dzx 1 éve
szülő
commit
46a558aaf9
27 módosított fájl, 1728 hozzáadás és 1 törlés
  1. 240 0
      src/main/java/com/xjrsoft/module/courseTable/controller/SecondCourseController.java
  2. 75 0
      src/main/java/com/xjrsoft/module/courseTable/dto/AddSecondCourseDto.java
  3. 37 0
      src/main/java/com/xjrsoft/module/courseTable/dto/AddSecondCourseEnrollDto.java
  4. 42 0
      src/main/java/com/xjrsoft/module/courseTable/dto/AddSecondCourseEnrollRangeDto.java
  5. 50 0
      src/main/java/com/xjrsoft/module/courseTable/dto/AddSecondCourseTimeDto.java
  6. 25 0
      src/main/java/com/xjrsoft/module/courseTable/dto/SecondCourseEnrollPageDto.java
  7. 31 0
      src/main/java/com/xjrsoft/module/courseTable/dto/SecondCoursePageDto.java
  8. 24 0
      src/main/java/com/xjrsoft/module/courseTable/dto/UpdateSecondCourseDto.java
  9. 137 0
      src/main/java/com/xjrsoft/module/courseTable/entity/SecondCourse.java
  10. 89 0
      src/main/java/com/xjrsoft/module/courseTable/entity/SecondCourseEnroll.java
  11. 94 0
      src/main/java/com/xjrsoft/module/courseTable/entity/SecondCourseEnrollRange.java
  12. 100 0
      src/main/java/com/xjrsoft/module/courseTable/entity/SecondCourseTime.java
  13. 16 0
      src/main/java/com/xjrsoft/module/courseTable/mapper/SecondCourseEnrollMapper.java
  14. 16 0
      src/main/java/com/xjrsoft/module/courseTable/mapper/SecondCourseEnrollRangeMapper.java
  15. 32 0
      src/main/java/com/xjrsoft/module/courseTable/mapper/SecondCourseMapper.java
  16. 16 0
      src/main/java/com/xjrsoft/module/courseTable/mapper/SecondCourseTimeMapper.java
  17. 55 0
      src/main/java/com/xjrsoft/module/courseTable/service/ISecondCourseService.java
  18. 198 0
      src/main/java/com/xjrsoft/module/courseTable/service/impl/SecondCourseServiceImpl.java
  19. 43 0
      src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseEnrollExcelVo.java
  20. 43 0
      src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseEnrollRangeVo.java
  21. 54 0
      src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseEnrollVo.java
  22. 60 0
      src/main/java/com/xjrsoft/module/courseTable/vo/SecondCoursePageVo.java
  23. 51 0
      src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseTimeVo.java
  24. 87 0
      src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseVo.java
  25. 1 1
      src/main/java/com/xjrsoft/module/student/controller/BaseStudentScholarshipApplicantController.java
  26. 59 0
      src/main/resources/mapper/courseTable/SecondCourseMapper.xml
  27. 53 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 240 - 0
src/main/java/com/xjrsoft/module/courseTable/controller/SecondCourseController.java

@@ -0,0 +1,240 @@
+package com.xjrsoft.module.courseTable.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.activity.dto.ChangeStatusDto;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.concat.service.IXjrUserService;
+import com.xjrsoft.module.courseTable.dto.AddSecondCourseDto;
+import com.xjrsoft.module.courseTable.dto.SecondCourseEnrollPageDto;
+import com.xjrsoft.module.courseTable.dto.SecondCoursePageDto;
+import com.xjrsoft.module.courseTable.dto.UpdateSecondCourseDto;
+import com.xjrsoft.module.courseTable.entity.SecondCourse;
+import com.xjrsoft.module.courseTable.service.ISecondCourseService;
+import com.xjrsoft.module.courseTable.vo.SecondCourseEnrollExcelVo;
+import com.xjrsoft.module.courseTable.vo.SecondCourseEnrollRangeVo;
+import com.xjrsoft.module.courseTable.vo.SecondCourseEnrollVo;
+import com.xjrsoft.module.courseTable.vo.SecondCoursePageVo;
+import com.xjrsoft.module.courseTable.vo.SecondCourseVo;
+import com.xjrsoft.module.organization.entity.Department;
+import com.xjrsoft.module.organization.service.IDepartmentService;
+import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.service.IFileService;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @title: 第二课堂
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/courseTable" + "/secondCourse")
+@Api(value = "/courseTable"  + "/secondCourse",tags = "第二课堂代码")
+@AllArgsConstructor
+public class SecondCourseController {
+
+
+    private final ISecondCourseService secondCourseService;
+    private final IBaseClassService classService;
+    private final IDepartmentService departmentService;
+    private final IXjrUserService xjrUserService;
+    private final IFileService fileService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="第二课堂列表(分页)")
+    @SaCheckPermission("secondcourse:detail")
+    public RT<PageOutput<SecondCoursePageVo>> page(@Valid SecondCoursePageDto dto){
+        Page<SecondCoursePageVo> page = secondCourseService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<SecondCoursePageVo> pageOutput = ConventPage.getPageOutput(page, SecondCoursePageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询第二课堂信息")
+    @SaCheckPermission("secondcourse:detail")
+    public RT<SecondCourseVo> info(@RequestParam Long id){
+        SecondCourse secondCourse = secondCourseService.getByIdDeep(id);
+        if (secondCourse == null) {
+           return RT.error("找不到此数据!");
+        }
+        SecondCourseVo courseVo = BeanUtil.toBean(secondCourse, SecondCourseVo.class);
+        if(secondCourse.getEnrollRange() != null && !"".equals(secondCourse.getEnrollRange())){
+            JsonParser parser = new JsonParser();
+            JsonArray asJsonArray = parser.parse(secondCourse.getEnrollRange()).getAsJsonArray();
+            List<SecondCourseEnrollRangeVo> list = new ArrayList<>();
+            for (JsonElement jsonElement : asJsonArray) {
+                SecondCourseEnrollRangeVo relationDto = JSONUtil.toBean(jsonElement.getAsJsonObject().toString(), SecondCourseEnrollRangeVo.class);
+                if(relationDto.getUserId() != null){
+                    XjrUser xjrUser = xjrUserService.getById(relationDto.getUserId());
+                    if(xjrUser != null){
+                        relationDto.setName(xjrUser.getName());
+                    }
+                }else if(relationDto.getDeptId() != null){
+                    Department department = departmentService.getById(relationDto.getDeptId());
+                    if(department != null){
+                        relationDto.setName(department.getName());
+                    }
+
+                }else if(relationDto.getClassId() != null){
+                    BaseClass aClass = classService.getById(relationDto.getClassId());
+                    if(aClass != null){
+                        relationDto.setName(aClass.getName());
+                    }
+                }
+                list.add(relationDto);
+            }
+            courseVo.setSecondCourseEnrollRangeList(list);
+        }
+        if(secondCourse.getCoverId() != null){
+            File file = fileService.getOne(
+                    new QueryWrapper<File>().lambda()
+                            .select(File::getId)
+                            .select(File.class, x -> VoToColumnUtil.fieldsToColumns(File.class).contains(x.getProperty()))
+                            .eq(File::getFolderId, secondCourse.getCoverId())
+            );
+            courseVo.setCoverUrl(file.getFileUrl());
+        }
+
+        Integer enrollCount = secondCourseService.getEnrollCount(secondCourse.getId());
+        courseVo.setEnrollCount(enrollCount);
+        return RT.ok(courseVo);
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增第二课堂")
+    @SaCheckPermission("secondcourse:add")
+    public RT<Boolean> add(@Valid @RequestBody AddSecondCourseDto dto){
+        boolean isSuccess = secondCourseService.add(dto);
+        return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改第二课堂")
+    @SaCheckPermission("secondcourse:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateSecondCourseDto dto){
+
+        return RT.ok(secondCourseService.update(dto));
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除第二课堂")
+    @SaCheckPermission("secondcourse:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(secondCourseService.delete(ids));
+    }
+
+    @PostMapping(value = "/change-status")
+    @ApiOperation(value="修改状态")
+    @SaCheckPermission("officebuild:detail")
+    public RT<Boolean> changeStatus(@Valid @RequestBody ChangeStatusDto dto) throws Exception {
+        SecondCourse secondCourse = secondCourseService.getById(dto.getId());
+        if(secondCourse == null){
+            throw new MyException("未能找到数据");
+        }
+        secondCourse.setStatus(dto.getStatus());
+        secondCourseService.updateById(secondCourse);
+        return RT.ok(true);
+    }
+
+    @PostMapping(value = "/enroll-page")
+    @ApiOperation(value="报名表")
+    @SaCheckPermission("secondcourse:detail")
+    public RT<PageOutput<SecondCourseEnrollVo>> enrollPage(@Valid SecondCourseEnrollPageDto dto){
+        Page<SecondCourseEnrollVo> enrollPage = secondCourseService.getEnrollPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        for (SecondCourseEnrollVo record : enrollPage.getRecords()) {
+            if(record.getStudentId() != null){
+                record.setRoleId(3L);
+            }else if(record.getTeacherId() != null){
+                record.setRoleId(2L);
+            }
+        }
+
+        PageOutput<SecondCourseEnrollVo> pageOutput = ConventPage.getPageOutput(enrollPage, SecondCourseEnrollVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @PostMapping("/export-query")
+    @ApiOperation(value = "导出列表")
+    public ResponseEntity<byte[]> exportData(@Valid @RequestBody SecondCourseEnrollPageDto dto) {
+        List<SecondCourseEnrollVo> enrollList = secondCourseService.getEnrollList(dto);
+        List<SecondCourseEnrollExcelVo> list = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
+        for (SecondCourseEnrollVo listVo : enrollList) {
+            list.add(new SecondCourseEnrollExcelVo(){{
+                setName(listVo.getName());
+                setMobile(listVo.getMobile());
+                if(listVo.getTeacherId() != null){
+                    setRoleType("教师");
+                }
+                if(listVo.getStudentId() != null){
+                    setRoleType("学生");
+                }
+                setUserName(listVo.getUserName());
+                setCreateDate(sdf.format(listVo.getCreateDate()));
+            }});
+        }
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, SecondCourseEnrollExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
+
+        return RT.fileStream(bot.toByteArray(), "enroll" + ExcelTypeEnum.XLSX.getValue());
+    }
+
+
+    @PostMapping(value = "/enroll")
+    @ApiOperation(value="报名")
+    @SaCheckPermission("secondcourse:detail")
+    public RT<Boolean> enroll(@Valid ChangeStatusDto dto){
+        Boolean enroll = secondCourseService.enroll(dto);
+        return RT.ok(enroll);
+    }
+
+    @GetMapping(value = "/my-enroll-page")
+    @ApiOperation(value="我的报名记录(分页)")
+    @SaCheckPermission("secondcourse:detail")
+    public RT<PageOutput<SecondCoursePageVo>> myEnrollList(@Valid SecondCoursePageDto dto){
+        if(dto.getUserId() == null){
+            dto.setUserId(StpUtil.getLoginIdAsLong());
+        }
+
+        Page<SecondCoursePageVo> page = secondCourseService.getMyPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<SecondCoursePageVo> pageOutput = ConventPage.getPageOutput(page, SecondCoursePageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+}

+ 75 - 0
src/main/java/com/xjrsoft/module/courseTable/dto/AddSecondCourseDto.java

@@ -0,0 +1,75 @@
+package com.xjrsoft.module.courseTable.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+
+/**
+* @title: 第二课堂
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class AddSecondCourseDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 学期id
+    */
+    @ApiModelProperty("学期id")
+    private Long baseSemesterId;
+    /**
+    * 课程名称
+    */
+    @ApiModelProperty("课程名称")
+    private String name;
+    /**
+    * 课程主要内容
+    */
+    @ApiModelProperty("课程主要内容")
+    private String content;
+    /**
+    * 开课地点
+    */
+    @ApiModelProperty("开课地点")
+    private String place;
+    /**
+    * 讲课老师
+    */
+    @ApiModelProperty("讲课老师")
+    private String teacherName;
+    /**
+    * 封面图片
+    */
+    @ApiModelProperty("封面图片")
+    private Long coverId;
+    /**
+    * 参与范围
+    */
+    @ApiModelProperty("参与范围")
+    private String enrollRange;
+    /**
+    * 状态(0:未发布 1:进行中 2:已结束)
+    */
+    @ApiModelProperty("状态(0:未发布 1:进行中 2:已结束)")
+    private Integer status;
+
+    /**
+    * secondCourseTime
+    */
+    @ApiModelProperty("secondCourseTime子表")
+    private List<AddSecondCourseTimeDto> secondCourseTimeList;
+    /**
+    * secondCourseEnrollRange
+    */
+    @ApiModelProperty("secondCourseEnrollRange子表")
+    private List<AddSecondCourseEnrollRangeDto> secondCourseEnrollRangeList;
+
+
+}

+ 37 - 0
src/main/java/com/xjrsoft/module/courseTable/dto/AddSecondCourseEnrollDto.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.courseTable.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 第二课堂报名表
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class AddSecondCourseEnrollDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 第二课堂id
+    */
+    @ApiModelProperty("第二课堂id")
+    private Long secondCourseId;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 状态
+    */
+    @ApiModelProperty("状态")
+    private Long status;
+
+}

+ 42 - 0
src/main/java/com/xjrsoft/module/courseTable/dto/AddSecondCourseEnrollRangeDto.java

@@ -0,0 +1,42 @@
+package com.xjrsoft.module.courseTable.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 第二课堂参与范围
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class AddSecondCourseEnrollRangeDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 第二课堂id
+    */
+    @ApiModelProperty("第二课堂id")
+    private Long secondCourseId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private Long classId;
+    /**
+    * 部门id
+    */
+    @ApiModelProperty("部门id")
+    private Long deptId;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+}

+ 50 - 0
src/main/java/com/xjrsoft/module/courseTable/dto/AddSecondCourseTimeDto.java

@@ -0,0 +1,50 @@
+package com.xjrsoft.module.courseTable.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.Date;
+
+
+
+/**
+* @title: 第二课堂开课时间
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class AddSecondCourseTimeDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 第二课堂id
+    */
+    @ApiModelProperty("第二课堂id")
+    private Long secondCourseId;
+    /**
+    * 上课日期
+    */
+    @ApiModelProperty("上课日期")
+    private LocalDate classTime;
+    /**
+    * 时段(1=上午 2=下午 3=晚上)
+    */
+    @ApiModelProperty("时段(1=上午 2=下午 3=晚上)")
+    private Integer timePeriod;
+    /**
+    * 开始时间
+    */
+    @ApiModelProperty("开始时间")
+    private LocalTime startTime;
+    /**
+    * 结束时间
+    */
+    @ApiModelProperty("结束时间")
+    private LocalTime endTime;
+
+}

+ 25 - 0
src/main/java/com/xjrsoft/module/courseTable/dto/SecondCourseEnrollPageDto.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.courseTable.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 第二课堂分页查询入参
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class SecondCourseEnrollPageDto extends PageInput {
+
+        @ApiModelProperty("课程id")
+        private Long secondCourseId;
+
+        @ApiModelProperty("用户类型")
+        private Long roleId;
+
+}

+ 31 - 0
src/main/java/com/xjrsoft/module/courseTable/dto/SecondCoursePageDto.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.module.courseTable.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 第二课堂分页查询入参
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class SecondCoursePageDto extends PageInput {
+
+        @ApiModelProperty("学期id")
+        private Long semesterId;
+
+        @ApiModelProperty("课程名称")
+        private String name;
+
+        @ApiModelProperty("状态")
+        private Integer status;
+
+        @ApiModelProperty("用户id")
+        private Long userId;
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/courseTable/dto/UpdateSecondCourseDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.courseTable.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 第二课堂
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class UpdateSecondCourseDto extends AddSecondCourseDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+}

+ 137 - 0
src/main/java/com/xjrsoft/module/courseTable/entity/SecondCourse.java

@@ -0,0 +1,137 @@
+package com.xjrsoft.module.courseTable.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+* @title: 第二课堂
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+@TableName("second_course")
+@ApiModel(value = "second_course", description = "第二课堂")
+public class SecondCourse implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 学期id
+    */
+    @ApiModelProperty("学期id")
+    private Long baseSemesterId;
+    /**
+    * 课程名称
+    */
+    @ApiModelProperty("课程名称")
+    private String name;
+    /**
+    * 课程主要内容
+    */
+    @ApiModelProperty("课程主要内容")
+    private String content;
+    /**
+    * 开课地点
+    */
+    @ApiModelProperty("开课地点")
+    private String place;
+    /**
+    * 讲课老师
+    */
+    @ApiModelProperty("讲课老师")
+    private String teacherName;
+    /**
+    * 封面图片
+    */
+    @ApiModelProperty("封面图片")
+    private Long coverId;
+    /**
+    * 参与范围
+    */
+    @ApiModelProperty("参与范围")
+    private String enrollRange;
+    /**
+    * 状态(0:未发布 1:进行中 2:已结束)
+    */
+    @ApiModelProperty("状态(0:未发布 1:进行中 2:已结束)")
+    private Integer status;
+
+    /**
+    * secondCourseTime
+    */
+    @ApiModelProperty("secondCourseTime子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "secondCourseId")
+    private List<SecondCourseTime> secondCourseTimeList;
+    /**
+    * secondCourseEnrollRange
+    */
+    @ApiModelProperty("secondCourseEnrollRange子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "secondCourseId")
+    private List<SecondCourseEnrollRange> secondCourseEnrollRangeList;
+    /**
+    * secondCourseEnroll
+    */
+    @ApiModelProperty("secondCourseEnroll子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "secondCourseId")
+    private List<SecondCourseEnroll> secondCourseEnrollList;
+
+}

+ 89 - 0
src/main/java/com/xjrsoft/module/courseTable/entity/SecondCourseEnroll.java

@@ -0,0 +1,89 @@
+package com.xjrsoft.module.courseTable.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 第二课堂报名表
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+@TableName("second_course_enroll")
+@ApiModel(value = "second_course_enroll", description = "第二课堂报名表")
+public class SecondCourseEnroll implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 第二课堂id
+    */
+    @ApiModelProperty("第二课堂id")
+    private Long secondCourseId;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 状态
+    */
+    @ApiModelProperty("状态")
+    private Long status;
+
+
+}

+ 94 - 0
src/main/java/com/xjrsoft/module/courseTable/entity/SecondCourseEnrollRange.java

@@ -0,0 +1,94 @@
+package com.xjrsoft.module.courseTable.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 第二课堂参与范围
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+@TableName("second_course_enroll_range")
+@ApiModel(value = "second_course_enroll_range", description = "第二课堂参与范围")
+public class SecondCourseEnrollRange implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 第二课堂id
+    */
+    @ApiModelProperty("第二课堂id")
+    private Long secondCourseId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private Long classId;
+    /**
+    * 部门id
+    */
+    @ApiModelProperty("部门id")
+    private Long deptId;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+
+}

+ 100 - 0
src/main/java/com/xjrsoft/module/courseTable/entity/SecondCourseTime.java

@@ -0,0 +1,100 @@
+package com.xjrsoft.module.courseTable.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.util.Date;
+
+
+/**
+* @title: 第二课堂开课时间
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+@TableName("second_course_time")
+@ApiModel(value = "second_course_time", description = "第二课堂开课时间")
+public class SecondCourseTime implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 第二课堂id
+    */
+    @ApiModelProperty("第二课堂id")
+    private Long secondCourseId;
+    /**
+    * 上课日期
+    */
+    @ApiModelProperty("上课日期")
+    private Date classTime;
+    /**
+    * 时段(1=上午 2=下午 3=晚上)
+    */
+    @ApiModelProperty("时段(1=上午 2=下午 3=晚上)")
+    private Integer timePeriod;
+    /**
+    * 开始时间
+    */
+    @ApiModelProperty("开始时间")
+    private LocalTime startTime;
+    /**
+    * 结束时间
+    */
+    @ApiModelProperty("结束时间")
+    private LocalTime endTime;
+
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/courseTable/mapper/SecondCourseEnrollMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.courseTable.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.courseTable.entity.SecondCourseEnroll;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 第二课堂报名表
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Mapper
+public interface SecondCourseEnrollMapper extends MPJBaseMapper<SecondCourseEnroll> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/courseTable/mapper/SecondCourseEnrollRangeMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.courseTable.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.courseTable.entity.SecondCourseEnrollRange;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 第二课堂参与范围
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Mapper
+public interface SecondCourseEnrollRangeMapper extends MPJBaseMapper<SecondCourseEnrollRange> {
+
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/courseTable/mapper/SecondCourseMapper.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.courseTable.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.courseTable.dto.SecondCourseEnrollPageDto;
+import com.xjrsoft.module.courseTable.dto.SecondCoursePageDto;
+import com.xjrsoft.module.courseTable.entity.SecondCourse;
+import com.xjrsoft.module.courseTable.vo.SecondCourseEnrollVo;
+import com.xjrsoft.module.courseTable.vo.SecondCoursePageVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+* @title: 第二课堂
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Mapper
+public interface SecondCourseMapper extends MPJBaseMapper<SecondCourse> {
+
+    Page<SecondCoursePageVo> getPage(Page<SecondCoursePageVo> page, @Param("dto") SecondCoursePageDto dto);
+
+    Page<SecondCourseEnrollVo> getEnrollPage(Page<SecondCourseEnrollVo> page, @Param("dto") SecondCourseEnrollPageDto dto);
+
+    List<SecondCourseEnrollVo> getEnrollList(@Param("dto") SecondCourseEnrollPageDto dto);
+
+
+    Page<SecondCoursePageVo> getMyPage(Page<SecondCoursePageVo> page, @Param("dto") SecondCoursePageDto dto);
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/courseTable/mapper/SecondCourseTimeMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.courseTable.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.courseTable.entity.SecondCourseTime;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 第二课堂开课时间
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Mapper
+public interface SecondCourseTimeMapper extends MPJBaseMapper<SecondCourseTime> {
+
+}

+ 55 - 0
src/main/java/com/xjrsoft/module/courseTable/service/ISecondCourseService.java

@@ -0,0 +1,55 @@
+package com.xjrsoft.module.courseTable.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.activity.dto.ChangeStatusDto;
+import com.xjrsoft.module.courseTable.dto.AddSecondCourseDto;
+import com.xjrsoft.module.courseTable.dto.SecondCourseEnrollPageDto;
+import com.xjrsoft.module.courseTable.dto.SecondCoursePageDto;
+import com.xjrsoft.module.courseTable.dto.UpdateSecondCourseDto;
+import com.xjrsoft.module.courseTable.entity.SecondCourse;
+import com.xjrsoft.module.courseTable.vo.SecondCourseEnrollVo;
+import com.xjrsoft.module.courseTable.vo.SecondCoursePageVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+* @title: 第二课堂
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+
+public interface ISecondCourseService extends MPJBaseService<SecondCourse> {
+    /**
+    * 新增
+    */
+    Boolean add(AddSecondCourseDto dto);
+
+    /**
+    * 更新
+    */
+    Boolean update(UpdateSecondCourseDto dto);
+
+    /**
+    * 删除
+    *
+    * @param ids
+    * @return
+    */
+    Boolean delete(List<Long> ids);
+
+
+    Page<SecondCoursePageVo> getPage(Page<SecondCoursePageVo> page, SecondCoursePageDto dto);
+
+    Integer getEnrollCount(Long secondCourseId);
+
+    Page<SecondCourseEnrollVo> getEnrollPage(Page<SecondCourseEnrollVo> page, SecondCourseEnrollPageDto dto);
+
+    List<SecondCourseEnrollVo> getEnrollList( SecondCourseEnrollPageDto dto);
+
+    Boolean enroll(ChangeStatusDto dto);
+
+    Page<SecondCoursePageVo> getMyPage(Page<SecondCoursePageVo> page, SecondCoursePageDto dto);
+}

+ 198 - 0
src/main/java/com/xjrsoft/module/courseTable/service/impl/SecondCourseServiceImpl.java

@@ -0,0 +1,198 @@
+package com.xjrsoft.module.courseTable.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.module.activity.dto.ChangeStatusDto;
+import com.xjrsoft.module.courseTable.dto.AddSecondCourseDto;
+import com.xjrsoft.module.courseTable.dto.SecondCourseEnrollPageDto;
+import com.xjrsoft.module.courseTable.dto.SecondCoursePageDto;
+import com.xjrsoft.module.courseTable.dto.UpdateSecondCourseDto;
+import com.xjrsoft.module.courseTable.entity.SecondCourse;
+import com.xjrsoft.module.courseTable.entity.SecondCourseEnroll;
+import com.xjrsoft.module.courseTable.entity.SecondCourseEnrollRange;
+import com.xjrsoft.module.courseTable.entity.SecondCourseTime;
+import com.xjrsoft.module.courseTable.mapper.SecondCourseEnrollMapper;
+import com.xjrsoft.module.courseTable.mapper.SecondCourseEnrollRangeMapper;
+import com.xjrsoft.module.courseTable.mapper.SecondCourseMapper;
+import com.xjrsoft.module.courseTable.mapper.SecondCourseTimeMapper;
+import com.xjrsoft.module.courseTable.service.ISecondCourseService;
+import com.xjrsoft.module.courseTable.vo.SecondCourseEnrollVo;
+import com.xjrsoft.module.courseTable.vo.SecondCoursePageVo;
+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;
+
+/**
+* @title: 第二课堂
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class SecondCourseServiceImpl extends MPJBaseServiceImpl<SecondCourseMapper, SecondCourse> implements ISecondCourseService {
+    private final SecondCourseMapper courseMapper;
+
+    private final SecondCourseTimeMapper courseTimeMapper;
+    private final SecondCourseEnrollRangeMapper enrollRangeMapper;
+    private final SecondCourseEnrollMapper enrollMapper;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean add(AddSecondCourseDto dto) {
+        SecondCourse secondCourse = BeanUtil.toBean(dto, SecondCourse.class);
+        secondCourse.setEnrollRange(JSONUtil.toJsonStr(dto.getSecondCourseEnrollRangeList()));
+        courseMapper.insert(secondCourse);
+        if(secondCourse.getSecondCourseEnrollList() != null){
+            for (SecondCourseTime secondCourseTime : secondCourse.getSecondCourseTimeList()) {
+                secondCourseTime.setSecondCourseId(secondCourse.getId());
+                courseTimeMapper.insert(secondCourseTime);
+            }
+        }
+        if(secondCourse.getSecondCourseEnrollRangeList() != null){
+            for (SecondCourseEnrollRange secondCourseEnrollRange : secondCourse.getSecondCourseEnrollRangeList()) {
+                secondCourseEnrollRange.setSecondCourseId(secondCourse.getId());
+                enrollRangeMapper.insert(secondCourseEnrollRange);
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean update(UpdateSecondCourseDto dto) {
+        SecondCourse secondCourse = BeanUtil.toBean(dto, SecondCourse.class);
+        secondCourse.setEnrollRange(JSONUtil.toJsonStr(dto.getSecondCourseEnrollRangeList()));
+        courseMapper.updateById(secondCourse);
+        //********************************* SecondCourseTime  增删改  开始 *******************************************/
+        {
+            // 查出所有子级的id
+            List<SecondCourseTime> secondCourseTimeList = courseTimeMapper.selectList(Wrappers.lambdaQuery(SecondCourseTime.class).eq(SecondCourseTime::getSecondCourseId, secondCourse.getId()).select(SecondCourseTime::getId));
+            List<Long> secondCourseTimeIds = secondCourseTimeList.stream().map(SecondCourseTime::getId).collect(Collectors.toList());
+            //原有子表单 没有被删除的主键
+            List<Long> secondCourseTimeOldIds = secondCourse.getSecondCourseTimeList().stream().map(SecondCourseTime::getId).filter(Objects::nonNull).collect(Collectors.toList());
+            //找到需要删除的id
+            List<Long> secondCourseTimeRemoveIds = secondCourseTimeIds.stream().filter(item -> !secondCourseTimeOldIds.contains(item)).collect(Collectors.toList());
+
+            for (SecondCourseTime secondCourseTime : secondCourse.getSecondCourseTimeList()) {
+                //如果不等于空则修改
+                if (secondCourseTime.getId() != null) {
+                    courseTimeMapper.updateById(secondCourseTime);
+                }
+                //如果等于空 则新增
+                else {
+                    //已经不存在的id 删除
+                    secondCourseTime.setSecondCourseId(secondCourse.getId());
+                    courseTimeMapper.insert(secondCourseTime);
+                }
+            }
+            //已经不存在的id 删除
+            if(!secondCourseTimeRemoveIds.isEmpty()){
+                courseTimeMapper.deleteBatchIds(secondCourseTimeRemoveIds);
+            }
+        }
+        //********************************* SecondCourseTime  增删改  结束 *******************************************/
+
+        //********************************* SecondCourseEnrollRange  增删改  开始 *******************************************/
+        {
+            // 查出所有子级的id
+            List<SecondCourseEnrollRange> secondCourseEnrollRangeList = enrollRangeMapper.selectList(Wrappers.lambdaQuery(SecondCourseEnrollRange.class).eq(SecondCourseEnrollRange::getSecondCourseId, secondCourse.getId()).select(SecondCourseEnrollRange::getId));
+            List<Long> secondCourseEnrollRangeIds = secondCourseEnrollRangeList.stream().map(SecondCourseEnrollRange::getId).collect(Collectors.toList());
+            //原有子表单 没有被删除的主键
+            List<Long> secondCourseEnrollRangeOldIds = secondCourse.getSecondCourseEnrollRangeList().stream().map(SecondCourseEnrollRange::getId).filter(Objects::nonNull).collect(Collectors.toList());
+            //找到需要删除的id
+            List<Long> secondCourseEnrollRangeRemoveIds = secondCourseEnrollRangeIds.stream().filter(item -> !secondCourseEnrollRangeOldIds.contains(item)).collect(Collectors.toList());
+
+            for (SecondCourseEnrollRange secondCourseEnrollRange : secondCourse.getSecondCourseEnrollRangeList()) {
+                //如果不等于空则修改
+                if (secondCourseEnrollRange.getId() != null) {
+                    enrollRangeMapper.updateById(secondCourseEnrollRange);
+                }
+                //如果等于空 则新增
+                else {
+                    //已经不存在的id 删除
+                    secondCourseEnrollRange.setSecondCourseId(secondCourse.getId());
+                    enrollRangeMapper.insert(secondCourseEnrollRange);
+                }
+            }
+            //已经不存在的id 删除
+            if(!secondCourseEnrollRangeRemoveIds.isEmpty()){
+                enrollRangeMapper.deleteBatchIds(secondCourseEnrollRangeRemoveIds);
+            }
+        }
+        //********************************* SecondCourseEnrollRange  增删改  结束 *******************************************/
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delete(List<Long> ids) {
+        courseMapper.deleteBatchIds(ids);
+        courseTimeMapper.delete(Wrappers.lambdaQuery(SecondCourseTime.class).in(SecondCourseTime::getSecondCourseId, ids));
+        enrollRangeMapper.delete(Wrappers.lambdaQuery(SecondCourseEnrollRange.class).in(SecondCourseEnrollRange::getSecondCourseId, ids));
+        enrollMapper.delete(Wrappers.lambdaQuery(SecondCourseEnroll.class).in(SecondCourseEnroll::getSecondCourseId, ids));
+
+        return true;
+    }
+
+    @Override
+    public Page<SecondCoursePageVo> getPage(Page<SecondCoursePageVo> page, SecondCoursePageDto dto) {
+        return this.baseMapper.getPage(page, dto);
+    }
+
+    @Override
+    public Integer getEnrollCount(Long secondCourseId) {
+        Long count = enrollMapper.selectCount(
+                new QueryWrapper<SecondCourseEnroll>().lambda()
+                        .eq(SecondCourseEnroll::getSecondCourseId, secondCourseId)
+        );
+        return count.intValue();
+    }
+
+    @Override
+    public Page<SecondCourseEnrollVo> getEnrollPage(Page<SecondCourseEnrollVo> page, SecondCourseEnrollPageDto dto) {
+        return this.baseMapper.getEnrollPage(page, dto);
+    }
+
+    @Override
+    public List<SecondCourseEnrollVo> getEnrollList(SecondCourseEnrollPageDto dto) {
+        return this.baseMapper.getEnrollList(dto);
+    }
+
+    @Override
+    public Boolean enroll(ChangeStatusDto dto) {
+        List<SecondCourseEnroll> enrollList = enrollMapper.selectList(
+                new QueryWrapper<SecondCourseEnroll>().lambda()
+                        .eq(SecondCourseEnroll::getUserId, StpUtil.getLoginIdAsLong())
+                        .eq(SecondCourseEnroll::getSecondCourseId, dto.getId())
+        );
+        if(!enrollList.isEmpty()){
+            throw new MyException("已报名,无需重复报名");
+        }
+        SecondCourseEnroll enroll = new SecondCourseEnroll() {{
+            setUserId(StpUtil.getLoginIdAsLong());
+            setSecondCourseId(dto.getId());
+        }};
+        enrollMapper.insert(enroll);
+
+
+        return true;
+    }
+
+    @Override
+    public Page<SecondCoursePageVo> getMyPage(Page<SecondCoursePageVo> page, SecondCoursePageDto dto) {
+        return this.baseMapper.getMyPage(page, dto);
+    }
+}

+ 43 - 0
src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseEnrollExcelVo.java

@@ -0,0 +1,43 @@
+package com.xjrsoft.module.courseTable.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+* @title: 第二课堂报名表表单出参
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class SecondCourseEnrollExcelVo {
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("用户类型")
+    @ApiModelProperty("用户类型")
+    private String roleType;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("姓名")
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("用户名")
+    @ApiModelProperty("用户名")
+    private String userName;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("手机号")
+    @ApiModelProperty("手机号")
+    private String mobile;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("报名时间")
+    @ApiModelProperty("报名时间")
+    private String createDate;
+
+}

+ 43 - 0
src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseEnrollRangeVo.java

@@ -0,0 +1,43 @@
+package com.xjrsoft.module.courseTable.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 第二课堂参与范围表单出参
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class SecondCourseEnrollRangeVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 第二课堂id
+    */
+    @ApiModelProperty("第二课堂id")
+    private Long secondCourseId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private Long classId;
+    /**
+    * 部门id
+    */
+    @ApiModelProperty("部门id")
+    private Long deptId;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("名称")
+    private String name;
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseEnrollVo.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.courseTable.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 第二课堂报名表表单出参
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class SecondCourseEnrollVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 状态
+    */
+    @ApiModelProperty("状态")
+    private Long status;
+
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ApiModelProperty("教师表id")
+    private Long teacherId;
+
+    @ApiModelProperty("学生表id")
+    private Long studentId;
+
+    @ApiModelProperty("用户名")
+    private String userName;
+
+    @ApiModelProperty("手机号")
+    private String mobile;
+
+    @ApiModelProperty("角色id")
+    private Long roleId;
+
+    @ApiModelProperty("报名时间")
+    private Date createDate;
+
+
+}

+ 60 - 0
src/main/java/com/xjrsoft/module/courseTable/vo/SecondCoursePageVo.java

@@ -0,0 +1,60 @@
+package com.xjrsoft.module.courseTable.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 第二课堂分页列表出参
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class SecondCoursePageVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private String id;
+
+    @ApiModelProperty("学期名称")
+    private String semesterName;
+    /**
+    * 课程名称
+    */
+    @ApiModelProperty("课程名称")
+    private String name;
+    /**
+    * 课程主要内容
+    */
+    @ApiModelProperty("课程主要内容")
+    private String content;
+    /**
+    * 开课地点
+    */
+    @ApiModelProperty("开课地点")
+    private String place;
+    /**
+    * 讲课老师
+    */
+    @ApiModelProperty("讲课老师")
+    private String teacherName;
+
+    /**
+    * 参与范围
+    */
+    @ApiModelProperty("参与范围")
+    private String enrollRange;
+    /**
+    * 状态(0:未发布 1:进行中 2:已结束)
+    */
+    @ApiModelProperty("状态(0:未发布 1:进行中 2:已结束)")
+    private Integer status;
+
+    @ApiModelProperty("报名人数")
+    private Integer enrollCount;
+
+}

+ 51 - 0
src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseTimeVo.java

@@ -0,0 +1,51 @@
+package com.xjrsoft.module.courseTable.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.util.Date;
+
+/**
+* @title: 第二课堂开课时间表单出参
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class SecondCourseTimeVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 第二课堂id
+    */
+    @ApiModelProperty("第二课堂id")
+    private Long secondCourseId;
+    /**
+    * 上课日期
+    */
+    @ApiModelProperty("上课日期")
+    private Date classTime;
+    /**
+    * 时段(1=上午 2=下午 3=晚上)
+    */
+    @ApiModelProperty("时段(1=上午 2=下午 3=晚上)")
+    private Integer timePeriod;
+    /**
+    * 开始时间
+    */
+    @ApiModelProperty("开始时间")
+    private LocalTime startTime;
+    /**
+    * 结束时间
+    */
+    @ApiModelProperty("结束时间")
+    private LocalTime endTime;
+
+
+
+}

+ 87 - 0
src/main/java/com/xjrsoft/module/courseTable/vo/SecondCourseVo.java

@@ -0,0 +1,87 @@
+package com.xjrsoft.module.courseTable.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+* @title: 第二课堂表单出参
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class SecondCourseVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 学期id
+    */
+    @ApiModelProperty("学期id")
+    private Long baseSemesterId;
+    /**
+    * 课程名称
+    */
+    @ApiModelProperty("课程名称")
+    private String name;
+    /**
+    * 课程主要内容
+    */
+    @ApiModelProperty("课程主要内容")
+    private String content;
+    /**
+    * 开课地点
+    */
+    @ApiModelProperty("开课地点")
+    private String place;
+    /**
+    * 讲课老师
+    */
+    @ApiModelProperty("讲课老师")
+    private String teacherName;
+    /**
+    * 封面图片
+    */
+    @ApiModelProperty("封面图片")
+    private Long coverId;
+    /**
+    * 参与范围
+    */
+    @ApiModelProperty("参与范围")
+    private String enrollRange;
+    /**
+    * 状态(0:未发布 1:进行中 2:已结束)
+    */
+    @ApiModelProperty("状态(0:未发布 1:进行中 2:已结束)")
+    private Integer status;
+
+
+    /**
+    * secondCourseTime
+    */
+    @ApiModelProperty("secondCourseTime子表")
+    private List<SecondCourseTimeVo> secondCourseTimeList;
+    /**
+    * secondCourseEnrollRange
+    */
+    @ApiModelProperty("secondCourseEnrollRange子表")
+    private List<SecondCourseEnrollRangeVo> secondCourseEnrollRangeList;
+    /**
+    * secondCourseEnroll
+    */
+    @ApiModelProperty("secondCourseEnroll子表")
+    private List<SecondCourseEnrollVo> secondCourseEnrollList;
+
+    @ApiModelProperty("封面图片地址")
+    private String coverUrl;
+
+
+    @ApiModelProperty("报名人数")
+    private Integer enrollCount;
+
+}

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

@@ -139,7 +139,7 @@ public class BaseStudentScholarshipApplicantController {
             .eq(ObjectUtil.isNotNull(dto.getBaseStudentScholarshipCategoryId()),BaseStudentScholarshipApplicant::getBaseStudentScholarshipCategoryId, dto.getBaseStudentScholarshipCategoryId())
             .eq(ObjectUtil.isNotNull(dto.getSemesterId()), BaseStudentScholarshipApplicant::getBaseSemesterId, dto.getSemesterId())
             .eq(BaseStudentScholarshipApplicant::getStatus, 1)
-            .eq(BaseStudentScholarshipApplicant::getReviewStatus, 0)
+            .ne(BaseStudentScholarshipApplicant::getReviewStatus, 1)
         );
         List<ScholarshipApplicantOptionVo> voList = BeanUtil.copyToList(applicantList, ScholarshipApplicantOptionVo.class);
         return RT.ok(voList);

+ 59 - 0
src/main/resources/mapper/courseTable/SecondCourseMapper.xml

@@ -0,0 +1,59 @@
+<?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.courseTable.mapper.SecondCourseMapper">
+    <select id="getPage" parameterType="com.xjrsoft.module.courseTable.dto.SecondCoursePageDto" resultType="com.xjrsoft.module.courseTable.vo.SecondCoursePageVo">
+        SELECT t1.id,t2.name AS semester_name,t1.name,t1.place,t1.content,t1.teacher_name,t1.status,
+        (SELECT COUNT(*) FROM second_course_enroll WHERE delete_mark = 0 AND second_course_id = t1.id) AS enroll_count FROM second_course t1
+        LEFT JOIN base_semester t2 ON t1.base_semester_id = t2.id
+        WHERE t1.delete_mark = 0
+        <if test="dto.name != null and dto.name != ''">
+            and t1.name like concat('%', #{dto.name}, '%')
+        </if>
+        <if test="dto.semesterId != null">
+            and t1.base_semester_id = #{dto.semesterId}
+        </if>
+        <if test="dto.status != null">
+            and t1.status = #{dto.status}
+        </if>
+    </select>
+    <select id="getEnrollPage" parameterType="com.xjrsoft.module.courseTable.dto.SecondCourseEnrollPageDto" resultType="com.xjrsoft.module.courseTable.vo.SecondCourseEnrollVo">
+        SELECT t1.id,t1.status,t2.name,t1.create_date,t2.user_name,t2.mobile,t1.user_id,
+        (SELECT id FROM base_teacher WHERE user_id = t1.user_id) AS teacher_id,
+        (SELECT id FROM base_student WHERE user_id = t1.user_id) AS student_id FROM second_course_enroll t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        WHERE t1.delete_mark = 0 AND t1.second_course_id = #{dto.secondCourseId}
+    </select>
+    <select id="getEnrollList" parameterType="com.xjrsoft.module.courseTable.dto.SecondCourseEnrollPageDto" resultType="com.xjrsoft.module.courseTable.vo.SecondCourseEnrollVo">
+        SELECT t1.id,t1.status,t2.name,t1.create_date,t2.user_name,t2.mobile,t1.user_id,
+        (SELECT id FROM base_teacher WHERE user_id = t1.user_id) AS teacher_id,
+        (SELECT id FROM base_student WHERE user_id = t1.user_id) AS student_id FROM second_course_enroll t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        WHERE t1.delete_mark = 0 AND t1.second_course_id = #{dto.secondCourseId}
+        <if test="dto.roleId != null">
+            <if test="dto.roleId == 2">
+                and (select id from base_teacher where user_id = t1.user_id) is not null
+            </if>
+            <if test="dto.roleId == 3">
+                and (SELECT id FROM base_student WHERE user_id = t1.user_id) is not null
+            </if>
+        </if>
+    </select>
+    <select id="getMyPage" parameterType="com.xjrsoft.module.courseTable.dto.SecondCoursePageDto" resultType="com.xjrsoft.module.courseTable.vo.SecondCoursePageVo">
+        SELECT t1.id,t2.name AS semester_name,t1.name,t1.place,t1.content,t1.teacher_name,t1.status,
+        (SELECT COUNT(*) FROM second_course_enroll WHERE delete_mark = 0 AND second_course_id = t1.id) AS enroll_count FROM second_course t1
+        LEFT JOIN base_semester t2 ON t1.base_semester_id = t2.id
+        LEFT JOIN activity_enroll t3 ON t1.id = t5.second_course_id
+        WHERE t1.delete_mark = 0 and t3.user_id = #{dto.userId}
+        <if test="dto.name != null and dto.name != ''">
+            and t1.name like concat('%', #{dto.name}, '%')
+        </if>
+        <if test="dto.semesterId != null">
+            and t1.base_semester_id = #{dto.semesterId}
+        </if>
+        <if test="dto.status != null">
+            and t1.status = #{dto.status}
+        </if>
+    </select>
+</mapper>

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

@@ -3551,4 +3551,57 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    @Test
+    public void gcSecondCourse() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("second_course");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        mainTable = new TableConfig();
+        mainTable.setTableName("second_course_time");//init_sql中的表名
+        mainTable.setIsMain(false);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        mainTable.setRelationField("second_course_id");//设置外键
+        mainTable.setRelationTableField(GlobalConstant.DEFAULT_PK);//设置外键
+        tableConfigs.add(mainTable);
+
+        mainTable = new TableConfig();
+        mainTable.setTableName("second_course_enroll_range");//init_sql中的表名
+        mainTable.setIsMain(false);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        mainTable.setRelationField("second_course_id");//设置外键
+        mainTable.setRelationTableField(GlobalConstant.DEFAULT_PK);//设置外键
+        tableConfigs.add(mainTable);
+
+        mainTable = new TableConfig();
+        mainTable.setTableName("second_course_enroll");//init_sql中的表名
+        mainTable.setIsMain(false);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        mainTable.setRelationField("second_course_id");//设置外键
+        mainTable.setRelationTableField(GlobalConstant.DEFAULT_PK);//设置外键
+        tableConfigs.add(mainTable);
+
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("dzx");//作者名称
+        params.setPackageName("courseTable");//包名
+        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);
+    }
 }