Browse Source

Merge branch 'pre'

dzx 8 months ago
parent
commit
91b857a34e
58 changed files with 1582 additions and 54 deletions
  1. 8 2
      src/main/java/com/xjrsoft/module/base/controller/BaseClassController.java
  2. 27 4
      src/main/java/com/xjrsoft/module/base/controller/BaseClassCourseController.java
  3. 8 1
      src/main/java/com/xjrsoft/module/base/controller/BaseClassDynamicsController.java
  4. 134 0
      src/main/java/com/xjrsoft/module/base/controller/BaseClassMergeController.java
  5. 8 1
      src/main/java/com/xjrsoft/module/base/controller/BaseCourseSubjectController.java
  6. 5 1
      src/main/java/com/xjrsoft/module/base/controller/ClassroomController.java
  7. 8 1
      src/main/java/com/xjrsoft/module/base/controller/CourseSubjectDetailController.java
  8. 8 1
      src/main/java/com/xjrsoft/module/base/controller/OdsZzxxgkjcsjController.java
  9. 5 1
      src/main/java/com/xjrsoft/module/base/controller/OfficeBuildController.java
  10. 8 1
      src/main/java/com/xjrsoft/module/base/controller/WhitelistManagementController.java
  11. 43 0
      src/main/java/com/xjrsoft/module/base/dto/AddBaseClassMergeDto.java
  12. 37 0
      src/main/java/com/xjrsoft/module/base/dto/AddBaseClassMergeStudentDto.java
  13. 24 0
      src/main/java/com/xjrsoft/module/base/dto/BaseClassMergePageDto.java
  14. 22 0
      src/main/java/com/xjrsoft/module/base/dto/BaseClassMergeStudentPageDto.java
  15. 24 0
      src/main/java/com/xjrsoft/module/base/dto/UpdateBaseClassMergeDto.java
  16. 5 1
      src/main/java/com/xjrsoft/module/base/entity/BaseClassAdminCourse.java
  17. 5 1
      src/main/java/com/xjrsoft/module/base/entity/BaseClassCourse.java
  18. 5 1
      src/main/java/com/xjrsoft/module/base/entity/BaseClassDynamics.java
  19. 99 0
      src/main/java/com/xjrsoft/module/base/entity/BaseClassMerge.java
  20. 89 0
      src/main/java/com/xjrsoft/module/base/entity/BaseClassMergeStudent.java
  21. 5 1
      src/main/java/com/xjrsoft/module/base/entity/BaseCourseSubject.java
  22. 0 1
      src/main/java/com/xjrsoft/module/base/entity/BaseSystemConfig.java
  23. 5 1
      src/main/java/com/xjrsoft/module/base/entity/CourseSubjectDetail.java
  24. 5 1
      src/main/java/com/xjrsoft/module/base/entity/OdsZzxxgkjcsj.java
  25. 5 1
      src/main/java/com/xjrsoft/module/base/entity/WhitelistManagement.java
  26. 16 0
      src/main/java/com/xjrsoft/module/base/mapper/BaseClassMergeMapper.java
  27. 16 0
      src/main/java/com/xjrsoft/module/base/mapper/BaseClassMergeStudentMapper.java
  28. 0 1
      src/main/java/com/xjrsoft/module/base/mapper/BaseSystemConfigMapper.java
  29. 5 1
      src/main/java/com/xjrsoft/module/base/service/IBaseClassCourseService.java
  30. 52 0
      src/main/java/com/xjrsoft/module/base/service/IBaseClassMergeService.java
  31. 27 4
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassCourseServiceImpl.java
  32. 195 0
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassMergeServiceImpl.java
  33. 12 2
      src/main/java/com/xjrsoft/module/base/service/impl/WhitelistManagementServiceImpl.java
  34. 76 0
      src/main/java/com/xjrsoft/module/base/vo/BaseClassMergePageVo.java
  35. 53 0
      src/main/java/com/xjrsoft/module/base/vo/BaseClassMergeStudentVo.java
  36. 45 0
      src/main/java/com/xjrsoft/module/base/vo/BaseClassMergeVo.java
  37. 0 2
      src/main/java/com/xjrsoft/module/base/vo/BaseSystemConfigVo.java
  38. 34 0
      src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java
  39. 75 3
      src/main/java/com/xjrsoft/module/databoard/controller/DatadetailController.java
  40. 30 0
      src/main/java/com/xjrsoft/module/databoard/vo/ItemCount2Vo.java
  41. 39 0
      src/main/java/com/xjrsoft/module/databoard/vo/RoomStatisticsDetailVo.java
  42. 3 0
      src/main/java/com/xjrsoft/module/hikvision/service/IHikvisionDataService.java
  43. 9 0
      src/main/java/com/xjrsoft/module/hikvision/service/impl/HikvisionDataServiceImpl.java
  44. 39 2
      src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java
  45. 1 1
      src/main/java/com/xjrsoft/module/oa/controller/WfMeetingApplyController.java
  46. 9 2
      src/main/java/com/xjrsoft/module/oa/service/impl/WfMeetingApplyServiceImpl.java
  47. 2 0
      src/main/java/com/xjrsoft/module/personnel/service/ITeacherFaceProcessService.java
  48. 58 0
      src/main/java/com/xjrsoft/module/personnel/service/impl/TeacherFaceProcessServiceImpl.java
  49. 8 0
      src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java
  50. 3 1
      src/main/java/com/xjrsoft/module/student/dto/BaseStudentUserPageDto.java
  51. 3 0
      src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java
  52. 1 1
      src/main/java/com/xjrsoft/module/student/service/impl/PbCseFeeobjupdateServiceImpl.java
  53. 64 8
      src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java
  54. 12 0
      src/main/resources/mapper/student/BaseStudentMapper.xml
  55. 62 0
      src/main/resources/sqlScript/20250408_sql.sql
  56. 3 3
      src/main/resources/sqlScript/今日安排视图.sql
  57. 4 2
      src/test/java/com/xjrsoft/module/job/BaseNewStudentTaskTest.java
  58. 34 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 8 - 2
src/main/java/com/xjrsoft/module/base/controller/BaseClassController.java

@@ -17,7 +17,14 @@ import com.xjrsoft.module.base.vo.BaseClassVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -40,7 +47,6 @@ public class BaseClassController {
     @SaCheckPermission("baseclass:detail")
     @XjrLog(value = "班级列表(分页)")
     public RT<PageOutput<BaseClassPageVo>> page(@Valid BaseClassPageDto dto) {
-
         Page<BaseClassPageVo> page = baseClassService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         PageOutput<BaseClassPageVo> pageOutput = ConventPage.getPageOutput(page, BaseClassPageVo.class);
         return RT.ok(pageOutput);

+ 27 - 4
src/main/java/com/xjrsoft/module/base/controller/BaseClassCourseController.java

@@ -13,14 +13,30 @@ import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
-import com.xjrsoft.module.base.dto.*;
-import com.xjrsoft.module.base.entity.*;
+import com.xjrsoft.module.base.dto.AddBaseClassAdminCourseDto;
+import com.xjrsoft.module.base.dto.AddBaseClassCourseDto;
+import com.xjrsoft.module.base.dto.BaseClassCourseListDto;
+import com.xjrsoft.module.base.dto.BaseClassCoursePageDto;
+import com.xjrsoft.module.base.dto.ClassCourseReuseDto;
+import com.xjrsoft.module.base.dto.ClassCourseTextbookExportQueryDto;
+import com.xjrsoft.module.base.dto.UpdateBaseClassCourseDto;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseClassAdminCourse;
+import com.xjrsoft.module.base.entity.BaseClassCourse;
+import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.base.entity.ClassCourseTextbook;
+import com.xjrsoft.module.base.entity.CourseBookInfo;
 import com.xjrsoft.module.base.mapper.BaseClassAdminCourseMapper;
 import com.xjrsoft.module.base.service.IBaseClassCourseService;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.service.IBaseCourseSubjectService;
 import com.xjrsoft.module.base.service.IBaseSemesterService;
-import com.xjrsoft.module.base.vo.*;
+import com.xjrsoft.module.base.vo.BaseClassCourseExcelVo;
+import com.xjrsoft.module.base.vo.BaseClassCourseListVo;
+import com.xjrsoft.module.base.vo.BaseClassCourseMobileListVo;
+import com.xjrsoft.module.base.vo.BaseClassCoursePageVo;
+import com.xjrsoft.module.base.vo.BaseClassCourseVo;
 import com.xjrsoft.module.textbook.entity.Textbook;
 import com.xjrsoft.module.textbook.service.ITextbookService;
 import io.swagger.annotations.Api;
@@ -30,7 +46,14 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;

+ 8 - 1
src/main/java/com/xjrsoft/module/base/controller/BaseClassDynamicsController.java

@@ -28,7 +28,14 @@ import com.xjrsoft.module.system.service.IFileService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.util.ArrayList;

+ 134 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseClassMergeController.java

@@ -0,0 +1,134 @@
+package com.xjrsoft.module.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+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;
+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;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 班级合并
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/base" + "/baseClassMerge")
+@Api(value = "/base"  + "/baseClassMerge",tags = "班级合并代码")
+@AllArgsConstructor
+public class BaseClassMergeController {
+
+
+    private final IBaseClassMergeService baseClassMergeService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="班级合并列表(分页)")
+    @SaCheckPermission("baseclassmerge:detail")
+    @XjrLog(value = "班级合并列表(分页)")
+    public RT<PageOutput<BaseClassMergePageVo>> page(@Valid BaseClassMergePageDto dto){
+        List<Long> classIds = null;
+        if(StrUtil.isNotEmpty(dto.getMergeClassName())){
+            classIds = baseClassMergeService.getClassIdsByClassName(dto.getMergeClassName());
+        }
+        MPJLambdaWrapper<BaseClassMerge> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .select(BaseClassMerge::getId)
+                .select(BaseClassMerge.class,x -> VoToColumnUtil.fieldsToColumns(BaseClassMerge.class).contains(x.getProperty()))
+                .selectAs(BaseClass::getName, BaseClassMergePageVo::getTargetClassName)
+                .selectAs(User::getName, BaseClassMergePageVo::getCreateUserName)
+                .innerJoin(User.class, User::getId, BaseClassMerge::getCreateUserId)
+                .innerJoin(BaseClass.class, BaseClass::getId, BaseClassMerge::getTargetClassId)
+                .like(StrUtil.isNotEmpty(dto.getTargetClassName()), BaseClass::getName, dto.getTargetClassName())
+                .in(ObjectUtil.isNotNull(classIds), BaseClassMerge::getId, classIds)
+                .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);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询班级合并信息")
+    @SaCheckPermission("baseclassmerge:detail")
+    @XjrLog(value = "根据id查询班级合并信息")
+    public RT<BaseClassMergeVo> info(@RequestParam Long id){
+        BaseClassMerge baseClassMerge = baseClassMergeService.getByIdDeep(id);
+        if (baseClassMerge == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(baseClassMerge, BaseClassMergeVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增班级合并")
+    @SaCheckPermission("baseclassmerge:add")
+    @XjrLog(value = "新增班级合并")
+    public RT<Boolean> add(@Valid @RequestBody AddBaseClassMergeDto dto){
+        BaseClassMerge baseClassMerge = BeanUtil.toBean(dto, BaseClassMerge.class);
+        boolean isSuccess = baseClassMergeService.add(baseClassMerge);
+        return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改班级合并")
+    @SaCheckPermission("baseclassmerge:edit")
+    @XjrLog(value = "修改班级合并")
+    public RT<Boolean> update(@Valid @RequestBody UpdateBaseClassMergeDto dto){
+        BaseClassMerge baseClassMerge = BeanUtil.toBean(dto, BaseClassMerge.class);
+        return RT.ok(baseClassMergeService.update(baseClassMerge));
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除班级合并")
+    @SaCheckPermission("baseclassmerge:delete")
+    @XjrLog(value = "删除班级合并")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        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);
+    }
+
+}

+ 8 - 1
src/main/java/com/xjrsoft/module/base/controller/BaseCourseSubjectController.java

@@ -24,7 +24,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;

+ 5 - 1
src/main/java/com/xjrsoft/module/base/controller/ClassroomController.java

@@ -10,7 +10,11 @@ import com.xjrsoft.module.base.service.IBaseClassroomService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 

+ 8 - 1
src/main/java/com/xjrsoft/module/base/controller/CourseSubjectDetailController.java

@@ -22,7 +22,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;

+ 8 - 1
src/main/java/com/xjrsoft/module/base/controller/OdsZzxxgkjcsjController.java

@@ -19,7 +19,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;

+ 5 - 1
src/main/java/com/xjrsoft/module/base/controller/OfficeBuildController.java

@@ -10,7 +10,11 @@ import com.xjrsoft.module.base.service.IBaseOfficeBuildService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 

+ 8 - 1
src/main/java/com/xjrsoft/module/base/controller/WhitelistManagementController.java

@@ -22,7 +22,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;

+ 43 - 0
src/main/java/com/xjrsoft/module/base/dto/AddBaseClassMergeDto.java

@@ -0,0 +1,43 @@
+package com.xjrsoft.module.base.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+
+/**
+* @title: 班级合并
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Data
+public class AddBaseClassMergeDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 涉及学生人数
+    */
+    @ApiModelProperty("涉及学生人数")
+    private Integer studentCount;
+    /**
+    * 目标班级
+    */
+    @ApiModelProperty("目标班级")
+    private Long targetClassId;
+    /**
+    * 原因
+    */
+    @ApiModelProperty("原因")
+    private String reason;
+
+    /**
+    * baseClassMergeStudent
+    */
+    @ApiModelProperty("baseClassMergeStudent子表")
+    private List<AddBaseClassMergeStudentDto> baseClassMergeStudentList;
+}

+ 37 - 0
src/main/java/com/xjrsoft/module/base/dto/AddBaseClassMergeStudentDto.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.base.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 班级合并涉及学生
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Data
+public class AddBaseClassMergeStudentDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 班级合并id(base_class_merge)
+    */
+    @ApiModelProperty("班级合并id(base_class_merge)")
+    private Long baseClassMergeId;
+    /**
+    * 原有班级
+    */
+    @ApiModelProperty("原有班级")
+    private Long classId;
+    /**
+    * 学生id
+    */
+    @ApiModelProperty("学生id")
+    private Long userId;
+
+}

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

@@ -0,0 +1,24 @@
+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 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;
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/base/dto/UpdateBaseClassMergeDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.base.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 班级合并
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Data
+public class UpdateBaseClassMergeDto extends AddBaseClassMergeDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+}

+ 5 - 1
src/main/java/com/xjrsoft/module/base/entity/BaseClassAdminCourse.java

@@ -1,6 +1,10 @@
 package com.xjrsoft.module.base.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 5 - 1
src/main/java/com/xjrsoft/module/base/entity/BaseClassCourse.java

@@ -1,6 +1,10 @@
 package com.xjrsoft.module.base.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 5 - 1
src/main/java/com/xjrsoft/module/base/entity/BaseClassDynamics.java

@@ -1,6 +1,10 @@
 package com.xjrsoft.module.base.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 99 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseClassMerge.java

@@ -0,0 +1,99 @@
+package com.xjrsoft.module.base.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+* @title: 班级合并
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Data
+@TableName("base_class_merge")
+@ApiModel(value = "base_class_merge", description = "班级合并")
+public class BaseClassMerge implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记(0:未删除 1:已删除)
+    */
+    @ApiModelProperty("删除标记(0:未删除 1:已删除)")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记(0:未启用 1:已启用)
+    */
+    @ApiModelProperty("有效标记(0:未启用 1:已启用)")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 涉及学生人数
+    */
+    @ApiModelProperty("涉及学生人数")
+    private Integer studentCount;
+    /**
+    * 目标班级
+    */
+    @ApiModelProperty("目标班级")
+    private Long targetClassId;
+    /**
+    * 原因
+    */
+    @ApiModelProperty("原因")
+    private String reason;
+
+    /**
+    * baseClassMergeStudent
+    */
+    @ApiModelProperty("baseClassMergeStudent子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "baseClassMergeId")
+    private List<BaseClassMergeStudent> baseClassMergeStudentList;
+
+}

+ 89 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseClassMergeStudent.java

@@ -0,0 +1,89 @@
+package com.xjrsoft.module.base.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 班级合并涉及学生
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Data
+@TableName("base_class_merge_student")
+@ApiModel(value = "base_class_merge_student", description = "班级合并涉及学生")
+public class BaseClassMergeStudent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记(0:未删除 1:已删除)
+    */
+    @ApiModelProperty("删除标记(0:未删除 1:已删除)")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记(0:未启用 1:已启用)
+    */
+    @ApiModelProperty("有效标记(0:未启用 1:已启用)")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 班级合并id(base_class_merge)
+    */
+    @ApiModelProperty("班级合并id(base_class_merge)")
+    private Long baseClassMergeId;
+    /**
+    * 原有班级
+    */
+    @ApiModelProperty("原有班级")
+    private Long classId;
+    /**
+    * 学生id
+    */
+    @ApiModelProperty("学生id")
+    private Long userId;
+
+
+}

+ 5 - 1
src/main/java/com/xjrsoft/module/base/entity/BaseCourseSubject.java

@@ -1,6 +1,10 @@
 package com.xjrsoft.module.base.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.github.yulichang.annotation.EntityMapping;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 0 - 1
src/main/java/com/xjrsoft/module/base/entity/BaseSystemConfig.java

@@ -6,7 +6,6 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
-import java.util.Date;
 
 /**
  * <p>

+ 5 - 1
src/main/java/com/xjrsoft/module/base/entity/CourseSubjectDetail.java

@@ -1,6 +1,10 @@
 package com.xjrsoft.module.base.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 5 - 1
src/main/java/com/xjrsoft/module/base/entity/OdsZzxxgkjcsj.java

@@ -1,6 +1,10 @@
 package com.xjrsoft.module.base.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 5 - 1
src/main/java/com/xjrsoft/module/base/entity/WhitelistManagement.java

@@ -1,6 +1,10 @@
 package com.xjrsoft.module.base.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 16 - 0
src/main/java/com/xjrsoft/module/base/mapper/BaseClassMergeMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.base.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.base.entity.BaseClassMerge;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 班级合并
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Mapper
+public interface BaseClassMergeMapper extends MPJBaseMapper<BaseClassMerge> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/base/mapper/BaseClassMergeStudentMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.base.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.base.entity.BaseClassMergeStudent;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 班级合并涉及学生
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Mapper
+public interface BaseClassMergeStudentMapper extends MPJBaseMapper<BaseClassMergeStudent> {
+
+}

+ 0 - 1
src/main/java/com/xjrsoft/module/base/mapper/BaseSystemConfigMapper.java

@@ -1,7 +1,6 @@
 package com.xjrsoft.module.base.mapper;
 
 import com.github.yulichang.base.MPJBaseMapper;
-import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.entity.BaseSystemConfig;
 import org.apache.ibatis.annotations.Mapper;
 

+ 5 - 1
src/main/java/com/xjrsoft/module/base/service/IBaseClassCourseService.java

@@ -2,7 +2,11 @@ package com.xjrsoft.module.base.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
-import com.xjrsoft.module.base.dto.*;
+import com.xjrsoft.module.base.dto.AddBaseClassAdminCourseDto;
+import com.xjrsoft.module.base.dto.BaseClassCourseListDto;
+import com.xjrsoft.module.base.dto.BaseClassCoursePageDto;
+import com.xjrsoft.module.base.dto.ClassCourseReuseDto;
+import com.xjrsoft.module.base.dto.ClassCourseTextbookExportQueryDto;
 import com.xjrsoft.module.base.entity.BaseClassCourse;
 import com.xjrsoft.module.base.entity.ClassCourseTextbook;
 import com.xjrsoft.module.base.entity.CourseBookInfo;

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

@@ -0,0 +1,52 @@
+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;
+
+/**
+* @title: 班级合并
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+
+public interface IBaseClassMergeService extends MPJBaseService<BaseClassMerge> {
+    /**
+    * 新增
+    *
+    * @param baseClassMerge
+    * @return
+    */
+    Boolean add(BaseClassMerge baseClassMerge);
+
+    /**
+    * 更新
+    *
+    * @param baseClassMerge
+    * @return
+    */
+    Boolean update(BaseClassMerge baseClassMerge);
+
+    /**
+    * 删除
+    *
+    * @param ids
+    * @return
+    */
+    Boolean delete(List<Long> ids);
+
+    List<BaseClass> getClassListByMergeId(Long id);
+
+    String getClassNamesByMergeId(Long id);
+
+    IPage<BaseClassMergeStudentVo> getStudentPage(BaseClassMergeStudentPageDto dto);
+
+
+    List<Long> getClassIdsByClassName(String className);
+}

+ 27 - 4
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassCourseServiceImpl.java

@@ -11,8 +11,18 @@ import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.UseSemesterTypeEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.base.dto.*;
-import com.xjrsoft.module.base.entity.*;
+import com.xjrsoft.module.base.dto.AddBaseClassAdminCourseDto;
+import com.xjrsoft.module.base.dto.BaseClassCourseListDto;
+import com.xjrsoft.module.base.dto.BaseClassCoursePageDto;
+import com.xjrsoft.module.base.dto.ClassCourseReuseDto;
+import com.xjrsoft.module.base.dto.ClassCourseTextbookExportQueryDto;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseClassAdminCourse;
+import com.xjrsoft.module.base.entity.BaseClassCourse;
+import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.base.entity.ClassCourseTextbook;
+import com.xjrsoft.module.base.entity.CourseBookInfo;
 import com.xjrsoft.module.base.mapper.BaseClassAdminCourseMapper;
 import com.xjrsoft.module.base.mapper.BaseClassCourseMapper;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
@@ -31,7 +41,14 @@ import com.xjrsoft.module.textbook.mapper.TextbookStudentClaimMapper;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.BeanUtils;
@@ -41,7 +58,13 @@ import org.springframework.transaction.annotation.Transactional;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 import java.util.stream.Collectors;
 
 import static com.xjrsoft.module.veb.util.ImportExcelUtil.allFields;

+ 195 - 0
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassMergeServiceImpl.java

@@ -0,0 +1,195 @@
+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.exception.MyException;
+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 com.xjrsoft.module.system.entity.DictionaryDetail;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+* @title: 班级合并
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class BaseClassMergeServiceImpl extends MPJBaseServiceImpl<BaseClassMergeMapper, BaseClassMerge> implements IBaseClassMergeService {
+
+    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) {
+        Set<Long> collect = baseClassMerge.getBaseClassMergeStudentList().stream().map(BaseClassMergeStudent::getClassId).collect(Collectors.toSet());
+        if(collect.contains(baseClassMerge.getTargetClassId())){
+            throw new MyException("原有班级中不能包含目标班级,请重新选择原有班级");
+        }
+        baseClassMerge.setStudentCount(baseClassMerge.getBaseClassMergeStudentList().size());
+        this.baseMapper.insert(baseClassMerge);
+        BaseClass baseClass = baseClassMapper.selectById(baseClassMerge.getTargetClassId());
+
+
+        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());
+            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) {
+        this.baseMapper.updateById(baseClassMerge);
+        //********************************* BaseClassMergeStudent  增删改  开始 *******************************************/
+        {
+            // 查出所有子级的id
+            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());
+            //找到需要删除的id
+            List<Long> baseClassMergeStudentRemoveIds = baseClassMergeStudentIds.stream().filter(item -> !baseClassMergeStudentOldIds.contains(item)).collect(Collectors.toList());
+
+            for (BaseClassMergeStudent baseClassMergeStudent : baseClassMerge.getBaseClassMergeStudentList()) {
+                //如果不等于空则修改
+                if (baseClassMergeStudent.getId() != null) {
+                    mergeStudentMapper.updateById(baseClassMergeStudent);
+                }
+                //如果等于空 则新增
+                else {
+                    //已经不存在的id 删除
+                    baseClassMergeStudent.setBaseClassMergeId(baseClassMerge.getId());
+                    mergeStudentMapper.insert(baseClassMergeStudent);
+                }
+            }
+            //已经不存在的id 删除
+            if(!baseClassMergeStudentRemoveIds.isEmpty()){
+                mergeStudentMapper.deleteBatchIds(baseClassMergeStudentRemoveIds);
+            }
+        }
+        //********************************* BaseClassMergeStudent  增删改  结束 *******************************************/
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delete(List<Long> 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)
+                        .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("t4.name", BaseClassMergeStudentVo::getGender)
+                .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)
+                .innerJoin("xjr_dictionary_detail t4 ON (t4.code = t1.gender) ")
+                .eq(BaseClassMergeStudent::getBaseClassMergeId, dto.getBaseClassMergeId())
+                .orderByDesc(BaseClassMergeStudent::getId);
+        IPage<BaseClassMergeStudentVo> page = mergeStudentMapper.selectJoinPage(ConventPage.getPage(dto), BaseClassMergeStudentVo.class, queryWrapper);
+        return page;
+    }
+
+    @Override
+    public List<Long> getClassIdsByClassName(String className) {
+        List<BaseClassMergeStudent> classList = mergeStudentMapper.selectList(
+                new MPJLambdaWrapper<BaseClassMergeStudent>()
+                        .distinct()
+                        .select(BaseClassMergeStudent::getId)
+                        .select(BaseClassMergeStudent.class, x -> VoToColumnUtil.fieldsToColumns(BaseClassMergeStudent.class).contains(x.getProperty()))
+                        .innerJoin(BaseClass.class, BaseClass::getId, BaseClassMergeStudent::getClassId)
+                        .eq(BaseClassMergeStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .like(BaseClass::getName, className)
+        );
+        if(!classList.isEmpty()){
+            Set<Long> collect = classList.stream().map(BaseClassMergeStudent::getBaseClassMergeId).collect(Collectors.toSet());
+            return new ArrayList<>(collect);
+        }
+        return null;
+    }
+}

+ 12 - 2
src/main/java/com/xjrsoft/module/base/service/impl/WhitelistManagementServiceImpl.java

@@ -14,7 +14,12 @@ import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.module.base.dto.WhitelistManagementPageDto;
-import com.xjrsoft.module.base.entity.*;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseUserStudent;
+import com.xjrsoft.module.base.entity.TreeNode;
+import com.xjrsoft.module.base.entity.WhiteBaseClass;
+import com.xjrsoft.module.base.entity.WhiteBaseGrade;
+import com.xjrsoft.module.base.entity.WhitelistManagement;
 import com.xjrsoft.module.base.mapper.WhitelistManagementMapper;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.service.IBaseUserStudentService;
@@ -35,7 +40,12 @@ import org.springframework.stereotype.Service;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 

+ 76 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseClassMergePageVo.java

@@ -0,0 +1,76 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+* @title: 班级合并分页列表出参
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Data
+public class BaseClassMergePageVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("操作人")
+    private String createUserName;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    private Date modifyDate;
+    /**
+    * 删除标记(0:未删除 1:已删除)
+    */
+    @ApiModelProperty("删除标记(0:未删除 1:已删除)")
+    private Short deleteMark;
+    /**
+    * 有效标记(0:未启用 1:已启用)
+    */
+    @ApiModelProperty("有效标记(0:未启用 1:已启用)")
+    private Short enabledMark;
+    /**
+    * 涉及学生人数
+    */
+    @ApiModelProperty("涉及学生人数")
+    private Integer studentCount;
+    /**
+    * 目标班级
+    */
+    @ApiModelProperty("目标班级id")
+    private Long targetClassId;
+
+    @ApiModelProperty("目标班级名称")
+    private String targetClassName;
+
+    @ApiModelProperty("原班级")
+    private String mergeClassName;
+
+    /**
+    * 原因
+    */
+    @ApiModelProperty("原因")
+    private String reason;
+
+}

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

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 班级合并涉及学生表单出参
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Data
+public class BaseClassMergeStudentVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 班级合并id(base_class_merge)
+    */
+    @ApiModelProperty("班级合并id(base_class_merge)")
+    private Long baseClassMergeId;
+    /**
+    * 原有班级
+    */
+    @ApiModelProperty("原有班级")
+    private Long classId;
+    /**
+    * 学生id
+    */
+    @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;
+
+
+
+}

+ 45 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseClassMergeVo.java

@@ -0,0 +1,45 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+* @title: 班级合并表单出参
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Data
+public class BaseClassMergeVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 涉及学生人数
+    */
+    @ApiModelProperty("涉及学生人数")
+    private Integer studentCount;
+    /**
+    * 目标班级
+    */
+    @ApiModelProperty("目标班级")
+    private Long targetClassId;
+    /**
+    * 原因
+    */
+    @ApiModelProperty("原因")
+    private String reason;
+
+
+    /**
+    * baseClassMergeStudent
+    */
+    @ApiModelProperty("baseClassMergeStudent子表")
+    private List<BaseClassMergeStudentVo> baseClassMergeStudentList;
+
+}

+ 0 - 2
src/main/java/com/xjrsoft/module/base/vo/BaseSystemConfigVo.java

@@ -3,8 +3,6 @@ package com.xjrsoft.module.base.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.util.Date;
-
 
 /**
  * @title: 系统参数配置

+ 34 - 0
src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java

@@ -562,4 +562,38 @@ public class DataboardController {
         return RT.ok(result);
     }
 
+
+    @GetMapping(value = "/room-statistics")
+    @ApiOperation(value = "寝室统计")
+    @SaCheckPermission("databoard:detail")
+    @XjrLog(value = "寝室统计", saveResponseData = true)
+    public RT<List<ItemCount2Vo>> roomStatistics(@Valid StatisticsDetailDto dto) {
+        String sql = " SELECT t0.name," +
+                " (SELECT COUNT(*) FROM room t1 " +
+                " INNER JOIN room_bed t2 ON t1.id = t2.room_id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0" +
+                " AND t2.student_user_id IS NOT NULL" +
+                " AND t1.office_build_id = t0.id) AS studentCount," +
+                " (SELECT COUNT(*) FROM room t1 " +
+                " INNER JOIN room_bed t2 ON t1.id = t2.room_id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0" +
+                " AND t2.student_user_id IS NULL" +
+                " AND t1.office_build_id = t0.id) AS emptyCount" +
+                " FROM base_office_build t0" +
+                " WHERE t0.delete_mark = 0" +
+                " AND t0.build_type = 'FB3604'" +
+                " ORDER BY t0.name";
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+        List<ItemCount2Vo> result = new ArrayList<>();
+        for (Map<String, Object> objectMap : list) {
+            result.add(new ItemCount2Vo(){{
+                setItem(objectMap.get("name").toString());
+                setCount(Integer.parseInt(objectMap.get("studentCount").toString()));
+                setCount2(Integer.parseInt(objectMap.get("emptyCount").toString()));
+            }});
+        }
+
+        return RT.ok(result);
+    }
+
 }

+ 75 - 3
src/main/java/com/xjrsoft/module/databoard/controller/DatadetailController.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.databoard.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.github.yulichang.toolkit.MPJWrappers;
@@ -23,11 +24,13 @@ import com.xjrsoft.module.databoard.vo.DistributionVo;
 import com.xjrsoft.module.databoard.vo.DurationVo;
 import com.xjrsoft.module.databoard.vo.HealthItemCountVo;
 import com.xjrsoft.module.databoard.vo.HealthStatisticsDetailVo;
+import com.xjrsoft.module.databoard.vo.ItemCount2Vo;
 import com.xjrsoft.module.databoard.vo.ItemCountAmountVo;
 import com.xjrsoft.module.databoard.vo.ItemCountRatioVo;
 import com.xjrsoft.module.databoard.vo.ItemCountVo;
 import com.xjrsoft.module.databoard.vo.ItemDoubleVo;
 import com.xjrsoft.module.databoard.vo.ProcessStatisticsDetailVo;
+import com.xjrsoft.module.databoard.vo.RoomStatisticsDetailVo;
 import com.xjrsoft.module.databoard.vo.StudnetStatisticsDetailVo;
 import com.xjrsoft.module.databoard.vo.SubscriptionStatisticsDetailVo;
 import com.xjrsoft.module.databoard.vo.TeacherChangeStatisticsDetailVo;
@@ -52,7 +55,6 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.camunda.bpm.engine.history.HistoricProcessInstance;
-import org.camunda.bpm.engine.history.JobState;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -362,6 +364,12 @@ public class DatadetailController {
         }
         result.setDeptList(deptList);
 
+        List<String> jobStates = new ArrayList<>();
+        jobStates.add("JOB_DDSX");
+        jobStates.add("JOB_WCPX");
+        jobStates.add("ZZZT10009");
+        jobStates.add("ZZZT10004");
+
         MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
                 .disableSubLogicDel()
                 .orderByDesc(XjrUser::getId)
@@ -371,8 +379,8 @@ public class DatadetailController {
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, BaseTeacher::getJobState, ext -> ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getJobState))
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, XjrUser::getCredentialType, ext -> ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getCredentialType))
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, BaseTeacher::getEmployWay, ext -> ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getEmployWay))
-
-                .selectAsClass(BaseTeacher.class, XjrUserPageVo.class);
+                .selectAsClass(BaseTeacher.class, XjrUserPageVo.class)
+                .in(BaseTeacher::getJobState, jobStates);
 
         List<XjrUserPageVo> teacherList = teacherService.selectJoinList(XjrUserPageVo.class, queryWrapper);
         List<String> idCardList = teacherList.stream().map(XjrUserPageVo::getCredentialNumber).collect(Collectors.toList());
@@ -889,4 +897,68 @@ public class DatadetailController {
         return RT.ok(result);
     }
 
+    @GetMapping(value = "/room-statistics")
+    @ApiOperation(value = "寝室统计")
+    @SaCheckPermission("databoard:detail")
+    @XjrLog(value = "寝室统计", saveResponseData = true)
+    public RT<RoomStatisticsDetailVo> roomStatistics(@Valid StatisticsDetailDto dto) {
+        RoomStatisticsDetailVo result = new RoomStatisticsDetailVo();
+        String sql = "SELECT t2.id, t3.user_id,t4.name AS grade_name, t6.name AS dept_name,t7.gender FROM room t1" +
+                " INNER JOIN room_bed t2 ON t1.id = t2.room_id" +
+                " LEFT JOIN base_student_school_roll t3 ON t2.student_user_id = t3.user_id" +
+                " LEFT JOIN base_grade t4 ON t3.grade_id = t4.id AND t4.status = 1" +
+                " LEFT JOIN base_class t5 ON t3.class_id = t5.id" +
+                " LEFT JOIN xjr_department t6 ON t5.org_id = t6.id" +
+                " LEFT JOIN xjr_user t7 ON t3.user_id = t7.id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0";
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+
+        Integer allCount = list.size();
+        long emptyCount = list.stream().filter(x -> ObjectUtil.isNull(x.get("user_id"))).count();
+        BigDecimal emptyRatio = BigDecimal.valueOf(emptyCount).divide(BigDecimal.valueOf(allCount), 4, RoundingMode.HALF_UP);
+        result.setEmptyRatio(emptyRatio.doubleValue() + "");
+
+        long notEmptyCount = list.stream().filter(x -> ObjectUtil.isNotNull(x.get("user_id"))).count();
+        BigDecimal notEmptyRatio = BigDecimal.valueOf(notEmptyCount).divide(BigDecimal.valueOf(allCount), 4, RoundingMode.HALF_UP);
+        result.setNotEmptyRatio(notEmptyRatio.doubleValue() + "");
+
+        Map<String, List<Map<String, Object>>> gradeMap = list.stream().filter(x -> ObjectUtil.isNotNull(x.get("grade_name"))).collect(Collectors.groupingBy(x -> x.get("grade_name").toString()));
+        List<ItemCount2Vo> gradeList = new ArrayList<>();
+        for (String gradeName : gradeMap.keySet()) {
+            List<Map<String, Object>> gradeDataList = gradeMap.get(gradeName);
+            Map<String, Long> genderMap = gradeDataList.stream().filter(x -> ObjectUtil.isNotNull(x.get("gender"))).collect(Collectors.groupingBy(x -> x.get("gender").toString(), Collectors.counting()));
+            ItemCount2Vo gradeVo = new ItemCount2Vo();
+            gradeVo.setItem(gradeName);
+            if(genderMap.get(GenderDictionaryEnum.MALE.getCode()) != null){
+                gradeVo.setCount(genderMap.get(GenderDictionaryEnum.MALE.getCode()).intValue());
+            }
+            if(genderMap.get(GenderDictionaryEnum.FEMALE.getCode()) != null){
+                gradeVo.setCount2(genderMap.get(GenderDictionaryEnum.FEMALE.getCode()).intValue());
+            }
+
+            gradeList.add(gradeVo);
+        }
+        Collections.reverse(gradeList);
+        result.setGradeList(gradeList);
+
+        Map<String, List<Map<String, Object>>> deptMap = list.stream().filter(x -> ObjectUtil.isNotNull(x.get("dept_name"))).collect(Collectors.groupingBy(x -> x.get("dept_name").toString()));
+        List<ItemCount2Vo> deptList = new ArrayList<>();
+        for (String deptName : deptMap.keySet()) {
+            List<Map<String, Object>> deptDataList = deptMap.get(deptName);
+            Map<String, Long> genderMap = deptDataList.stream().filter(x -> ObjectUtil.isNotNull(x.get("gender"))).collect(Collectors.groupingBy(x -> x.get("gender").toString(), Collectors.counting()));
+            ItemCount2Vo deptVo = new ItemCount2Vo();
+            deptVo.setItem(deptName);
+            if(genderMap.get(GenderDictionaryEnum.MALE.getCode()) != null){
+                deptVo.setCount(genderMap.get(GenderDictionaryEnum.MALE.getCode()).intValue());
+            }
+            if(genderMap.get(GenderDictionaryEnum.FEMALE.getCode()) != null){
+                deptVo.setCount2(genderMap.get(GenderDictionaryEnum.FEMALE.getCode()).intValue());
+            }
+
+            deptList.add(deptVo);
+        }
+        result.setDeptList(deptList);
+        return RT.ok(result);
+    }
+
 }

+ 30 - 0
src/main/java/com/xjrsoft/module/databoard/vo/ItemCount2Vo.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.databoard.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * @title: 数据看板-流程统计出参
+ * @Author dzx
+ * @Date: 2024年8月2日
+ * @Version 1.0
+ */
+@Data
+public class ItemCount2Vo {
+
+    /**
+     * 发起流程总数
+     */
+    @ApiModelProperty("统计项")
+    private String item;
+    /**
+     * 完成总数
+     */
+    @ApiModelProperty("数量")
+    private Integer count;
+
+    @ApiModelProperty("数量2")
+    private Integer count2;
+
+}

+ 39 - 0
src/main/java/com/xjrsoft/module/databoard/vo/RoomStatisticsDetailVo.java

@@ -0,0 +1,39 @@
+package com.xjrsoft.module.databoard.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @title: 数据看板-流程统计出参
+ * @Author dzx
+ * @Date: 2024年8月2日
+ * @Version 1.0
+ */
+@Data
+public class RoomStatisticsDetailVo {
+
+    /**
+     * 发起流程总数
+     */
+    @ApiModelProperty("入住比例")
+    private String notEmptyRatio;
+    /**
+     * 完成总数
+     */
+    @ApiModelProperty("未入住比例")
+    private String emptyRatio;
+    /**
+     * 未完成总数
+     */
+    @ApiModelProperty("未完成总数")
+    private Long uncompleteCount;
+
+    @ApiModelProperty("年级情况")
+    private List<ItemCount2Vo> gradeList;
+
+    @ApiModelProperty("专业部情况")
+    private List<ItemCount2Vo> deptList;
+
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/hikvision/service/IHikvisionDataService.java

@@ -18,4 +18,7 @@ public interface IHikvisionDataService extends MPJBaseService<HikvisionData> {
 
     Map<String, String> getUserIdMap();
 
+
+    Boolean removeByUserId(Long userId);
+
 }

+ 9 - 0
src/main/java/com/xjrsoft/module/hikvision/service/impl/HikvisionDataServiceImpl.java

@@ -7,6 +7,7 @@ import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.hikvision.service.IHikvisionDataService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.HashMap;
 import java.util.List;
@@ -51,4 +52,12 @@ public class HikvisionDataServiceImpl extends MPJBaseServiceImpl<HikvisionDataMa
         result.putAll(teacherMap);
         return result;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean removeByUserId(Long userId) {
+        return null;
+    }
+
+
 }

+ 39 - 2
src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java

@@ -15,7 +15,13 @@ import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import lombok.extern.slf4j.Slf4j;
 
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * @author dzx
@@ -651,7 +657,6 @@ public class DataUtil {
      * @param userIds
      */
     public void deletePerson(List<Long> userIds) {
-        String tableName = "hikvision_data";
         JsonArray personIds = new JsonArray();
         for (Long userId : userIds) {
             String sql = "select * from hikvision_data where source_id = '" + userId + "'";
@@ -673,4 +678,36 @@ public class DataUtil {
         String result = apiUtil.doPost(apiPath, param.toString(), null);
         log.info("海康人员删除:param:" + param + ",result:" + result);
     }
+
+
+    public void deleteCar(List<CarMessageApply> carList) {
+        ApiUtil apiUtil = new ApiUtil();
+        String apiPath = "/api/resource/v2/vehicle/advance/vehicleList";
+        JsonParser parser = new JsonParser();
+
+        JsonArray vehicleIds = new JsonArray();
+        for (CarMessageApply carMessageApply : carList) {
+            JsonObject param = new JsonObject();
+            param.addProperty("plateNo", carMessageApply.getCarNumber());
+            String result = apiUtil.doPost(apiPath, param.toString(), null);
+            JsonObject vehicleData = parser.parse(result).getAsJsonObject();
+            if ("0".equals(vehicleData.get("code").getAsString()) && "success".equals(vehicleData.get("msg").getAsString())) {
+                JsonObject dataJson = vehicleData.get("data").getAsJsonObject();
+                if (dataJson.get("total").getAsInt() > 0) {
+                    JsonArray vehicleList = dataJson.get("list").getAsJsonArray();
+                    for (JsonElement jsonElement : vehicleList) {
+                        vehicleIds.add(jsonElement.getAsJsonObject().get("vehicleId"));
+                    }
+                }
+            }
+        }
+
+        if(vehicleIds.size() > 0){
+            apiPath = "/api/resource/v1/vehicle/batch/delete";
+
+            JsonObject param = new JsonObject();
+            param.add("vehicleIds", vehicleIds);
+            apiUtil.doPost(apiPath, param.toString(), null);
+        }
+    }
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/oa/controller/WfMeetingApplyController.java

@@ -197,7 +197,7 @@ public class WfMeetingApplyController {
     @SaCheckPermission("wfmeetingapply:detail")
     @XjrLog(value = "会议签到二维码-生成二维码")
     public RT<String> qrcode(@RequestParam Long id) throws Exception {
-        String url = commonPropertiesConfig.getDomainApp() + "/pages/meeting/permissions?id=" + id + "&type=1";
+        String url = commonPropertiesConfig.getDomainApp() + "/pages/meeting/permissions?id=" + id + "&type=0";
         int width = 400;
         int height = 400;
         int margin = 1;

+ 9 - 2
src/main/java/com/xjrsoft/module/oa/service/impl/WfMeetingApplyServiceImpl.java

@@ -205,11 +205,14 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                 .le(ObjectUtils.isNotEmpty(dto.getEndMeetingApplyDate()), WfMeetingApply::getMeetingApplyDate, dto.getEndMeetingApplyDate())
                 .eq(StringUtils.isNotEmpty(dto.getMeetingApplyFormat()), WfMeetingApply::getMeetingApplyFormat, dto.getMeetingApplyFormat())
                 .like(StringUtils.isNotEmpty(dto.getMeetingApplyTheme()), WfMeetingApply::getMeetingApplyTheme, dto.getMeetingApplyTheme())
+                .orderByDesc(WfMeetingApply::getMeetingApplyDate)
+                .orderByAsc(WfMeetingApply::getMeetingApplyS)
         ;
         if (ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 0) {
             wfMeetingApplyPageVoMPJLambdaWrapper
                     .ge(WfMeetingApply::getMeetingApplyDate, nowLocalDate)
                     .gt(WfMeetingApply::getMeetingApplyS, nowLocalTime)
+                    .ne(WfMeetingApply::getMeetingStatus, 1)
             ;
         }
 
@@ -223,6 +226,7 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
             wfMeetingApplyPageVoMPJLambdaWrapper
                     .le(WfMeetingApply::getMeetingApplyDate, nowLocalDate)
                     .lt(WfMeetingApply::getMeetingApplyE, nowLocalTime)
+                    .ne(WfMeetingApply::getMeetingStatus, 1)
             ;
         }
 
@@ -231,6 +235,7 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                     .eq(WfMeetingApply::getMeetingApplyDate, nowLocalDate)
                     .le(WfMeetingApply::getMeetingApplyS, nowLocalTime)
                     .ge(WfMeetingApply::getMeetingApplyE, nowLocalTime)
+                    .ne(WfMeetingApply::getMeetingStatus, 1)
             ;
         }
 
@@ -467,14 +472,16 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
             List<File> fileList = fileMapper.selectList(Wrappers.<File>query().lambda().eq(File::getFolderId, info.getPreMeetingInfoFileId()));
             info.setFileInfos(fileList);
 
-            // 处理签到状态
+            // 如果是会议参会人员,应该处理签到状态
             LambdaQueryWrapper<MeetingConferee> meetingConfereeLambdaQueryWrapper = new LambdaQueryWrapper<>();
             meetingConfereeLambdaQueryWrapper
                     .eq(MeetingConferee::getUserId, StpUtil.getLoginIdAsLong())
                     .eq(MeetingConferee::getWfMeetingApplyId, id)
                     ;
             MeetingConferee meetingConferee = meetingConfereeMapper.selectOne(meetingConfereeLambdaQueryWrapper);
-            info.setCheckInStatus(meetingConferee.getCheckInStatus());
+            if(ObjectUtils.isNotEmpty(meetingConferee)){
+                info.setCheckInStatus(meetingConferee.getCheckInStatus());
+            }
 
             // 处理状态
             LocalTime nowLocalTime = LocalTime.now();

+ 2 - 0
src/main/java/com/xjrsoft/module/personnel/service/ITeacherFaceProcessService.java

@@ -17,4 +17,6 @@ public interface ITeacherFaceProcessService extends MPJBaseService<TeacherFacePr
     Boolean removeByIds(List<Long> ids);
 
     Boolean clearHistory(TeacherFaceProcess process);
+
+    Boolean removeByUserId(Long userId);
 }

+ 58 - 0
src/main/java/com/xjrsoft/module/personnel/service/impl/TeacherFaceProcessServiceImpl.java

@@ -95,4 +95,62 @@ public class TeacherFaceProcessServiceImpl extends MPJBaseServiceImpl<TeacherFac
     public Boolean clearHistory(TeacherFaceProcess process) {
         return this.baseMapper.clearHistory(process);
     }
+
+    @Override
+    public Boolean removeByUserId(Long userId) {
+        List<TeacherFaceProcess> list = this.list(
+                new QueryWrapper<TeacherFaceProcess>().lambda()
+                        .eq(TeacherFaceProcess::getUserId, userId)
+        );
+        ApiUtil apiUtil = new ApiUtil();
+        String apiPath = "/api/resource/v1/face/single/delete";
+        JsonParser parser = new JsonParser();
+        for (TeacherFaceProcess process : list) {
+            String studentHikvisionId = hikvisionDataMapper.getTeacherHikvisionId(process.getUserId());
+
+            String apiUrl = "/api/resource/v1/person/condition/personInfo";
+            JsonObject paramsJson = new JsonObject();
+            paramsJson.addProperty("paramName", "personId");
+            JsonArray array = new JsonArray();
+            array.add(studentHikvisionId);
+            paramsJson.add("paramValue", array);
+            String personInfoRes = apiUtil.doPost(apiUrl, paramsJson.toString(), null);
+            String faceId = null;
+            JsonObject personInfoData = parser.parse(personInfoRes).getAsJsonObject();
+            if ("0".equals(personInfoData.get("code").getAsString()) && "success".equals(personInfoData.get("msg").getAsString())) {
+                JsonObject dataJson = personInfoData.get("data").getAsJsonObject();
+                if (dataJson.get("total").getAsInt() > 0) {
+                    JsonArray personPhoto = dataJson.get("list").getAsJsonArray().get(0)
+                            .getAsJsonObject().get("personPhoto").getAsJsonArray();
+                    if (personPhoto.size() > 0) {
+                        faceId = personPhoto.get(0).getAsJsonObject().get("personPhotoIndexCode").getAsString();
+                    }
+                }
+            }
+
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("faceId", faceId);
+
+            String result = apiUtil.doPost(apiPath, paramJson.toString(), null);
+            process.setExamStatus(2);
+            process.setHikvisionResult(result);
+            process.setDeleteMark(DeleteMark.DELETED.getCode());
+            process.setModifyUserId(StpUtil.getLoginIdAsLong());
+            process.setModifyDate(new Date());
+            this.baseMapper.updateById(process);
+
+            FaceManagement faceManagement = faceManagementService.getOne(
+                    new QueryWrapper<FaceManagement>().lambda()
+                            .eq(FaceManagement::getUserId, process.getUserId())
+                            .eq(FaceManagement::getFileId, process.getFacePhoto())
+            );
+            if (faceManagement != null) {
+                faceManagement.setRegisterBase64(null);
+                faceManagementService.update(faceManagement);
+            }
+
+        }
+        return true;
+    }
+
 }

+ 8 - 0
src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java

@@ -84,6 +84,14 @@ public class StudentManagerController {
             }
         }
 
+        if(StrUtil.isNotEmpty(dto.getClassIdStr())){
+            List<Long> classIds = new ArrayList<>();
+            for (String classId : dto.getClassIdStr().split(",")) {
+                classIds.add(Long.parseLong(classId));
+            }
+            dto.setClassIds(classIds);
+        }
+
         IPage<BaseStudentUserPageVo> page = studentManagerService.getStudentPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         for (BaseStudentUserPageVo record : page.getRecords()) {
             BaseStudentUser user = studentManagerService.getById(record.getId());

+ 3 - 1
src/main/java/com/xjrsoft/module/student/dto/BaseStudentUserPageDto.java

@@ -63,7 +63,6 @@ public class BaseStudentUserPageDto extends PageInput {
     @JsonIgnore
     private Long teacherId;
 
-
     @JsonIgnore
     private List<Long> classIds;
 
@@ -71,4 +70,7 @@ public class BaseStudentUserPageDto extends PageInput {
     @ApiModelProperty("身份证号")
     private List<String> credentialNumbers;
 
+    @ApiModelProperty("身份证号")
+    private String classIdStr;
+
 }

+ 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);
 

+ 1 - 1
src/main/java/com/xjrsoft/module/student/service/impl/PbCseFeeobjupdateServiceImpl.java

@@ -104,7 +104,7 @@ public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobj
         pbCseSpecplanMPJLambdaWrapper
                 .disableSubLogicDel()
                 .distinct()
-                .select("ifnull(t2.name,t.specname) as kkey")
+                .select("ifnull(t1.name,t.specname) as kkey")
                 .selectAs(PbCseSpecplan::getNum, EnrollmentStatisticsInfoKeyValue::getValue)
                 .leftJoin(BaseMajorSet.class, BaseMajorSet::getName, PbCseSpecplan::getSpecname)
                 .leftJoin(BaseMajorCategor.class, BaseMajorCategor::getId, BaseMajorSet::getMajorCategorId)

+ 64 - 8
src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java

@@ -13,6 +13,7 @@ import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.enums.JobStateEnum;
 import com.xjrsoft.common.enums.RoleEnum;
@@ -21,21 +22,49 @@ import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
-import com.xjrsoft.module.liteflow.node.WfTeacherDepartNode;
-import com.xjrsoft.module.organization.entity.*;
+import com.xjrsoft.module.hikvision.util.DataUtil;
+import com.xjrsoft.module.organization.entity.Department;
+import com.xjrsoft.module.organization.entity.Post;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.organization.entity.UserPostRelation;
+import com.xjrsoft.module.organization.entity.UserRoleRelation;
 import com.xjrsoft.module.organization.mapper.UserDeptRelationMapper;
 import com.xjrsoft.module.organization.mapper.UserRoleRelationMapper;
-import com.xjrsoft.module.organization.service.*;
+import com.xjrsoft.module.organization.service.IDepartmentService;
+import com.xjrsoft.module.organization.service.IPostService;
+import com.xjrsoft.module.organization.service.IUserDeptRelationService;
+import com.xjrsoft.module.organization.service.IUserPostRelationService;
+import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.personnel.entity.CarMessageApply;
+import com.xjrsoft.module.personnel.mapper.CarMessageApplyMapper;
+import com.xjrsoft.module.personnel.service.ITeacherFaceProcessService;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.system.entity.DictionaryItem;
 import com.xjrsoft.module.system.service.IDictionarydetailService;
 import com.xjrsoft.module.teacher.dto.AddXjrUserDto;
 import com.xjrsoft.module.teacher.dto.UpdateXjrUserDto;
-import com.xjrsoft.module.teacher.entity.*;
-import com.xjrsoft.module.teacher.mapper.*;
-import com.xjrsoft.module.teacher.service.IBaseTeacherChangeRecordService;
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
+import com.xjrsoft.module.teacher.entity.BaseTeacherChangeRecord;
+import com.xjrsoft.module.teacher.entity.BaseTeacherContact;
+import com.xjrsoft.module.teacher.entity.BaseTeacherEducation;
+import com.xjrsoft.module.teacher.entity.BaseTeacherEmploy;
+import com.xjrsoft.module.teacher.entity.BaseTeacherFamily;
+import com.xjrsoft.module.teacher.entity.BaseTeacherFamilyMember;
+import com.xjrsoft.module.teacher.entity.BaseTeacherRegular;
+import com.xjrsoft.module.teacher.entity.WfTeacherDepart;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherChangeRecordMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherContactMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherEducationMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherEmployMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherFamilyMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherFamilyMemberMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherRegularMapper;
+import com.xjrsoft.module.teacher.mapper.WfTeacherDepartMapper;
+import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
 import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
-import com.xjrsoft.module.textbook.entity.WfTextbookRecede;
 import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
 import lombok.AllArgsConstructor;
@@ -47,7 +76,12 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -88,6 +122,9 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
 
     private WorkflowFormRelationMapper workflowFormRelationMapper;
 
+    private final ITeacherFaceProcessService teacherFaceProcessService;
+    private final CarMessageApplyMapper carMessageApplyMapper;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -820,6 +857,25 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void disabledUser(Long userId) {
+        XjrUser xjrUser = this.getById(userId);
+        xjrUser.setDeleteMark(DeleteMark.DELETED.getCode());
+        xjrUser.setEnabledMark(EnabledMark.DISABLED.getCode());
+        this.updateById(xjrUser);
+
+        //清除海康人脸
+        teacherFaceProcessService.removeByUserId(userId);
+
+        DataUtil dataUtil = new DataUtil();
 
+        List<Long> userIds = new ArrayList<>();
+        userIds.add(userId);
+        dataUtil.deletePerson(userIds);
+
+        List<CarMessageApply> carList = carMessageApplyMapper.selectList(
+                new QueryWrapper<CarMessageApply>().lambda()
+                        .eq(CarMessageApply::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(CarMessageApply::getUserId, userId)
+        );
+        dataUtil.deleteCar(carList);
     }
 }

+ 12 - 0
src/main/resources/mapper/student/BaseStudentMapper.xml

@@ -100,6 +100,18 @@
         <if test="dto.teacherId != null">
             and t4.teacher_id = #{dto.teacherId}
         </if>
+        <if test="dto.classIds != null and dto.classIds.size() > 0">
+            and t3.class_id in
+            <foreach item="classId" index="index" collection="dto.classIds" open="(" close=")" separator=",">
+                #{classId}
+            </foreach>
+        </if>
+        <if test="dto.credentialNumbers != null and dto.credentialNumbers.size() > 0">
+            and t1.credential_number in
+            <foreach item="credentialNumber" index="index" collection="dto.credentialNumbers" open="(" close=")" separator=",">
+                #{credentialNumber}
+            </foreach>
+        </if>
         <if test="dto.order == null">
             order by t1.id
         </if>

+ 62 - 0
src/main/resources/sqlScript/20250408_sql.sql

@@ -0,0 +1,62 @@
+-- ---------------------------------------------------------------
+-- 学生复读流程
+-- ---------------------------------------------------------------
+CREATE TABLE `wf_student_repeat_study` (
+  `id` BIGINT NOT NULL COMMENT '主键',
+  `create_user_id` BIGINT DEFAULT NULL COMMENT '创建人',
+  `create_date` DATETIME(3) DEFAULT NULL COMMENT '创建时间',
+  `modify_user_id` BIGINT DEFAULT NULL COMMENT '修改人id',
+  `modify_date` DATETIME(3) DEFAULT NULL COMMENT '修改日期',
+  `delete_mark` INT DEFAULT NULL COMMENT '删除标记(0:未删除 1:已删除)',
+  `enabled_mark` INT DEFAULT NULL COMMENT '有效标记(0:未启用 1:已启用)',
+  `is_original` INT DEFAULT NULL COMMENT '是否本校生(1:是 0:否)',
+  `name` VARCHAR(50) DEFAULT NULL COMMENT '学生姓名',
+  `credential_number` VARCHAR(30) DEFAULT NULL COMMENT '身份证',
+  `old_grade_id` BIGINT DEFAULT NULL COMMENT '原年级id',
+  `old_class_id` BIGINT(30) DEFAULT NULL COMMENT '原班级id',
+  `archives_status` VARCHAR(20) DEFAULT NULL COMMENT '学籍状态',
+  `mobile` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
+  `grade_id` BIGINT DEFAULT NULL COMMENT '年级id(base_grade)',
+  `major_set_id` BIGINT DEFAULT NULL COMMENT '专业方向id',
+  `class_id` BIGINT DEFAULT NULL COMMENT '教务处审批班级',
+  `stduy_status` VARCHAR(30) DEFAULT NULL COMMENT '就读方式',
+  `teacher_id` BIGINT DEFAULT NULL COMMENT '班主任id(xjr_user)',
+  `teacher_name` VARCHAR(20) DEFAULT NULL COMMENT '班主任姓名',
+  `remarks` VARCHAR(500) DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生复读流程';
+
+
+-- ---------------------------------------------------------------
+-- 班级合并
+-- ---------------------------------------------------------------
+CREATE TABLE `base_class_merge` (
+  `id` BIGINT NOT NULL COMMENT '主键',
+  `create_user_id` BIGINT DEFAULT NULL COMMENT '创建人',
+  `create_date` DATETIME DEFAULT NULL COMMENT '创建时间',
+  `modify_user_id` BIGINT DEFAULT NULL COMMENT '修改人id',
+  `modify_date` DATETIME DEFAULT NULL COMMENT '修改日期',
+  `delete_mark` INT DEFAULT NULL COMMENT '删除标记(0:未删除 1:已删除)',
+  `enabled_mark` INT DEFAULT NULL COMMENT '有效标记(0:未启用 1:已启用)',
+  `student_count` INT DEFAULT NULL COMMENT '涉及学生人数',
+  `target_class_id` BIGINT DEFAULT NULL COMMENT '目标班级',
+  `reason` VARCHAR(500) DEFAULT NULL COMMENT '原因',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='班级合并';
+
+-- ---------------------------------------------------------------
+-- 班级合并涉及学生
+-- ---------------------------------------------------------------
+CREATE TABLE `base_class_merge_student` (
+  `id` BIGINT NOT NULL COMMENT '主键',
+  `create_user_id` BIGINT DEFAULT NULL COMMENT '创建人',
+  `create_date` DATETIME DEFAULT NULL COMMENT '创建时间',
+  `modify_user_id` BIGINT DEFAULT NULL COMMENT '修改人id',
+  `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)',
+  `class_id` BIGINT DEFAULT NULL COMMENT '原有班级',
+  `user_id` BIGINT DEFAULT NULL COMMENT '学生id',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='班级合并涉及学生';

+ 3 - 3
src/main/resources/sqlScript/今日安排视图.sql

@@ -1,4 +1,3 @@
-
 -- id,开始时间,结束时间,右上角的类别,中间竖线左边内容,中间竖线右边地点,底部类别,名称,参与人id
 DROP VIEW IF EXISTS today_schedule;
 CREATE VIEW today_schedule AS
@@ -31,9 +30,10 @@ t1.adjust_type,t1.class_name,t2.name AS place,t1.course_name,7,t1.teacher_id AS
 INNER JOIN base_classroom t2 ON t1.site_id = t2.id
 WHERE t1.schedule_date = DATE_FORMAT(NOW(), '%Y-%m-%d')
 UNION ALL
-SELECT t1.id,CONCAT(t1.meeting_apply_date, t1.meeting_apply_s),CONCAT(t1.meeting_apply_date,t1.meeting_apply_e),'会议',
-CONCAT(t4.name,t3.name) AS place,'会议',t1.meeting_apply_theme,8,t2.user_id FROM wf_meeting_apply t1
+SELECT t1.id,CONCAT(t1.meeting_apply_date, ' ', t1.meeting_apply_s),CONCAT(t1.meeting_apply_date, ' ',t1.meeting_apply_e),NULL,
+IFNULL(CONCAT(t4.name,t3.name), t1.meeting_apply_url),t5.name,t1.meeting_apply_theme,8,t2.user_id FROM wf_meeting_apply t1
 INNER JOIN meeting_conferee t2 ON t2.wf_meeting_apply_id = t1.id
 LEFT JOIN meeting_room t3 ON t1.meeting_room_id = t3.id
 LEFT JOIN base_office_build t4 ON t3.office_build_id = t4.id
+LEFT JOIN xjr_dictionary_detail t5 ON t1.meeting_apply_format = t5.code
 WHERE t1.meeting_apply_date = DATE_FORMAT(NOW(), '%Y-%m-%d');

+ 4 - 2
src/test/java/com/xjrsoft/module/job/BaseNewStudentTaskTest.java

@@ -146,7 +146,7 @@ class BaseNewStudentTaskTest {
         List<BaseNewStudent> insertList = new ArrayList<>();
         for (PbCseFeeobjupdate feeobjupdate : dataList) {
             BaseNewStudent existsNewStudent = existsNewStudentMap.get(feeobjupdate.getPersonalid());
-
+            Long planId = planMap.get(feeobjupdate.getEnteryear() + feeobjupdate.getUserdef6());
             if (existsNewStudent != null) {
                 existsNewStudent.setName(feeobjupdate.getFeeobjname());
                 existsNewStudent.setPaymnystate(feeobjupdate.getPaymnystate());
@@ -165,6 +165,7 @@ class BaseNewStudentTaskTest {
                     }
                 }
                 existsNewStudent.setGraduateSchool(feeobjupdate.getGraduations());
+                existsNewStudent.setGraduateClass(feeobjupdate.getGradclass());
                 existsNewStudent.setStduyStatus(StudyStatusEnum.getCode(feeobjupdate.getQuartername()));
                 existsNewStudent.setSource(StudentTypeEnum.getCode(feeobjupdate.getResourcename()));
                 existsNewStudent.setMobile(feeobjupdate.getTelephone());
@@ -178,12 +179,12 @@ class BaseNewStudentTaskTest {
                 existsNewStudent.setModifyDate(new Date());
                 existsNewStudent.setStatus(0);
                 existsNewStudent.setIsCanBanding(1);
+                existsNewStudent.setEnrollmentPlanId(planId);
 
                 updateList.add(existsNewStudent);
                 continue;
             }
 
-            Long planId = planMap.get(feeobjupdate.getEnteryear() + feeobjupdate.getUserdef6());
             insertList.add(
                     new BaseNewStudent() {{
                         setCredentialNumber(feeobjupdate.getPersonalid());
@@ -204,6 +205,7 @@ class BaseNewStudentTaskTest {
                             }
                         }
                         setGraduateSchool(feeobjupdate.getGraduations());
+                        setGraduateClass(feeobjupdate.getGradclass());
                         setStduyStatus(StudyStatusEnum.getCode(feeobjupdate.getQuartername()));
                         setSource(StudentTypeEnum.getCode(feeobjupdate.getResourcename()));
                         setMobile(feeobjupdate.getTelephone());

+ 34 - 0
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -4594,4 +4594,38 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    @Test
+    public void gcBaseClassMerge() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("base_class_merge");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        mainTable = new TableConfig();
+        mainTable.setTableName("base_class_merge_student");//init_sql中的表名
+        mainTable.setIsMain(false);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        mainTable.setRelationField("base_class_merge_id");//设置外键
+        mainTable.setRelationTableField(GlobalConstant.DEFAULT_PK);//设置外键
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("dzx");//作者名称
+        params.setPackageName("base");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
 }