Browse Source

Merge remote-tracking branch 'origin/dev' into dev

dzx 8 months ago
parent
commit
26895f7e87
44 changed files with 2817 additions and 91 deletions
  1. 23 15
      src/main/java/com/xjrsoft/module/base/controller/BaseClassTeacherChangeController.java
  2. 8 2
      src/main/java/com/xjrsoft/module/base/dto/AddBaseClassTeacherChangeDto.java
  3. 5 25
      src/main/java/com/xjrsoft/module/base/dto/BaseClassTeacherChangePageDto.java
  4. 9 1
      src/main/java/com/xjrsoft/module/base/dto/UpdateBaseClassTeacherChangeDto.java
  5. 7 3
      src/main/java/com/xjrsoft/module/base/entity/BaseClassTeacherChange.java
  6. 2 6
      src/main/java/com/xjrsoft/module/base/mapper/BaseClassTeacherChangeMapper.java
  7. 4 7
      src/main/java/com/xjrsoft/module/base/service/IBaseClassTeacherChangeService.java
  8. 7 8
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassTeacherChangeServiceImpl.java
  9. 55 23
      src/main/java/com/xjrsoft/module/base/vo/BaseClassTeacherChangePageVo.java
  10. 7 1
      src/main/java/com/xjrsoft/module/base/vo/BaseClassTeacherChangeVo.java
  11. 141 0
      src/main/java/com/xjrsoft/module/teacher/controller/ClassHomeworkController.java
  12. 132 0
      src/main/java/com/xjrsoft/module/teacher/controller/ClassInternshipDynamicController.java
  13. 66 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddClassHomeworkDto.java
  14. 32 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddClassHomeworkReadDto.java
  15. 58 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddClassInternshipDynamicDto.java
  16. 32 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddClassInternshipDynamicReadDto.java
  17. 36 0
      src/main/java/com/xjrsoft/module/teacher/dto/ClassHomeworkPageDto.java
  18. 34 0
      src/main/java/com/xjrsoft/module/teacher/dto/ClassHomeworkReadListDto.java
  19. 34 0
      src/main/java/com/xjrsoft/module/teacher/dto/ClassInternshipDynamicPageDto.java
  20. 33 0
      src/main/java/com/xjrsoft/module/teacher/dto/ClassInternshipDynamicReadListDto.java
  21. 109 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassHomework.java
  22. 88 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassHomeworkClass.java
  23. 88 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassHomeworkRead.java
  24. 103 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassInternshipDynamic.java
  25. 88 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassInternshipDynamicClass.java
  26. 88 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassInternshipDynamicRead.java
  27. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassHomeworkClassMapper.java
  28. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassHomeworkMapper.java
  29. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassHomeworkReadMapper.java
  30. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassInternshipDynamicClassMapper.java
  31. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassInternshipDynamicMapper.java
  32. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassInternshipDynamicReadMapper.java
  33. 33 0
      src/main/java/com/xjrsoft/module/teacher/service/IClassHomeworkService.java
  34. 34 0
      src/main/java/com/xjrsoft/module/teacher/service/IClassInternshipDynamicService.java
  35. 360 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/ClassHomeworkServiceImpl.java
  36. 351 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/ClassInternshipDynamicServiceImpl.java
  37. 81 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassHomeworkPageVo.java
  38. 36 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassHomeworkReadListVo.java
  39. 69 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassHomeworkVo.java
  40. 73 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassInternshipDynamicPageVo.java
  41. 37 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassInternshipDynamicReadListVo.java
  42. 62 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassInternshipDynamicVo.java
  43. 140 0
      src/main/resources/sqlScript/20250427_sql.sql
  44. 150 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 23 - 15
src/main/java/com/xjrsoft/module/base/controller/BaseClassTeacherChangeController.java

@@ -1,38 +1,41 @@
 package com.xjrsoft.module.base.controller;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.xjrsoft.common.annotation.XjrLog;
-import com.xjrsoft.common.model.result.RT;
+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.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.base.dto.AddBaseClassTeacherChangeDto;
-import com.xjrsoft.module.base.dto.BaseClassTeacherChangePageDto;
 import com.xjrsoft.module.base.dto.UpdateBaseClassTeacherChangeDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.xjrsoft.common.annotation.XjrLog;
+
+import com.xjrsoft.module.base.dto.BaseClassTeacherChangePageDto;
 import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
 import com.xjrsoft.module.base.service.IBaseClassTeacherChangeService;
 import com.xjrsoft.module.base.vo.BaseClassTeacherChangePageVo;
+
 import com.xjrsoft.module.base.vo.BaseClassTeacherChangeVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
 import java.util.List;
 
 /**
 * @title: 班主任异动记录表
 * @Author dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 @RestController
@@ -50,7 +53,11 @@ public class BaseClassTeacherChangeController {
     @XjrLog(value = "班主任异动记录表列表(分页)")
     public RT<PageOutput<BaseClassTeacherChangePageVo>> page(@Valid BaseClassTeacherChangePageDto dto){
 
-        Page<BaseClassTeacherChangePageVo> page = baseClassTeacherChangeService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        LambdaQueryWrapper<BaseClassTeacherChange> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                    .orderByDesc(BaseClassTeacherChange::getId)
+                .select(BaseClassTeacherChange.class,x -> VoToColumnUtil.fieldsToColumns(BaseClassTeacherChangePageVo.class).contains(x.getProperty()));
+        IPage<BaseClassTeacherChange> page = baseClassTeacherChangeService.page(ConventPage.getPage(dto), queryWrapper);
         PageOutput<BaseClassTeacherChangePageVo> pageOutput = ConventPage.getPageOutput(page, BaseClassTeacherChangePageVo.class);
         return RT.ok(pageOutput);
     }
@@ -95,6 +102,7 @@ public class BaseClassTeacherChangeController {
     @XjrLog(value = "删除班主任异动记录表")
     public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
         return RT.ok(baseClassTeacherChangeService.removeBatchByIds(ids));
+
     }
 
 }

+ 8 - 2
src/main/java/com/xjrsoft/module/base/dto/AddBaseClassTeacherChangeDto.java

@@ -2,15 +2,21 @@ package com.xjrsoft.module.base.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 dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 @Data

+ 5 - 25
src/main/java/com/xjrsoft/module/base/dto/BaseClassTeacherChangePageDto.java

@@ -6,41 +6,21 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
 
 
 /**
 * @title: 班主任异动记录表分页查询入参
 * @Author dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 @Data
 @EqualsAndHashCode(callSuper = false)
 public class BaseClassTeacherChangePageDto extends PageInput {
 
-    @ApiModelProperty("班级名称")
-    private String className;
-
-    @ApiModelProperty("班级代码")
-    private String classCode;
-
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    @ApiModelProperty("异动时间-开始")
-    private LocalDate createDateStart;
-
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    @ApiModelProperty("异动时间-结束")
-    private LocalDate createDateEnd;
-
-    @ApiModelProperty("异动前班主任")
-    private String beforeTeacherName;
-
-    @ApiModelProperty("异动后班主任")
-    private String afterTeacherName;
-
-    @ApiModelProperty("年级")
-    private Long gradeId;
-
 
 }

+ 9 - 1
src/main/java/com/xjrsoft/module/base/dto/UpdateBaseClassTeacherChangeDto.java

@@ -2,13 +2,21 @@ package com.xjrsoft.module.base.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 dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 @Data

+ 7 - 3
src/main/java/com/xjrsoft/module/base/entity/BaseClassTeacherChange.java

@@ -2,21 +2,25 @@ package com.xjrsoft.module.base.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.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 dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 @Data

+ 2 - 6
src/main/java/com/xjrsoft/module/base/mapper/BaseClassTeacherChangeMapper.java

@@ -1,21 +1,17 @@
 package com.xjrsoft.module.base.mapper;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.github.yulichang.base.MPJBaseMapper;
-import com.xjrsoft.module.base.dto.BaseClassTeacherChangePageDto;
 import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
-import com.xjrsoft.module.base.vo.BaseClassTeacherChangePageVo;
 import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
 
 /**
 * @title: 班主任异动记录表
 * @Author dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 @Mapper
 public interface BaseClassTeacherChangeMapper extends MPJBaseMapper<BaseClassTeacherChange> {
 
-    Page<BaseClassTeacherChangePageVo> getPage(Page<BaseClassTeacherChangePageVo> page, @Param("dto") BaseClassTeacherChangePageDto dto);
 }

+ 4 - 7
src/main/java/com/xjrsoft/module/base/service/IBaseClassTeacherChangeService.java

@@ -1,20 +1,17 @@
 package com.xjrsoft.module.base.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.base.dto.BaseClassTeacherChangePageDto;
 import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
-import com.xjrsoft.module.base.vo.BaseClassTeacherChangePageVo;
-import org.apache.ibatis.annotations.Param;
+import lombok.Data;
+import java.util.List;
 
 /**
 * @title: 班主任异动记录表
 * @Author dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 
 public interface IBaseClassTeacherChangeService extends MPJBaseService<BaseClassTeacherChange> {
-
-    Page<BaseClassTeacherChangePageVo> getPage(Page<BaseClassTeacherChangePageVo> page, @Param("dto") BaseClassTeacherChangePageDto dto);
 }

+ 7 - 8
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassTeacherChangeServiceImpl.java

@@ -1,26 +1,25 @@
 package com.xjrsoft.module.base.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.base.dto.BaseClassTeacherChangePageDto;
 import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
 import com.xjrsoft.module.base.mapper.BaseClassTeacherChangeMapper;
 import com.xjrsoft.module.base.service.IBaseClassTeacherChangeService;
-import com.xjrsoft.module.base.vo.BaseClassTeacherChangePageVo;
 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 dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 @Service
 @AllArgsConstructor
 public class BaseClassTeacherChangeServiceImpl extends MPJBaseServiceImpl<BaseClassTeacherChangeMapper, BaseClassTeacherChange> implements IBaseClassTeacherChangeService {
-    @Override
-    public Page<BaseClassTeacherChangePageVo> getPage(Page<BaseClassTeacherChangePageVo> page, BaseClassTeacherChangePageDto dto) {
-        return this.baseMapper.getPage(page, dto);
-    }
 }

+ 55 - 23
src/main/java/com/xjrsoft/module/base/vo/BaseClassTeacherChangePageVo.java

@@ -1,42 +1,74 @@
 package com.xjrsoft.module.base.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 dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 @Data
 public class BaseClassTeacherChangePageVo {
 
-
-    @ApiModelProperty("主键编号")
+    /**
+    * 
+    */
+    @ApiModelProperty("")
     private String id;
-
-    @ApiModelProperty("年级名称")
-    private String gradeName;
-
-    @ApiModelProperty("班级名称")
-    private String className;
-
-    @ApiModelProperty("班级代码")
-    private String classCode;
-
-    @ApiModelProperty("异动时间")
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
     private LocalDateTime createDate;
-
-    @ApiModelProperty("操作人")
-    private String createUserName;
-
-    @ApiModelProperty("异动前班主任")
-    private String beforeTeacherName;
-
-    @ApiModelProperty("异动后班主任")
-    private String afterTeacherName;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    private Integer enabledMark;
+    /**
+    * 班级id(base_class)
+    */
+    @ApiModelProperty("班级id(base_class)")
+    private Long classId;
+    /**
+    * 异动前班主任(xjr_user)
+    */
+    @ApiModelProperty("异动前班主任(xjr_user)")
+    private Long beforeTeacherId;
+    /**
+    * 异动后班主任(xjr_user)
+    */
+    @ApiModelProperty("异动后班主任(xjr_user)")
+    private Long afterTeacherId;
 
 }

+ 7 - 1
src/main/java/com/xjrsoft/module/base/vo/BaseClassTeacherChangeVo.java

@@ -3,10 +3,16 @@ package com.xjrsoft.module.base.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 dzx
-* @Date: 2025-04-24
+* @Date: 2025-04-27
 * @Version 1.0
 */
 @Data

+ 141 - 0
src/main/java/com/xjrsoft/module/teacher/controller/ClassHomeworkController.java

@@ -0,0 +1,141 @@
+package com.xjrsoft.module.teacher.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+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.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.service.IFileService;
+import com.xjrsoft.module.teacher.dto.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.xjrsoft.common.annotation.XjrLog;
+
+import com.xjrsoft.module.teacher.entity.ClassHomework;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.service.IClassHomeworkService;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkPageVo;
+
+import com.xjrsoft.module.teacher.vo.ClassHomeworkReadListVo;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 教师为班级布置作业记录表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/teacher" + "/classHomework")
+@Api(value = "/teacher"  + "/classHomework",tags = "教师为班级布置作业记录表代码")
+@AllArgsConstructor
+public class ClassHomeworkController {
+
+
+    private final IClassHomeworkService classHomeworkService;
+    private final IFileService fileService;
+
+    @GetMapping(value = "/page-mobile")
+    @ApiOperation(value="移动端查看作业记录表列表(分页)")
+    @SaCheckPermission("classhomework:detail")
+    @XjrLog(value = "移动端查看作业记录表列表(分页)")
+    public RT<PageOutput<ClassHomeworkPageVo>> pageClassHomework(@Valid ClassHomeworkPageDto dto){
+        IPage<ClassHomeworkPageVo> page = classHomeworkService.pageClassHomework(dto);
+        PageOutput<ClassHomeworkPageVo> pageOutput = ConventPage.getPageOutput(page, ClassHomeworkPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询教师为班级布置作业记录表信息")
+    @SaCheckPermission("classhomework:detail")
+    @XjrLog(value = "根据id查询教师为班级布置作业记录表信息")
+    public RT<ClassHomeworkVo> info(@RequestParam Long id){
+        MPJLambdaWrapper<ClassHomework> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .disableSubLogicDel()
+                .select(ClassHomework::getId)
+                .select(ClassHomework.class,x -> VoToColumnUtil.fieldsToColumns(ClassHomeworkVo.class).contains(x.getProperty()))
+                .select("(select\n" +
+                        "            group_concat(b.name)\n" +
+                        "        from class_homework_class a\n" +
+                        "            inner join base_class b on a.class_id = b.id\n" +
+                        "        where a.class_homework_id = t.id\n" +
+                        "        ) as class_id_cns")
+                .select("(select\n" +
+                        "            group_concat(a.class_id)\n" +
+                        "        from class_homework_class a\n" +
+                        "        where a.class_homework_id = t.id\n" +
+                        "       ) as class_ids")
+                .leftJoin(XjrUser.class, XjrUser::getId, ClassHomework::getTeacherId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, ClassHomeworkVo::getTeacherIdCn)
+                )
+                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, ClassHomework::getBaseCourseSubjectId,
+                        wrapper -> wrapper
+                                .selectAs(BaseCourseSubject::getName, ClassHomeworkVo::getBaseCourseSubjectIdCn)
+                )
+                .eq(ClassHomework::getId, id)
+                .orderByDesc(ClassHomework::getCreateDate)
+        ;
+
+        ClassHomeworkVo vo = classHomeworkService.selectJoinOne(ClassHomeworkVo.class, queryWrapper);
+
+        if (vo == null) {
+            return RT.error("找不到此数据!");
+        }
+
+        if(ObjectUtils.isNotEmpty(vo.getFolderId())){
+            List<File> files = fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId, vo.getFolderId()));
+            vo.setFiles(files);
+        }
+
+        return RT.ok(vo);
+    }
+
+    @PostMapping
+    @ApiOperation(value = "新增教师为班级布置作业记录表")
+    @SaCheckPermission("classhomework:add")
+    @XjrLog(value = "新增教师为班级布置作业记录表")
+    public RT<Boolean> addClassHomework(@Valid @RequestBody AddClassHomeworkDto dto){
+        boolean isSuccess = classHomeworkService.addClassHomework(dto);
+        return RT.ok(isSuccess);
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除教师为班级布置作业记录表")
+    @SaCheckPermission("classhomework:delete")
+    @XjrLog(value = "删除教师为班级布置作业记录表")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(classHomeworkService.removeBatchByIds(ids));
+
+    }
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value="阅读情况列表(不分页)")
+    @SaCheckPermission("classhomeworkread:detail")
+    @XjrLog(value = "阅读情况列表(不分页)")
+    public RT<List<ClassHomeworkReadListVo>> listClassHomeworkRead(@Valid ClassHomeworkReadListDto dto){
+        List<ClassHomeworkReadListVo> list = classHomeworkService.listClassHomeworkRead(dto);
+        return RT.ok(list);
+    }
+
+    @PostMapping("/read")
+    @ApiOperation(value = "新增班级作业已读表")
+    @SaCheckPermission("classhomeworkread:add")
+    @XjrLog(value = "新增班级作业已读表")
+    public RT<Boolean> readClassHomework(@Valid @RequestBody AddClassHomeworkReadDto dto){
+        return RT.ok(classHomeworkService.readClassHomework(dto));
+    }
+}

+ 132 - 0
src/main/java/com/xjrsoft/module/teacher/controller/ClassInternshipDynamicController.java

@@ -0,0 +1,132 @@
+package com.xjrsoft.module.teacher.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.service.IFileService;
+import com.xjrsoft.module.teacher.dto.*;
+import com.xjrsoft.module.teacher.entity.ClassInternshipDynamic;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.service.IClassInternshipDynamicService;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkReadListVo;
+import com.xjrsoft.module.teacher.vo.ClassInternshipDynamicPageVo;
+import com.xjrsoft.module.teacher.vo.ClassInternshipDynamicReadListVo;
+import com.xjrsoft.module.teacher.vo.ClassInternshipDynamicVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 实习动态表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/teacher" + "/classInternshipDynamic")
+@Api(value = "/teacher"  + "/classInternshipDynamic",tags = "实习动态表代码")
+@AllArgsConstructor
+public class ClassInternshipDynamicController {
+
+
+    private final IClassInternshipDynamicService classInternshipDynamicService;
+    private final IFileService fileService;
+
+    @GetMapping(value = "/page-mobile")
+    @ApiOperation(value="实习动态表列表(分页)")
+    @SaCheckPermission("classinternshipdynamic:detail")
+    @XjrLog(value = "实习动态表列表(分页)")
+    public RT<PageOutput<ClassInternshipDynamicPageVo>> pageClassInternshipDynamic(@Valid ClassInternshipDynamicPageDto dto){
+        IPage<ClassInternshipDynamicPageVo> page = classInternshipDynamicService.pageClassInternshipDynamic(dto);
+        PageOutput<ClassInternshipDynamicPageVo> pageOutput = ConventPage.getPageOutput(page, ClassInternshipDynamicPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询实习动态表信息")
+    @SaCheckPermission("classinternshipdynamic:detail")
+    @XjrLog(value = "根据id查询实习动态表信息")
+    public RT<ClassInternshipDynamicVo> info(@RequestParam Long id){
+        MPJLambdaWrapper<ClassInternshipDynamic> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .select(ClassInternshipDynamic::getId)
+                .select(ClassInternshipDynamic.class,x -> VoToColumnUtil.fieldsToColumns(ClassInternshipDynamicVo.class).contains(x.getProperty()))
+                .select("(select\n" +
+                        "            group_concat(b.name)\n" +
+                        "        from class_internship_dynamic_class a\n" +
+                        "            inner join base_class b on a.class_id = b.id\n" +
+                        "        where a.class_internship_dynamic_id = t.id\n" +
+                        "        ) as class_id_cns")
+                .select("(select\n" +
+                        "            group_concat(a.class_id)\n" +
+                        "        from class_internship_dynamic_class a\n" +
+                        "        where a.class_internship_dynamic_id = t.id\n" +
+                        "       ) as class_ids")
+                .leftJoin(XjrUser.class, XjrUser::getId, ClassInternshipDynamic::getPublisherId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, ClassInternshipDynamicVo::getPublisherIdCn)
+                )
+                .eq(ClassInternshipDynamic::getId, id)
+        ;
+
+        ClassInternshipDynamicVo vo = classInternshipDynamicService.selectJoinOne(ClassInternshipDynamicVo.class, queryWrapper);
+
+        if (vo == null) {
+           return RT.error("找不到此数据!");
+        }
+
+        if(ObjectUtils.isNotEmpty(vo.getFolderId())){
+            List<File> files = fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId, vo.getFolderId()));
+            vo.setFiles(files);
+        }
+
+        return RT.ok(vo);
+    }
+
+    @PostMapping
+    @ApiOperation(value = "新增实习动态表")
+    @SaCheckPermission("classinternshipdynamic:add")
+    @XjrLog(value = "新增实习动态表")
+    public RT<Boolean> addClassInternshipDynamic(@Valid @RequestBody AddClassInternshipDynamicDto dto){
+        return RT.ok(classInternshipDynamicService.addClassInternshipDynamic(dto));
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除实习动态表")
+    @SaCheckPermission("classinternshipdynamic:delete")
+    @XjrLog(value = "删除实习动态表")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(classInternshipDynamicService.removeBatchByIds(ids));
+
+    }
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value="阅读情况列表(不分页)")
+    @SaCheckPermission("classinternshipdynamicRead:detail")
+    @XjrLog(value = "阅读情况列表(不分页)")
+    public RT<List<ClassInternshipDynamicReadListVo>> listClassInternshipDynamic(@Valid ClassInternshipDynamicReadListDto dto){
+        List<ClassInternshipDynamicReadListVo> list = classInternshipDynamicService.listClassInternshipDynamic(dto);
+        return RT.ok(list);
+    }
+
+    @PostMapping("/read")
+    @ApiOperation(value = "新增实习动态已读表")
+    @SaCheckPermission("classinternshipdynamicRead:add")
+    @XjrLog(value = "新增实习动态已读表")
+    public RT<Boolean> readClassInternshipDynamic(@Valid @RequestBody AddClassInternshipDynamicReadDto dto){
+        return RT.ok(classInternshipDynamicService.readClassInternshipDynamic(dto));
+    }
+
+}

+ 66 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AddClassHomeworkDto.java

@@ -0,0 +1,66 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 教师为班级布置作业记录表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class AddClassHomeworkDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 教师id
+    */
+    @ApiModelProperty("教师id")
+    private Long teacherId;
+    /**
+    * 课程学科id
+    */
+    @ApiModelProperty("课程学科id")
+    private Long baseCourseSubjectId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id集合")
+    private List<Long> classIds;
+    /**
+    * 作业主题
+    */
+    @ApiModelProperty("作业主题")
+    private String title;
+    /**
+    * 完成截止时间
+    */
+    @ApiModelProperty("完成截止时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate completionDeadline;
+    /**
+    * 内容
+    */
+    @ApiModelProperty("内容")
+    private String content;
+    /**
+    * 附件
+    */
+    @ApiModelProperty("附件")
+    private Long folderId;
+
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AddClassHomeworkReadDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.teacher.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 szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class AddClassHomeworkReadDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 教师为班级布置作业记录表主键id
+    */
+    @ApiModelProperty("教师为班级布置作业记录表主键id")
+    private Long classHomeworkId;
+}

+ 58 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AddClassInternshipDynamicDto.java

@@ -0,0 +1,58 @@
+package com.xjrsoft.module.teacher.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 szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class AddClassInternshipDynamicDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 发布人id
+    */
+    @ApiModelProperty("发布人id")
+    private Long publisherId;
+    /**
+     * 班级id
+     */
+    @ApiModelProperty("班级id集合")
+    private List<Long> classIds;
+    /**
+    * 实习主题
+    */
+    @ApiModelProperty("实习主题")
+    private String title;
+    /**
+    * 发送范围(1:学生、2:家长、3:学生和家长)
+    */
+    @ApiModelProperty("发送范围(1:学生、2:家长、3:学生和家长)")
+    private Integer roleType;
+    /**
+    * 内容
+    */
+    @ApiModelProperty("内容")
+    private String content;
+    /**
+    * 附件
+    */
+    @ApiModelProperty("附件")
+    private Long folderId;
+
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AddClassInternshipDynamicReadDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.teacher.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 szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class AddClassInternshipDynamicReadDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 实习动态记录表主键id
+    */
+    @ApiModelProperty("实习动态记录表主键id")
+    private Long classInternshipDynamicId;
+}

+ 36 - 0
src/main/java/com/xjrsoft/module/teacher/dto/ClassHomeworkPageDto.java

@@ -0,0 +1,36 @@
+package com.xjrsoft.module.teacher.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.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 教师为班级布置作业记录表分页查询入参
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ClassHomeworkPageDto extends PageInput {
+
+    @ApiModelProperty("课程学科id")
+    private Long baseCourseSubjectId;
+
+    @ApiModelProperty("开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    @ApiModelProperty("结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+}

+ 34 - 0
src/main/java/com/xjrsoft/module/teacher/dto/ClassHomeworkReadListDto.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.module.teacher.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+
+/**
+* @title: 班级作业已读表分页查询入参
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ClassHomeworkReadListDto {
+    /**
+     * 教师为班级布置作业记录表主键id
+     */
+    @ApiModelProperty("教师为班级布置作业记录表主键id")
+    private Long classHomeworkId;
+
+    /**
+     * 班级id
+     */
+    @ApiModelProperty("班级id")
+    private Long classId;
+
+    @ApiModelProperty("阅读状态(0:未读,1:已读)")
+    private Integer isRead;
+}

+ 34 - 0
src/main/java/com/xjrsoft/module/teacher/dto/ClassInternshipDynamicPageDto.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.module.teacher.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.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 实习动态表分页查询入参
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ClassInternshipDynamicPageDto extends PageInput {
+
+    @ApiModelProperty("开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    @ApiModelProperty("结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+}

+ 33 - 0
src/main/java/com/xjrsoft/module/teacher/dto/ClassInternshipDynamicReadListDto.java

@@ -0,0 +1,33 @@
+package com.xjrsoft.module.teacher.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 实习动态已读表分页查询入参
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ClassInternshipDynamicReadListDto {
+    /**
+     * 教师为班级布置作业记录表主键id
+     */
+    @ApiModelProperty("教师为班级布置作业记录表主键id")
+    private Long classInternshipDynamicId;
+
+    /**
+     * 班级id
+     */
+    @ApiModelProperty("班级id")
+    private Long classId;
+
+    @ApiModelProperty("阅读状态(0:未读,1:已读)")
+    private Integer isRead;
+
+}

+ 109 - 0
src/main/java/com/xjrsoft/module/teacher/entity/ClassHomework.java

@@ -0,0 +1,109 @@
+package com.xjrsoft.module.teacher.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.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 教师为班级布置作业记录表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@TableName("class_homework")
+@ApiModel(value = "class_homework", description = "教师为班级布置作业记录表")
+public class ClassHomework 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;
+    /**
+    * 教师id
+    */
+    @ApiModelProperty("教师id")
+    private Long teacherId;
+    /**
+    * 课程学科id
+    */
+    @ApiModelProperty("课程学科id")
+    private Long baseCourseSubjectId;
+    /**
+    * 作业主题
+    */
+    @ApiModelProperty("作业主题")
+    private String title;
+    /**
+    * 完成截止时间
+    */
+    @ApiModelProperty("完成截止时间")
+    private LocalDate completionDeadline;
+    /**
+    * 内容
+    */
+    @ApiModelProperty("内容")
+    private String content;
+    /**
+    * 附件
+    */
+    @ApiModelProperty("附件")
+    private Long folderId;
+
+
+}

+ 88 - 0
src/main/java/com/xjrsoft/module/teacher/entity/ClassHomeworkClass.java

@@ -0,0 +1,88 @@
+package com.xjrsoft.module.teacher.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 szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@TableName("class_homework_class")
+@ApiModel(value = "class_homework_class", description = "作业与班级的关联记录表")
+public class ClassHomeworkClass 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;
+    /**
+    * 教师为班级布置作业记录表主键id
+    */
+    @ApiModelProperty("教师为班级布置作业记录表主键id")
+    private Long classHomeworkId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private Long classId;
+
+
+}

+ 88 - 0
src/main/java/com/xjrsoft/module/teacher/entity/ClassHomeworkRead.java

@@ -0,0 +1,88 @@
+package com.xjrsoft.module.teacher.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 szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@TableName("class_homework_read")
+@ApiModel(value = "class_homework_read", description = "班级作业已读表")
+public class ClassHomeworkRead 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;
+    /**
+    * 教师为班级布置作业记录表主键id
+    */
+    @ApiModelProperty("教师为班级布置作业记录表主键id")
+    private Long classHomeworkId;
+    /**
+    * 已读用户主键id
+    */
+    @ApiModelProperty("已读用户主键id")
+    private Long userId;
+
+
+}

+ 103 - 0
src/main/java/com/xjrsoft/module/teacher/entity/ClassInternshipDynamic.java

@@ -0,0 +1,103 @@
+package com.xjrsoft.module.teacher.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 szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@TableName("class_internship_dynamic")
+@ApiModel(value = "class_internship_dynamic", description = "实习动态表")
+public class ClassInternshipDynamic 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;
+    /**
+    * 发布人id
+    */
+    @ApiModelProperty("发布人id")
+    private Long publisherId;
+    /**
+    * 实习主题
+    */
+    @ApiModelProperty("实习主题")
+    private String title;
+    /**
+    * 发送范围(1:学生、2:家长、3:学生和家长)
+    */
+    @ApiModelProperty("发送范围(1:学生、2:家长、3:学生和家长)")
+    private String roleType;
+    /**
+    * 内容
+    */
+    @ApiModelProperty("内容")
+    private String content;
+    /**
+    * 附件
+    */
+    @ApiModelProperty("附件")
+    private Long folderId;
+
+
+}

+ 88 - 0
src/main/java/com/xjrsoft/module/teacher/entity/ClassInternshipDynamicClass.java

@@ -0,0 +1,88 @@
+package com.xjrsoft.module.teacher.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 szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@TableName("class_internship_dynamic_class")
+@ApiModel(value = "class_internship_dynamic_class", description = "实习动态班级关联表")
+public class ClassInternshipDynamicClass 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;
+    /**
+    * 实习动态id
+    */
+    @ApiModelProperty("实习动态id")
+    private Long classInternshipDynamicId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private Long classId;
+
+
+}

+ 88 - 0
src/main/java/com/xjrsoft/module/teacher/entity/ClassInternshipDynamicRead.java

@@ -0,0 +1,88 @@
+package com.xjrsoft.module.teacher.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 szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+@TableName("class_internship_dynamic_read")
+@ApiModel(value = "class_internship_dynamic_read", description = "实习动态已读表")
+public class ClassInternshipDynamicRead 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;
+    /**
+    * 实习动态记录表主键id
+    */
+    @ApiModelProperty("实习动态记录表主键id")
+    private Long classInternshipDynamicId;
+    /**
+    * 已读用户主键id
+    */
+    @ApiModelProperty("已读用户主键id")
+    private Long userId;
+
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/ClassHomeworkClassMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.ClassHomeworkClass;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 作业与班级的关联记录表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Mapper
+public interface ClassHomeworkClassMapper extends MPJBaseMapper<ClassHomeworkClass> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/ClassHomeworkMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.ClassHomework;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 教师为班级布置作业记录表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Mapper
+public interface ClassHomeworkMapper extends MPJBaseMapper<ClassHomework> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/ClassHomeworkReadMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.ClassHomeworkRead;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 班级作业已读表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Mapper
+public interface ClassHomeworkReadMapper extends MPJBaseMapper<ClassHomeworkRead> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/ClassInternshipDynamicClassMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.ClassInternshipDynamicClass;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 实习动态班级关联表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Mapper
+public interface ClassInternshipDynamicClassMapper extends MPJBaseMapper<ClassInternshipDynamicClass> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/ClassInternshipDynamicMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.ClassInternshipDynamic;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 实习动态表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Mapper
+public interface ClassInternshipDynamicMapper extends MPJBaseMapper<ClassInternshipDynamic> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/ClassInternshipDynamicReadMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.ClassInternshipDynamicRead;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 实习动态已读表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Mapper
+public interface ClassInternshipDynamicReadMapper extends MPJBaseMapper<ClassInternshipDynamicRead> {
+
+}

+ 33 - 0
src/main/java/com/xjrsoft/module/teacher/service/IClassHomeworkService.java

@@ -0,0 +1,33 @@
+package com.xjrsoft.module.teacher.service;
+
+import com.alibaba.excel.enums.BooleanEnum;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.teacher.dto.AddClassHomeworkDto;
+import com.xjrsoft.module.teacher.dto.AddClassHomeworkReadDto;
+import com.xjrsoft.module.teacher.dto.ClassHomeworkPageDto;
+import com.xjrsoft.module.teacher.dto.ClassHomeworkReadListDto;
+import com.xjrsoft.module.teacher.entity.ClassHomework;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkPageVo;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkReadListVo;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkVo;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 教师为班级布置作业记录表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+
+public interface IClassHomeworkService extends MPJBaseService<ClassHomework> {
+    IPage<ClassHomeworkPageVo>  pageClassHomework(ClassHomeworkPageDto dto);
+
+    Boolean addClassHomework(AddClassHomeworkDto dto);
+
+    List<ClassHomeworkReadListVo> listClassHomeworkRead(ClassHomeworkReadListDto dto);
+
+    Boolean readClassHomework(AddClassHomeworkReadDto dto);
+}

+ 34 - 0
src/main/java/com/xjrsoft/module/teacher/service/IClassInternshipDynamicService.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.module.teacher.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.module.teacher.dto.*;
+import com.xjrsoft.module.teacher.entity.ClassInternshipDynamic;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkReadListVo;
+import com.xjrsoft.module.teacher.vo.ClassInternshipDynamicPageVo;
+import com.xjrsoft.module.teacher.vo.ClassInternshipDynamicReadListVo;
+import lombok.Data;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 实习动态表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+
+public interface IClassInternshipDynamicService extends MPJBaseService<ClassInternshipDynamic> {
+
+    IPage<ClassInternshipDynamicPageVo> pageClassInternshipDynamic(@Valid ClassInternshipDynamicPageDto dto);
+
+    Boolean addClassInternshipDynamic(AddClassInternshipDynamicDto dto);
+
+    List<ClassInternshipDynamicReadListVo> listClassInternshipDynamic(ClassInternshipDynamicReadListDto dto);
+
+    Boolean readClassInternshipDynamic(AddClassInternshipDynamicReadDto dto);
+}

+ 360 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/ClassHomeworkServiceImpl.java

@@ -0,0 +1,360 @@
+package com.xjrsoft.module.teacher.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.RoleEnum;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.entity.BaseUserStudent;
+import com.xjrsoft.module.base.service.IBaseUserStudentService;
+import com.xjrsoft.module.evaluate.entity.EvaluateExecuter;
+import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.entity.UserStudent;
+import com.xjrsoft.module.organization.mapper.UserMapper;
+import com.xjrsoft.module.organization.service.IWeChatService;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.mapper.FileMapper;
+import com.xjrsoft.module.system.service.IFileService;
+import com.xjrsoft.module.teacher.dto.AddClassHomeworkDto;
+import com.xjrsoft.module.teacher.dto.AddClassHomeworkReadDto;
+import com.xjrsoft.module.teacher.dto.ClassHomeworkPageDto;
+import com.xjrsoft.module.teacher.dto.ClassHomeworkReadListDto;
+import com.xjrsoft.module.teacher.entity.ClassHomework;
+import com.xjrsoft.module.teacher.entity.ClassHomeworkClass;
+import com.xjrsoft.module.teacher.entity.ClassHomeworkRead;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.mapper.ClassHomeworkClassMapper;
+import com.xjrsoft.module.teacher.mapper.ClassHomeworkMapper;
+import com.xjrsoft.module.teacher.mapper.ClassHomeworkReadMapper;
+import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
+import com.xjrsoft.module.teacher.service.IClassHomeworkService;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkPageVo;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkReadListVo;
+import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.ParseException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+ * @title: 教师为班级布置作业记录表
+ * @Author szs
+ * @Date: 2025-04-27
+ * @Version 1.0
+ */
+@Service
+@AllArgsConstructor
+public class ClassHomeworkServiceImpl extends MPJBaseServiceImpl<ClassHomeworkMapper, ClassHomework> implements IClassHomeworkService {
+
+    private final IWeChatService weChatService;
+    private final UserMapper userMapper;
+    private final IBaseStudentSchoolRollService rollService;
+    private final IBaseUserStudentService userStudentService;
+    private final IFileService fileService;
+    private final XjrUserMapper xjrUserMapper;
+    private final ClassHomeworkReadMapper classHomeworkReadMapper;
+    private final ClassHomeworkClassMapper classHomeworkClassMapper;
+
+    @Override
+    public IPage<ClassHomeworkPageVo> pageClassHomework(ClassHomeworkPageDto dto) {
+        // 需要划分权限
+        // 教职工看到自己发的所有的,学生和家长看到自己的
+        List<String> roleList = StpUtil.getRoleList();
+        long userId = StpUtil.getLoginIdAsLong();
+
+        int roleType = 1;
+
+        List<Long> classIds = new ArrayList<>();
+
+        if (roleList.contains("TEACHER")) {
+            roleType = 2;
+        }
+        if (roleList.contains("STUDENT")) {
+            roleType = 3;
+            classIds.add(rollService.getClassIdByUserId(userId));
+        }
+        if (roleList.contains("PARENT")) {
+            roleType = 3;
+            List<BaseUserStudent> list = userStudentService.list(new QueryWrapper<BaseUserStudent>().lambda().eq(BaseUserStudent::getUserId, userId));
+            for (BaseUserStudent userStudent : list) {
+                classIds.add(rollService.getClassIdByUserId(userStudent.getStudentId()));
+            }
+        }
+
+        MPJLambdaWrapper<ClassHomework> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .disableSubLogicDel()
+                .select(ClassHomework::getId)
+                .select(ClassHomework.class,x -> VoToColumnUtil.fieldsToColumns(ClassHomeworkPageVo.class).contains(x.getProperty()))
+                .select("(select\n" +
+                        "            group_concat(b.name)\n" +
+                        "        from class_homework_class a\n" +
+                        "            inner join base_class b on a.class_id = b.id\n" +
+                        "        where a.class_homework_id = t.id\n" +
+                        "        ) as class_id_cns")
+                .select("(select\n" +
+                        "            group_concat(a.class_id)\n" +
+                        "        from class_homework_class a\n" +
+                        "        where a.class_homework_id = t.id\n" +
+                        "       ) as class_ids")
+                .leftJoin(XjrUser.class, XjrUser::getId, ClassHomework::getTeacherId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, ClassHomeworkPageVo::getTeacherIdCn)
+                        )
+                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, ClassHomework::getBaseCourseSubjectId,
+                        wrapper -> wrapper
+                                .selectAs(BaseCourseSubject::getName, ClassHomeworkPageVo::getBaseCourseSubjectIdCn)
+                )
+                .eq(ObjectUtils.isNotEmpty(dto.getBaseCourseSubjectId()), ClassHomework::getBaseCourseSubjectId, dto.getBaseCourseSubjectId())
+                .ge(ObjectUtils.isNotEmpty(dto.getStartDate()), ClassHomework::getCreateDate, dto.getStartDate())
+                .le(ObjectUtils.isNotEmpty(dto.getEndDate()), ClassHomework::getCreateDate, dto.getEndDate())
+                .orderByDesc(ClassHomework::getCreateDate)
+        ;
+        if(roleType == 2){
+            queryWrapper
+                    .eq(ClassHomework::getTeacherId, userId);
+        }
+
+        if(roleType == 3){
+            queryWrapper
+                    .innerJoin(ClassHomeworkClass.class, ClassHomeworkClass::getClassHomeworkId, ClassHomework::getId)
+                    .in(CollectionUtils.isNotEmpty(classIds), ClassHomeworkClass::getClassId, classIds);
+        }
+
+        IPage<ClassHomeworkPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), ClassHomeworkPageVo.class, queryWrapper);
+
+        for (ClassHomeworkPageVo vo : page.getRecords()){
+            if(ObjectUtils.isNotEmpty(vo.getFolderId())){
+                List<File> files = fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId, vo.getFolderId()));
+                vo.setFiles(files);
+            }
+        }
+
+        return page;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addClassHomework(AddClassHomeworkDto dto) {
+        Long loginId = StpUtil.getLoginIdAsLong();
+        LocalDateTime nowLocalDateTime = LocalDateTime.now();
+
+        ClassHomework classHomework = BeanUtil.toBean(dto, ClassHomework.class);
+        classHomework.setTeacherId(loginId);
+
+        classHomework.setCreateUserId(loginId);
+        classHomework.setCreateDate(nowLocalDateTime);
+
+        this.save(classHomework);
+        for (Long classId : dto.getClassIds()){
+            ClassHomeworkClass classHomeworkClass = new ClassHomeworkClass();
+            classHomeworkClass.setClassHomeworkId(classHomework.getId());
+            classHomeworkClass.setClassId(classId);
+
+            classHomeworkClass.setCreateUserId(loginId);
+            classHomeworkClass.setCreateDate(nowLocalDateTime);
+
+            classHomeworkClassMapper.insert(classHomeworkClass);
+        }
+
+        // 发送通知
+        // 找到班上所有的学生
+        MPJLambdaWrapper<User> stuMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        stuMPJLambdaWrapper
+                .distinct()
+                .select(User::getId)
+                .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
+                .in(BaseStudentSchoolRoll::getClassId, dto.getClassIds());
+        List<User> stuList = userMapper.selectJoinList(User.class, stuMPJLambdaWrapper);
+
+        // 找到班上所有的学生的家长
+        MPJLambdaWrapper<User> parentMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        parentMPJLambdaWrapper
+                .distinct()
+                .disableSubLogicDel()
+                .select(User::getId).select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                .leftJoin(UserStudent.class, UserStudent::getUserId, User::getId)
+                .leftJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, UserStudent::getId)
+                .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
+                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                .in(BaseStudentSchoolRoll::getClassId, dto.getClassIds());
+        List<User> parentList = userMapper.selectJoinList(User.class, parentMPJLambdaWrapper);
+
+        // 合并两个列表,并根据 User 的 id 去重
+        List<User> combinedList = new ArrayList<>(Stream.concat(stuList.stream(), parentList.stream())
+                .collect(Collectors.toMap(
+                        User::getId, // 键:User 的 id
+                        user -> user, // 值:User 对象本身
+                        (existing, replacement) -> existing // 如果有重复的键,保留旧值(existing)
+                ))
+                .values());
+
+        // 发布作业的教师
+        User releaseUser = userMapper.selectById(loginId);
+
+        try {
+            for (User user : combinedList) {
+                WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                weChatSendMessageDto.setUserId(user.getOpenId());
+                weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
+                weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
+                JSONObject paramJson = new JSONObject();
+
+                JSONObject thing23 = new JSONObject();
+                thing23.put("value", dto.getTitle());
+                paramJson.put("thing23", thing23);
+
+                JSONObject thing29 = new JSONObject();
+                thing29.put("value", releaseUser.getName());
+                paramJson.put("thing29", thing29);
+
+                JSONObject time17Json = new JSONObject();
+                time17Json.put("value", dto.getCompletionDeadline());
+                paramJson.put("time17", time17Json);
+
+                weChatSendMessageDto.setContent(paramJson);
+                weChatService.sendTemplateMessage(weChatSendMessageDto);
+            }
+        } catch (Exception e) {
+            log.error("发送消息错误,Error processing event data", e);
+        }
+        return true;
+    }
+
+    @Override
+    public List<ClassHomeworkReadListVo> listClassHomeworkRead(ClassHomeworkReadListDto dto) {
+        ClassHomework classHomework = this.getById(dto.getClassHomeworkId());
+        if (ObjectUtils.isEmpty(classHomework)) {
+            throw new MyException("当前作业被修改,请刷新重试");
+        }
+
+        // 获取当前所有班级所有的学生
+        MPJLambdaWrapper<XjrUser> xjrUserMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        xjrUserMPJLambdaWrapper
+                .selectAs(XjrUser::getId, ClassHomeworkReadListVo::getUserId)
+                .selectAs(XjrUser::getName, ClassHomeworkReadListVo::getUserIdCn)
+                .select("0 as is_read")
+                .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
+        ;
+
+        if(ObjectUtils.isEmpty(dto.getClassId())){
+            LambdaQueryWrapper<ClassHomeworkClass> classLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            classLambdaQueryWrapper
+                    .eq(ClassHomeworkClass::getClassHomeworkId, dto.getClassHomeworkId())
+                    .eq(ClassHomeworkClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+            ;
+
+            List<ClassHomeworkClass> classHomeworkClassList = classHomeworkClassMapper.selectList(classLambdaQueryWrapper);
+            if(CollectionUtils.isEmpty(classHomeworkClassList)){
+                return new ArrayList<>();
+            }
+
+            // 提取 classId 并去重
+            List<Long> uniqueClassIds = classHomeworkClassList.stream()
+                    .map(ClassHomeworkClass::getClassId) // 提取 classId
+                    .distinct() // 去重
+                    .collect(Collectors.toList()); // 收集为 List
+
+            xjrUserMPJLambdaWrapper
+                .in(BaseStudentSchoolRoll::getClassId, uniqueClassIds);
+        }else {
+            xjrUserMPJLambdaWrapper
+                    .eq(BaseStudentSchoolRoll::getClassId, dto.getClassId());
+        }
+
+        List<ClassHomeworkReadListVo> list = xjrUserMapper.selectJoinList(ClassHomeworkReadListVo.class, xjrUserMPJLambdaWrapper);
+
+        // 获取当前作业已经阅读情况
+        LambdaQueryWrapper<ClassHomeworkRead> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .select(ClassHomeworkRead.class, x -> VoToColumnUtil.fieldsToColumns(ClassHomeworkRead.class).contains(x.getProperty()))
+                .eq(ClassHomeworkRead::getClassHomeworkId, dto.getClassHomeworkId())
+                .orderByDesc(ClassHomeworkRead::getId)
+        ;
+
+        List<ClassHomeworkRead> readList = classHomeworkReadMapper.selectList(queryWrapper);
+        Map<Long, LocalDateTime> readMap = readList.stream()
+                .collect(Collectors.toMap(ClassHomeworkRead::getUserId, ClassHomeworkRead::getCreateDate, (l1, l2) -> l2));
+
+        if (MapUtils.isNotEmpty(readMap)) {
+            for (ClassHomeworkReadListVo vo : list) {
+                if (readMap.containsKey(vo.getUserId())) {
+                    vo.setCreateDate(readMap.get(vo.getUserId()));
+                    vo.setIsRead(1);
+                }
+            }
+        }
+
+        List<ClassHomeworkReadListVo> result = new ArrayList<>();
+        if(ObjectUtils.isNotEmpty(dto.getIsRead())){
+            for (ClassHomeworkReadListVo vo : list) {
+                if(Objects.equals(vo.getIsRead(), dto.getIsRead())){
+                    result.add(vo);
+                }
+            }
+        }else {
+            return list;
+        }
+
+        return result;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean readClassHomework(AddClassHomeworkReadDto dto) {
+        Long loginId = StpUtil.getLoginIdAsLong();
+        // 查询用户是否已经阅读当前作业
+        LambdaQueryWrapper<ClassHomeworkRead> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .select(ClassHomeworkRead.class,x -> VoToColumnUtil.fieldsToColumns(ClassHomeworkRead.class).contains(x.getProperty()))
+                .eq(ClassHomeworkRead::getClassHomeworkId, dto.getClassHomeworkId())
+                .eq(ClassHomeworkRead::getUserId, loginId)
+        ;
+        ClassHomeworkRead classHomeworkRead = classHomeworkReadMapper.selectOne(queryWrapper);
+
+        if(ObjectUtils.isEmpty(classHomeworkRead)){
+            ClassHomeworkRead insert = BeanUtil.toBean(dto, ClassHomeworkRead.class);
+            insert.setUserId(loginId);
+
+            insert.setCreateDate(LocalDateTime.now());
+            insert.setCreateUserId(loginId);
+
+            classHomeworkReadMapper.insert(insert);
+        }
+
+        return true;
+    }
+}

+ 351 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/ClassInternshipDynamicServiceImpl.java

@@ -0,0 +1,351 @@
+package com.xjrsoft.module.teacher.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.entity.BaseUserStudent;
+import com.xjrsoft.module.base.service.IBaseUserStudentService;
+import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.entity.UserStudent;
+import com.xjrsoft.module.organization.mapper.UserMapper;
+import com.xjrsoft.module.organization.service.IWeChatService;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.service.IFileService;
+import com.xjrsoft.module.teacher.dto.AddClassInternshipDynamicDto;
+import com.xjrsoft.module.teacher.dto.AddClassInternshipDynamicReadDto;
+import com.xjrsoft.module.teacher.dto.ClassInternshipDynamicPageDto;
+import com.xjrsoft.module.teacher.dto.ClassInternshipDynamicReadListDto;
+import com.xjrsoft.module.teacher.entity.*;
+import com.xjrsoft.module.teacher.mapper.ClassInternshipDynamicClassMapper;
+import com.xjrsoft.module.teacher.mapper.ClassInternshipDynamicMapper;
+import com.xjrsoft.module.teacher.mapper.ClassInternshipDynamicReadMapper;
+import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
+import com.xjrsoft.module.teacher.service.IClassInternshipDynamicService;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkPageVo;
+import com.xjrsoft.module.teacher.vo.ClassHomeworkReadListVo;
+import com.xjrsoft.module.teacher.vo.ClassInternshipDynamicPageVo;
+import com.xjrsoft.module.teacher.vo.ClassInternshipDynamicReadListVo;
+import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
+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.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 实习动态表
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassInternshipDynamicMapper, ClassInternshipDynamic> implements IClassInternshipDynamicService {
+
+    private final ClassInternshipDynamicClassMapper classInternshipDynamicClassMapper;
+    private final UserMapper userMapper;
+    private final IWeChatService weChatService;
+    private final IBaseStudentSchoolRollService rollService;
+    private final IBaseUserStudentService userStudentService;
+    private final IFileService fileService;
+    private final XjrUserMapper xjrUserMapper;
+    private final ClassInternshipDynamicReadMapper classInternshipDynamicReadMapper;
+
+    @Override
+    public IPage<ClassInternshipDynamicPageVo> pageClassInternshipDynamic(ClassInternshipDynamicPageDto dto) {
+        // 需要划分权限
+        // 教职工看到自己发的所有的,学生和家长看到自己的
+        List<String> roleList = StpUtil.getRoleList();
+        long userId = StpUtil.getLoginIdAsLong();
+
+        int roleType = 1;
+
+        List<Long> classIds = new ArrayList<>();
+
+        if (roleList.contains("TEACHER")) {
+            roleType = 2;
+        }
+        if (roleList.contains("STUDENT")) {
+            roleType = 3;
+            classIds.add(rollService.getClassIdByUserId(userId));
+        }
+        if (roleList.contains("PARENT")) {
+            roleType = 3;
+            List<BaseUserStudent> list = userStudentService.list(new QueryWrapper<BaseUserStudent>().lambda().eq(BaseUserStudent::getUserId, userId));
+            for (BaseUserStudent userStudent : list) {
+                classIds.add(rollService.getClassIdByUserId(userStudent.getStudentId()));
+            }
+        }
+
+        MPJLambdaWrapper<ClassInternshipDynamic> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .select(ClassInternshipDynamic::getId)
+                .select(ClassInternshipDynamic.class,x -> VoToColumnUtil.fieldsToColumns(ClassInternshipDynamicPageVo.class).contains(x.getProperty()))
+                .select("(select\n" +
+                        "            group_concat(b.name)\n" +
+                        "        from class_internship_dynamic_class a\n" +
+                        "            inner join base_class b on a.class_id = b.id\n" +
+                        "        where a.class_internship_dynamic_id = t.id\n" +
+                        "        ) as class_id_cns")
+                .select("(select\n" +
+                        "            group_concat(a.class_id)\n" +
+                        "        from class_internship_dynamic_class a\n" +
+                        "        where a.class_internship_dynamic_id = t.id\n" +
+                        "       ) as class_ids")
+                .leftJoin(XjrUser.class, XjrUser::getId, ClassInternshipDynamic::getPublisherId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, ClassInternshipDynamicPageVo::getPublisherIdCn)
+                )
+                .ge(ObjectUtils.isNotEmpty(dto.getStartDate()), ClassInternshipDynamic::getCreateDate, dto.getStartDate())
+                .le(ObjectUtils.isNotEmpty(dto.getEndDate()), ClassInternshipDynamic::getCreateDate, dto.getEndDate())
+                .orderByDesc(ClassInternshipDynamic::getCreateDate)
+        ;
+        if(roleType == 2){
+            queryWrapper
+                    .eq(ClassInternshipDynamic::getPublisherId, userId);
+        }
+
+        if(roleType == 3){
+            queryWrapper
+                    .innerJoin(ClassInternshipDynamicClass.class, ClassInternshipDynamicClass::getClassInternshipDynamicId, ClassInternshipDynamic::getId)
+                    .in(CollectionUtils.isNotEmpty(classIds), ClassInternshipDynamicClass::getClassId, classIds);
+        }
+
+        IPage<ClassInternshipDynamicPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), ClassInternshipDynamicPageVo.class, queryWrapper);
+
+        for (ClassInternshipDynamicPageVo vo : page.getRecords()){
+            if(ObjectUtils.isNotEmpty(vo.getFolderId())){
+                List<File> files = fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId, vo.getFolderId()));
+                vo.setFiles(files);
+            }
+        }
+
+        return page;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addClassInternshipDynamic(AddClassInternshipDynamicDto dto) {
+        Long loginId = StpUtil.getLoginIdAsLong();
+        LocalDateTime nowLocalDateTime = LocalDateTime.now();
+
+        ClassInternshipDynamic classInternshipDynamic = BeanUtil.toBean(dto, ClassInternshipDynamic.class);
+        classInternshipDynamic.setPublisherId(loginId);
+        classInternshipDynamic.setCreateUserId(loginId);
+        classInternshipDynamic.setCreateDate(nowLocalDateTime);
+
+        this.save(classInternshipDynamic);
+
+        for (Long classid : dto.getClassIds()){
+            ClassInternshipDynamicClass classInternshipDynamicClass = new ClassInternshipDynamicClass();
+            classInternshipDynamicClass.setClassInternshipDynamicId(classInternshipDynamic.getId());
+            classInternshipDynamicClass.setClassId(classid);
+
+            classInternshipDynamicClass.setCreateUserId(loginId);
+            classInternshipDynamicClass.setCreateDate(nowLocalDateTime);
+            classInternshipDynamicClassMapper.insert(classInternshipDynamicClass);
+        }
+
+        // 发送通知
+        List<User> combinedList = new ArrayList<>();
+        if(ObjectUtils.isNotEmpty(dto.getRoleType()) && dto.getRoleType() == 1){
+            // 找到班上所有的学生
+            MPJLambdaWrapper<User> stuMPJLambdaWrapper = new MPJLambdaWrapper<>();
+            stuMPJLambdaWrapper
+                    .distinct()
+                    .select(User::getId)
+                    .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                    .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
+                    .in(BaseStudentSchoolRoll::getClassId, dto.getClassIds());
+            List<User> stuList = userMapper.selectJoinList(User.class, stuMPJLambdaWrapper);
+
+            combinedList.addAll(stuList);
+        }
+
+        if(ObjectUtils.isNotEmpty(dto.getRoleType()) && dto.getRoleType() == 2){
+            // 找到班上所有的学生的家长
+            MPJLambdaWrapper<User> parentMPJLambdaWrapper = new MPJLambdaWrapper<>();
+            parentMPJLambdaWrapper
+                    .distinct()
+                    .disableSubLogicDel()
+                    .select(User::getId).select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                    .leftJoin(UserStudent.class, UserStudent::getUserId, User::getId)
+                    .leftJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, UserStudent::getId)
+                    .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
+                    .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                    .in(BaseStudentSchoolRoll::getClassId, dto.getClassIds());
+            List<User> parentList = userMapper.selectJoinList(User.class, parentMPJLambdaWrapper);
+
+            // 合并两个列表,并根据 User 的 id 去重
+            combinedList = new ArrayList<>(Stream.concat(combinedList.stream(), parentList.stream())
+                    .collect(Collectors.toMap(
+                            User::getId, // 键:User 的 id
+                            user -> user, // 值:User 对象本身
+                            (existing, replacement) -> existing // 如果有重复的键,保留旧值(existing)
+                    ))
+                    .values());
+        }
+
+        // 发布作业的教师
+        User releaseUser = userMapper.selectById(loginId);
+        try {
+            for (User user : combinedList) {
+                WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                weChatSendMessageDto.setUserId(user.getOpenId());
+                weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
+                weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
+                JSONObject paramJson = new JSONObject();
+
+                JSONObject thing23 = new JSONObject();
+                thing23.put("value", dto.getTitle());
+                paramJson.put("thing23", thing23);
+
+                JSONObject thing29 = new JSONObject();
+                thing29.put("value", releaseUser.getName());
+                paramJson.put("thing29", thing29);
+
+                JSONObject time17Json = new JSONObject();
+                time17Json.put("value", nowLocalDateTime);
+                paramJson.put("time17", time17Json);
+
+                weChatSendMessageDto.setContent(paramJson);
+                weChatService.sendTemplateMessage(weChatSendMessageDto);
+            }
+        } catch (Exception e) {
+            log.error("发送消息错误,Error processing event data", e);
+        }
+        return true;
+    }
+
+    @Override
+    public List<ClassInternshipDynamicReadListVo> listClassInternshipDynamic(ClassInternshipDynamicReadListDto dto) {
+        ClassInternshipDynamic classInternshipDynamic = this.getById(dto.getClassInternshipDynamicId());
+        if (ObjectUtils.isEmpty(classInternshipDynamic)) {
+            throw new MyException("当前作业被修改,请刷新重试");
+        }
+
+        // 获取当前所有班级所有的学生
+        MPJLambdaWrapper<XjrUser> xjrUserMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        xjrUserMPJLambdaWrapper
+                .selectAs(XjrUser::getId, ClassInternshipDynamicReadListVo::getUserId)
+                .selectAs(XjrUser::getName, ClassInternshipDynamicReadListVo::getUserIdCn)
+                .select("0 as is_read")
+                .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
+        ;
+
+        if(ObjectUtils.isEmpty(dto.getClassId())){
+            LambdaQueryWrapper<ClassInternshipDynamicClass> classLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            classLambdaQueryWrapper
+                    .eq(ClassInternshipDynamicClass::getClassInternshipDynamicId, dto.getClassInternshipDynamicId())
+                    .eq(ClassInternshipDynamicClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+            ;
+
+            List<ClassInternshipDynamicClass> classeList = classInternshipDynamicClassMapper.selectList(classLambdaQueryWrapper);
+            if(CollectionUtils.isEmpty(classeList)){
+                return new ArrayList<>();
+            }
+
+            // 提取 classId 并去重
+            List<Long> uniqueClassIds = classeList.stream()
+                    .map(ClassInternshipDynamicClass::getClassId) // 提取 classId
+                    .distinct() // 去重
+                    .collect(Collectors.toList()); // 收集为 List
+
+            xjrUserMPJLambdaWrapper
+                    .in(BaseStudentSchoolRoll::getClassId, uniqueClassIds);
+        }else {
+            xjrUserMPJLambdaWrapper
+                    .eq(BaseStudentSchoolRoll::getClassId, dto.getClassId());
+        }
+
+        List<ClassInternshipDynamicReadListVo> list = xjrUserMapper.selectJoinList(ClassInternshipDynamicReadListVo.class, xjrUserMPJLambdaWrapper);
+
+        // 获取当前作业已经阅读情况
+        LambdaQueryWrapper<ClassInternshipDynamicRead> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .select(ClassInternshipDynamicRead.class, x -> VoToColumnUtil.fieldsToColumns(ClassInternshipDynamicRead.class).contains(x.getProperty()))
+                .eq(ClassInternshipDynamicRead::getClassInternshipDynamicId, dto.getClassInternshipDynamicId())
+                .orderByDesc(ClassInternshipDynamicRead::getId)
+        ;
+
+        List<ClassInternshipDynamicRead> readList = classInternshipDynamicReadMapper.selectList(queryWrapper);
+        Map<Long, LocalDateTime> readMap = readList.stream()
+                .collect(Collectors.toMap(ClassInternshipDynamicRead::getUserId, ClassInternshipDynamicRead::getCreateDate, (l1, l2) -> l2));
+
+        if (MapUtils.isNotEmpty(readMap)) {
+            for (ClassInternshipDynamicReadListVo vo : list) {
+                if (readMap.containsKey(vo.getUserId())) {
+                    vo.setCreateDate(readMap.get(vo.getUserId()));
+                    vo.setIsRead(1);
+                }
+            }
+        }
+
+        List<ClassInternshipDynamicReadListVo> result = new ArrayList<>();
+        if(ObjectUtils.isNotEmpty(dto.getIsRead())){
+            for (ClassInternshipDynamicReadListVo vo : list) {
+                if(Objects.equals(vo.getIsRead(), dto.getIsRead())){
+                    result.add(vo);
+                }
+            }
+        }else {
+            return list;
+        }
+
+        return result;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean readClassInternshipDynamic(AddClassInternshipDynamicReadDto dto) {
+        Long loginId = StpUtil.getLoginIdAsLong();
+        // 查询用户是否已经阅读当前作业
+        LambdaQueryWrapper<ClassInternshipDynamicRead> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .select(ClassInternshipDynamicRead.class,x -> VoToColumnUtil.fieldsToColumns(ClassInternshipDynamicRead.class).contains(x.getProperty()))
+                .eq(ClassInternshipDynamicRead::getClassInternshipDynamicId, dto.getClassInternshipDynamicId())
+                .eq(ClassInternshipDynamicRead::getUserId, loginId)
+        ;
+        ClassInternshipDynamicRead classInternshipDynamicRead = classInternshipDynamicReadMapper.selectOne(queryWrapper);
+
+        if(ObjectUtils.isEmpty(classInternshipDynamicRead)){
+            ClassInternshipDynamicRead insert = BeanUtil.toBean(dto, ClassInternshipDynamicRead.class);
+            insert.setUserId(loginId);
+
+            insert.setCreateDate(LocalDateTime.now());
+            insert.setCreateUserId(loginId);
+
+            classInternshipDynamicReadMapper.insert(insert);
+        }
+
+        return true;
+    }
+}

+ 81 - 0
src/main/java/com/xjrsoft/module/teacher/vo/ClassHomeworkPageVo.java

@@ -0,0 +1,81 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xjrsoft.module.system.entity.File;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+* @title: 教师为班级布置作业记录表分页列表出参
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class ClassHomeworkPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createDate;
+    /**
+    * 教师id
+    */
+    @ApiModelProperty("教师id")
+    private Long teacherId;
+    @ApiModelProperty("教师id")
+    private String teacherIdCn;
+    /**
+    * 课程学科id
+    */
+    @ApiModelProperty("课程学科id")
+    private Long baseCourseSubjectId;
+    @ApiModelProperty("课程学科id")
+    private String baseCourseSubjectIdCn;
+
+    @ApiModelProperty("班级id")
+    private String classIds;
+    @ApiModelProperty("班级id")
+    private String classIdCns;
+
+    /**
+    * 作业主题
+    */
+    @ApiModelProperty("作业主题")
+    private String title;
+    /**
+    * 完成截止时间
+    */
+    @ApiModelProperty("完成截止时间")
+    private LocalDate completionDeadline;
+    /**
+    * 内容
+    */
+    @ApiModelProperty("内容")
+    private String content;
+    /**
+    * 附件
+    */
+    @ApiModelProperty("附件")
+    private Long folderId;
+    @ApiModelProperty("附件")
+    private List<File> files;
+}

+ 36 - 0
src/main/java/com/xjrsoft/module/teacher/vo/ClassHomeworkReadListVo.java

@@ -0,0 +1,36 @@
+package com.xjrsoft.module.teacher.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+* @title: 班级作业已读表分页列表出参
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class ClassHomeworkReadListVo {
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createDate;
+    /**
+    * 教师为班级布置作业记录表主键id
+    */
+    @ApiModelProperty("教师为班级布置作业记录表主键id")
+    private Long classHomeworkId;
+    /**
+    * 已读用户主键id
+    */
+    @ApiModelProperty("已读用户主键id")
+    private Long userId;
+    @ApiModelProperty("已读用户主键id")
+    private String userIdCn;
+
+    @ApiModelProperty("阅读状态(0:未读,1:已读)")
+    private Integer isRead;
+}

+ 69 - 0
src/main/java/com/xjrsoft/module/teacher/vo/ClassHomeworkVo.java

@@ -0,0 +1,69 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.xjrsoft.module.system.entity.File;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 教师为班级布置作业记录表表单出参
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class ClassHomeworkVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 教师id
+    */
+    @ApiModelProperty("教师id")
+    private Long teacherId;
+    @ApiModelProperty("教师id")
+    private String teacherIdCn;
+    /**
+    * 课程学科id
+    */
+    @ApiModelProperty("课程学科id")
+    private Long baseCourseSubjectId;
+    @ApiModelProperty("课程学科id")
+    private String baseCourseSubjectIdCn;
+
+    @ApiModelProperty("班级id")
+    private String classIds;
+    @ApiModelProperty("班级id")
+    private String classIdCns;
+    /**
+    * 作业主题
+    */
+    @ApiModelProperty("作业主题")
+    private String title;
+    /**
+    * 完成截止时间
+    */
+    @ApiModelProperty("完成截止时间")
+    private LocalDate completionDeadline;
+    /**
+    * 内容
+    */
+    @ApiModelProperty("内容")
+    private String content;
+    /**
+    * 附件
+    */
+    @ApiModelProperty("附件")
+    private Long folderId;
+    @ApiModelProperty("附件")
+    private List<File> files;
+}

+ 73 - 0
src/main/java/com/xjrsoft/module/teacher/vo/ClassInternshipDynamicPageVo.java

@@ -0,0 +1,73 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xjrsoft.module.system.entity.File;
+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;
+import java.util.List;
+
+/**
+* @title: 实习动态表分页列表出参
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class ClassInternshipDynamicPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createDate;
+    /**
+    * 发布人id
+    */
+    @ApiModelProperty("发布人id")
+    private Long publisherId;
+    @ApiModelProperty("发布人id")
+    private String publisherIdCn;
+
+    @ApiModelProperty("班级id")
+    private String classIds;
+    @ApiModelProperty("班级id")
+    private String classIdCns;
+
+    /**
+    * 实习主题
+    */
+    @ApiModelProperty("实习主题")
+    private String title;
+    /**
+    * 发送范围(1:学生、2:家长、3:学生和家长)
+    */
+    @ApiModelProperty("发送范围(1:学生、2:家长、3:学生和家长)")
+    private Integer roleType;
+    /**
+    * 内容
+    */
+    @ApiModelProperty("内容")
+    private String content;
+    /**
+    * 附件
+    */
+    @ApiModelProperty("附件")
+    private Long folderId;
+    @ApiModelProperty("附件")
+    private List<File> files;
+}

+ 37 - 0
src/main/java/com/xjrsoft/module/teacher/vo/ClassInternshipDynamicReadListVo.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.teacher.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+* @title: 实习动态已读表分页列表出参
+* @Author szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class ClassInternshipDynamicReadListVo {
+
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createDate;
+    /**
+    * 实习动态记录表主键id
+    */
+    @ApiModelProperty("实习动态记录表主键id")
+    private Long classInternshipDynamicId;
+    /**
+    * 已读用户主键id
+    */
+    @ApiModelProperty("已读用户主键id")
+    private Long userId;
+    @ApiModelProperty("已读用户主键id")
+    private String userIdCn;
+
+    @ApiModelProperty("阅读状态(0:未读,1:已读)")
+    private Integer isRead;
+}

+ 62 - 0
src/main/java/com/xjrsoft/module/teacher/vo/ClassInternshipDynamicVo.java

@@ -0,0 +1,62 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.xjrsoft.module.system.entity.File;
+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 szs
+* @Date: 2025-04-27
+* @Version 1.0
+*/
+@Data
+public class ClassInternshipDynamicVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 发布人id
+    */
+    @ApiModelProperty("发布人id")
+    private Long publisherId;
+    @ApiModelProperty("发布人id")
+    private String publisherIdCn;
+
+    @ApiModelProperty("班级id")
+    private String classIds;
+    @ApiModelProperty("班级id")
+    private String classIdCns;
+
+    /**
+    * 实习主题
+    */
+    @ApiModelProperty("实习主题")
+    private String title;
+    /**
+    * 发送范围(1:学生、2:家长、3:学生和家长)
+    */
+    @ApiModelProperty("发送范围(1:学生、2:家长、3:学生和家长)")
+    private String roleType;
+    /**
+    * 内容
+    */
+    @ApiModelProperty("内容")
+    private String content;
+    /**
+    * 附件
+    */
+    @ApiModelProperty("附件")
+    private Long folderId;
+    @ApiModelProperty("附件")
+    private List<File> files;
+}

+ 140 - 0
src/main/resources/sqlScript/20250427_sql.sql

@@ -0,0 +1,140 @@
+-- --------------------------------------------------------------------------------------------
+-- 教师布置作业记录表
+-- --------------------------------------------------------------------------------------------
+DROP TABLE IF EXISTS class_homework;
+CREATE TABLE `class_homework`
+(
+    id                     bigint        not null comment '主键编号'
+        primary key,
+    create_user_id         bigint        null comment '创建人',
+    create_date            datetime      null comment '创建时间',
+    modify_user_id         bigint        null comment '修改人',
+    modify_date            datetime      null comment '修改时间',
+    delete_mark            int           not null comment '删除标记',
+    enabled_mark           int           not null comment '有效标志',
+
+    teacher_id             bigint        not null comment '教师id',
+    base_course_subject_id bigint        not null comment '课程学科id',
+    title                  varchar(200)  not null comment '作业主题',
+    completion_deadline    date          not null comment '完成截止时间',
+    content                varchar(1000) not null comment '内容',
+    folder_id              bigint        null comment '附件'
+) ENGINE = INNODB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='教师为班级布置作业记录表';
+
+-- --------------------------------------------------------------------------------------------
+-- 作业与班级的关联记录表
+-- --------------------------------------------------------------------------------------------
+DROP TABLE IF EXISTS class_homework_class;
+CREATE TABLE `class_homework_class`
+(
+    id                bigint   not null comment '主键编号'
+        primary key,
+    create_user_id    bigint   null comment '创建人',
+    create_date       datetime null comment '创建时间',
+    modify_user_id    bigint   null comment '修改人',
+    modify_date       datetime null comment '修改时间',
+    delete_mark       int      not null comment '删除标记',
+    enabled_mark      int      not null comment '有效标志',
+
+    class_homework_id bigint   not null comment '教师为班级布置作业记录表主键id',
+    class_id          bigint   not null comment '班级id'
+) ENGINE = INNODB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='作业与班级的关联记录表';
+
+-- --------------------------------------------------------------------------------------------
+-- 班级作业已读表
+-- --------------------------------------------------------------------------------------------
+DROP TABLE IF EXISTS class_homework_read;
+CREATE TABLE `class_homework_read`
+(
+    id                bigint   not null comment '主键编号'
+        primary key,
+    create_user_id    bigint   null comment '创建人',
+    create_date       datetime null comment '创建时间',
+    modify_user_id    bigint   null comment '修改人',
+    modify_date       datetime null comment '修改时间',
+    delete_mark       int      not null comment '删除标记',
+    enabled_mark      int      not null comment '有效标志',
+
+    class_homework_id bigint   not null comment '教师为班级布置作业记录表主键id',
+    user_id           bigint   not null comment '已读用户主键id'
+) ENGINE = INNODB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='班级作业已读表';
+
+-- --------------------------------------------------------------------------------------------
+-- 实习动态表
+-- --------------------------------------------------------------------------------------------
+DROP TABLE IF EXISTS class_internship_dynamic;
+CREATE TABLE `class_internship_dynamic`
+(
+    id             bigint        not null comment '主键编号'
+        primary key,
+    create_user_id bigint        null comment '创建人',
+    create_date    datetime      null comment '创建时间',
+    modify_user_id bigint        null comment '修改人',
+    modify_date    datetime      null comment '修改时间',
+    delete_mark    int           not null comment '删除标记',
+    enabled_mark   int           not null comment '有效标志',
+
+    publisher_id   bigint        not null comment '发布人id',
+    title          varchar(200)  not null comment '实习主题',
+    role_type      int           null comment '发送范围(1:学生、2:家长、3:学生和家长)',
+    content        varchar(1000) not null comment '内容',
+    folder_id      bigint        null comment '附件'
+) ENGINE = INNODB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='实习动态表';
+
+-- --------------------------------------------------------------------------------------------
+-- 实习动态班级关联表
+-- --------------------------------------------------------------------------------------------
+DROP TABLE IF EXISTS class_internship_dynamic_class;
+CREATE TABLE `class_internship_dynamic_class`
+(
+    id                          bigint   not null comment '主键编号'
+        primary key,
+    create_user_id              bigint   null comment '创建人',
+    create_date                 datetime null comment '创建时间',
+    modify_user_id              bigint   null comment '修改人',
+    modify_date                 datetime null comment '修改时间',
+    delete_mark                 int      not null comment '删除标记',
+    enabled_mark                int      not null comment '有效标志',
+
+    class_internship_dynamic_id bigint   not null comment '实习动态id',
+    class_id                    bigint   not null comment '班级id'
+) ENGINE = INNODB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='实习动态班级关联表';
+
+-- --------------------------------------------------------------------------------------------
+-- 实习动态已读表
+-- --------------------------------------------------------------------------------------------
+DROP TABLE IF EXISTS class_internship_dynamic_read;
+CREATE TABLE `class_internship_dynamic_read`
+(
+    id                          bigint   not null comment '主键编号'
+        primary key,
+    create_user_id              bigint   null comment '创建人',
+    create_date                 datetime null comment '创建时间',
+    modify_user_id              bigint   null comment '修改人',
+    modify_date                 datetime null comment '修改时间',
+    delete_mark                 int      not null comment '删除标记',
+    enabled_mark                int      not null comment '有效标志',
+
+    class_internship_dynamic_id bigint   not null comment '实习动态记录表主键id',
+    user_id                     bigint   not null comment '已读用户主键id'
+) ENGINE = INNODB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='实习动态已读表';
+
+
+
+
+
+
+
+

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

@@ -4978,4 +4978,154 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    @Test
+    public void gcoClassHomework() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("class_homework");//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("szs");//作者名称
+        params.setPackageName("teacher");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcoClassHomeworkClass() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("class_homework_class");//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("szs");//作者名称
+        params.setPackageName("teacher");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcoClassHomeworkRead() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("class_homework_read");//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("szs");//作者名称
+        params.setPackageName("teacher");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcClassInternshipDynamic() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("class_internship_dynamic");//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("szs");//作者名称
+        params.setPackageName("teacher");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcClassInternshipDynamicClass() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("class_internship_dynamic_class");//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("szs");//作者名称
+        params.setPackageName("teacher");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcClassInternshipDynamicRead() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("class_internship_dynamic_read");//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("szs");//作者名称
+        params.setPackageName("teacher");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
 }