Browse Source

Merge branch 'pre'

dzx 1 year ago
parent
commit
8920652902
37 changed files with 813 additions and 332 deletions
  1. 3 1
      src/main/java/com/xjrsoft/common/enums/CourseAdjustTypeEnum.java
  2. 2 3
      src/main/java/com/xjrsoft/module/activity/dto/ChangeStatusDto.java
  3. 19 8
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java
  4. 11 3
      src/main/java/com/xjrsoft/module/classtime/controller/ClassTimeCalendarController.java
  5. 8 11
      src/main/java/com/xjrsoft/module/classtime/controller/ClassTimeDeleteController.java
  6. 27 5
      src/main/java/com/xjrsoft/module/classtime/controller/ClassTimeStatisticsController.java
  7. 3 3
      src/main/java/com/xjrsoft/module/classtime/dto/AddClassTimeCalendarDto.java
  8. 2 2
      src/main/java/com/xjrsoft/module/classtime/dto/AddClassTimeDeleteDto.java
  9. 9 0
      src/main/java/com/xjrsoft/module/classtime/dto/ClassTimeDeletePageDto.java
  10. 5 3
      src/main/java/com/xjrsoft/module/classtime/entity/ClassTimeCalendar.java
  11. 3 0
      src/main/java/com/xjrsoft/module/classtime/entity/ClassTimeDelete.java
  12. 5 0
      src/main/java/com/xjrsoft/module/classtime/mapper/ClassTimeDeleteMapper.java
  13. 5 1
      src/main/java/com/xjrsoft/module/classtime/mapper/ClassTimeStatisticsMapper.java
  14. 14 0
      src/main/java/com/xjrsoft/module/classtime/service/IClassTimeCalendarService.java
  15. 6 0
      src/main/java/com/xjrsoft/module/classtime/service/IClassTimeDeleteService.java
  16. 11 0
      src/main/java/com/xjrsoft/module/classtime/service/IClassTimeStatisticsService.java
  17. 93 0
      src/main/java/com/xjrsoft/module/classtime/service/impl/ClassTimeCalendarServiceImpl.java
  18. 7 0
      src/main/java/com/xjrsoft/module/classtime/service/impl/ClassTimeDeleteServiceImpl.java
  19. 289 232
      src/main/java/com/xjrsoft/module/classtime/service/impl/ClassTimeStatisticsServiceImpl.java
  20. 6 2
      src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeCalendarPageVo.java
  21. 5 4
      src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeCalendarVo.java
  22. 13 29
      src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeDeletePageVo.java
  23. 116 0
      src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeStatisticsRecordExcelVo.java
  24. 5 17
      src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeStatisticsRecordVo.java
  25. 3 0
      src/main/java/com/xjrsoft/module/classtime/vo/CourseListVo.java
  26. 0 2
      src/main/java/com/xjrsoft/module/classtime/vo/TeacherListVo.java
  27. 0 1
      src/main/java/com/xjrsoft/module/classtime/vo/WeekTimeRangeVo.java
  28. 1 0
      src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java
  29. 1 3
      src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java
  30. 2 0
      src/main/java/com/xjrsoft/module/organization/service/IUserService.java
  31. 55 0
      src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java
  32. 17 0
      src/main/java/com/xjrsoft/module/schedule/service/ICourseTableBakService.java
  33. 19 0
      src/main/java/com/xjrsoft/module/schedule/service/impl/CourseTableBakServiceImpl.java
  34. 1 0
      src/main/java/com/xjrsoft/module/student/controller/BaseStudentAssessmentInspectionController.java
  35. 5 0
      src/main/java/com/xjrsoft/module/student/service/impl/BaseNewStudentServiceImpl.java
  36. 24 0
      src/main/resources/mapper/classtime/ClassTimeDeleteMapper.xml
  37. 18 2
      src/main/resources/mapper/classtime/ClassTimeStatisticsMapper.xml

+ 3 - 1
src/main/java/com/xjrsoft/common/enums/CourseAdjustTypeEnum.java

@@ -12,7 +12,9 @@ public enum CourseAdjustTypeEnum {
     /**
      * 调课
      * */
-    courseExchange("course_exchange", "调课");
+    courseExchange("course_exchange", "调课"),
+
+    courseReplace("course_replace", "补班");
 
     final String code;
     final String value;

+ 2 - 3
src/main/java/com/xjrsoft/module/activity/dto/ChangeStatusDto.java

@@ -22,9 +22,8 @@ public class ChangeStatusDto implements Serializable {
     */
     @ApiModelProperty("主键编号")
     private Long id;
-    /**
-    * 状态(0:未发布 1:报名中 2:报名结束 3:活动结束)
-    */
+
+
     @ApiModelProperty("状态")
     private Integer status;
 }

+ 19 - 8
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java

@@ -2,9 +2,11 @@ package com.xjrsoft.module.banding.service.impl;
 
 import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.IdUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.enums.DeleteMark;
@@ -55,7 +57,6 @@ 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;
 
@@ -205,7 +206,7 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
 
                 /**
                  * 新增学生数据
-                 * 1、新增用户xjr_user
+                 * 1、新增用户xjr_user,需要先查询用户信息是否已经存在
                  * 2、新增用户与角色的关系xjr_user_role_relation
                  * 3、新增学生基本信息base_student
                  * 4、新增学籍信息表base_student_school_roll
@@ -213,12 +214,26 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                  */
                 LocalDateTime now = LocalDateTime.now();
                 List<String> idNumbers = updateList.stream().map(BaseNewStudent::getCredentialNumber).collect(Collectors.toList());
-                List<User> students = userService.list(new QueryWrapper<User>().lambda().in(User::getCredentialNumber, idNumbers));
-                Map<String, Long> userSet = students.stream().collect(Collectors.toMap(User::getCredentialNumber, User::getId));
+                List<User> students = userService.list(
+                        new MPJLambdaWrapper<User>()
+                                .disableLogicDel()
+                                .in(User::getCredentialNumber, idNumbers)
+                                .orderByAsc(User::getCreateDate)
+                );
+                Map<String, Long> userSet = new HashMap<>();
+                Map<String, Integer> userDeleteMarkMap = new HashMap<>();
+                for (User student : students) {
+                    userSet.put(student.getCredentialNumber(), student.getId());
+                    userDeleteMarkMap.put(student.getCredentialNumber(), student.getDeleteMark());
+                }
                 Map<Long, Long> studentClassRelation = dataList.stream().collect(Collectors.toMap(BandingTaskClassStudent::getNewStudentId, BandingTaskClassStudent::getBandingTaskClassId));
                 for (BaseNewStudent student : updateList) {
                     if(userSet.containsKey(student.getCredentialNumber())){
                         schoolRollService.updateStudentClass(classMap.get(studentClassRelation.get(student.getId())), userSet.get(student.getCredentialNumber()));
+                        Integer deleteMark = userDeleteMarkMap.get(student.getCredentialNumber());
+                        if(deleteMark != null && deleteMark == 1){
+                            userService.recoveryStudentInfo(userSet.get(student.getCredentialNumber()));
+                        }
                         continue;
                     }
                     LocalDate birthDate = getBirthDate(student.getCredentialNumber());
@@ -294,10 +309,6 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
         return true;
     }
 
-    void createStudentData(Long badingTaskId,List<BandingTaskClassStudent> classStudents, List<BaseNewStudent> updateList){
-
-    }
-
     LocalDate getBirthDate(String idCardNumber){
         // 获取出生日期前6位,即yyyyMM
         String birthdayString = idCardNumber.substring(6, 14);

+ 11 - 3
src/main/java/com/xjrsoft/module/classtime/controller/ClassTimeCalendarController.java

@@ -10,6 +10,7 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.classtime.dto.AddClassTimeCalendarDto;
 import com.xjrsoft.module.classtime.dto.ClassTimeCalendarPageDto;
+import com.xjrsoft.module.classtime.dto.RefreshStatisticsDto;
 import com.xjrsoft.module.classtime.dto.UpdateClassTimeCalendarDto;
 import com.xjrsoft.module.classtime.entity.ClassTimeCalendar;
 import com.xjrsoft.module.classtime.service.IClassTimeCalendarService;
@@ -75,9 +76,8 @@ public class ClassTimeCalendarController {
     @ApiOperation(value = "新增节假日调课设置")
     @SaCheckPermission("classtimecalendar:add")
     public RT<Boolean> add(@Valid @RequestBody AddClassTimeCalendarDto dto){
-        ClassTimeCalendar classTimeCalendar = BeanUtil.toBean(dto, ClassTimeCalendar.class);
-        boolean isSuccess = classTimeCalendarService.save(classTimeCalendar);
-    return RT.ok(isSuccess);
+        boolean isSuccess = classTimeCalendarService.add(dto);
+        return RT.ok(isSuccess);
     }
 
     @PutMapping
@@ -98,4 +98,12 @@ public class ClassTimeCalendarController {
 
     }
 
+    @PostMapping(value = "/cancel")
+    @ApiOperation(value="作废")
+    @SaCheckPermission("classtimecalendar:detail")
+    public RT<Boolean> cancel(@Valid @RequestBody RefreshStatisticsDto dto) throws Exception {
+        Boolean cancel = classTimeCalendarService.cancel(dto.getId());
+        return RT.ok(cancel);
+    }
+
 }

+ 8 - 11
src/main/java/com/xjrsoft/module/classtime/controller/ClassTimeDeleteController.java

@@ -2,13 +2,11 @@ package com.xjrsoft.module.classtime.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.activity.dto.ChangeStatusDto;
 import com.xjrsoft.module.classtime.dto.AddClassTimeDeleteDto;
 import com.xjrsoft.module.classtime.dto.ClassTimeDeletePageDto;
@@ -30,6 +28,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -52,12 +51,8 @@ public class ClassTimeDeleteController {
     @SaCheckPermission("classtimedelete:detail")
     public RT<PageOutput<ClassTimeDeletePageVo>> page(@Valid ClassTimeDeletePageDto dto){
 
-        LambdaQueryWrapper<ClassTimeDelete> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper
-                    .orderByDesc(ClassTimeDelete::getId)
-                .select(ClassTimeDelete.class,x -> VoToColumnUtil.fieldsToColumns(ClassTimeDeletePageVo.class).contains(x.getProperty()));
-        IPage<ClassTimeDelete> page = classTimeDeleteService.page(ConventPage.getPage(dto), queryWrapper);
-        PageOutput<ClassTimeDeletePageVo> pageOutput = ConventPage.getPageOutput(page, ClassTimeDeletePageVo.class);
+        Page<ClassTimeDeletePageVo> pages = classTimeDeleteService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<ClassTimeDeletePageVo> pageOutput = ConventPage.getPageOutput(pages, ClassTimeDeletePageVo.class);
         return RT.ok(pageOutput);
     }
 
@@ -78,8 +73,9 @@ public class ClassTimeDeleteController {
     @SaCheckPermission("classtimedelete:add")
     public RT<Boolean> add(@Valid @RequestBody AddClassTimeDeleteDto dto){
         ClassTimeDelete classTimeDelete = BeanUtil.toBean(dto, ClassTimeDelete.class);
+        classTimeDelete.setCreateDate(new Date());
         boolean isSuccess = classTimeDeleteService.save(classTimeDelete);
-    return RT.ok(isSuccess);
+        return RT.ok(isSuccess);
     }
 
     @PutMapping
@@ -88,6 +84,7 @@ public class ClassTimeDeleteController {
     public RT<Boolean> update(@Valid @RequestBody UpdateClassTimeDeleteDto dto){
 
         ClassTimeDelete classTimeDelete = BeanUtil.toBean(dto, ClassTimeDelete.class);
+        classTimeDelete.setModifyDate(new Date());
         return RT.ok(classTimeDeleteService.updateById(classTimeDelete));
 
     }
@@ -108,7 +105,7 @@ public class ClassTimeDeleteController {
         if(classTimeDelete == null){
             throw new MyException("未能查到数据");
         }
-        classTimeDelete.setEnabledMark(dto.getStatus());
+        classTimeDelete.setStatus(dto.getStatus());
         classTimeDeleteService.updateById(classTimeDelete);
         return RT.ok(true);
     }

+ 27 - 5
src/main/java/com/xjrsoft/module/classtime/controller/ClassTimeStatisticsController.java

@@ -20,6 +20,7 @@ import com.xjrsoft.module.classtime.entity.ClassTimeStatisticsSet;
 import com.xjrsoft.module.classtime.service.IClassTimeStatisticsService;
 import com.xjrsoft.module.classtime.service.IClassTimeStatisticsSetService;
 import com.xjrsoft.module.classtime.vo.ClassTimeStatisticsPageVo;
+import com.xjrsoft.module.classtime.vo.ClassTimeStatisticsRecordVo;
 import com.xjrsoft.module.classtime.vo.ClassTimeStatisticsVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -37,7 +38,6 @@ import javax.validation.Valid;
 import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 
 /**
 * @title: 课时统计
@@ -117,6 +117,9 @@ public class ClassTimeStatisticsController {
         }
         statistics.setStatus(dto.getStatus());
         classTimeStatisticsService.updateById(statistics);
+        if(dto.getStatus() != null && dto.getStatus() == 3){
+            classTimeStatisticsService.lockData(dto.getId());
+        }
         return RT.ok(true);
     }
 
@@ -150,9 +153,10 @@ public class ClassTimeStatisticsController {
                         .eq(ClassTimeStatisticsSet::getCategory, category)
                         .orderByDesc(ClassTimeStatisticsSet::getCreateDate)
         );
-        if(!list.isEmpty()){
-            classTimeStatistics.setWeightSetJson(list.get(0).getJsonContent());
+        if(list.isEmpty()){
+            throw new MyException("请先设置权重并进行保存");
         }
+        classTimeStatistics.setWeightSetJson(list.get(0).getJsonContent());
 
         //查询最新费用并保存到统计中
         category = 2;
@@ -161,9 +165,10 @@ public class ClassTimeStatisticsController {
                         .eq(ClassTimeStatisticsSet::getCategory, category)
                         .orderByDesc(ClassTimeStatisticsSet::getCreateDate)
         );
-        if(!list.isEmpty()){
-            classTimeStatistics.setCostSetJson(list.get(0).getJsonContent());
+        if(list.isEmpty()){
+            throw new MyException("请先设置费用并进行保存");
         }
+        classTimeStatistics.setCostSetJson(list.get(0).getJsonContent());
         Boolean aBoolean = classTimeStatisticsService.updateById(classTimeStatistics);
 
 //        CompletableFuture.runAsync(() -> {
@@ -174,4 +179,21 @@ public class ClassTimeStatisticsController {
         return RT.ok(aBoolean);
     }
 
+
+    @GetMapping(value = "/record-list")
+    @ApiOperation(value="课时统计详情列表")
+    @SaCheckPermission("classtimestatistics:detail")
+    public RT<List<ClassTimeStatisticsRecordVo>> recordPage(@Valid RefreshStatisticsDto dto){
+        List<ClassTimeStatisticsRecordVo> recordList = classTimeStatisticsService.getRecordList(dto.getId());
+        return RT.ok(recordList);
+    }
+
+    @GetMapping(value = "/record-export")
+    @ApiOperation(value="课时统计详情导出")
+    @SaCheckPermission("classtimestatistics:detail")
+    public RT<List<ClassTimeStatisticsRecordVo>> recordExport(@Valid RefreshStatisticsDto dto){
+        List<ClassTimeStatisticsRecordVo> recordList = classTimeStatisticsService.getRecordList(dto.getId());
+        return RT.ok(recordList);
+    }
+
 }

+ 3 - 3
src/main/java/com/xjrsoft/module/classtime/dto/AddClassTimeCalendarDto.java

@@ -5,7 +5,7 @@ import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
-import java.util.Date;
+import java.time.LocalDate;
 
 
 
@@ -25,12 +25,12 @@ public class AddClassTimeCalendarDto implements Serializable {
     */
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty("补班日期")
-    private Date supplementDate;
+    private LocalDate supplementDate;
     /**
     * 补课日期
     */
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty("补课日期")
-    private Date replaceDate;
+    private LocalDate replaceDate;
 
 }

+ 2 - 2
src/main/java/com/xjrsoft/module/classtime/dto/AddClassTimeDeleteDto.java

@@ -28,8 +28,8 @@ public class AddClassTimeDeleteDto implements Serializable {
     /**
     * 类别(1:权重 2:费用设置)
     */
-    @ApiModelProperty("类别(1:权重 2:费用设置)")
-    private Integer classId;
+    @ApiModelProperty("班级id")
+    private Long classId;
     /**
     * 删除说明
     */

+ 9 - 0
src/main/java/com/xjrsoft/module/classtime/dto/ClassTimeDeletePageDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.classtime.dto;
 
 import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -15,5 +16,13 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = false)
 public class ClassTimeDeletePageDto extends PageInput {
 
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    @ApiModelProperty("删除类型(xjr_dictionary_item[class_time_delete])")
+    private String type;
+
+    @ApiModelProperty("状态(0:生效 1:锁定 2:作废)")
+    private Integer enabledMark;
 
 }

+ 5 - 3
src/main/java/com/xjrsoft/module/classtime/entity/ClassTimeCalendar.java

@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.time.LocalDate;
 import java.util.Date;
 
 
@@ -73,12 +74,13 @@ public class ClassTimeCalendar implements Serializable {
     * 补班日期
     */
     @ApiModelProperty("补班日期")
-    private Date supplementDate;
+    private LocalDate supplementDate;
     /**
     * 补课日期
     */
     @ApiModelProperty("补课日期")
-    private Date replaceDate;
-
+    private LocalDate replaceDate;
 
+    @ApiModelProperty("状态(0:生效 1:锁定 2:作废)")
+    private Integer status;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/classtime/entity/ClassTimeDelete.java

@@ -96,5 +96,8 @@ public class ClassTimeDelete implements Serializable {
     @ApiModelProperty("结束日期")
     private LocalDate endDate;
 
+    @ApiModelProperty("状态(0:生效 1:锁定 2:作废)")
+    private Integer status;
+
 
 }

+ 5 - 0
src/main/java/com/xjrsoft/module/classtime/mapper/ClassTimeDeleteMapper.java

@@ -1,8 +1,12 @@
 package com.xjrsoft.module.classtime.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.classtime.dto.ClassTimeDeletePageDto;
 import com.xjrsoft.module.classtime.entity.ClassTimeDelete;
+import com.xjrsoft.module.classtime.vo.ClassTimeDeletePageVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
 * @title: 课时删除
@@ -13,4 +17,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface ClassTimeDeleteMapper extends MPJBaseMapper<ClassTimeDelete> {
 
+    Page<ClassTimeDeletePageVo> getPage(Page<ClassTimeDeletePageVo> page, @Param("dto") ClassTimeDeletePageDto dto);
 }

+ 5 - 1
src/main/java/com/xjrsoft/module/classtime/mapper/ClassTimeStatisticsMapper.java

@@ -1,7 +1,9 @@
 package com.xjrsoft.module.classtime.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.classtime.entity.ClassTimeStatistics;
+import com.xjrsoft.module.classtime.vo.ClassTimeStatisticsRecordVo;
 import com.xjrsoft.module.classtime.vo.CourseListVo;
 import com.xjrsoft.module.classtime.vo.TeacherListVo;
 import com.xjrsoft.module.oa.entity.WfTeacherCourseTime;
@@ -29,7 +31,7 @@ public interface ClassTimeStatisticsMapper extends MPJBaseMapper<ClassTimeStatis
      * 查询所有课时补充数据
      * @return 数据集合
      */
-    List<WfTeacherCourseTime> getWfTeacherCourseTimeList();
+    List<WfTeacherCourseTime> getWfTeacherCourseTimeList(@Param("dto") ClassTimeStatistics dto);
 
     List<CourseListVo> getCourseList(@Param("dto") ClassTimeStatistics dto);
 
@@ -39,4 +41,6 @@ public interface ClassTimeStatisticsMapper extends MPJBaseMapper<ClassTimeStatis
      * @return
      */
     List<CourseListVo> getSubstituteList(@Param("dto") ClassTimeStatistics dto);
+
+    List<ClassTimeStatisticsRecordVo> getRecordList(@Param("id") Long id);
 }

+ 14 - 0
src/main/java/com/xjrsoft/module/classtime/service/IClassTimeCalendarService.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.classtime.service;
 
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.classtime.dto.AddClassTimeCalendarDto;
 import com.xjrsoft.module.classtime.entity.ClassTimeCalendar;
 
 /**
@@ -11,4 +12,17 @@ import com.xjrsoft.module.classtime.entity.ClassTimeCalendar;
 */
 
 public interface IClassTimeCalendarService extends MPJBaseService<ClassTimeCalendar> {
+    /**
+     * 添加,添加成功后,调整课程数据
+     * @param dto
+     * @return
+     */
+    Boolean add(AddClassTimeCalendarDto dto);
+
+    /**
+     * 作废,恢复数据并删除补班的数据
+     * @param id
+     * @return
+     */
+    Boolean cancel(Long id);
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/classtime/service/IClassTimeDeleteService.java

@@ -1,7 +1,11 @@
 package com.xjrsoft.module.classtime.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.classtime.dto.ClassTimeDeletePageDto;
 import com.xjrsoft.module.classtime.entity.ClassTimeDelete;
+import com.xjrsoft.module.classtime.vo.ClassTimeDeletePageVo;
+import org.apache.ibatis.annotations.Param;
 
 /**
 * @title: 课时删除
@@ -11,4 +15,6 @@ import com.xjrsoft.module.classtime.entity.ClassTimeDelete;
 */
 
 public interface IClassTimeDeleteService extends MPJBaseService<ClassTimeDelete> {
+
+    Page<ClassTimeDeletePageVo> getPage(Page<ClassTimeDeletePageVo> page, ClassTimeDeletePageDto dto);
 }

+ 11 - 0
src/main/java/com/xjrsoft/module/classtime/service/IClassTimeStatisticsService.java

@@ -3,6 +3,8 @@ package com.xjrsoft.module.classtime.service;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.classtime.dto.AddClassTimeStatisticsDto;
 import com.xjrsoft.module.classtime.entity.ClassTimeStatistics;
+import com.xjrsoft.module.classtime.vo.ClassTimeStatisticsRecordVo;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -46,4 +48,13 @@ public interface IClassTimeStatisticsService extends MPJBaseService<ClassTimeSta
     Boolean add(AddClassTimeStatisticsDto dto);
 
     Boolean refreshRecord(ClassTimeStatistics statistics);
+
+    /**
+     * 锁定数据
+     * @param id
+     * @return
+     */
+    Boolean lockData(Long id);
+
+    List<ClassTimeStatisticsRecordVo> getRecordList(@Param("id") Long id);
 }

+ 93 - 0
src/main/java/com/xjrsoft/module/classtime/service/impl/ClassTimeCalendarServiceImpl.java

@@ -1,12 +1,25 @@
 package com.xjrsoft.module.classtime.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.enums.CourseAdjustTypeEnum;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.module.classtime.dto.AddClassTimeCalendarDto;
 import com.xjrsoft.module.classtime.entity.ClassTimeCalendar;
 import com.xjrsoft.module.classtime.mapper.ClassTimeCalendarMapper;
 import com.xjrsoft.module.classtime.service.IClassTimeCalendarService;
+import com.xjrsoft.module.courseTable.entity.CourseTable;
+import com.xjrsoft.module.courseTable.service.ICourseTableService;
+import com.xjrsoft.module.schedule.entity.CourseTableBak;
+import com.xjrsoft.module.schedule.service.ICourseTableBakService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
 /**
 * @title: 节假日调课设置
 * @Author dzx
@@ -16,4 +29,84 @@ import org.springframework.stereotype.Service;
 @Service
 @AllArgsConstructor
 public class ClassTimeCalendarServiceImpl extends MPJBaseServiceImpl<ClassTimeCalendarMapper, ClassTimeCalendar> implements IClassTimeCalendarService {
+    private final ICourseTableService courseTableService;
+    private final ICourseTableBakService courseTableBakService;
+
+    @Override
+    public Boolean add(AddClassTimeCalendarDto dto) {
+        try {
+            ClassTimeCalendar classTimeCalendar = BeanUtil.toBean(dto, ClassTimeCalendar.class);
+            //1、查询补课日期的数据,将日期设置为补班日期然后新增
+            List<CourseTable> list = courseTableService.list(
+                    new QueryWrapper<CourseTable>().lambda()
+                            .eq(CourseTable::getScheduleDate, dto.getReplaceDate())
+            );
+            if(list.isEmpty()){
+                throw new MyException("未能查询到补课日期那天的课表信息,请联系管理员");
+            }
+
+            //2、删除补班日期的课表数据,包括调课和顶课,并肩删除的数据进行备份
+            List<CourseTable> deleteList = courseTableService.list(
+                    new QueryWrapper<CourseTable>().lambda()
+                            .eq(CourseTable::getScheduleDate, dto.getSupplementDate())
+            );
+            List<CourseTableBak> bakList = new ArrayList<>();
+            for (CourseTable courseTable : deleteList) {
+                CourseTableBak tableBak = BeanUtil.toBean(courseTable, CourseTableBak.class);
+                tableBak.setWfCourseAdjustId(classTimeCalendar.getId());
+                bakList.add(tableBak);
+            }
+            courseTableBakService.saveBatch(bakList);
+
+            //3、将补课日期的数据查询出来,将日期改为补班日期进行新增
+            List<CourseTable> insertList = new ArrayList<>();
+            for (CourseTable courseTable : list) {
+                courseTable.setId(null);
+                courseTable.setScheduleDate(dto.getSupplementDate());
+                courseTable.setAdjustType(CourseAdjustTypeEnum.courseReplace.getCode());
+                insertList.add(courseTable);
+            }
+
+            courseTableService.saveBatch(insertList);
+
+            classTimeCalendar.setCreateDate(new Date());
+            boolean isSuccess = this.save(classTimeCalendar);
+            return isSuccess;
+        }catch (Exception e){
+            log.error(e.getMessage());
+            throw new MyException("添加出错,请联系管理员");
+        }
+    }
+
+    @Override
+    public Boolean cancel(Long id) {
+        try{
+            ClassTimeCalendar calendar = this.getById(id);
+            //1、作废后,删除新增的补班课表数据
+            courseTableService.remove(
+                    new QueryWrapper<CourseTable>().lambda()
+                            .eq(CourseTable::getScheduleDate, calendar.getSupplementDate())
+                            .eq(CourseTable::getAdjustType, CourseAdjustTypeEnum.courseReplace.getCode())
+            );
+            //查询出来备份的数据,并恢复到课表中
+            List<CourseTableBak> list = courseTableBakService.list(
+                    new QueryWrapper<CourseTableBak>().lambda()
+                            .eq(CourseTableBak::getWfCourseAdjustId, calendar.getId())
+            );
+            List<CourseTable> insertList = new ArrayList<>();
+            for (CourseTableBak courseTable : list) {
+                CourseTable table = BeanUtil.toBean(courseTable, CourseTable.class);
+                insertList.add(table);
+            }
+
+            courseTableService.saveBatch(insertList);
+
+            calendar.setStatus(2);
+            calendar.setModifyDate(new Date());
+            return this.updateById(calendar);
+        }catch (Exception e){
+            log.error(e.getMessage());
+            throw new MyException("作废出错,请联系管理员");
+        }
+    }
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/classtime/service/impl/ClassTimeDeleteServiceImpl.java

@@ -1,9 +1,12 @@
 package com.xjrsoft.module.classtime.service.impl;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.classtime.dto.ClassTimeDeletePageDto;
 import com.xjrsoft.module.classtime.entity.ClassTimeDelete;
 import com.xjrsoft.module.classtime.mapper.ClassTimeDeleteMapper;
 import com.xjrsoft.module.classtime.service.IClassTimeDeleteService;
+import com.xjrsoft.module.classtime.vo.ClassTimeDeletePageVo;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
@@ -16,4 +19,8 @@ import org.springframework.stereotype.Service;
 @Service
 @AllArgsConstructor
 public class ClassTimeDeleteServiceImpl extends MPJBaseServiceImpl<ClassTimeDeleteMapper, ClassTimeDelete> implements IClassTimeDeleteService {
+    @Override
+    public Page<ClassTimeDeletePageVo> getPage(Page<ClassTimeDeletePageVo> page, ClassTimeDeletePageDto dto) {
+        return this.baseMapper.getPage(page, dto);
+    }
 }

+ 289 - 232
src/main/java/com/xjrsoft/module/classtime/service/impl/ClassTimeStatisticsServiceImpl.java

@@ -12,6 +12,7 @@ import com.google.gson.JsonParser;
 import com.xjrsoft.common.enums.CourseAdjustTypeEnum;
 import com.xjrsoft.common.enums.CourseTimeTypeEnum;
 import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.module.classtime.dto.AddClassTimeStatisticsDto;
 import com.xjrsoft.module.classtime.entity.ClassTimeDelete;
 import com.xjrsoft.module.classtime.entity.ClassTimeStatistics;
@@ -22,6 +23,7 @@ import com.xjrsoft.module.classtime.mapper.ClassTimeStatisticsRecordMapper;
 import com.xjrsoft.module.classtime.service.IClassTimeDeleteService;
 import com.xjrsoft.module.classtime.service.IClassTimeStatisticsService;
 import com.xjrsoft.module.classtime.service.IClassTimeStatisticsSetService;
+import com.xjrsoft.module.classtime.vo.ClassTimeStatisticsRecordVo;
 import com.xjrsoft.module.classtime.vo.CourseListVo;
 import com.xjrsoft.module.classtime.vo.TeacherListVo;
 import com.xjrsoft.module.classtime.vo.WeekTimeRangeVo;
@@ -98,9 +100,10 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                         .eq(ClassTimeStatisticsSet::getCategory, category)
                         .orderByDesc(ClassTimeStatisticsSet::getCreateDate)
         );
-        if(!list.isEmpty()){
-            classTimeStatistics.setWeightSetJson(list.get(0).getJsonContent());
+        if(list.isEmpty()){
+            throw new MyException("请先设置权重并进行保存");
         }
+        classTimeStatistics.setWeightSetJson(list.get(0).getJsonContent());
 
         //查询最新费用并保存到统计中
         category = 2;
@@ -109,9 +112,10 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                         .eq(ClassTimeStatisticsSet::getCategory, category)
                         .orderByDesc(ClassTimeStatisticsSet::getCreateDate)
         );
-        if(!list.isEmpty()){
-            classTimeStatistics.setCostSetJson(list.get(0).getJsonContent());
+        if(list.isEmpty()){
+            throw new MyException("请先设置费用并进行保存");
         }
+        classTimeStatistics.setCostSetJson(list.get(0).getJsonContent());
         this.save(classTimeStatistics);
 
         CompletableFuture.runAsync(() -> {
@@ -133,271 +137,324 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean refreshRecord(ClassTimeStatistics statistics) {
-        // 1、查询教师
-        List<TeacherListVo> teacherList = this.baseMapper.getTeacherList();
-        // 2、查询补课课时
-        List<WfTeacherCourseTime> courseTimeList = this.baseMapper.getWfTeacherCourseTimeList();
-        //按照课时补充类型分类统计
-        Map<String, List<WfTeacherCourseTime>> courseTimeMap = courseTimeList.stream().collect(Collectors.groupingBy(WfTeacherCourseTime::getCourseTimeType));
-        JsonParser parser = new JsonParser();
-
-        //费用设置jsonArray
-        JsonArray costSetArray = parser.parse(statistics.getCostSetJson()).getAsJsonArray();
-        Map<String, Double> costSetMap = new HashMap<>();
-        for (JsonElement jsonElement : costSetArray) {
-            JsonObject object = jsonElement.getAsJsonObject();
-            costSetMap.put(object.get("field").getAsString(), object.get("value").getAsDouble());
-        }
-
-        //权重设置jsonArray
-        JsonArray weightSetArray = parser.parse(statistics.getWeightSetJson()).getAsJsonArray();
-        Map<String, Double> weightSetMap = new HashMap<>();
-        for (JsonElement jsonElement : weightSetArray) {
-            JsonObject object = jsonElement.getAsJsonObject();
-            weightSetMap.put(object.get("label").getAsString(), object.get("value").getAsDouble());
-        }
-        //计算出这个时间段内一共多少周
-        List<WeekTimeRangeVo> weekTimeRangeVos = calculateNaturalWeeks(statistics.getStartDate(), statistics.getEndDate());
-
-        //查询课程数据,排除开节假日的数据
-        List<CourseListVo> allCourseList = this.baseMapper.getCourseList(statistics);
-
-        //查询补班日期
-
+        try {
+            // 1、查询教师
+            List<TeacherListVo> teacherList = this.baseMapper.getTeacherList();
+            // 2、查询补课课时
+            List<WfTeacherCourseTime> courseTimeList = this.baseMapper.getWfTeacherCourseTimeList(statistics);
+            //按照课时补充类型分类统计
+            Map<String, List<WfTeacherCourseTime>> courseTimeMap = courseTimeList.stream().collect(Collectors.groupingBy(WfTeacherCourseTime::getCourseTimeType));
+            JsonParser parser = new JsonParser();
+
+            //费用设置jsonArray
+            JsonArray costSetArray = parser.parse(statistics.getCostSetJson()).getAsJsonArray();
+            Map<String, Double> costSetMap = new HashMap<>();
+            for (JsonElement jsonElement : costSetArray) {
+                JsonObject object = jsonElement.getAsJsonObject();
+                costSetMap.put(object.get("field").getAsString(), object.get("value").getAsDouble());
+            }
 
-        //查询删除课时的数据,将每个班删除的具体日期统计出来
-        List<ClassTimeDelete> deleteList = deleteService.list(
-                new QueryWrapper<ClassTimeDelete>().lambda()
-                        .ne(ClassTimeDelete::getEnabledMark, EnabledMark.DISABLED)
-        );
-        Map<Long, List<ClassTimeDelete>> deleteDataMap = deleteList.stream().collect(Collectors.groupingBy(ClassTimeDelete::getClassId));
-        Map<Long, Set<LocalDate>> deleteMap = new HashMap<>();//将每个班级计算出来所有被删除的日期存入map
-        for (Long classId : deleteDataMap.keySet()) {
-            List<LocalDate> dateList = new ArrayList<>();
-            for (ClassTimeDelete classTimeDelete : deleteDataMap.get(classId)) {
-                LocalDate currentDate = classTimeDelete.getStartDate();
-                while (!currentDate.isAfter(classTimeDelete.getEndDate())) {
-                    dateList.add(currentDate);
-                    currentDate = currentDate.plusDays(1); // 增加一天
-                }
+            //权重设置jsonArray
+            JsonArray weightSetArray = parser.parse(statistics.getWeightSetJson()).getAsJsonArray();
+            Map<String, Double> weightSetMap = new HashMap<>();
+            for (JsonElement jsonElement : weightSetArray) {
+                JsonObject object = jsonElement.getAsJsonObject();
+                weightSetMap.put(object.get("label").getAsString(), object.get("value").getAsDouble());
             }
-            //去重并存到map中
-            deleteMap.put(classId, new HashSet<>(dateList));
-        }
+            //计算出这个时间段内一共多少周
+            List<WeekTimeRangeVo> weekTimeRangeVos = calculateNaturalWeeks(statistics.getStartDate(), statistics.getEndDate());
 
-        //查询所有老师发起顶课通过的数量(只查询事假、病假),也要分别计算早自习、晚自习、正课、如果日期出入课时删除中,也需要跳过
-        List<CourseListVo> allSubstituteList = this.baseMapper.getSubstituteList(statistics);
-        List<ClassTimeStatisticsRecord> insertList = new ArrayList<>();
-        //循环教师,准备开始计算
-        for (TeacherListVo teacher : teacherList) {
-            ClassTimeStatisticsRecord record = new ClassTimeStatisticsRecord();
-            record.setUserId(teacher.getId());
-            record.setEmployType(teacher.getEmployType());
-
-            Double allClassTime = 0D;
-            //计算补充课时,算作正课课时,但是计算超出课时时不计算这部分
-            for (String courseTimeType : courseTimeMap.keySet()) {
-                List<WfTeacherCourseTime> courseTimes = courseTimeMap.get(courseTimeType);
-                double sum = courseTimes.stream()
-                        .filter(x -> x.getTeacherIds().contains(teacher.getId().toString()))
-                        .mapToDouble(WfTeacherCourseTime::getCourseTime).sum();
-                allClassTime = allClassTime + sum;
-                if(CourseTimeTypeEnum.CTT001.getCode().equals(courseTimeType)){
-                    record.setClassTime1(sum);
-                }else if(CourseTimeTypeEnum.CTT002.getCode().equals(courseTimeType)){
-                    record.setClassTime2(sum);
-                }else if(CourseTimeTypeEnum.CTT003.getCode().equals(courseTimeType)){
-                    record.setClassTime3(sum);
-                }else if(CourseTimeTypeEnum.CTT004.getCode().equals(courseTimeType)){
-                    record.setClassTime4(sum);
-                }else if(CourseTimeTypeEnum.CTT005.getCode().equals(courseTimeType)){
-                    record.setClassTime5(sum);
-                }else if(CourseTimeTypeEnum.CTT006.getCode().equals(courseTimeType)){
-                    record.setClassTime6(sum);
+            //查询课程数据,排除开节假日的数据
+            List<CourseListVo> allCourseList = this.baseMapper.getCourseList(statistics);
+
+            //查询删除课时的数据,将每个班删除的具体日期统计出来
+            List<ClassTimeDelete> deleteList = deleteService.list(
+                    new QueryWrapper<ClassTimeDelete>().lambda()
+                            .ne(ClassTimeDelete::getStatus, 2)
+            );
+            Map<Long, List<ClassTimeDelete>> deleteDataMap = deleteList.stream().collect(Collectors.groupingBy(ClassTimeDelete::getClassId));
+            Map<Long, Set<LocalDate>> deleteMap = new HashMap<>();//将每个班级计算出来所有被删除的日期存入map
+            for (Long classId : deleteDataMap.keySet()) {
+                List<LocalDate> dateList = new ArrayList<>();
+                for (ClassTimeDelete classTimeDelete : deleteDataMap.get(classId)) {
+                    LocalDate currentDate = classTimeDelete.getStartDate();
+                    while (!currentDate.isAfter(classTimeDelete.getEndDate())) {
+                        dateList.add(currentDate);
+                        currentDate = currentDate.plusDays(1); // 增加一天
+                    }
                 }
+                //去重并存到map中
+                deleteMap.put(classId, new HashSet<>(dateList));
             }
-            //早自习、正课、晚辅、顶课、调课
-            Double classTime7 = 0D,classTime8 = 0D,classTime9 = 0D,classTime10 = 0D,classTime11 = 0D;
-
-            List<String> zkList = Arrays.asList("上1","上2","上3","上4","下1","下2","下3","下4");
-            List<String> wzxList = Arrays.asList("晚1","晚2","晚3");
-            //查询出老师的课程
-            List<CourseListVo> courseList = allCourseList.stream()
-                    .filter(x -> x.getTeacherId().contains(teacher.getId().toString()))
-                    .collect(Collectors.toList());
-
-            //循环,统计出各项数据
-            for (CourseListVo courseListVo : courseList) {
-                //如果这个课程数据包含在被删除的课时中,跳过不计算
-                Set<LocalDate> deleteDates = deleteMap.get(courseListVo.getClassId());
-                if(deleteDates != null && deleteDates.contains(courseListVo.getScheduleDate())){
-                    continue;
-                }
-                if("早自习".equals(courseListVo.getShortName())){
-                    classTime7 += weightSetMap.get(courseListVo.getShortName());
-                }else if(zkList.contains(courseListVo.getShortName())){
-                    classTime8 += weightSetMap.get(courseListVo.getShortName());
-                }else if(wzxList.contains(courseListVo.getShortName())){
-                    classTime9 += weightSetMap.get(courseListVo.getShortName());
-                }
 
-                if(courseListVo.getAdjustType() != null && !courseListVo.getAdjustType().isEmpty()){
-                    if(CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseListVo.getAdjustType())){
-                        classTime10 += weightSetMap.get(courseListVo.getShortName());
-                    }else if(CourseAdjustTypeEnum.courseExchange.getCode().equals(courseListVo.getAdjustType())){
-                        classTime11 += weightSetMap.get(courseListVo.getShortName());
+            //查询所有老师发起顶课通过的数量(只查询事假、病假),也要分别计算早自习、晚自习、正课、如果日期出入课时删除中,也需要跳过
+            List<CourseListVo> allSubstituteList = this.baseMapper.getSubstituteList(statistics);
+            List<ClassTimeStatisticsRecord> insertList = new ArrayList<>();
+            //循环教师,准备开始计算
+            for (TeacherListVo teacher : teacherList) {
+                ClassTimeStatisticsRecord record = new ClassTimeStatisticsRecord();
+                record.setUserId(teacher.getId());
+                record.setClassTimeStatisticsId(statistics.getId());
+                record.setEmployType(teacher.getEmployType());
+
+                JsonArray allClassTimeDataArray = new JsonArray();
+
+                Double allClassTime = 0D;
+                //计算补充课时,算作正课课时,但是计算超出课时时不计算这部分
+                for (String courseTimeType : courseTimeMap.keySet()) {
+                    List<WfTeacherCourseTime> courseTimes = courseTimeMap.get(courseTimeType);
+                    double sum = courseTimes.stream()
+                            .filter(x -> x.getTeacherIds().contains(teacher.getId().toString()))
+                            .mapToDouble(WfTeacherCourseTime::getCourseTime).sum();
+                    allClassTime = allClassTime + sum;
+                    if(CourseTimeTypeEnum.CTT001.getCode().equals(courseTimeType)){
+                        record.setClassTime1(sum);
+                    }else if(CourseTimeTypeEnum.CTT002.getCode().equals(courseTimeType)){
+                        record.setClassTime2(sum);
+                    }else if(CourseTimeTypeEnum.CTT003.getCode().equals(courseTimeType)){
+                        record.setClassTime3(sum);
+                    }else if(CourseTimeTypeEnum.CTT004.getCode().equals(courseTimeType)){
+                        record.setClassTime4(sum);
+                    }else if(CourseTimeTypeEnum.CTT005.getCode().equals(courseTimeType)){
+                        record.setClassTime5(sum);
+                    }else if(CourseTimeTypeEnum.CTT006.getCode().equals(courseTimeType)){
+                        record.setClassTime6(sum);
                     }
                 }
-            }
-            JsonObject weekDataJson = new JsonObject();
-            Double allTimes = 0d;
-            //存每周的数据
-            for (WeekTimeRangeVo timeRangeVo : weekTimeRangeVos) {
-                Double zkTimes = 0d;
-                Double wzxTimes = 0d;
-                Double dkTimes = 0d;
-                Double tkTimes = 0d;
+                //早自习、正课、晚辅、顶课、调课
+                Double classTime7 = 0D,classTime8 = 0D,classTime9 = 0D,classTime10 = 0D,classTime11 = 0D;
+
+                List<String> zkList = Arrays.asList("上1","上2","上3","上4","下1","下2","下3","下4");
+                List<String> wzxList = Arrays.asList("晚1","晚2","晚3");
+                //查询出老师的课程
+                List<CourseListVo> courseList = allCourseList.stream()
+                        .filter(x -> x.getTeacherId().contains(teacher.getId().toString()))
+                        .collect(Collectors.toList());
+
+                //循环,统计出各项数据
                 for (CourseListVo courseListVo : courseList) {
-                    LocalDate scheduleDate = courseListVo.getScheduleDate();
                     //如果这个课程数据包含在被删除的课时中,跳过不计算
                     Set<LocalDate> deleteDates = deleteMap.get(courseListVo.getClassId());
-                    if(deleteDates != null && deleteDates.contains(scheduleDate)){
+                    if(deleteDates != null && deleteDates.contains(courseListVo.getScheduleDate())){
                         continue;
                     }
-
-                    if(!(scheduleDate.isAfter(timeRangeVo.getMondayDate()) && scheduleDate.isBefore(timeRangeVo.getSundayDate()))){
-                        continue;
-                    }
-
                     if("早自习".equals(courseListVo.getShortName())){
-                        zkTimes += weightSetMap.get(courseListVo.getShortName());
+                        classTime7 += weightSetMap.get(courseListVo.getShortName());
                     }else if(zkList.contains(courseListVo.getShortName())){
-                        zkTimes += weightSetMap.get(courseListVo.getShortName());
+                        classTime8 += weightSetMap.get(courseListVo.getShortName());
                     }else if(wzxList.contains(courseListVo.getShortName())){
-                        wzxTimes += weightSetMap.get(courseListVo.getShortName());
+                        classTime9 += weightSetMap.get(courseListVo.getShortName());
                     }
 
                     if(courseListVo.getAdjustType() != null && !courseListVo.getAdjustType().isEmpty()){
                         if(CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseListVo.getAdjustType())){
-                            dkTimes += weightSetMap.get(courseListVo.getShortName());
+                            classTime10 += weightSetMap.get(courseListVo.getShortName());
                         }else if(CourseAdjustTypeEnum.courseExchange.getCode().equals(courseListVo.getAdjustType())){
-                            tkTimes += weightSetMap.get(courseListVo.getShortName());
+                            classTime11 += weightSetMap.get(courseListVo.getShortName());
                         }
                     }
                 }
-                timeRangeVo.setZkTimes(zkTimes);
-                timeRangeVo.setWzxTimes(wzxTimes);
-                timeRangeVo.setDkTimes(dkTimes);
-                timeRangeVo.setTkTimes(tkTimes);
-                allTimes += (zkTimes + wzxTimes);
-            }
-            weekDataJson.add("weekData", new Gson().toJsonTree(weekTimeRangeVos));
-            weekDataJson.addProperty("allTimes", allTimes);
-            record.setWeekData(weekDataJson.toString());
-
-            //计算总课时
-            allClassTime = allClassTime + classTime7 + classTime8 + classTime9;
-            record.setAllClassTime(allClassTime);
-
-            //计算该老师发起的事假、病假顶课数据
-            List<CourseListVo> substituteList = allSubstituteList.stream().filter(x -> x.getTeacherId().equals(teacher.getId().toString()))
-                    .collect(Collectors.toList());
-            Double reduceTime = 0d;
-            for (CourseListVo courseListVo : substituteList) {
-                Set<LocalDate> deleteDates = deleteMap.get(courseListVo.getClassId());
-                if(deleteDates.contains(courseListVo.getScheduleDate())){
-                    continue;
+                record.setClassTime7(classTime7);
+                record.setClassTime8(classTime8);
+                record.setClassTime9(classTime9);
+                record.setClassTime11(classTime11);
+                JsonObject weekDataJson = new JsonObject();
+                Double allTimes = 0d;
+                //存每周的数据
+                for (WeekTimeRangeVo timeRangeVo : weekTimeRangeVos) {
+                    Double zkTimes = 0d;
+                    Double wzxTimes = 0d;
+                    Double dkTimes = 0d;
+                    Double tkTimes = 0d;
+                    for (CourseListVo courseListVo : courseList) {
+                        LocalDate scheduleDate = courseListVo.getScheduleDate();
+                        //如果这个课程数据包含在被删除的课时中,跳过不计算
+                        Set<LocalDate> deleteDates = deleteMap.get(courseListVo.getClassId());
+                        if(deleteDates != null && deleteDates.contains(scheduleDate)){
+                            continue;
+                        }
+
+                        if(!(scheduleDate.isAfter(timeRangeVo.getMondayDate()) && scheduleDate.isBefore(timeRangeVo.getSundayDate()))){
+                            continue;
+                        }
+
+                        if("早自习".equals(courseListVo.getShortName())){
+                            zkTimes += weightSetMap.get(courseListVo.getShortName());
+                        }else if(zkList.contains(courseListVo.getShortName())){
+                            zkTimes += weightSetMap.get(courseListVo.getShortName());
+                        }else if(wzxList.contains(courseListVo.getShortName())){
+                            wzxTimes += weightSetMap.get(courseListVo.getShortName());
+                        }
+
+                        if(courseListVo.getAdjustType() != null && !courseListVo.getAdjustType().isEmpty()){
+                            if(CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseListVo.getAdjustType())){
+                                dkTimes += weightSetMap.get(courseListVo.getShortName());
+                            }else if(CourseAdjustTypeEnum.courseExchange.getCode().equals(courseListVo.getAdjustType())){
+                                tkTimes += weightSetMap.get(courseListVo.getShortName());
+                            }
+                        }
+                    }
+                    timeRangeVo.setZkTimes(zkTimes);
+                    timeRangeVo.setWzxTimes(wzxTimes);
+                    timeRangeVo.setDkTimes(dkTimes);
+                    timeRangeVo.setTkTimes(tkTimes);
+                    allTimes += (zkTimes + wzxTimes);
+                }
+                weekDataJson.add("weekData", new Gson().toJsonTree(weekTimeRangeVos));
+                weekDataJson.addProperty("allTimes", allTimes);
+                record.setWeekData(weekDataJson.toString());
+
+                //计算该老师发起的事假、病假顶课数据
+                List<CourseListVo> substituteList = allSubstituteList.stream().filter(x -> x.getExchangeTeacherId().equals(teacher.getId()))
+                        .collect(Collectors.toList());
+                Double reduceTime = 0d;
+                for (CourseListVo courseListVo : substituteList) {
+                    Set<LocalDate> deleteDates = deleteMap.get(courseListVo.getClassId());
+                    if(deleteDates !=null && deleteDates.contains(courseListVo.getScheduleDate())){
+                        continue;
+                    }
+                    reduceTime += weightSetMap.get(courseListVo.getShortName());
                 }
-                reduceTime += weightSetMap.get(courseListVo.getShortName());
-            }
 
-            //计算费用,根据聘用类型判断费用问题
-            Double classTimeAmount = 0d;
-            Double beyondClassTimeAmount = 0d;
+                substituteList = allSubstituteList.stream().filter(x -> x.getTeacherId().equals(teacher.getId().toString()))
+                        .collect(Collectors.toList());
+                for (CourseListVo courseListVo : substituteList) {
+                    Set<LocalDate> deleteDates = deleteMap.get(courseListVo.getClassId());
+                    if(deleteDates !=null && deleteDates.contains(courseListVo.getScheduleDate())){
+                        continue;
+                    }
+                    reduceTime = reduceTime - weightSetMap.get(courseListVo.getShortName());
+                }
 
-            BigDecimal zzxCost = BigDecimal.ZERO;//早自习费用
-            if("FB1601".equals(teacher.getEmployType())){
-                zzxCost = BigDecimal.valueOf(costSetMap.get("cost1"));
-            }else{//外聘FB1605、合作人员FB1609
-                zzxCost = BigDecimal.valueOf(costSetMap.get("cost2"));
-            }
-            classTimeAmount += BigDecimal.valueOf(classTime7).multiply(zzxCost).doubleValue();
+                record.setClassTime10(reduceTime);
+                //计算总课时
+                allClassTime = allClassTime + classTime7 + classTime8 + classTime9;
+                record.setAllClassTime(allClassTime);
 
-            BigDecimal zkCost = BigDecimal.ZERO;//正课费用
-            if("FB1601".equals(teacher.getEmployType())){
-                zkCost = BigDecimal.valueOf(costSetMap.get("cost3"));
-            }else{//外聘FB1605、合作人员FB1609
-                zkCost = BigDecimal.valueOf(costSetMap.get("cost4"));
-            }
-            classTimeAmount += BigDecimal.valueOf(classTime8).multiply(zkCost).doubleValue();
+                //计算费用,根据聘用类型判断费用问题
+                Double classTimeAmount = 0d;
+                Double beyondClassTimeAmount = 0d;
 
-            BigDecimal wzxCost = BigDecimal.ZERO;//晚自习费用
-            if("FB1601".equals(teacher.getEmployType())){
-                wzxCost = BigDecimal.valueOf(costSetMap.get("cost5"));
-            }else{//外聘FB1605、合作人员FB1609
-                wzxCost = BigDecimal.valueOf(costSetMap.get("cost6"));
-            }
-            classTimeAmount += BigDecimal.valueOf(classTime9).multiply(wzxCost).doubleValue();
+                BigDecimal zzxCost = BigDecimal.ZERO;//早自习费用
+                if("FB1601".equals(teacher.getEmployType())){
+                    zzxCost = BigDecimal.valueOf(costSetMap.get("cost1"));
+                }else{//外聘FB1605、合作人员FB1609
+                    zzxCost = BigDecimal.valueOf(costSetMap.get("cost2"));
+                }
 
-            BigDecimal dkCost = BigDecimal.ZERO;//顶课费用,顶课老师加钱
-            if("FB1601".equals(teacher.getEmployType())){
-                dkCost = BigDecimal.valueOf(costSetMap.get("cost11"));
-            }else{//外聘FB1605、合作人员FB1609
-                dkCost = BigDecimal.valueOf(costSetMap.get("cost12"));
-            }
-            classTimeAmount += BigDecimal.valueOf(classTime10).multiply(dkCost).doubleValue();
+                classTimeAmount += BigDecimal.valueOf(classTime7).multiply(zzxCost).doubleValue();
 
-            BigDecimal bdkCost = BigDecimal.ZERO;//顶课费用,被顶课老师扣钱
-            if("FB1601".equals(teacher.getEmployType())){
-                bdkCost = BigDecimal.valueOf(costSetMap.get("cost13"));
-            }else{//外聘FB1605、合作人员FB1609
-                bdkCost = BigDecimal.valueOf(costSetMap.get("cost14"));
-            }
-            //计算被扣除的费用
-            BigDecimal reduceTimeAmount = bdkCost.multiply(BigDecimal.valueOf(reduceTime));
-
-            //计算总课时费用
-            classTimeAmount = BigDecimal.valueOf(classTimeAmount).subtract(reduceTimeAmount).doubleValue();
-
-            //计算超出的课时,需要先计算出每个周的开始结束时间
-            BigDecimal ccksTime = BigDecimal.ZERO;//超出课时标准(每周)
-            if("FB1601".equals(teacher.getEmployType())){
-                ccksTime = BigDecimal.valueOf(costSetMap.get("cost7"));
-            }else{//外聘FB1605、合作人员FB1609
-                ccksTime = BigDecimal.valueOf(costSetMap.get("cost8"));
-            }
-            BigDecimal ccksCost = BigDecimal.ZERO;
-            if("FB1601".equals(teacher.getEmployType())){
-                ccksCost = BigDecimal.valueOf(costSetMap.get("cost9"));
-            }else{//外聘FB1605、合作人员FB1609
-                ccksCost = BigDecimal.valueOf(costSetMap.get("cost10"));
-            }
-            //计算出总的超出课时并计算超课时费
-            BigDecimal allCcksTime = BigDecimal.valueOf(allClassTime).subtract(ccksTime.multiply(BigDecimal.valueOf(weekTimeRangeVos.size())));
-            beyondClassTimeAmount = allCcksTime.multiply(ccksCost).doubleValue();
-            if(!"FB1601".equals(teacher.getEmployType())){
-                record.setBeyondClassTimeAmount(beyondClassTimeAmount);
-            }
+                BigDecimal zkCost = BigDecimal.ZERO;//正课费用
+                if("FB1601".equals(teacher.getEmployType())){
+                    zkCost = BigDecimal.valueOf(costSetMap.get("cost3"));
+                }else{//外聘FB1605、合作人员FB1609
+                    zkCost = BigDecimal.valueOf(costSetMap.get("cost4"));
+                }
 
-            //计算总金额,课时费+超课时费
-            Double totalAmount = classTimeAmount + beyondClassTimeAmount - reduceTimeAmount.doubleValue();
-            record.setTotalAmount(totalAmount);
+                double classTime = classTime8
+                        + (record.getClassTime1() == null ? 0d:record.getClassTime1())
+                        + (record.getClassTime2() == null ? 0d:record.getClassTime2())
+                        + (record.getClassTime3() == null ? 0d:record.getClassTime3())
+                        + (record.getClassTime4() == null ? 0d:record.getClassTime4())
+                        + (record.getClassTime5() == null ? 0d:record.getClassTime5())
+                        + (record.getClassTime6() == null ? 0d:record.getClassTime6());
+                classTimeAmount += BigDecimal.valueOf(classTime).multiply(zkCost).doubleValue();
+
+                BigDecimal wzxCost = BigDecimal.ZERO;//晚自习费用
+                if("FB1601".equals(teacher.getEmployType())){
+                    wzxCost = BigDecimal.valueOf(costSetMap.get("cost5"));
+                }else{//外聘FB1605、合作人员FB1609
+                    wzxCost = BigDecimal.valueOf(costSetMap.get("cost6"));
+                }
+                classTimeAmount += BigDecimal.valueOf(classTime9).multiply(wzxCost).doubleValue();
+
+                BigDecimal reduceTimeAmount = BigDecimal.ZERO;
+                BigDecimal dkCost = BigDecimal.ZERO;//顶课费用,顶课老师加钱
+                if("FB1601".equals(teacher.getEmployType())){
+                    dkCost = BigDecimal.valueOf(costSetMap.get("cost11"));
+                }else{//外聘FB1605、合作人员FB1609
+                    dkCost = BigDecimal.valueOf(costSetMap.get("cost12"));
+                }
+                if(record.getClassTime10() != null && record.getClassTime10() > 0){
+                    reduceTimeAmount = BigDecimal.valueOf(record.getClassTime10()).multiply(dkCost);
+                }
 
-            insertList.add(record);
-        }
 
-        if(!insertList.isEmpty()){
-            //先删除
-            recordMapper.delete(
-                new QueryWrapper<ClassTimeStatisticsRecord>().lambda()
-                    .eq(ClassTimeStatisticsRecord::getClassTimeStatisticsId, statistics.getId())
-            );
-            for (ClassTimeStatisticsRecord record : insertList) {
-                recordMapper.insert(record);
+                BigDecimal bdkCost = BigDecimal.ZERO;//顶课费用,被顶课老师扣钱
+                if("FB1601".equals(teacher.getEmployType())){
+                    bdkCost = BigDecimal.valueOf(costSetMap.get("cost13")==null?0:costSetMap.get("cost13"));
+                }else{//外聘FB1605、合作人员FB1609
+                    bdkCost = BigDecimal.valueOf(costSetMap.get("cost14")==null?0:costSetMap.get("cost14"));
+                }
+                //计算被扣除的费用
+                if(record.getClassTime10() != null && record.getClassTime10() < 0){
+                    reduceTimeAmount = bdkCost.multiply(BigDecimal.valueOf(record.getClassTime10()));
+                }
+                record.setClassTimeAmount(classTimeAmount);
+                //计算超出的课时,需要先计算出每个周的开始结束时间
+                BigDecimal ccksTime = BigDecimal.ZERO;//超出课时标准(每周)
+                if("FB1601".equals(teacher.getEmployType())){
+                    ccksTime = BigDecimal.valueOf(costSetMap.get("cost7"));
+                }else{//外聘FB1605、合作人员FB1609
+                    ccksTime = BigDecimal.valueOf(costSetMap.get("cost8"));
+                }
+                BigDecimal ccksCost = BigDecimal.ZERO;
+                if("FB1601".equals(teacher.getEmployType())){
+                    ccksCost = BigDecimal.valueOf(costSetMap.get("cost9"));
+                }else{//外聘FB1605、合作人员FB1609
+                    ccksCost = BigDecimal.valueOf(costSetMap.get("cost10"));
+                }
+                //计算出总的超出课时并计算超课时费
+                BigDecimal allCcksTime = BigDecimal.ZERO;
+                BigDecimal ccksTime2 = ccksTime.multiply(BigDecimal.valueOf(weekTimeRangeVos.size()));
+                if(allClassTime > ccksTime2.doubleValue()){//如果总的课时超出规定课时
+                    allCcksTime = BigDecimal.valueOf(allClassTime).subtract(ccksTime2);
+                }
+                beyondClassTimeAmount = allCcksTime.multiply(ccksCost).doubleValue();
+                if(!"FB1601".equals(teacher.getEmployType())){
+                    record.setBeyondClassTimeAmount(beyondClassTimeAmount);
+                }
+
+                //计算总金额,课时费+超课时费
+                Double totalAmount = classTimeAmount + beyondClassTimeAmount + reduceTimeAmount.doubleValue();
+                record.setTotalAmount(totalAmount);
+
+                insertList.add(record);
+            }
+
+            if(!insertList.isEmpty()){
+                //先删除
+                recordMapper.delete(
+                        new QueryWrapper<ClassTimeStatisticsRecord>().lambda()
+                                .eq(ClassTimeStatisticsRecord::getClassTimeStatisticsId, statistics.getId())
+                );
+                for (ClassTimeStatisticsRecord record : insertList) {
+                    recordMapper.insert(record);
+                }
             }
+
+            statistics.setAllClassTime(insertList.stream().filter(x -> x.getAllClassTime() != null).mapToDouble(ClassTimeStatisticsRecord::getAllClassTime).sum());
+            statistics.setTotalAmount(insertList.stream().filter(x -> x.getTotalAmount() != null).mapToDouble(ClassTimeStatisticsRecord::getTotalAmount).sum());
+            statistics.setBeyondClassTimeAmount(insertList.stream().filter(x -> x.getBeyondClassTimeAmount() != null).mapToDouble(ClassTimeStatisticsRecord::getBeyondClassTimeAmount).sum());
+            statistics.setClassTimeAmount(insertList.stream().filter(x -> x.getClassTimeAmount() != null).mapToDouble(ClassTimeStatisticsRecord::getClassTimeAmount).sum());
+            statistics.setStatus(1);
+            this.updateById(statistics);
+            return true;
+        }catch (Exception e){
+            log.error(e.getMessage());
+            throw new MyException("统计出错,请联系管理员");
         }
+    }
 
-        return true;
+    @Override
+    public Boolean lockData(Long id) {
+        ClassTimeStatistics statistics = this.getById(id);
+        return null;
+    }
+
+    @Override
+    public List<ClassTimeStatisticsRecordVo> getRecordList(Long id) {
+        return this.baseMapper.getRecordList(id);
     }
 
     //计算日期内一共几个周,并返回每周的周一日期和周日日期

+ 6 - 2
src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeCalendarPageVo.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.classtime.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDate;
 import java.util.Date;
 
 /**
@@ -53,11 +54,14 @@ public class ClassTimeCalendarPageVo {
     * 补班日期
     */
     @ApiModelProperty("补班日期")
-    private Date supplementDate;
+    private LocalDate supplementDate;
     /**
     * 补课日期
     */
     @ApiModelProperty("补课日期")
-    private Date replaceDate;
+    private LocalDate replaceDate;
+
+    @ApiModelProperty("状态(0:生效 1:锁定 2:作废)")
+    private Integer status;
 
 }

+ 5 - 4
src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeCalendarVo.java

@@ -3,7 +3,7 @@ package com.xjrsoft.module.classtime.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.util.Date;
+import java.time.LocalDate;
 
 /**
 * @title: 节假日调课设置表单出参
@@ -23,13 +23,14 @@ public class ClassTimeCalendarVo {
     * 补班日期
     */
     @ApiModelProperty("补班日期")
-    private Date supplementDate;
+    private LocalDate supplementDate;
     /**
     * 补课日期
     */
     @ApiModelProperty("补课日期")
-    private Date replaceDate;
-
+    private LocalDate replaceDate;
 
+    @ApiModelProperty("状态(0:生效 1:锁定 2:作废)")
+    private Integer status;
 
 }

+ 13 - 29
src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeDeletePageVo.java

@@ -22,43 +22,24 @@ public class ClassTimeDeletePageVo {
     /**
     * 创建人
     */
-    @ApiModelProperty("创建人")
-    private Long createUserId;
+    @ApiModelProperty("操作人")
+    private String operationUserName;
     /**
     * 创建时间
     */
-    @ApiModelProperty("创建时间")
-    private Date createDate;
-    /**
-    * 修改人
-    */
-    @ApiModelProperty("修改人")
-    private Long modifyUserId;
-    /**
-    * 修改时间
-    */
-    @ApiModelProperty("修改时间")
-    private Date modifyDate;
-    /**
-    * 删除标记
-    */
-    @ApiModelProperty("删除标记")
-    private Integer deleteMark;
-    /**
-    * 有效标志
-    */
-    @ApiModelProperty("有效标志(0:作废 1:启用 2:锁定)")
-    private Integer enabledMark;
-    /**
-    * 删除类型(xjr_dictionary_item[class_time_delete])
-    */
+    @ApiModelProperty("操作时间")
+    private Date operationDate;
+
     @ApiModelProperty("删除类型(xjr_dictionary_item[class_time_delete])")
     private String type;
+
+    @ApiModelProperty("删除类型-中文")
+    private String typeCn;
     /**
     * 类别(1:权重 2:费用设置)
     */
-    @ApiModelProperty("类别(1:权重 2:费用设置)")
-    private Integer classId;
+    @ApiModelProperty("班级名称")
+    private String className;
     /**
     * 删除说明
     */
@@ -75,4 +56,7 @@ public class ClassTimeDeletePageVo {
     @ApiModelProperty("结束日期")
     private Date endDate;
 
+    @ApiModelProperty("状态(0:生效 1:锁定 2:作废)")
+    private Integer status;
+
 }

+ 116 - 0
src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeStatisticsRecordExcelVo.java

@@ -0,0 +1,116 @@
+package com.xjrsoft.module.classtime.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 课时统计-教师详情表单出参
+* @Author dzx
+* @Date: 2024-09-26
+* @Version 1.0
+*/
+@Data
+public class ClassTimeStatisticsRecordExcelVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 课时统计(class_time_statistics)
+    */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+    * 教师id(xjr_user)
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 聘用类型
+    */
+    @ApiModelProperty("聘用类型")
+    private String employTypeCn;
+    /**
+    * 总课时
+    */
+    @ApiModelProperty("总课时")
+    private Double allClassTime;
+    /**
+    * 总金额
+    */
+    @ApiModelProperty("总金额")
+    private Double totalAmount;
+    /**
+    * 课时费用
+    */
+    @ApiModelProperty("课时费用")
+    private Double classTimeAmount;
+    /**
+    * 外聘教师超课时费
+    */
+    @ApiModelProperty("外聘教师超课时费")
+    private Double beyondClassTimeAmount;
+    /**
+    * 每周数据
+    */
+    @ApiModelProperty("每周数据")
+    private String weekData;
+    /**
+    * 教研会
+    */
+    @ApiModelProperty("教研会")
+    private Double classTime1;
+    /**
+    * 督导听课
+    */
+    @ApiModelProperty("督导听课")
+    private Double classTime2;
+    /**
+    * 临近三年退休政策
+    */
+    @ApiModelProperty("临近三年退休政策")
+    private Double classTime3;
+    /**
+    * 出题
+    */
+    @ApiModelProperty("出题")
+    private Double classTime4;
+    /**
+    * 阅卷
+    */
+    @ApiModelProperty("阅卷")
+    private Double classTime5;
+    /**
+    * 周末培优
+    */
+    @ApiModelProperty("周末培优")
+    private Double classTime6;
+    /**
+    * 早自习
+    */
+    @ApiModelProperty("早自习")
+    private Double classTime7;
+    /**
+    * 正课(包含调顶课时)
+    */
+    @ApiModelProperty("正课(包含调顶课时)")
+    private Double classTime8;
+    /**
+    * 晚辅(包含调顶课时)
+    */
+    @ApiModelProperty("晚辅(包含调顶课时)")
+    private Double classTime9;
+    /**
+    * 顶课
+    */
+    @ApiModelProperty("顶课")
+    private Double classTime10;
+    /**
+    * 调课
+    */
+    @ApiModelProperty("调课")
+    private Double classTime11;
+
+}

+ 5 - 17
src/main/java/com/xjrsoft/module/classtime/vo/ClassTimeStatisticsRecordVo.java

@@ -22,18 +22,18 @@ public class ClassTimeStatisticsRecordVo {
     /**
     * 课时统计(class_time_statistics)
     */
-    @ApiModelProperty("课时统计(class_time_statistics)")
-    private Long classTimeStatisticsId;
+    @ApiModelProperty("姓名")
+    private String name;
     /**
     * 教师id(xjr_user)
     */
-    @ApiModelProperty("教师id(xjr_user)")
-    private Long userId;
+    @ApiModelProperty("工号")
+    private String userName;
     /**
     * 聘用类型
     */
     @ApiModelProperty("聘用类型")
-    private Date employType;
+    private String employTypeCn;
     /**
     * 总课时
     */
@@ -114,17 +114,5 @@ public class ClassTimeStatisticsRecordVo {
     */
     @ApiModelProperty("调课")
     private Double classTime11;
-    /**
-    * 权重json
-    */
-    @ApiModelProperty("权重json")
-    private String weightSetJson;
-    /**
-    * 权重json
-    */
-    @ApiModelProperty("权重json")
-    private String costSetJson;
-
-
 
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/classtime/vo/CourseListVo.java

@@ -33,4 +33,7 @@ public class CourseListVo {
     @ApiModelProperty("上课日期")
     private LocalDate scheduleDate;
 
+    @ApiModelProperty("顶课老师")
+    private Long exchangeTeacherId;
+
 }

+ 0 - 2
src/main/java/com/xjrsoft/module/classtime/vo/TeacherListVo.java

@@ -3,8 +3,6 @@ package com.xjrsoft.module.classtime.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.util.Date;
-
 /**
 * @title: 教师信息
 * @Author dzx

+ 0 - 1
src/main/java/com/xjrsoft/module/classtime/vo/WeekTimeRangeVo.java

@@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.time.LocalDate;
-import java.util.Date;
 
 /**
 * @title: 课时删除表单出参

+ 1 - 0
src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java

@@ -261,6 +261,7 @@ public class DataUtil {
         return insertStudentOne(tableName, tableData, studentList, null);
     }
 
+
     public Map<String, String> insertStudentOne(String tableName, Map<String, String> tableData, List<HikvisionData> studentList, Long userId) throws InterruptedException {
         String sql = "SELECT t1.id,t1.name,CONCAT(t3.id,'-',replace(t4.name,'级',''),'-',t3.class_type,'-',t2.stduy_status) as orgIndexCode," +
                 " t1.user_name,t1.gender,DATE_FORMAT(t1.birth_date, '%Y-%m-%d') as birthday,t1.mobile,t1.email,t1.credential_type,t1.credential_number FROM xjr_user t1" +

+ 1 - 3
src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java

@@ -92,12 +92,10 @@ public class JianyuekbScheduleTask {
             }
             //删除课表信息
             String delSql = "delete from course_table where schedule_date between '" + startDateStr + "'" +
-                    " and '" + endDateStr + "'" +
+                    " and '" + endDateStr + "' and adjust_type is null" +
                     " and class_id in (" + gradeClassMaps.get(eduYearSerialNo).toString().replace("[","").replace("]","")+ ")";
             SqlRunnerAdapter.db().delete(delSql);
 
-
-
             long between = ChronoUnit.DAYS.between(startDateObj, endDateObj);
             int times = Integer.parseInt(((between / 7) + 1) + "");
 

+ 2 - 0
src/main/java/com/xjrsoft/module/organization/service/IUserService.java

@@ -83,4 +83,6 @@ public interface IUserService extends MPJBaseService<User> {
 
     Page<PersonPageVo> personPage(Page<PersonPageVo> page, PersonPageDto dto);
 
+    Boolean recoveryStudentInfo(Long userId);
+
 }

+ 55 - 0
src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java

@@ -5,9 +5,11 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -16,11 +18,15 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.module.hikvision.entity.HikvisionData;
+import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
+import com.xjrsoft.module.hikvision.util.DataUtil;
 import com.xjrsoft.module.organization.dto.AddUserDto;
 import com.xjrsoft.module.organization.dto.BindOpenidDto;
 import com.xjrsoft.module.organization.dto.PersonPageDto;
@@ -79,6 +85,7 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
 
     private final CommonPropertiesConfig propertiesConfig;
 
+    private HikvisionDataMapper hikvisionDataMapper;
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean add(AddUserDto dto) {
@@ -371,4 +378,52 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         return result;
     }
 
+    /**
+     * 恢复学生信息
+     * 1、新增 xjr_user_role_relation数据
+     * 2、恢复 xjr_user数据
+     * 3、恢复 base_student_school_roll数据
+     * 4、恢复 base_student数据
+     * 5、恢复 base_student_family数据
+     * 6、重新往海康推送数据
+     * @param userId
+     * @return
+     */
+    @Override
+    public Boolean recoveryStudentInfo(Long userId){
+        try {
+            String sql = "update xjr_user set delete_mark = 0 where id = " + userId;
+            SqlRunnerAdapter.db().update(sql);
+
+            long id = IdUtil.getSnowflakeNextId();
+            sql = "INSERT INTO xjr_user_role_relation (id, user_id, role_id) SELECT " + id
+                    + ", " + userId + ", 3 WHERE NOT EXISTS (SELECT * FROM xjr_user_role_relation WHERE role_id = 3 and user_id = " + userId + ")";
+            SqlRunnerAdapter.db().insert(sql);
+
+            sql = "update base_student_school_roll set delete_mark = 0 where user_id = " + userId;
+            SqlRunnerAdapter.db().update(sql);
+
+            sql = "update base_student_school_roll set delete_mark = 0 where user_id = " + userId;
+            SqlRunnerAdapter.db().update(sql);
+
+            sql = "update base_student set delete_mark = 0 where user_id = " + userId;
+            SqlRunnerAdapter.db().update(sql);
+
+            sql = "update base_student_family set delete_mark = 0 where user_id = " + userId;
+            SqlRunnerAdapter.db().update(sql);
+
+            DataUtil dataUtil = new DataUtil();
+            String tableName = "base_student";
+            List<HikvisionData> studentList = hikvisionDataMapper.selectList(
+                    new QueryWrapper<HikvisionData>().lambda().eq(HikvisionData::getTableName, tableName)
+            );
+            dataUtil.insertStudentOne(tableName, null, studentList, userId);
+
+            return true;
+        }catch (Exception e){
+            log.error(e.getMessage());
+            throw new MyException("恢复学生数据出错,请联系管理员");
+        }
+    }
+
 }

+ 17 - 0
src/main/java/com/xjrsoft/module/schedule/service/ICourseTableBakService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.schedule.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.schedule.entity.CourseTableBak;
+
+/**
+* @title: 课表数据备份表
+* @Author dzx
+* @Date: 2024年10月8日
+* @Version 1.0
+*/
+
+public interface ICourseTableBakService extends MPJBaseService<CourseTableBak> {
+
+
+
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/schedule/service/impl/CourseTableBakServiceImpl.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.schedule.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.schedule.entity.CourseTableBak;
+import com.xjrsoft.module.schedule.mapper.CourseTableBakMapper;
+import com.xjrsoft.module.schedule.service.ICourseTableBakService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * @title: 课表数据备份表
+ * @Author dzx
+ * @Date: 2024年10月8日
+ * @Version 1.0
+ */
+@Service
+@AllArgsConstructor
+public class CourseTableBakServiceImpl extends MPJBaseServiceImpl<CourseTableBakMapper, CourseTableBak> implements ICourseTableBakService {
+}

+ 1 - 0
src/main/java/com/xjrsoft/module/student/controller/BaseStudentAssessmentInspectionController.java

@@ -95,6 +95,7 @@ public class BaseStudentAssessmentInspectionController {
         inspection.setPersonalStudentUserIds(dto.getStudentUserIds());
         boolean isSuccess = inspectionService.save(inspection);
         inspectionService.dataHandle(inspection.getId());
+        inspectionService.noticeTeacher(inspection.getId());
         return RT.ok(isSuccess);
     }
 

+ 5 - 0
src/main/java/com/xjrsoft/module/student/service/impl/BaseNewStudentServiceImpl.java

@@ -282,6 +282,11 @@ public class BaseNewStudentServiceImpl extends MPJBaseServiceImpl<BaseNewStudent
         return this.baseMapper.getMajorStudentCount(bandingTaskId);
     }
 
+    /**
+     * 删除数据后,将学生从海康平台中删除
+     * @param dto
+     * @return
+     */
     @Override
     public Boolean deleteByUserIds(DeleteNewStudentDto dto) {
         List<BaseNewStudent> studentList = this.baseMapper.selectBatchIds(dto.getIds());

+ 24 - 0
src/main/resources/mapper/classtime/ClassTimeDeleteMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xjrsoft.module.classtime.mapper.ClassTimeDeleteMapper">
+    <select id="getPage" parameterType="com.xjrsoft.module.classtime.dto.ClassTimeDeletePageDto" resultType="com.xjrsoft.module.classtime.vo.ClassTimeDeletePageVo">
+        SELECT t1.id, t2.name AS class_name,t3.name AS type_cn,t1.type,t4.name AS operation_user_name,t1.remark,
+        t1.start_date,t1.end_date,t1.status,IFNULL(t1.modify_date,t1.create_date) AS operation_time FROM class_time_delete t1
+        INNER JOIN base_class t2 ON t1.class_id = t2.id
+        LEFT JOIN xjr_dictionary_detail t3 ON t1.type = t3.code
+        LEFT JOIN xjr_user t4 ON IFNULL(t1.modify_user_id, t1.create_user_id) = t4.id
+        WHERE t1.delete_mark = 0
+        <if test="dto.className != null and dto.className != ''">
+            and t2.name like concat('%', #{dto.className},'%')
+        </if>
+        <if test="dto.type != null and dto.type != ''">
+            and t1.type = #{dto.type}
+        </if>
+        <if test="dto.enabledMark != null">
+            and t1.status = #{dto.enabledMark}
+        </if>
+    </select>
+
+</mapper>

+ 18 - 2
src/main/resources/mapper/classtime/ClassTimeStatisticsMapper.xml

@@ -9,10 +9,11 @@
         WHERE t1.delete_mark = 0 AND t2.employ_type IN ('FB1601','FB1605','FB1609')
     </select>
 
-    <select id="getWfTeacherCourseTimeList" resultType="com.xjrsoft.module.oa.entity.WfTeacherCourseTime">
+    <select id="getWfTeacherCourseTimeList" parameterType="com.xjrsoft.module.classtime.entity.ClassTimeStatistics" resultType="com.xjrsoft.module.oa.entity.WfTeacherCourseTime">
         SELECT t1.* FROM wf_teacher_course_time t1
         INNER JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value
         WHERE t2.current_state = 'COMPLETED'
+        and t1.schedule_date BETWEEN #{dto.startDate} and #{dto.endDate}
     </select>
 
     <select id="getCourseList" parameterType="com.xjrsoft.module.classtime.entity.ClassTimeStatistics" resultType="com.xjrsoft.module.classtime.vo.CourseListVo">
@@ -39,13 +40,28 @@
     </select>
 
     <select id="getSubstituteList" parameterType="com.xjrsoft.module.classtime.entity.ClassTimeStatistics" resultType="com.xjrsoft.module.classtime.vo.CourseListVo">
-        SELECT t4.short_name,t3.schedule_date,t3.class_id,t1.user_id as teacher_id FROM wf_course_adjust t1
+        SELECT t4.short_name,t3.schedule_date,t3.class_id,t1.user_id as teacher_id,t1.exchange_teacher_id FROM wf_course_adjust t1
         INNER JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value
         INNER JOIN course_table_bak t3 ON t1.id = t3.wf_course_adjust_id
         LEFT JOIN class_time t4 ON t3.time_period = t4.time_period AND t3.time_number = t4.number
         WHERE t1.delete_mark = 0 AND t2.current_state = 'COMPLETED'
         AND t1.reason IN ('sick _leave','leave_absence') and t1.adjust_type = 'course_substitute'
         AND t3.schedule_date BETWEEN #{dto.startDate} and #{dto.endDate}
+        AND t3.schedule_date NOT IN (
+            SELECT DATE FROM holiday_date WHERE STATUS = 3
+            AND DATE BETWEEN #{dto.startDate} and #{dto.endDate}
+        )
+    </select>
+
+
+    <select id="getRecordList" resultType="com.xjrsoft.module.classtime.vo.ClassTimeStatisticsRecordVo">
+        SELECT t1.id,t2.user_name,t2.name,t3.name AS employ_type_cn,
+        t1.class_time1,t1.class_time2,t1.class_time3,t1.class_time4,t1.class_time5,
+        t1.class_time6,t1.class_time7,t1.class_time8,t1.class_time9,t1.class_time10,t1.class_time11,
+        t1.all_class_time,t1.total_amount,t1.class_time_amount,t1.beyond_class_time_amount FROM class_time_statistics_record t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        LEFT JOIN xjr_dictionary_detail t3 ON t1.employ_type = t3.code
+        WHERE t1.delete_mark = 0 AND t1.class_time_statistics_id = #{id}
     </select>
 
 </mapper>