瀏覽代碼

修改课程统计

snihwxf 2 月之前
父節點
當前提交
92c73c0116
共有 37 個文件被更改,包括 2956 次插入11 次删除
  1. 113 0
      src/main/java/com/xjrsoft/module/classtime/controller/ClassCourseTimeStatisticsSetController.java
  2. 108 0
      src/main/java/com/xjrsoft/module/classtime/controller/ClassCourseTimeStatisticsSetGroupController.java
  3. 143 0
      src/main/java/com/xjrsoft/module/classtime/dto/AddClassCourseTimeStatisticsRecordDto.java
  4. 48 0
      src/main/java/com/xjrsoft/module/classtime/dto/AddClassCourseTimeStatisticsSetDto.java
  5. 53 0
      src/main/java/com/xjrsoft/module/classtime/dto/AddClassCourseTimeStatisticsSetGroupDto.java
  6. 26 0
      src/main/java/com/xjrsoft/module/classtime/dto/ClassCourseTimeStatisticsRecordPageDto.java
  7. 38 0
      src/main/java/com/xjrsoft/module/classtime/dto/ClassCourseTimeStatisticsSetGroupPageDto.java
  8. 38 0
      src/main/java/com/xjrsoft/module/classtime/dto/ClassCourseTimeStatisticsSetPageDto.java
  9. 32 0
      src/main/java/com/xjrsoft/module/classtime/dto/UpdateClassCourseTimeStatisticsRecordDto.java
  10. 32 0
      src/main/java/com/xjrsoft/module/classtime/dto/UpdateClassCourseTimeStatisticsSetDto.java
  11. 32 0
      src/main/java/com/xjrsoft/module/classtime/dto/UpdateClassCourseTimeStatisticsSetGroupDto.java
  12. 227 0
      src/main/java/com/xjrsoft/module/classtime/entity/ClassCourseTimeStatisticsRecord.java
  13. 103 0
      src/main/java/com/xjrsoft/module/classtime/entity/ClassCourseTimeStatisticsSet.java
  14. 103 0
      src/main/java/com/xjrsoft/module/classtime/entity/ClassCourseTimeStatisticsSetGroup.java
  15. 17 0
      src/main/java/com/xjrsoft/module/classtime/mapper/ClassCourseTimeStatisticsRecordMapper.java
  16. 24 0
      src/main/java/com/xjrsoft/module/classtime/mapper/ClassCourseTimeStatisticsSetGroupMapper.java
  17. 20 0
      src/main/java/com/xjrsoft/module/classtime/mapper/ClassCourseTimeStatisticsSetMapper.java
  18. 17 0
      src/main/java/com/xjrsoft/module/classtime/service/IClassCourseTimeStatisticsRecordService.java
  19. 24 0
      src/main/java/com/xjrsoft/module/classtime/service/IClassCourseTimeStatisticsSetGroupService.java
  20. 30 0
      src/main/java/com/xjrsoft/module/classtime/service/IClassCourseTimeStatisticsSetService.java
  21. 25 0
      src/main/java/com/xjrsoft/module/classtime/service/impl/ClassCourseTimeStatisticsRecordServiceImpl.java
  22. 34 0
      src/main/java/com/xjrsoft/module/classtime/service/impl/ClassCourseTimeStatisticsSetGroupServiceImpl.java
  23. 248 0
      src/main/java/com/xjrsoft/module/classtime/service/impl/ClassCourseTimeStatisticsSetServiceImpl.java
  24. 618 1
      src/main/java/com/xjrsoft/module/classtime/service/impl/ClassTimeStatisticsServiceImpl.java
  25. 174 0
      src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsRecordPageVo.java
  26. 144 0
      src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsRecordVo.java
  27. 97 0
      src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsSetGroupPageVo.java
  28. 54 0
      src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsSetGroupVo.java
  29. 62 0
      src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsSetPageVo.java
  30. 54 0
      src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsSetVo.java
  31. 3 0
      src/main/java/com/xjrsoft/module/classtime/vo/CourseListVo.java
  32. 32 7
      src/main/resources/mapper/classtime/ClassCourseTimeStatisticsSetGroupMapper.xml
  33. 19 0
      src/main/resources/mapper/classtime/ClassCourseTimeStatisticsSetMapper.xml
  34. 2 2
      src/main/resources/mapper/classtime/ClassTimeStatisticsMapper.xml
  35. 85 0
      src/main/resources/sqlScript/20251011_sql.sql
  36. 1 1
      src/test/java/com/xjrsoft/module/system/controller/LoginControllerTest.java
  37. 76 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 113 - 0
src/main/java/com/xjrsoft/module/classtime/controller/ClassCourseTimeStatisticsSetController.java

@@ -0,0 +1,113 @@
+package com.xjrsoft.module.classtime.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+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.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.classtime.dto.AddClassCourseTimeStatisticsSetDto;
+import com.xjrsoft.module.classtime.dto.UpdateClassCourseTimeStatisticsSetDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.xjrsoft.common.annotation.XjrLog;
+
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetPageDto;
+import com.xjrsoft.module.classtime.dto.UpdateClassCourseTimeStatisticsSetGroupDto;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsSet;
+import com.xjrsoft.module.classtime.service.IClassCourseTimeStatisticsSetService;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo;
+
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetVo;
+import com.xjrsoft.module.classtime.vo.ClassTimeDeletePageVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+* @title: 课时统计-班级课程设置
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/classtime" + "/classCourseTimeStatisticsSet")
+@Api(value = "/classtime"  + "/classCourseTimeStatisticsSet",tags = "课时统计-班级课程设置代码")
+@AllArgsConstructor
+public class ClassCourseTimeStatisticsSetController {
+
+    private final IClassCourseTimeStatisticsSetService classCourseTimeStatisticsSetService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="课时统计-班级课程设置列表(分页)")
+    @SaCheckPermission("classcoursetimestatisticsset:detail")
+    @XjrLog(value = "课时统计-班级课程设置列表(分页)")
+    public RT<PageOutput<ClassCourseTimeStatisticsSetPageVo>> page(@Valid ClassCourseTimeStatisticsSetPageDto dto){
+        Page<ClassCourseTimeStatisticsSetPageVo> pages = classCourseTimeStatisticsSetService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<ClassCourseTimeStatisticsSetPageVo> pageOutput = ConventPage.getPageOutput(pages, ClassCourseTimeStatisticsSetPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询课时统计-班级课程设置信息")
+    @SaCheckPermission("classcoursetimestatisticsset:detail")
+    @XjrLog(value = "根据id查询课时统计-班级课程设置信息")
+    public RT<ClassCourseTimeStatisticsSetVo> info(@RequestParam Long id){
+        ClassCourseTimeStatisticsSet classCourseTimeStatisticsSet = classCourseTimeStatisticsSetService.getById(id);
+        if (classCourseTimeStatisticsSet == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(classCourseTimeStatisticsSet, ClassCourseTimeStatisticsSetVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增课时统计-班级课程设置")
+    @SaCheckPermission("classcoursetimestatisticsset:add")
+    @XjrLog(value = "新增课时统计-班级课程设置")
+    public RT<Boolean> add(@Valid @RequestBody AddClassCourseTimeStatisticsSetDto dto){
+        boolean isSuccess = classCourseTimeStatisticsSetService.add(dto);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改课时统计-班级课程设置")
+    @SaCheckPermission("classcoursetimestatisticsset:edit")
+    @XjrLog(value = "修改课时统计-班级课程设置")
+    public RT<Boolean> update(@Valid @RequestBody UpdateClassCourseTimeStatisticsSetGroupDto dto){
+        return RT.ok(classCourseTimeStatisticsSetService.edit(dto));
+    }
+
+//    @PutMapping
+//    @ApiOperation(value = "修改课时统计-班级课程设置")
+//    @SaCheckPermission("classcoursetimestatisticsset:edit")
+//    @XjrLog(value = "修改课时统计-班级课程设置")
+//    public RT<Boolean> update(@Valid @RequestBody UpdateClassCourseTimeStatisticsSetDto dto){
+//
+//        ClassCourseTimeStatisticsSet classCourseTimeStatisticsSet = BeanUtil.toBean(dto, ClassCourseTimeStatisticsSet.class);
+//        classCourseTimeStatisticsSet.setModifyDate(LocalDateTime.now());
+//        return RT.ok(classCourseTimeStatisticsSetService.updateById(classCourseTimeStatisticsSet));
+//
+//    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除课时统计-班级课程设置")
+    @SaCheckPermission("classcoursetimestatisticsset:delete")
+    @XjrLog(value = "删除课时统计-班级课程设置")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(classCourseTimeStatisticsSetService.removeBatchByIds(ids));
+    }
+
+}

+ 108 - 0
src/main/java/com/xjrsoft/module/classtime/controller/ClassCourseTimeStatisticsSetGroupController.java

@@ -0,0 +1,108 @@
+package com.xjrsoft.module.classtime.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+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.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.classtime.dto.AddClassCourseTimeStatisticsSetDto;
+import com.xjrsoft.module.classtime.dto.AddClassCourseTimeStatisticsSetGroupDto;
+import com.xjrsoft.module.classtime.dto.UpdateClassCourseTimeStatisticsSetGroupDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.xjrsoft.common.annotation.XjrLog;
+
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetGroupPageDto;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsSetGroup;
+import com.xjrsoft.module.classtime.service.IClassCourseTimeStatisticsSetGroupService;
+import com.xjrsoft.module.classtime.service.IClassCourseTimeStatisticsSetService;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetGroupPageVo;
+
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetGroupVo;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @title: 课时统计-班级课程分组设置
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/classtime" + "/classCourseTimeStatisticsSetGroup")
+@Api(value = "/classtime"  + "/classCourseTimeStatisticsSetGroup",tags = "课时统计-班级课程分组设置代码")
+@AllArgsConstructor
+public class ClassCourseTimeStatisticsSetGroupController {
+
+
+    private final IClassCourseTimeStatisticsSetGroupService classCourseTimeStatisticsSetGroupService;
+    private final IClassCourseTimeStatisticsSetService classCourseTimeStatisticsSetService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="课时统计-班级课程分组设置列表(分页)")
+    @SaCheckPermission("classcoursetimestatisticssetgroup:detail")
+    @XjrLog(value = "课时统计-班级课程分组设置列表(分页)")
+    public RT<PageOutput<ClassCourseTimeStatisticsSetGroupPageVo>> page(@Valid ClassCourseTimeStatisticsSetGroupPageDto dto){
+
+        Page<ClassCourseTimeStatisticsSetGroupPageVo> pages = classCourseTimeStatisticsSetGroupService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<ClassCourseTimeStatisticsSetGroupPageVo> pageOutput = ConventPage.getPageOutput(pages, ClassCourseTimeStatisticsSetGroupPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询课时统计-班级课程分组设置信息")
+    @SaCheckPermission("classcoursetimestatisticssetgroup:detail")
+    @XjrLog(value = "根据id查询课时统计-班级课程分组设置信息")
+    public RT<ClassCourseTimeStatisticsSetGroupVo> info(@RequestParam Long id){
+        ClassCourseTimeStatisticsSetGroup classCourseTimeStatisticsSetGroup = classCourseTimeStatisticsSetGroupService.getById(id);
+        if (classCourseTimeStatisticsSetGroup == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(classCourseTimeStatisticsSetGroup, ClassCourseTimeStatisticsSetGroupVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增课时统计-班级课程分组设置")
+    @SaCheckPermission("classcoursetimestatisticssetgroup:add")
+    @XjrLog(value = "新增课时统计-班级课程分组设置")
+    public RT<Boolean> add(@Valid @RequestBody AddClassCourseTimeStatisticsSetDto dto) {
+        boolean isSuccess = classCourseTimeStatisticsSetService.add(dto);
+        return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改课时统计-班级课程分组设置")
+    @SaCheckPermission("classcoursetimestatisticssetgroup:edit")
+    @XjrLog(value = "修改课时统计-班级课程分组设置")
+    public RT<Boolean> update(@Valid @RequestBody UpdateClassCourseTimeStatisticsSetGroupDto dto){
+
+        ClassCourseTimeStatisticsSetGroup classCourseTimeStatisticsSetGroup = BeanUtil.toBean(dto, ClassCourseTimeStatisticsSetGroup.class);
+        return RT.ok(classCourseTimeStatisticsSetGroupService.updateById(classCourseTimeStatisticsSetGroup));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除课时统计-班级课程分组设置")
+    @SaCheckPermission("classcoursetimestatisticssetgroup:delete")
+    @XjrLog(value = "删除课时统计-班级课程分组设置")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(classCourseTimeStatisticsSetGroupService.removeBatchByIds(ids));
+
+    }
+
+}

+ 143 - 0
src/main/java/com/xjrsoft/module/classtime/dto/AddClassCourseTimeStatisticsRecordDto.java

@@ -0,0 +1,143 @@
+package com.xjrsoft.module.classtime.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 课时统计-教师课程详情
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+public class AddClassCourseTimeStatisticsRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 课时统计(class_time_statistics)
+    */
+    @ApiModelProperty("课时统计(class_time_statistics)")
+    private Long classTimeStatisticsId;
+    /**
+    * 教师id(xjr_user)
+    */
+    @ApiModelProperty("教师id(xjr_user)")
+    private Long userId;
+    /**
+    * 聘用类型
+    */
+    @ApiModelProperty("聘用类型")
+    private String employType;
+    /**
+    * 总课时
+    */
+    @ApiModelProperty("总课时")
+    private Double allClassTime;
+    /**
+    * 总金额
+    */
+    @ApiModelProperty("总金额")
+    private Double totalAmount;
+    /**
+    * 课时费用
+    */
+    @ApiModelProperty("课时费用")
+    private Double classTimeAmount;
+    /**
+    * 外聘教师超课时费
+    */
+    @ApiModelProperty("外聘教师超课时费")
+    private Double beyondClassTimeAmount;
+    /**
+    * 每周数据
+    */
+    @ApiModelProperty("每周数据")
+    private String weekData;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private Long classId;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private Long courseId;
+    /**
+    * 权重json
+    */
+    @ApiModelProperty("权重json")
+    private String weightSetJson;
+    /**
+    * 权重json
+    */
+    @ApiModelProperty("权重json")
+    private String costSetJson;
+    /**
+    * 教研会
+    */
+    @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;
+
+}

+ 48 - 0
src/main/java/com/xjrsoft/module/classtime/dto/AddClassCourseTimeStatisticsSetDto.java

@@ -0,0 +1,48 @@
+package com.xjrsoft.module.classtime.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 课时统计-班级课程设置
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+@Data
+public class AddClassCourseTimeStatisticsSetDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 权重内容
+    */
+    @ApiModelProperty("权重内容")
+    private String jsonContent;
+    /**
+    * 类别(1:权重 2:费用设置)
+    */
+    @ApiModelProperty("类别(1:权重 2:费用设置)")
+    private Integer category;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private List<Long> classIds;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private List<Long> courseIds;
+
+}

+ 53 - 0
src/main/java/com/xjrsoft/module/classtime/dto/AddClassCourseTimeStatisticsSetGroupDto.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.classtime.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 课时统计-班级课程分组设置
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+public class AddClassCourseTimeStatisticsSetGroupDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 权重内容
+    */
+    @ApiModelProperty("权重内容")
+    private String jsonContent;
+    /**
+    * 类别(1:权重 2:费用设置)
+    */
+    @ApiModelProperty("类别(1:权重 2:费用设置)")
+    private Integer category;
+    /**
+     * 班级
+     */
+    @ApiModelProperty("班级")
+    private List<Long> classIds;
+    /**
+     * 课程
+     */
+    @ApiModelProperty("课程")
+    private List<Long> courseIds;
+    /**
+    * 是否默认,一个班级只有一个默认,默认时候不设置课程
+    */
+    @ApiModelProperty("是否默认,一个班级只有一个默认,默认时候不设置课程")
+    private Integer isDefault;
+
+}

+ 26 - 0
src/main/java/com/xjrsoft/module/classtime/dto/ClassCourseTimeStatisticsRecordPageDto.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.classtime.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 课时统计-教师课程详情分页查询入参
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ClassCourseTimeStatisticsRecordPageDto extends PageInput {
+
+
+}

+ 38 - 0
src/main/java/com/xjrsoft/module/classtime/dto/ClassCourseTimeStatisticsSetGroupPageDto.java

@@ -0,0 +1,38 @@
+package com.xjrsoft.module.classtime.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 课时统计-班级课程分组设置分页查询入参
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ClassCourseTimeStatisticsSetGroupPageDto extends PageInput {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 班级名称
+     */
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    /**
+     * 课程名称
+     */
+    @ApiModelProperty("课程名称")
+    private String courseName;
+}

+ 38 - 0
src/main/java/com/xjrsoft/module/classtime/dto/ClassCourseTimeStatisticsSetPageDto.java

@@ -0,0 +1,38 @@
+package com.xjrsoft.module.classtime.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 课时统计-班级课程设置分页查询入参
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ClassCourseTimeStatisticsSetPageDto extends PageInput {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 班级名称
+     */
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    /**
+     * 课程名称
+     */
+    @ApiModelProperty("课程名称")
+    private String courseName;
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/classtime/dto/UpdateClassCourseTimeStatisticsRecordDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.classtime.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 课时统计-教师课程详情
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+public class UpdateClassCourseTimeStatisticsRecordDto extends AddClassCourseTimeStatisticsRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/classtime/dto/UpdateClassCourseTimeStatisticsSetDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.classtime.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 课时统计-班级课程设置
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+@Data
+public class UpdateClassCourseTimeStatisticsSetDto extends AddClassCourseTimeStatisticsSetDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/classtime/dto/UpdateClassCourseTimeStatisticsSetGroupDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.classtime.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 课时统计-班级课程分组设置
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+public class UpdateClassCourseTimeStatisticsSetGroupDto extends AddClassCourseTimeStatisticsSetGroupDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 227 - 0
src/main/java/com/xjrsoft/module/classtime/entity/ClassCourseTimeStatisticsRecord.java

@@ -0,0 +1,227 @@
+package com.xjrsoft.module.classtime.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+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.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 课时统计-教师课程详情
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+@TableName("class_course_time_statistics_record")
+@ApiModel(value = "class_course_time_statistics_record", description = "课时统计-教师课程详情")
+public class ClassCourseTimeStatisticsRecord 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;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 课时统计(class_time_statistics)
+    */
+    @ApiModelProperty("课时统计(class_time_statistics)")
+    private Long classTimeStatisticsId;
+    /**
+    * 教师id(xjr_user)
+    */
+    @ApiModelProperty("教师id(xjr_user)")
+    private Long userId;
+    /**
+    * 聘用类型
+    */
+    @ApiModelProperty("聘用类型")
+    private String employType;
+    /**
+    * 总课时
+    */
+    @ApiModelProperty("总课时")
+    private Double allClassTime;
+    /**
+    * 总金额
+    */
+    @ApiModelProperty("总金额")
+    private Double totalAmount;
+    /**
+    * 课时费用
+    */
+    @ApiModelProperty("课时费用")
+    private Double classTimeAmount;
+    /**
+    * 外聘教师超课时费
+    */
+    @ApiModelProperty("外聘教师超课时费")
+    private Double beyondClassTimeAmount;
+    /**
+    * 每周数据
+    */
+    @ApiModelProperty("每周数据")
+    private String weekData;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private Long classId;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private Long courseId;
+    /**
+    * 权重json
+    */
+    @ApiModelProperty("权重json")
+    private String weightSetJson;
+    /**
+    * 权重json
+    */
+    @ApiModelProperty("权重json")
+    private String costSetJson;
+    /**
+    * 教研会
+    */
+    @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;
+
+    /**
+     * 去顶课的数量,所有顶课数量
+     * dkClassTime
+     */
+    @ApiModelProperty("去顶课的数量,所有顶课数量")
+    private Double classTime20;
+
+    /**
+     * 发起顶课的数量,只统计事假和病假的数量
+     * bdkClassTime
+     */
+    @ApiModelProperty("发起顶课的数量,只统计事假和病假的数量")
+    private Double classTime21;
+    /**
+     * zkTimes
+     */
+    @ApiModelProperty("zkTimes")
+    private Double classTime22;
+    /**
+     * wzxTimes
+     */
+    @ApiModelProperty("wzxTimes")
+    private Double classTime23;
+    /**
+     * tkTimes
+     */
+    @ApiModelProperty("tkTimes")
+    private Double classTime24;
+    /**
+     * reduceTime
+     */
+    @ApiModelProperty("reduceTime")
+    private Double classTime25;
+
+
+}

+ 103 - 0
src/main/java/com/xjrsoft/module/classtime/entity/ClassCourseTimeStatisticsSet.java

@@ -0,0 +1,103 @@
+package com.xjrsoft.module.classtime.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+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.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 课时统计-班级课程设置
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+@Data
+@TableName("class_course_time_statistics_set")
+@ApiModel(value = "class_course_time_statistics_set", description = "课时统计-班级课程设置")
+public class ClassCourseTimeStatisticsSet 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;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 权重内容
+    */
+    @ApiModelProperty("权重内容")
+    private String jsonContent;
+    /**
+    * 类别(1:权重 2:费用设置)
+    */
+    @ApiModelProperty("类别(1:权重 2:费用设置)")
+    private Integer category;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private Long classId;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private Long courseId;
+    /**
+    * 是否默认,一个班级只有一个默认,默认时候不设置课程
+    */
+    @ApiModelProperty("是否默认,一个班级只有一个默认,默认时候不设置课程")
+    private Integer isDefault;
+
+
+}

+ 103 - 0
src/main/java/com/xjrsoft/module/classtime/entity/ClassCourseTimeStatisticsSetGroup.java

@@ -0,0 +1,103 @@
+package com.xjrsoft.module.classtime.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+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.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 课时统计-班级课程分组设置
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+@TableName("class_course_time_statistics_set_group")
+@ApiModel(value = "class_course_time_statistics_set_group", description = "课时统计-班级课程分组设置")
+public class ClassCourseTimeStatisticsSetGroup 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;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 权重内容
+    */
+    @ApiModelProperty("权重内容")
+    private String jsonContent;
+    /**
+    * 类别(1:权重 2:费用设置)
+    */
+    @ApiModelProperty("类别(1:权重 2:费用设置)")
+    private Integer category;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private String classIds;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private String courseIds;
+    /**
+    * 是否默认,一个班级只有一个默认,默认时候不设置课程
+    */
+    @ApiModelProperty("是否默认,一个班级只有一个默认,默认时候不设置课程")
+    private Integer isDefault;
+
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/classtime/mapper/ClassCourseTimeStatisticsRecordMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.classtime.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 课时统计-教师课程详情
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Mapper
+public interface ClassCourseTimeStatisticsRecordMapper extends MPJBaseMapper<ClassCourseTimeStatisticsRecord> {
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/classtime/mapper/ClassCourseTimeStatisticsSetGroupMapper.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.classtime.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetGroupPageDto;
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetPageDto;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsSetGroup;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetGroupPageVo;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+* @title: 课时统计-班级课程分组设置
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Mapper
+public interface ClassCourseTimeStatisticsSetGroupMapper extends MPJBaseMapper<ClassCourseTimeStatisticsSetGroup> {
+    Page<ClassCourseTimeStatisticsSetGroupPageVo> getPage(Page<ClassCourseTimeStatisticsSetGroupPageVo> page, @Param("dto") ClassCourseTimeStatisticsSetGroupPageDto dto);
+
+}

+ 20 - 0
src/main/java/com/xjrsoft/module/classtime/mapper/ClassCourseTimeStatisticsSetMapper.java

@@ -0,0 +1,20 @@
+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.ClassCourseTimeStatisticsSetPageDto;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsSet;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+* @title: 课时统计-班级课程设置
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+@Mapper
+public interface ClassCourseTimeStatisticsSetMapper extends MPJBaseMapper<ClassCourseTimeStatisticsSet> {
+    Page<ClassCourseTimeStatisticsSetPageVo> getPage(Page<ClassCourseTimeStatisticsSetPageVo> page, @Param("dto") ClassCourseTimeStatisticsSetPageDto dto);
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/classtime/service/IClassCourseTimeStatisticsRecordService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.classtime.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsRecord;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 课时统计-教师课程详情
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+
+public interface IClassCourseTimeStatisticsRecordService extends MPJBaseService<ClassCourseTimeStatisticsRecord> {
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/classtime/service/IClassCourseTimeStatisticsSetGroupService.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.classtime.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetGroupPageDto;
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetPageDto;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsSetGroup;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetGroupPageVo;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 课时统计-班级课程分组设置
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+
+public interface IClassCourseTimeStatisticsSetGroupService extends MPJBaseService<ClassCourseTimeStatisticsSetGroup> {
+    Page<ClassCourseTimeStatisticsSetGroupPageVo> getPage(Page<ClassCourseTimeStatisticsSetGroupPageVo> page, ClassCourseTimeStatisticsSetGroupPageDto dto);
+
+}

+ 30 - 0
src/main/java/com/xjrsoft/module/classtime/service/IClassCourseTimeStatisticsSetService.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.classtime.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.classtime.dto.AddClassCourseTimeStatisticsSetDto;
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetPageDto;
+import com.xjrsoft.module.classtime.dto.UpdateClassCourseTimeStatisticsSetGroupDto;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsSet;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo;
+import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 课时统计-班级课程设置
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+
+public interface IClassCourseTimeStatisticsSetService extends MPJBaseService<ClassCourseTimeStatisticsSet> {
+    Page<ClassCourseTimeStatisticsSetPageVo> getPage(Page<ClassCourseTimeStatisticsSetPageVo> page, ClassCourseTimeStatisticsSetPageDto dto);
+
+    boolean add(AddClassCourseTimeStatisticsSetDto dto);
+
+    boolean edit(UpdateClassCourseTimeStatisticsSetGroupDto dto);
+
+    boolean addDef(AddClassCourseTimeStatisticsSetDto dto);
+}

+ 25 - 0
src/main/java/com/xjrsoft/module/classtime/service/impl/ClassCourseTimeStatisticsRecordServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.classtime.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsRecord;
+import com.xjrsoft.module.classtime.mapper.ClassCourseTimeStatisticsRecordMapper;
+import com.xjrsoft.module.classtime.service.IClassCourseTimeStatisticsRecordService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 课时统计-教师课程详情
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class ClassCourseTimeStatisticsRecordServiceImpl extends MPJBaseServiceImpl<ClassCourseTimeStatisticsRecordMapper, ClassCourseTimeStatisticsRecord> implements IClassCourseTimeStatisticsRecordService {
+}

+ 34 - 0
src/main/java/com/xjrsoft/module/classtime/service/impl/ClassCourseTimeStatisticsSetGroupServiceImpl.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.module.classtime.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetGroupPageDto;
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetPageDto;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsSetGroup;
+import com.xjrsoft.module.classtime.mapper.ClassCourseTimeStatisticsSetGroupMapper;
+import com.xjrsoft.module.classtime.service.IClassCourseTimeStatisticsSetGroupService;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetGroupPageVo;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 课时统计-班级课程分组设置
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class ClassCourseTimeStatisticsSetGroupServiceImpl extends MPJBaseServiceImpl<ClassCourseTimeStatisticsSetGroupMapper, ClassCourseTimeStatisticsSetGroup> implements IClassCourseTimeStatisticsSetGroupService {
+    @Override
+    public Page<ClassCourseTimeStatisticsSetGroupPageVo> getPage(Page<ClassCourseTimeStatisticsSetGroupPageVo> page, ClassCourseTimeStatisticsSetGroupPageDto dto) {
+        return this.baseMapper.getPage(page, dto);
+    }
+}

+ 248 - 0
src/main/java/com/xjrsoft/module/classtime/service/impl/ClassCourseTimeStatisticsSetServiceImpl.java

@@ -0,0 +1,248 @@
+package com.xjrsoft.module.classtime.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.base.service.IBaseCourseSubjectService;
+import com.xjrsoft.module.classtime.dto.AddClassCourseTimeStatisticsSetDto;
+import com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetPageDto;
+import com.xjrsoft.module.classtime.dto.ClassTimeDeletePageDto;
+import com.xjrsoft.module.classtime.dto.UpdateClassCourseTimeStatisticsSetGroupDto;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsSet;
+import com.xjrsoft.module.classtime.entity.ClassCourseTimeStatisticsSetGroup;
+import com.xjrsoft.module.classtime.mapper.ClassCourseTimeStatisticsSetGroupMapper;
+import com.xjrsoft.module.classtime.mapper.ClassCourseTimeStatisticsSetMapper;
+import com.xjrsoft.module.classtime.service.IClassCourseTimeStatisticsSetGroupService;
+import com.xjrsoft.module.classtime.service.IClassCourseTimeStatisticsSetService;
+import com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo;
+import com.xjrsoft.module.classtime.vo.ClassTimeDeletePageVo;
+import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
+import com.xjrsoft.module.student.entity.BaseStudentUser;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 课时统计-班级课程设置
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class ClassCourseTimeStatisticsSetServiceImpl extends MPJBaseServiceImpl<ClassCourseTimeStatisticsSetMapper, ClassCourseTimeStatisticsSet> implements IClassCourseTimeStatisticsSetService {
+
+    private final ClassCourseTimeStatisticsSetMapper classCourseTimeStatisticsSetMapper;
+    private final IBaseClassService baseClassService;
+    private final IBaseCourseSubjectService baseCourseSubjectService;
+    private final IClassCourseTimeStatisticsSetGroupService classCourseTimeStatisticsSetGroupService;
+    private final ClassCourseTimeStatisticsSetGroupMapper classCourseTimeStatisticsSetGroupMapper;
+
+    @Override
+    public Page<ClassCourseTimeStatisticsSetPageVo> getPage(Page<ClassCourseTimeStatisticsSetPageVo> page, ClassCourseTimeStatisticsSetPageDto dto) {
+        return this.baseMapper.getPage(page, dto);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean add(AddClassCourseTimeStatisticsSetDto dto) {
+        if (dto.getClassIds().isEmpty()) {
+            throw new MyException("班级不能为空");
+        }
+        if (dto.getCourseIds().isEmpty()) {
+            throw new MyException("课程不能为空");
+        }
+
+        List<BaseClass> baseClassList = baseClassService.list();
+        List<BaseCourseSubject> baseCourseSubjectList = baseCourseSubjectService.list();
+
+        for (Long classId : dto.getClassIds()) {
+            for (Long courseId : dto.getCourseIds()) {
+
+                boolean exists = classCourseTimeStatisticsSetGroupMapper.exists(new QueryWrapper<ClassCourseTimeStatisticsSetGroup>()
+                        .lambda()
+                        .like(ClassCourseTimeStatisticsSetGroup::getClassIds, classId)
+                        .like(ClassCourseTimeStatisticsSetGroup::getCourseIds, courseId));
+
+//                boolean exists = classCourseTimeStatisticsSetMapper.exists(new QueryWrapper<ClassCourseTimeStatisticsSet>()
+//                        .lambda()
+//                        .eq(ClassCourseTimeStatisticsSet::getClassId, classId)
+//                        .eq(ClassCourseTimeStatisticsSet::getCourseId, courseId)
+//                );
+                if (exists) {
+
+                    String className = baseClassList.stream()
+                            .filter(item -> Objects.equals(item.getId(), classId))
+                            .findFirst()
+                            .map(BaseClass::getName)
+                            .orElse(null);
+
+                    String courseName = baseCourseSubjectList.stream()
+                            .filter(item -> Objects.equals(item.getId(), courseId))
+                            .findFirst()
+                            .map(BaseCourseSubject::getName)
+                            .orElse(null);
+
+                    String errorMsg = String.format("班级: %s, 课程: %s :已经设置,不能重复设置", className, courseName);
+                    throw new MyException(errorMsg);
+                }
+
+                ClassCourseTimeStatisticsSet classCourseTimeStatisticsSet =
+                        new ClassCourseTimeStatisticsSet() {{
+                            setCourseId(courseId);
+                            setClassId(classId);
+                            setCreateDate(LocalDateTime.now());
+                            setCategory(2);
+                            setJsonContent(dto.getJsonContent());
+                            setIsDefault(0);
+                            setDeleteMark(DeleteMark.NODELETE.getCode());
+                            setEnabledMark(EnabledMark.ENABLED.getCode());
+                        }};
+
+                classCourseTimeStatisticsSetMapper.insert(classCourseTimeStatisticsSet);
+            }
+        }
+
+        String classIds = dto.getClassIds().stream().map(Object::toString).collect(Collectors.joining(","));
+        String courseIds = dto.getCourseIds().stream().map(Object::toString).collect(Collectors.joining(","));
+
+        classCourseTimeStatisticsSetGroupService.save(new ClassCourseTimeStatisticsSetGroup() {{
+            setCourseIds(courseIds);
+            setClassIds(classIds);
+            setCreateDate(LocalDateTime.now());
+            setCategory(2);
+            setJsonContent(dto.getJsonContent());
+            setIsDefault(0);
+            setDeleteMark(DeleteMark.NODELETE.getCode());
+            setEnabledMark(EnabledMark.ENABLED.getCode());
+        }});
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addDef(AddClassCourseTimeStatisticsSetDto dto) {
+        if (dto.getClassIds().isEmpty()) {
+            throw new MyException("班级不能为空");
+        }
+
+        for (Long classId : dto.getClassIds()) {
+                ClassCourseTimeStatisticsSet classCourseTimeStatisticsSet =
+                        new ClassCourseTimeStatisticsSet() {{
+                            setCourseId(0L);
+                            setClassId(classId);
+                            setCreateDate(LocalDateTime.now());
+                            setCategory(2);
+                            setJsonContent(dto.getJsonContent());
+                            setIsDefault(1);
+                            setDeleteMark(DeleteMark.NODELETE.getCode());
+                            setEnabledMark(EnabledMark.ENABLED.getCode());
+                        }};
+
+                classCourseTimeStatisticsSetMapper.insert(classCourseTimeStatisticsSet);
+
+        }
+        return true;
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean edit(UpdateClassCourseTimeStatisticsSetGroupDto dto) {
+        if (dto.getClassIds().isEmpty()) {
+            throw new MyException("班级不能为空");
+        }
+        if (dto.getCourseIds().isEmpty()) {
+            throw new MyException("课程不能为空");
+        }
+
+        List<BaseClass> baseClassList = baseClassService.list();
+        List<BaseCourseSubject> baseCourseSubjectList = baseCourseSubjectService.list();
+
+        for (Long classId : dto.getClassIds()) {
+            for (Long courseId : dto.getCourseIds()) {
+
+                boolean exists = classCourseTimeStatisticsSetGroupMapper.exists(new QueryWrapper<ClassCourseTimeStatisticsSetGroup>()
+                                .lambda()
+                                .like(ClassCourseTimeStatisticsSetGroup::getClassIds, classId)
+                                .like(ClassCourseTimeStatisticsSetGroup::getCourseIds, courseId)
+                                .ne(ClassCourseTimeStatisticsSetGroup::getId,dto.getId()));
+                if(exists){
+                    String className = baseClassList.stream()
+                            .filter(item -> Objects.equals(item.getId(), classId))
+                            .findFirst()
+                            .map(BaseClass::getName)
+                            .orElse(null);
+
+                    String courseName = baseCourseSubjectList.stream()
+                            .filter(item -> Objects.equals(item.getId(), courseId))
+                            .findFirst()
+                            .map(BaseCourseSubject::getName)
+                            .orElse(null);
+
+                    String errorMsg = String.format("班级: %s, 课程: %s :已经设置,不能重复设置", className, courseName);
+                    throw new MyException(errorMsg);
+                }
+
+
+                ClassCourseTimeStatisticsSet classCourseTimeStatisticsSet = classCourseTimeStatisticsSetMapper.selectOne(new QueryWrapper<ClassCourseTimeStatisticsSet>()
+                        .lambda()
+                        .eq(ClassCourseTimeStatisticsSet::getClassId, classId)
+                        .eq(ClassCourseTimeStatisticsSet::getCourseId, courseId)
+                );
+                if (classCourseTimeStatisticsSet==null) {
+                    ClassCourseTimeStatisticsSet _classCourseTimeStatisticsSet =
+                            new ClassCourseTimeStatisticsSet() {{
+                                setCourseId(courseId);
+                                setClassId(classId);
+                                setCreateDate(LocalDateTime.now());
+                                setCategory(2);
+                                setJsonContent(dto.getJsonContent());
+                                setIsDefault(0);
+                                setDeleteMark(DeleteMark.NODELETE.getCode());
+                                setEnabledMark(EnabledMark.ENABLED.getCode());
+                            }};
+
+                    classCourseTimeStatisticsSetMapper.insert(_classCourseTimeStatisticsSet);
+                }else{
+                    classCourseTimeStatisticsSet.setJsonContent(dto.getJsonContent());
+                    classCourseTimeStatisticsSet.setModifyDate(LocalDateTime.now());
+                    classCourseTimeStatisticsSetMapper.updateById(classCourseTimeStatisticsSet);
+                }
+
+
+            }
+        }
+
+        String classIds = dto.getClassIds().stream().map(Object::toString).collect(Collectors.joining(","));
+        String courseIds = dto.getCourseIds().stream().map(Object::toString).collect(Collectors.joining(","));
+
+        classCourseTimeStatisticsSetGroupService.updateById(new ClassCourseTimeStatisticsSetGroup() {{
+            setId(dto.getId());
+            setCourseIds(courseIds);
+            setClassIds(classIds);
+            setCreateDate(LocalDateTime.now());
+            setCategory(2);
+            setJsonContent(dto.getJsonContent());
+            setIsDefault(0);
+            setDeleteMark(DeleteMark.NODELETE.getCode());
+            setEnabledMark(EnabledMark.ENABLED.getCode());
+        }});
+        return true;
+    }
+}

+ 618 - 1
src/main/java/com/xjrsoft/module/classtime/service/impl/ClassTimeStatisticsServiceImpl.java

@@ -21,9 +21,11 @@ import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.classtime.dto.AddClassTimeStatisticsDto;
 import com.xjrsoft.module.classtime.dto.CourseRecordDto;
 import com.xjrsoft.module.classtime.entity.*;
+import com.xjrsoft.module.classtime.mapper.ClassCourseTimeStatisticsRecordMapper;
 import com.xjrsoft.module.classtime.mapper.ClassTimeStatisticsAdministrationMapper;
 import com.xjrsoft.module.classtime.mapper.ClassTimeStatisticsMapper;
 import com.xjrsoft.module.classtime.mapper.ClassTimeStatisticsRecordMapper;
+import com.xjrsoft.module.classtime.service.IClassCourseTimeStatisticsSetService;
 import com.xjrsoft.module.classtime.service.IClassTimeDeleteService;
 import com.xjrsoft.module.classtime.service.IClassTimeStatisticsService;
 import com.xjrsoft.module.classtime.service.IClassTimeStatisticsSetService;
@@ -67,6 +69,9 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
     private final ClassTimeStatisticsMapper statisticsMapper;
 
     private final ClassTimeStatisticsRecordMapper recordMapper;
+    private final ClassCourseTimeStatisticsRecordMapper recordCourseMapper;
+
+    private  final IClassCourseTimeStatisticsSetService statisticsCourseSetService;
 
     private final IClassTimeStatisticsSetService statisticsSetService;
 
@@ -238,6 +243,384 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
      * 4、查询补班日期下的所有课程
      * 5、属于节假日的课程不查询
      */
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean refreshRecordNew(ClassTimeStatistics statistics) {
+        try {
+            // 1、查询教师
+            List<TeacherListVo> teacherList = this.baseMapper.getTeacherList();
+            // 2、查询补课课时
+            List<DictionaryDetail> CourseTimeTypeList = dictionaryService.list(
+                    new QueryWrapper<DictionaryDetail>().lambda()
+                            .eq(DictionaryDetail::getItemId, 1833772737004875778L)
+                            .eq(DictionaryDetail::getDeleteMark, DeleteMark.NODELETE.getCode())
+                            .eq(DictionaryDetail::getEnabledMark, EnabledMark.ENABLED.getCode())
+                            .orderByAsc(DictionaryDetail::getCode)
+            );
+            Map<String, String> CourseTimeTypeMap = CourseTimeTypeList.stream().collect(Collectors.toMap(DictionaryDetail::getCode, DictionaryDetail::getName));
+            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 LinkedHashMap<>();
+            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 LinkedHashMap<>();
+            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<LocalDate> allDateList = getDatesBetween(statistics.getStartDate(), statistics.getEndDate());
+            //查询课程数据,排除开节假日的数据
+            List<CourseListVo> allCourseList = this.baseMapper.getCourseList(statistics);
+            allCourseList.addAll(this.baseMapper.getHolidayReplaceCourseList(statistics));
+
+            //查询删除课时的数据,将每个班删除的具体日期统计出来
+            List<ClassTimeDelete> deleteList = deleteService.list(
+                    new QueryWrapper<ClassTimeDelete>().lambda()
+                            .ne(ClassTimeDelete::getStatus, 2)
+                            .eq(ClassTimeDelete::getEnabledMark, EnabledMark.ENABLED.getCode())
+                            .eq(ClassTimeDelete::getDeleteMark, DeleteMark.NODELETE.getCode())
+            );
+            Map<Long, List<ClassTimeDelete>> deleteDataMap = deleteList.stream().collect(Collectors.groupingBy(ClassTimeDelete::getClassId));
+            Map<Long, Map<LocalDate, String>> deleteMap = new HashMap<>();//将每个班级计算出来所有被删除的日期存入map
+            for (Long classId : deleteDataMap.keySet()) {
+                Map<LocalDate, String> dateMap = new HashMap<>();
+                for (ClassTimeDelete classTimeDelete : deleteDataMap.get(classId)) {
+                    LocalDate currentDate = classTimeDelete.getStartDate();
+                    while (!currentDate.isAfter(classTimeDelete.getEndDate())) {
+                        dateMap.put(currentDate, classTimeDelete.getTimePeriod());
+                        currentDate = currentDate.plusDays(1); // 增加一天
+                    }
+                }
+                //去重并存到map中
+                deleteMap.put(classId, dateMap);
+            }
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+            //查询所有老师发起顶课通过的数量,也要分别计算早自习、晚自习、正课、如果日期出入课时删除中,也需要跳过
+            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;
+                //计算补充课时,算作正课课时,但是计算超出课时时不计算这部分
+                JsonObject courseTimeTypeJson = new JsonObject();
+                Double courseTimeTypeTime = 0D;
+                for (String courseTimeType : CourseTimeTypeMap.keySet()) {
+                    List<WfTeacherCourseTime> courseTimes = courseTimeMap.get(courseTimeType);
+                    if (courseTimes == null) {
+                        courseTimeTypeJson.addProperty(CourseTimeTypeMap.get(courseTimeType), 0);
+                        continue;
+                    }
+                    double sum = courseTimes.stream()
+                            .filter(x -> x.getTeacherIds().contains(teacher.getId().toString()))
+                            .mapToDouble(WfTeacherCourseTime::getCourseTime).sum();
+                    allClassTime = allClassTime + sum;
+                    courseTimeTypeTime = courseTimeTypeTime + sum;
+                    courseTimeTypeJson.addProperty(CourseTimeTypeMap.get(courseTimeType), sum);
+
+                    for (LocalDate localDate : allDateList) {
+                        double sum1 = courseTimes.stream()
+                                .filter(x -> x.getTeacherIds().contains(teacher.getId().toString()) && localDate.equals(x.getScheduleDate()))
+                                .mapToDouble(WfTeacherCourseTime::getCourseTime).sum();
+                        JsonObject courseJson = new JsonObject();
+                        courseJson.addProperty("type", CourseTimeTypeMap.get(courseTimeType));
+                        courseJson.addProperty("scheduleDate", localDate.format(formatter));
+                        courseJson.addProperty("content", sum1);
+                        courseJson.addProperty("adjustType", "");
+                        allClassTimeDataArray.add(courseJson);
+                    }
+                }
+                record.setCourseTimeTypeData(courseTimeTypeJson.toString());
+
+                //早自习、正课、晚辅
+                Double classTime7 = 0D, classTime8 = 0D, classTime9 = 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) {
+                    //如果这个课程数据包含在被删除的课时中,跳过不计算
+                    Map<LocalDate, String> deleteDates = deleteMap.get(courseListVo.getClassId());
+                    JsonObject courseJson = new JsonObject();
+                    if (deleteDates != null && deleteDates.containsKey(courseListVo.getScheduleDate()) && deleteDates.get(courseListVo.getScheduleDate()) != null
+                            && deleteDates.get(courseListVo.getScheduleDate()).contains(courseListVo.getTimeNumber())) {
+                        courseJson.addProperty("type", courseListVo.getShortName());
+                        courseJson.addProperty("scheduleDate", courseListVo.getScheduleDate().format(formatter));
+                        courseJson.addProperty("content", "");
+                        courseJson.addProperty("adjustType", "course_delete");
+                        allClassTimeDataArray.add(courseJson);
+                        continue;
+                    }
+                    if ("早自习".equals(courseListVo.getShortName())) {
+                        classTime7 += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                    } else if (zkList.contains(courseListVo.getShortName())) {
+                        classTime8 += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                    } else if (wzxList.contains(courseListVo.getShortName())) {
+                        classTime9 += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                    }
+
+                    if (courseListVo.getAdjustType() != null && !courseListVo.getAdjustType().isEmpty()) {
+                        if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseListVo.getAdjustType())) {
+                            classTime11 += weightSetMap.get(courseListVo.getShortName());
+                        }
+                    }
+                    courseJson.addProperty("type", courseListVo.getShortName());
+                    courseJson.addProperty("scheduleDate", courseListVo.getScheduleDate().format(formatter));
+                    courseJson.addProperty("content", courseListVo.getClassName() + "," + courseListVo.getCourseName());
+                    courseJson.addProperty("adjustType", courseListVo.getAdjustType() == null ? "" : courseListVo.getAdjustType());
+                    allClassTimeDataArray.add(courseJson);
+                }
+                record.setClassTime7(classTime7);
+                record.setClassTime8(classTime8);
+                record.setClassTime9(classTime9);
+                record.setClassTime11(classTime11);
+                JsonObject weekDataJson = new JsonObject();
+                Double allTimes = 0d;
+                Double allCcksTime = 0d;//总的超出课时,从每周的正课课时中计算
+                BigDecimal ccksTime = BigDecimal.ZERO;//超出课时标准(每周)
+                if ("FB1601".equals(teacher.getEmployType())) {
+                    ccksTime = BigDecimal.valueOf(costSetMap.get("cost7"));
+                } else {//外聘FB1605、合作人员FB1609
+                    ccksTime = BigDecimal.valueOf(costSetMap.get("cost8"));
+                }
+                //存每周的数据
+                for (WeekTimeRangeVo timeRangeVo : weekTimeRangeVos) {
+                    Double zkTimes = 0d;
+                    Double wzxTimes = 0d;
+                    Double tkTimes = 0d;
+                    for (CourseListVo courseListVo : courseList) {
+                        LocalDate scheduleDate = courseListVo.getScheduleDate();
+                        //如果这个课程数据包含在被删除的课时中,跳过不计算
+                        Map<LocalDate, String> deleteDates = deleteMap.get(courseListVo.getClassId());
+                        if (deleteDates != null && deleteDates.containsKey(scheduleDate) && deleteDates.get(courseListVo.getScheduleDate()) != null
+                                && deleteDates.get(courseListVo.getScheduleDate()).contains(courseListVo.getTimeNumber())) {
+                            continue;
+                        }
+
+                        if (!((scheduleDate.equals(timeRangeVo.getMondayDate()) || scheduleDate.isAfter(timeRangeVo.getMondayDate()))
+                                && (scheduleDate.equals(timeRangeVo.getSundayDate()) || scheduleDate.isBefore(timeRangeVo.getSundayDate())))) {
+                            continue;
+                        }
+
+                        if ("早自习".equals(courseListVo.getShortName())) {
+                            zkTimes += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                        } else if (zkList.contains(courseListVo.getShortName())) {
+                            zkTimes += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                        } else if (wzxList.contains(courseListVo.getShortName())) {
+                            wzxTimes += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                        }
+
+                        if (courseListVo.getAdjustType() != null && !courseListVo.getAdjustType().isEmpty()) {
+                            if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseListVo.getAdjustType())) {
+                                tkTimes += weightSetMap.get(courseListVo.getShortName());
+                            }
+                        }
+                    }
+                    //计算该老师发起的事假、病假顶课数据
+                    List<CourseListVo> substituteList = allSubstituteList.stream().filter(x -> x.getExchangeTeacherId().equals(teacher.getId()))
+                            .collect(Collectors.toList());
+                    Double reduceTime = 0d;//顶课课时
+                    for (CourseListVo courseListVo : substituteList) {
+                        Map<LocalDate, String> deleteDates = deleteMap.get(courseListVo.getClassId());
+                        if (deleteDates != null && deleteDates.get(courseListVo.getScheduleDate()) != null && deleteDates.get(courseListVo.getScheduleDate()).contains(courseListVo.getTimeNumber())) {
+                            continue;
+                        }
+                        if (!((courseListVo.getScheduleDate().equals(timeRangeVo.getMondayDate()) || courseListVo.getScheduleDate().isAfter(timeRangeVo.getMondayDate()))
+                                && (courseListVo.getScheduleDate().equals(timeRangeVo.getSundayDate()) || courseListVo.getScheduleDate().isBefore(timeRangeVo.getSundayDate())))) {
+                            continue;
+                        }
+                        reduceTime += weightSetMap.get(courseListVo.getShortName());
+                    }
+
+                    substituteList = allSubstituteList.stream().filter(x -> x.getTeacherId().equals(teacher.getId().toString()))
+                            .collect(Collectors.toList());
+                    for (CourseListVo courseListVo : substituteList) {
+                        Map<LocalDate, String> deleteDates = deleteMap.get(courseListVo.getClassId());
+                        if (deleteDates != null && deleteDates.get(courseListVo.getScheduleDate()) != null
+                        ) {
+                            String timeNumbers = deleteDates.get(courseListVo.getScheduleDate());
+                            if (StrUtil.isNotEmpty(timeNumbers) && timeNumbers.contains(courseListVo.getTimeNumber())) {
+                                continue;
+                            }
+                        }
+                        if (!((courseListVo.getScheduleDate().equals(timeRangeVo.getMondayDate()) || courseListVo.getScheduleDate().isAfter(timeRangeVo.getMondayDate()))
+                                && (courseListVo.getScheduleDate().equals(timeRangeVo.getSundayDate()) || courseListVo.getScheduleDate().isBefore(timeRangeVo.getSundayDate())))) {
+                            continue;
+                        }
+                        reduceTime = reduceTime - weightSetMap.get(courseListVo.getShortName());
+                    }
+
+                    timeRangeVo.setZkTimes(zkTimes);
+                    timeRangeVo.setWzxTimes(wzxTimes);
+                    timeRangeVo.setDkTimes(reduceTime);
+                    timeRangeVo.setTkTimes(tkTimes);
+                    allTimes += (zkTimes + wzxTimes);
+                    if (zkTimes > ccksTime.doubleValue()) {
+                        allCcksTime += zkTimes - ccksTime.doubleValue();
+                    }
+                }
+                weekDataJson.add("weekData", new Gson().toJsonTree(weekTimeRangeVos));
+                weekDataJson.addProperty("allTimes", allTimes);
+                record.setWeekData(weekDataJson.toString());
+                //计算总课时
+                allClassTime = allClassTime + classTime7 + classTime8 + classTime9;
+                record.setAllClassTime(allClassTime);
+
+                //计算费用,根据聘用类型判断费用问题
+                Double classTimeAmount = 0d;
+                Double beyondClassTimeAmount = 0d;
+
+                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();
+
+                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 classTime = classTime8
+                        + courseTimeTypeTime;
+                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();
+                /**
+                 * 顶课:
+                 * 1、流程发起人(被顶老师)的课被顶课老师上了,那么被顶老师的课时就会-1,顶课老师课时就会+1
+                 * 2、顶课老师会根据规则额外加一笔费用,根据设置1课时额外加4元
+                 * 3、顶课类型为事假和病假的时候会扣除被顶老师的费用,根据设置为扣除4元
+                 */
+                BigDecimal reduceTimeAmount = BigDecimal.ZERO;
+                {
+                    //计算该老师发起的事假、病假顶课数据
+                    List<CourseListVo> substituteList = allSubstituteList.stream().filter(x -> x.getExchangeTeacherId().equals(teacher.getId()))
+                            .collect(Collectors.toList());
+                    Double reduceTime = 0d;//顶课课时
+                    Double dkClassTime = 0d;//去顶课的数量,所有顶课数量
+                    for (CourseListVo courseListVo : substituteList) {
+                        Map<LocalDate, String> deleteDates = deleteMap.get(courseListVo.getClassId());
+                        if (deleteDates != null && deleteDates.get(courseListVo.getScheduleDate()) != null && deleteDates.get(courseListVo.getScheduleDate()).contains(courseListVo.getTimeNumber())) {
+                            continue;
+                        }
+                        reduceTime += weightSetMap.get(courseListVo.getShortName());
+                        dkClassTime += weightSetMap.get(courseListVo.getShortName());
+                    }
+
+
+                    Double bdkClassTime = 0d;//发起顶课的数量,只统计事假和病假的数量
+                    substituteList = allSubstituteList.stream().filter(x -> x.getTeacherId().equals(teacher.getId().toString()))
+                            .collect(Collectors.toList());
+                    for (CourseListVo courseListVo : substituteList) {
+                        Map<LocalDate, String> deleteDates = deleteMap.get(courseListVo.getClassId());
+                        if (deleteDates != null && deleteDates.get(courseListVo.getScheduleDate()) != null && deleteDates.get(courseListVo.getScheduleDate()).contains(courseListVo.getTimeNumber())) {
+                            continue;
+                        }
+                        reduceTime = reduceTime - weightSetMap.get(courseListVo.getShortName());
+                        if ("sick _leave".equals(courseListVo.getReason()) || "leave_absence".equals(courseListVo.getReason())) {
+                            bdkClassTime += weightSetMap.get(courseListVo.getShortName());
+                        }
+                    }
+                    record.setClassTime10(reduceTime);
+
+                    BigDecimal dkCost = BigDecimal.ZERO;//顶课费用,顶课老师加钱
+                    if ("FB1601".equals(teacher.getEmployType())) {
+                        dkCost = BigDecimal.valueOf(costSetMap.get("cost11"));
+                    } else {//外聘FB1605、合作人员FB1609
+                        dkCost = BigDecimal.valueOf(costSetMap.get("cost12"));
+                    }
+                    reduceTimeAmount = BigDecimal.valueOf(dkClassTime).multiply(dkCost);
+                    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"));
+                    }
+                    //计算被扣除的费用
+                    reduceTimeAmount = reduceTimeAmount.subtract(bdkCost.multiply(BigDecimal.valueOf(bdkClassTime)));
+                }
+
+                record.setClassTimeAmount(classTimeAmount);
+                //计算超出的课时,需要先计算出每个周的开始结束时间
+                BigDecimal ccksCost = BigDecimal.ZERO;
+                if ("FB1601".equals(teacher.getEmployType())) {
+                    ccksCost = BigDecimal.valueOf(costSetMap.get("cost9"));
+                } else {//外聘FB1605、合作人员FB1609
+                    ccksCost = BigDecimal.valueOf(costSetMap.get("cost10"));
+                }
+                //计算出总的超出课时并计算超课时费
+                beyondClassTimeAmount = BigDecimal.valueOf(allCcksTime).multiply(ccksCost).doubleValue();
+                if (!"FB1601".equals(teacher.getEmployType())) {
+                    record.setBeyondClassTimeAmount(beyondClassTimeAmount);
+                }
+
+                //计算总金额,课时费+超课时费
+                Double totalAmount = classTimeAmount + beyondClassTimeAmount + reduceTimeAmount.doubleValue();
+                record.setTotalAmount(totalAmount);
+                record.setAllClassTimeData(calculateClassTime(allClassTimeDataArray, weightSetMap, allDateList, new ArrayList<>(CourseTimeTypeMap.values())));
+                record.setCreateDate(new Date());
+
+                insertList.add(record);
+            }
+
+            if (!insertList.isEmpty()) {
+                //先删除
+                String sql = "delete from class_time_statistics_record where class_time_statistics_id = " + statistics.getId();
+                SqlRunnerAdapter.db().delete(sql);
+                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());
+        } catch (Exception e) {
+            Log.error(e.getMessage(), e);
+            throw new MyException("统计出错,请联系管理员");
+        } finally {
+            statistics.setStatus(1);
+            this.updateById(statistics);
+        }
+        return true;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean refreshRecord(ClassTimeStatistics statistics) {
@@ -307,6 +690,10 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
             //查询所有老师发起顶课通过的数量,也要分别计算早自习、晚自习、正课、如果日期出入课时删除中,也需要跳过
             List<CourseListVo> allSubstituteList = this.baseMapper.getSubstituteList(statistics);
             List<ClassTimeStatisticsRecord> insertList = new ArrayList<>();
+            List<ClassCourseTimeStatisticsRecord> insertCourseList = new ArrayList<>();
+
+            List<ClassCourseTimeStatisticsSet> classCourseTimeStatisticsSetList = statisticsCourseSetService.list();
+
             //循环教师,准备开始计算
             for (TeacherListVo teacher : teacherList) {
                 ClassTimeStatisticsRecord record = new ClassTimeStatisticsRecord();
@@ -371,6 +758,7 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                         allClassTimeDataArray.add(courseJson);
                         continue;
                     }
+
                     if ("早自习".equals(courseListVo.getShortName())) {
                         classTime7 += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
                     } else if (zkList.contains(courseListVo.getShortName())) {
@@ -389,6 +777,42 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                     courseJson.addProperty("content", courseListVo.getClassName() + "," + courseListVo.getCourseName());
                     courseJson.addProperty("adjustType", courseListVo.getAdjustType() == null ? "" : courseListVo.getAdjustType());
                     allClassTimeDataArray.add(courseJson);
+
+                    ClassCourseTimeStatisticsRecord  classCourseTimeStatisticsRecord =checkCourseSet(classCourseTimeStatisticsSetList,insertCourseList,courseListVo.getClassId(),courseListVo.getCourseId(),teacher);
+
+                    if(classCourseTimeStatisticsRecord!=null) {
+                        //早自习、正课、晚辅
+                        Double _classTime7 = classCourseTimeStatisticsRecord.getClassTime7(),
+                                _classTime8 = classCourseTimeStatisticsRecord.getClassTime8(),
+                                _classTime9 = classCourseTimeStatisticsRecord.getClassTime9(),
+                                _classTime11 = classCourseTimeStatisticsRecord.getClassTime11();
+
+                        if ("早自习".equals(courseListVo.getShortName())) {
+                            _classTime7 += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                        } else if (zkList.contains(courseListVo.getShortName())) {
+                            _classTime8 += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                        } else if (wzxList.contains(courseListVo.getShortName())) {
+                            _classTime9 += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                        }
+
+                        if (courseListVo.getAdjustType() != null && !courseListVo.getAdjustType().isEmpty()) {
+                            if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseListVo.getAdjustType())) {
+                                _classTime11 += weightSetMap.get(courseListVo.getShortName());
+                            }
+                        }
+
+                        classCourseTimeStatisticsRecord.setClassTime7(_classTime7);
+                        classCourseTimeStatisticsRecord.setClassTime8(_classTime8);
+                        classCourseTimeStatisticsRecord.setClassTime9(_classTime9);
+                        classCourseTimeStatisticsRecord.setClassTime11(_classTime11);
+
+                        Double _llClassTime = _classTime7 + _classTime8 + _classTime9;
+
+                        classCourseTimeStatisticsRecord.setAllClassTime(_llClassTime);
+                    }
+
+
+
                 }
                 record.setClassTime7(classTime7);
                 record.setClassTime8(classTime8);
@@ -435,6 +859,34 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                                 tkTimes += weightSetMap.get(courseListVo.getShortName());
                             }
                         }
+
+                        ClassCourseTimeStatisticsRecord  classCourseTimeStatisticsRecord =checkCourseSet(classCourseTimeStatisticsSetList,insertCourseList,courseListVo.getClassId(),courseListVo.getCourseId(),teacher);
+
+                        if(classCourseTimeStatisticsRecord!=null) {
+                            //早自习、正课、晚辅
+                            Double _zkTimes = classCourseTimeStatisticsRecord.getClassTime22(),
+                                    _wzxTimes = classCourseTimeStatisticsRecord.getClassTime23(),
+                                    _tkTimes = classCourseTimeStatisticsRecord.getClassTime24();
+
+                            if ("早自习".equals(courseListVo.getShortName())) {
+                                _zkTimes += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                            } else if (zkList.contains(courseListVo.getShortName())) {
+                                _zkTimes += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                            } else if (wzxList.contains(courseListVo.getShortName())) {
+                                _wzxTimes += weightSetMap.get(courseListVo.getShortName()) == null ? 0d : weightSetMap.get(courseListVo.getShortName());
+                            }
+
+                            if (courseListVo.getAdjustType() != null && !courseListVo.getAdjustType().isEmpty()) {
+                                if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseListVo.getAdjustType())) {
+                                    _tkTimes += weightSetMap.get(courseListVo.getShortName());
+                                }
+                            }
+
+                            classCourseTimeStatisticsRecord.setClassTime22(_zkTimes);
+                            classCourseTimeStatisticsRecord.setClassTime23(_wzxTimes);
+                            classCourseTimeStatisticsRecord.setClassTime24(_tkTimes);
+                        }
+
                     }
                     //计算该老师发起的事假、病假顶课数据
                     List<CourseListVo> substituteList = allSubstituteList.stream().filter(x -> x.getExchangeTeacherId().equals(teacher.getId()))
@@ -450,6 +902,15 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                             continue;
                         }
                         reduceTime += weightSetMap.get(courseListVo.getShortName());
+
+                        ClassCourseTimeStatisticsRecord  classCourseTimeStatisticsRecord =checkCourseSet(classCourseTimeStatisticsSetList,insertCourseList,courseListVo.getClassId(),courseListVo.getCourseId(),teacher);
+
+                        if(classCourseTimeStatisticsRecord!=null) {
+                            Double _reduceTime = classCourseTimeStatisticsRecord.getClassTime25();
+                            _reduceTime += weightSetMap.get(courseListVo.getShortName());
+                            classCourseTimeStatisticsRecord.setClassTime25(_reduceTime);
+                        }
+
                     }
 
                     substituteList = allSubstituteList.stream().filter(x -> x.getTeacherId().equals(teacher.getId().toString()))
@@ -468,6 +929,15 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                             continue;
                         }
                         reduceTime = reduceTime - weightSetMap.get(courseListVo.getShortName());
+
+
+                        ClassCourseTimeStatisticsRecord  classCourseTimeStatisticsRecord =checkCourseSet(classCourseTimeStatisticsSetList,insertCourseList,courseListVo.getClassId(),courseListVo.getCourseId(),teacher);
+
+                        if(classCourseTimeStatisticsRecord!=null) {
+                            Double _reduceTime = classCourseTimeStatisticsRecord.getClassTime25();
+                            _reduceTime -= weightSetMap.get(courseListVo.getShortName());
+                            classCourseTimeStatisticsRecord.setClassTime25(_reduceTime);
+                        }
                     }
 
                     timeRangeVo.setZkTimes(zkTimes);
@@ -478,6 +948,8 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                     if (zkTimes > ccksTime.doubleValue()) {
                         allCcksTime += zkTimes - ccksTime.doubleValue();
                     }
+
+
                 }
                 weekDataJson.add("weekData", new Gson().toJsonTree(weekTimeRangeVos));
                 weekDataJson.addProperty("allTimes", allTimes);
@@ -537,8 +1009,20 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                         }
                         reduceTime += weightSetMap.get(courseListVo.getShortName());
                         dkClassTime += weightSetMap.get(courseListVo.getShortName());
-                    }
 
+                        ClassCourseTimeStatisticsRecord  classCourseTimeStatisticsRecord =checkCourseSet(classCourseTimeStatisticsSetList,insertCourseList,courseListVo.getClassId(),courseListVo.getCourseId(),teacher);
+
+                        if(classCourseTimeStatisticsRecord!=null) {
+                            Double _reduceTime = classCourseTimeStatisticsRecord.getClassTime10();
+                            _reduceTime += weightSetMap.get(courseListVo.getShortName());
+
+                            Double _classTime20 = classCourseTimeStatisticsRecord.getClassTime20();
+                            _classTime20 += weightSetMap.get(courseListVo.getShortName());
+
+                            classCourseTimeStatisticsRecord.setClassTime10(_reduceTime);
+                            classCourseTimeStatisticsRecord.setClassTime20(_classTime20);
+                        }
+                    }
 
                     Double bdkClassTime = 0d;//发起顶课的数量,只统计事假和病假的数量
                     substituteList = allSubstituteList.stream().filter(x -> x.getTeacherId().equals(teacher.getId().toString()))
@@ -552,6 +1036,22 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                         if ("sick _leave".equals(courseListVo.getReason()) || "leave_absence".equals(courseListVo.getReason())) {
                             bdkClassTime += weightSetMap.get(courseListVo.getShortName());
                         }
+
+                        ClassCourseTimeStatisticsRecord  classCourseTimeStatisticsRecord =checkCourseSet(classCourseTimeStatisticsSetList,insertCourseList,courseListVo.getClassId(),courseListVo.getCourseId(),teacher);
+
+                        if(classCourseTimeStatisticsRecord!=null) {
+                            Double _reduceTime = classCourseTimeStatisticsRecord.getClassTime10();
+                            _reduceTime -= weightSetMap.get(courseListVo.getShortName());
+                            classCourseTimeStatisticsRecord.setClassTime10(_reduceTime);
+
+                            if ("sick _leave".equals(courseListVo.getReason()) || "leave_absence".equals(courseListVo.getReason())) {
+                                Double _bdkClassTime = classCourseTimeStatisticsRecord.getClassTime21();
+                                _bdkClassTime += weightSetMap.get(courseListVo.getShortName());
+
+                                classCourseTimeStatisticsRecord.setClassTime21(_bdkClassTime);
+                            }
+                        }
+
                     }
                     record.setClassTime10(reduceTime);
 
@@ -595,6 +1095,66 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                 insertList.add(record);
             }
 
+            // 计算费用
+            for (ClassCourseTimeStatisticsRecord record : insertCourseList) {
+
+                record.setClassTimeStatisticsId(statistics.getId());
+
+                //费用设置jsonArray
+                JsonArray _costSetArray = parser.parse(record.getCostSetJson()).getAsJsonArray();
+                Map<String, Double> _costSetMap = new LinkedHashMap<>();
+                for (JsonElement jsonElement : _costSetArray) {
+                    JsonObject object = jsonElement.getAsJsonObject();
+                    _costSetMap.put(object.get("field").getAsString(), object.get("value").getAsDouble());
+                }
+
+                BigDecimal _zzxCost = BigDecimal.ZERO;//早自习费用
+                BigDecimal _zkCost = BigDecimal.ZERO;//正课费用
+                BigDecimal _wzxCost = BigDecimal.ZERO;//晚自习费用
+                BigDecimal _dkCost = BigDecimal.ZERO;//顶课费用,顶课老师加钱
+                BigDecimal _bdkCost = BigDecimal.ZERO;//顶课费用,被顶课老师扣钱
+                //计算超出的课时,需要先计算出每个周的开始结束时间
+                BigDecimal _ccksCost = BigDecimal.ZERO;
+                if ("FB1601".equals(record.getEmployType())) {
+                    _zzxCost = BigDecimal.valueOf(_costSetMap.get("cost1"));
+                    _zkCost = BigDecimal.valueOf(_costSetMap.get("cost3"));
+                    _wzxCost = BigDecimal.valueOf(_costSetMap.get("cost5"));
+                    _dkCost = BigDecimal.valueOf(_costSetMap.get("cost11"));
+                    _bdkCost = BigDecimal.valueOf(_costSetMap.get("cost13") == null ? 0 : _costSetMap.get("cost13"));
+                    _ccksCost = BigDecimal.valueOf(_costSetMap.get("cost9"));
+                } else {//外聘FB1605、合作人员FB1609
+                    _zzxCost = BigDecimal.valueOf(_costSetMap.get("cost2"));
+                    _zkCost = BigDecimal.valueOf(_costSetMap.get("cost4"));
+                    _wzxCost = BigDecimal.valueOf(_costSetMap.get("cost6"));
+                    _dkCost = BigDecimal.valueOf(_costSetMap.get("cost12"));
+                    _bdkCost = BigDecimal.valueOf(_costSetMap.get("cost14") == null ? 0 : _costSetMap.get("cost14"));
+                    _ccksCost = BigDecimal.valueOf(_costSetMap.get("cost10"));
+                }
+
+
+                double _classTimeAmount = BigDecimal.valueOf(record.getClassTime7()).multiply(_zzxCost).doubleValue();
+                _classTimeAmount += BigDecimal.valueOf(record.getClassTime8()).multiply(_zkCost).doubleValue();
+                _classTimeAmount += BigDecimal.valueOf(record.getClassTime9()).multiply(_wzxCost).doubleValue();
+                record.setClassTimeAmount(_classTimeAmount);
+
+
+                BigDecimal _reduceTimeAmount = BigDecimal.valueOf(record.getClassTime20()).multiply(_dkCost);
+                //计算被扣除的费用
+                _reduceTimeAmount = _reduceTimeAmount.subtract(_bdkCost.multiply(BigDecimal.valueOf(record.getClassTime21())));
+
+//                //计算出总的超出课时并计算超课时费
+//                double _beyondClassTimeAmount = BigDecimal.valueOf(allCcksTime).multiply(_ccksCost).doubleValue();
+//
+//                if (!"FB1601".equals(record.getEmployType())) {
+//                    record.setBeyondClassTimeAmount(_beyondClassTimeAmount);
+//                }
+
+                //计算总金额,课时费+超课时费
+//                Double totalAmount = _classTimeAmount + _beyondClassTimeAmount + _reduceTimeAmount.doubleValue();
+                Double totalAmount = _classTimeAmount + _reduceTimeAmount.doubleValue();
+                record.setTotalAmount(totalAmount);
+            }
+
             if (!insertList.isEmpty()) {
                 //先删除
                 String sql = "delete from class_time_statistics_record where class_time_statistics_id = " + statistics.getId();
@@ -602,6 +1162,12 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
                 for (ClassTimeStatisticsRecord record : insertList) {
                     recordMapper.insert(record);
                 }
+
+                 sql = "delete from class_course_time_statistics_record where class_time_statistics_id = " + statistics.getId();
+                SqlRunnerAdapter.db().delete(sql);
+                for (ClassCourseTimeStatisticsRecord record : insertCourseList) {
+                    recordCourseMapper.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());
@@ -617,6 +1183,57 @@ public class ClassTimeStatisticsServiceImpl extends MPJBaseServiceImpl<ClassTime
         return true;
     }
 
+    // 检查数据
+    private  ClassCourseTimeStatisticsRecord checkCourseSet(List<ClassCourseTimeStatisticsSet> classCourseTimeStatisticsSetList,List<ClassCourseTimeStatisticsRecord> insertCourseList,Long classId,Long  courseId,TeacherListVo teacher) {
+        // 课程明细统计
+        ClassCourseTimeStatisticsSet classCourseTimeStatisticsSet = classCourseTimeStatisticsSetList.stream()
+                .filter(item -> classId.equals(item.getClassId()) && courseId.equals(item.getCourseId()))
+                .findFirst()
+                .orElse(null);
+
+        if (classCourseTimeStatisticsSet != null) {
+
+            ClassCourseTimeStatisticsRecord classCourseTimeStatisticsRecord = insertCourseList.stream()
+                    .filter(item -> classId.equals(item.getClassId()) && courseId.equals(item.getCourseId()) && teacher.getId().equals(item.getUserId()))
+                    .findFirst()
+                    .orElse(null);
+
+            if (classCourseTimeStatisticsRecord == null) {
+
+                classCourseTimeStatisticsRecord = new ClassCourseTimeStatisticsRecord() {{
+
+                    setUserId(teacher.getId());
+//                    setClassTimeStatisticsId(statistics.getId());
+                    setEmployType(teacher.getEmployType());
+                    setCostSetJson(classCourseTimeStatisticsSet.getJsonContent());
+                    setClassId(classCourseTimeStatisticsSet.getClassId());
+                    setCourseId(classCourseTimeStatisticsSet.getCourseId());
+
+                    setClassTime7(0D);
+                    setClassTime8(0D);
+                    setClassTime9(0D);
+                    setClassTime10(0D);
+                    setClassTime11(0D);
+                    setClassTime20(0D);
+                    setClassTime21(0D);
+                    setClassTime22(0D);
+                    setClassTime23(0D);
+                    setClassTime24(0D);
+                    setClassTime25(0D);
+                    setAllClassTime(0D);
+
+                }};
+
+                insertCourseList.add(classCourseTimeStatisticsRecord);
+
+                return classCourseTimeStatisticsRecord;
+
+            }
+
+        }
+        return null;
+    }
+
     @Override
     public Boolean lockData(Long id) {
         ClassTimeStatistics statistics = this.getById(id);

+ 174 - 0
src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsRecordPageVo.java

@@ -0,0 +1,174 @@
+package com.xjrsoft.module.classtime.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 课时统计-教师课程详情分页列表出参
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+public class ClassCourseTimeStatisticsRecordPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+    /**
+    * 课时统计(class_time_statistics)
+    */
+    @ApiModelProperty("课时统计(class_time_statistics)")
+    private Long classTimeStatisticsId;
+    /**
+    * 教师id(xjr_user)
+    */
+    @ApiModelProperty("教师id(xjr_user)")
+    private Long userId;
+    /**
+    * 聘用类型
+    */
+    @ApiModelProperty("聘用类型")
+    private String employType;
+    /**
+    * 总课时
+    */
+    @ApiModelProperty("总课时")
+    private Double allClassTime;
+    /**
+    * 总金额
+    */
+    @ApiModelProperty("总金额")
+    private Double totalAmount;
+    /**
+    * 课时费用
+    */
+    @ApiModelProperty("课时费用")
+    private Double classTimeAmount;
+    /**
+    * 外聘教师超课时费
+    */
+    @ApiModelProperty("外聘教师超课时费")
+    private Double beyondClassTimeAmount;
+    /**
+    * 每周数据
+    */
+    @ApiModelProperty("每周数据")
+    private String weekData;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private Long classId;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private Long courseId;
+    /**
+    * 权重json
+    */
+    @ApiModelProperty("权重json")
+    private String weightSetJson;
+    /**
+    * 权重json
+    */
+    @ApiModelProperty("权重json")
+    private String costSetJson;
+    /**
+    * 教研会
+    */
+    @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;
+
+}

+ 144 - 0
src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsRecordVo.java

@@ -0,0 +1,144 @@
+package com.xjrsoft.module.classtime.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 课时统计-教师课程详情表单出参
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+public class ClassCourseTimeStatisticsRecordVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 课时统计(class_time_statistics)
+    */
+    @ApiModelProperty("课时统计(class_time_statistics)")
+    private Long classTimeStatisticsId;
+    /**
+    * 教师id(xjr_user)
+    */
+    @ApiModelProperty("教师id(xjr_user)")
+    private Long userId;
+    /**
+    * 聘用类型
+    */
+    @ApiModelProperty("聘用类型")
+    private String employType;
+    /**
+    * 总课时
+    */
+    @ApiModelProperty("总课时")
+    private Double allClassTime;
+    /**
+    * 总金额
+    */
+    @ApiModelProperty("总金额")
+    private Double totalAmount;
+    /**
+    * 课时费用
+    */
+    @ApiModelProperty("课时费用")
+    private Double classTimeAmount;
+    /**
+    * 外聘教师超课时费
+    */
+    @ApiModelProperty("外聘教师超课时费")
+    private Double beyondClassTimeAmount;
+    /**
+    * 每周数据
+    */
+    @ApiModelProperty("每周数据")
+    private String weekData;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private Long classId;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private Long courseId;
+    /**
+    * 权重json
+    */
+    @ApiModelProperty("权重json")
+    private String weightSetJson;
+    /**
+    * 权重json
+    */
+    @ApiModelProperty("权重json")
+    private String costSetJson;
+    /**
+    * 教研会
+    */
+    @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;
+
+
+
+}

+ 97 - 0
src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsSetGroupPageVo.java

@@ -0,0 +1,97 @@
+package com.xjrsoft.module.classtime.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 课时统计-班级课程分组设置分页列表出参
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+public class ClassCourseTimeStatisticsSetGroupPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+    /**
+    * 权重内容
+    */
+    @ApiModelProperty("权重内容")
+    private String jsonContent;
+    /**
+    * 类别(1:权重 2:费用设置)
+    */
+    @ApiModelProperty("类别(1:权重 2:费用设置)")
+    private Integer category;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private String classIds;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private String courseIds;
+    /**
+    * 是否默认,一个班级只有一个默认,默认时候不设置课程
+    */
+    @ApiModelProperty("是否默认,一个班级只有一个默认,默认时候不设置课程")
+    private Integer isDefault;
+
+
+    /**
+     * 班级名称
+     */
+    @ApiModelProperty("班级名称")
+    private String classNames;
+
+    /**
+     * 课程名称
+     */
+    @ApiModelProperty("课程名称")
+    private String courseNames;
+
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsSetGroupVo.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.classtime.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 课时统计-班级课程分组设置表单出参
+* @Author bc
+* @Date: 2025-10-13
+* @Version 1.0
+*/
+@Data
+public class ClassCourseTimeStatisticsSetGroupVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 权重内容
+    */
+    @ApiModelProperty("权重内容")
+    private String jsonContent;
+    /**
+    * 类别(1:权重 2:费用设置)
+    */
+    @ApiModelProperty("类别(1:权重 2:费用设置)")
+    private Integer category;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private String classIds;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private String courseIds;
+    /**
+    * 是否默认,一个班级只有一个默认,默认时候不设置课程
+    */
+    @ApiModelProperty("是否默认,一个班级只有一个默认,默认时候不设置课程")
+    private Integer isDefault;
+
+
+
+}

+ 62 - 0
src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsSetPageVo.java

@@ -0,0 +1,62 @@
+package com.xjrsoft.module.classtime.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 课时统计-班级课程设置分页列表出参
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+@Data
+public class ClassCourseTimeStatisticsSetPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private String id;
+
+    /**
+    * 权重内容
+    */
+    @ApiModelProperty("权重内容")
+    private String jsonContent;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private Long classId;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private Long courseId;
+    /**
+    * 是否默认,一个班级只有一个默认,默认时候不设置课程
+    */
+    @ApiModelProperty("是否默认,一个班级只有一个默认,默认时候不设置课程")
+    private Integer isDefault;
+
+    /**
+     * 班级名称
+     */
+    @ApiModelProperty("班级名称")
+    private String classNames;
+
+    /**
+     * 课程名称
+     */
+    @ApiModelProperty("课程名称")
+    private String courseNames;
+
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/classtime/vo/ClassCourseTimeStatisticsSetVo.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.classtime.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 课时统计-班级课程设置表单出参
+* @Author bc
+* @Date: 2025-10-11
+* @Version 1.0
+*/
+@Data
+public class ClassCourseTimeStatisticsSetVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 权重内容
+    */
+    @ApiModelProperty("权重内容")
+    private String jsonContent;
+    /**
+    * 类别(1:权重 2:费用设置)
+    */
+    @ApiModelProperty("类别(1:权重 2:费用设置)")
+    private Integer category;
+    /**
+    * 班级
+    */
+    @ApiModelProperty("班级")
+    private Long classId;
+    /**
+    * 课程
+    */
+    @ApiModelProperty("课程")
+    private Long courseId;
+    /**
+    * 是否默认,一个班级只有一个默认,默认时候不设置课程
+    */
+    @ApiModelProperty("是否默认,一个班级只有一个默认,默认时候不设置课程")
+    private Integer isDefault;
+
+
+
+}

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

@@ -18,6 +18,9 @@ public class CourseListVo {
     @ApiModelProperty("班级id")
     private Long classId;
 
+    @ApiModelProperty("课程id")
+    private Long courseId;
+
     @ApiModelProperty("教师id(被顶课老师)")
     private String teacherId;
 

+ 32 - 7
src/main/resources/mapper/classtime/ClassCourseTimeStatisticsSetGroupMapper.xml

@@ -2,17 +2,42 @@
 <!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.ClassCourseTimeStatisticsSetMapper">
-    <select id="getPage" parameterType="com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetPageDto" resultType="com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo">
-        SELECT t1.id,t1.class_id,t1.course_id,t1.json_content,t1.is_default,t2.name class_name,t3.name course_name FROM class_course_time_statistics_set t1
-        INNER JOIN base_class t2 ON t1.class_id = t2.id
-        INNER JOIN base_course_subject t3 on t1.course_id=t3.id
+<mapper namespace="com.xjrsoft.module.classtime.mapper.ClassCourseTimeStatisticsSetGroupMapper">
+    <select id="getPage" parameterType="com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetGroupPageDto" resultType="com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetGroupPageVo">
+
+        SELECT
+        t1.id,t1.class_ids,t1.course_ids,t1.json_content,t1.is_default,
+        (
+        SELECT GROUP_CONCAT(b.name SEPARATOR ', ')
+        FROM base_class b
+        WHERE FIND_IN_SET(b.id, t1.class_ids) > 0
+        <if test="dto.className != null and dto.className != ''">
+            AND b.name like concat('%', #{dto.className},'%')
+        </if>
+        ) AS class_names,
+        (
+        SELECT GROUP_CONCAT(c.name SEPARATOR ', ')
+        FROM base_course_subject c
+        WHERE FIND_IN_SET(c.id, t1.course_ids) > 0
+        <if test="dto.courseName != null and dto.courseName != ''">
+            AND c.name like concat('%', #{dto.courseName},'%')
+        </if>
+        ) AS course_names
+        FROM class_course_time_statistics_set_group t1
         WHERE t1.delete_mark = 0
         <if test="dto.className != null and dto.className != ''">
-            and t2.name like concat('%', #{dto.className},'%')
+        AND EXISTS (
+        SELECT 1 FROM base_class b
+        WHERE FIND_IN_SET(b.id, t1.class_ids) > 0
+            AND b.name like concat('%', #{dto.className},'%')
+        )
         </if>
         <if test="dto.courseName != null and dto.courseName != ''">
-            and t3.name like concat('%', #{dto.courseName},'%')
+        AND EXISTS (
+        SELECT 1 FROM base_course_subject c
+        WHERE FIND_IN_SET(c.id, t1.course_ids) > 0
+            AND c.name like concat('%', #{dto.courseName},'%')
+        )
         </if>
         order by t1.create_date desc
     </select>

+ 19 - 0
src/main/resources/mapper/classtime/ClassCourseTimeStatisticsSetMapper.xml

@@ -0,0 +1,19 @@
+<?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.ClassCourseTimeStatisticsSetMapper">
+    <select id="getPage" parameterType="com.xjrsoft.module.classtime.dto.ClassCourseTimeStatisticsSetPageDto" resultType="com.xjrsoft.module.classtime.vo.ClassCourseTimeStatisticsSetPageVo">
+        SELECT t1.id,t1.class_id,t1.course_id,t1.json_content,t1.is_default,t2.name class_name,t3.name course_name FROM class_course_time_statistics_set t1
+        INNER JOIN base_class t2 ON t1.class_id = t2.id
+        INNER JOIN base_course_subject t3 on t1.course_id=t3.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.courseName != null and dto.courseName != ''">
+            and t3.name like concat('%', #{dto.courseName},'%')
+        </if>
+        order by t1.create_date desc
+    </select>
+</mapper>

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

@@ -19,7 +19,7 @@
     </select>
 
     <select id="getCourseList" parameterType="com.xjrsoft.module.classtime.entity.ClassTimeStatistics" resultType="com.xjrsoft.module.classtime.vo.CourseListVo">
-        SELECT DISTINCT t1.class_id, t1.teacher_id, t2.short_name,t1.adjust_type,t4.reason,t1.schedule_date,t1.class_name,t1.course_name,t1.time_number FROM course_table t1
+        SELECT DISTINCT t1.class_id, t1.teacher_id, t2.short_name,t1.adjust_type,t4.reason,t1.schedule_date,t1.class_name,t1.course_name,t1.time_number,t1.course_id FROM course_table t1
         LEFT JOIN class_time t2 ON t1.time_period = t2.time_period AND t1.time_number = t2.number
         LEFT JOIN course_table_bak t3 ON t1.id = t3.id
         LEFT JOIN wf_course_adjust t4 ON t4.id = t3.wf_course_adjust_id
@@ -55,7 +55,7 @@
     </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,t1.exchange_teacher_id,t1.reason,t3.time_number 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,t1.reason,t3.time_number,t3.course_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

+ 85 - 0
src/main/resources/sqlScript/20251011_sql.sql

@@ -0,0 +1,85 @@
+-- ---------------------------------------------------------------------------------
+-- 课时统计-班级课程设置
+-- ---------------------------------------------------------------------------------
+DROP TABLE IF EXISTS class_course_time_statistics_set;
+CREATE TABLE `class_course_time_statistics_set` (
+  `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 '修改人',
+  `modify_date` DATETIME DEFAULT NULL COMMENT '修改时间',
+  `delete_mark` INT NOT NULL COMMENT '删除标记',
+  `enabled_mark` INT NOT NULL COMMENT '有效标志',
+  `json_content` TEXT DEFAULT NULL COMMENT '权重内容',
+  `category` INT DEFAULT NULL COMMENT '类别(1:权重 2:费用设置)',
+  `class_id` BIGINT DEFAULT NULL COMMENT '班级',
+  `course_id` BIGINT DEFAULT NULL COMMENT '课程',
+  `is_default` int DEFAULT 0 COMMENT '是否默认,一个班级只有一个默认,默认时候不设置课程',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='课时统计-班级课程设置';
+
+
+
+
+-- ---------------------------------------------------------------------------------
+-- 课时统计-班级课程分组设置
+-- ---------------------------------------------------------------------------------
+DROP TABLE IF EXISTS class_course_time_statistics_set_group;
+CREATE TABLE `class_course_time_statistics_set_group` (
+  `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 '修改人',
+  `modify_date` DATETIME DEFAULT NULL COMMENT '修改时间',
+  `delete_mark` INT NOT NULL COMMENT '删除标记',
+  `enabled_mark` INT NOT NULL COMMENT '有效标志',
+  `json_content` TEXT DEFAULT NULL COMMENT '权重内容',
+  `category` INT DEFAULT NULL COMMENT '类别(1:权重 2:费用设置)',
+  `class_ids` longtext DEFAULT NULL COMMENT '班级',
+  `course_ids` longtext DEFAULT NULL COMMENT '课程',
+  `is_default` int DEFAULT 0 COMMENT '是否默认,一个班级只有一个默认,默认时候不设置课程',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='课时统计-班级课程分组设置';
+
+-- ---------------------------------------------------------------------------------
+-- 课时统计-教师课程详情
+-- ---------------------------------------------------------------------------------
+DROP TABLE IF EXISTS class_course_time_statistics_record;
+CREATE TABLE `class_course_time_statistics_record` (
+  `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 '修改人',
+  `modify_date` DATETIME DEFAULT NULL COMMENT '修改时间',
+  `delete_mark` INT NOT NULL COMMENT '删除标记',
+  `enabled_mark` INT NOT NULL COMMENT '有效标志',
+  `class_time_statistics_id` BIGINT DEFAULT NULL COMMENT '课时统计(class_time_statistics)',
+  `user_id` BIGINT DEFAULT NULL COMMENT '教师id(xjr_user)',
+  `employ_type` VARCHAR(20) DEFAULT NULL COMMENT '聘用类型',
+  `all_class_time` DOUBLE(8,1) DEFAULT NULL COMMENT '总课时',
+  `total_amount` DOUBLE(8,2) DEFAULT NULL COMMENT '总金额',
+  `class_time_amount` DOUBLE(8,2)  DEFAULT NULL COMMENT '课时费用',
+  `beyond_class_time_amount` DOUBLE(8,2)  DEFAULT NULL COMMENT '外聘教师超课时费',
+  `week_data` LONGTEXT DEFAULT NULL COMMENT '每周数据',
+
+  `class_id` BIGINT DEFAULT NULL COMMENT '班级',
+  `course_id` BIGINT DEFAULT NULL COMMENT '课程',
+
+  `weight_set_json` LONGTEXT DEFAULT NULL COMMENT '权重json',
+  `cost_set_json` LONGTEXT DEFAULT NULL COMMENT '权重json',
+
+  `class_time1` FLOAT(4,1) DEFAULT NULL COMMENT '教研会',
+  `class_time2` FLOAT(4,1) DEFAULT NULL COMMENT '督导听课',
+  `class_time3` FLOAT(4,1) DEFAULT NULL COMMENT '临近三年退休政策',
+  `class_time4` FLOAT(4,1) DEFAULT NULL COMMENT '出题',
+  `class_time5` FLOAT(4,1) DEFAULT NULL COMMENT '阅卷',
+  `class_time6` FLOAT(4,1) DEFAULT NULL COMMENT '周末培优',
+  `class_time7` FLOAT(4,1) DEFAULT NULL COMMENT '早自习',
+  `class_time8` FLOAT(4,1) DEFAULT NULL COMMENT '正课(包含调顶课时)',
+  `class_time9` FLOAT(4,1) DEFAULT NULL COMMENT '晚辅(包含调顶课时)',
+  `class_time10` FLOAT(4,1) DEFAULT NULL COMMENT '顶课',
+  `class_time11` FLOAT(4,1) DEFAULT NULL COMMENT '调课',
+
+
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='课时统计-教师课程详情';

+ 1 - 1
src/test/java/com/xjrsoft/module/system/controller/LoginControllerTest.java

@@ -45,7 +45,7 @@ class LoginControllerTest {
 
     @Test
     void testToken() {
-        User user = userService.getById("14954809128646");
+        User user = userService.getById("1000000000000000000");
         LoginVo pc = loginService.getLoginInfo(user, "PC");
         System.out.println(pc);
     }

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

@@ -5278,4 +5278,80 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+
+    @Test
+    public void gcclass_course_time_statistics_set() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("class_course_time_statistics_set");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("bc");//作者名称
+        params.setPackageName("classtime");//包名
+        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);
+    }
+
+    @Test
+    public void gcclass_course_time_statistics_set_group() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("class_course_time_statistics_set_group");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("bc");//作者名称
+        params.setPackageName("classtime");//包名
+        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);
+    }
+
+    @Test
+    public void gcclass_course_time_statistics_record() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("class_course_time_statistics_record");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("bc");//作者名称
+        params.setPackageName("classtime");//包名
+        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);
+    }
 }