dzx 10 mesiacov pred
rodič
commit
f6906fee26
71 zmenil súbory, kde vykonal 3570 pridanie a 80 odobranie
  1. 1 1
      src/main/java/com/xjrsoft/common/xss/XssHttpServletRequestWrapper.java
  2. 13 11
      src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java
  3. 4 3
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassServiceImpl.java
  4. 1 1
      src/main/java/com/xjrsoft/module/base/controller/BaseClassController.java
  5. 42 27
      src/main/java/com/xjrsoft/module/base/controller/BaseClassDynamicsController.java
  6. 10 0
      src/main/java/com/xjrsoft/module/base/dto/BaseClassDynamicsPageDto.java
  7. 27 0
      src/main/java/com/xjrsoft/module/base/dto/BaseClassDynamicsRelationPageDto.java
  8. 9 1
      src/main/java/com/xjrsoft/module/base/dto/UpdateBaseClassTeacherChangeDto.java
  9. 2 0
      src/main/java/com/xjrsoft/module/base/entity/BaseClass.java
  10. 53 0
      src/main/java/com/xjrsoft/module/base/entity/BaseClassDynamicsRelation.java
  11. 7 3
      src/main/java/com/xjrsoft/module/base/entity/BaseClassTeacherChange.java
  12. 6 0
      src/main/java/com/xjrsoft/module/base/entity/BaseClassroom.java
  13. 6 0
      src/main/java/com/xjrsoft/module/base/entity/BaseGrade.java
  14. 6 0
      src/main/java/com/xjrsoft/module/base/entity/BaseLabel.java
  15. 6 0
      src/main/java/com/xjrsoft/module/base/entity/BaseMajorSet.java
  16. 6 0
      src/main/java/com/xjrsoft/module/base/entity/BaseOfficeBuild.java
  17. 6 0
      src/main/java/com/xjrsoft/module/base/entity/BaseSemester.java
  18. 17 0
      src/main/java/com/xjrsoft/module/base/mapper/BaseClassDynamicsRelationMapper.java
  19. 5 0
      src/main/java/com/xjrsoft/module/base/service/IBaseClassDynamicsService.java
  20. 155 0
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassDynamicsServiceImpl.java
  21. 27 0
      src/main/java/com/xjrsoft/module/base/vo/BaseClassDynamicsRelationPageVo.java
  22. 1 1
      src/main/java/com/xjrsoft/module/job/BaseNewStudentTask.java
  23. 9 0
      src/main/java/com/xjrsoft/module/personnel/service/impl/CarMessageApplyServiceImpl.java
  24. 4 0
      src/main/java/com/xjrsoft/module/schedule/entity/CourseReceiveMsg.java
  25. 6 0
      src/main/java/com/xjrsoft/module/schedule/entity/WfCourseAdjust.java
  26. 3 0
      src/main/java/com/xjrsoft/module/student/dto/BaseStudentSimpleInfoDto.java
  27. 1 0
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java
  28. 43 2
      src/main/java/com/xjrsoft/module/student/service/impl/PbVXsxxsfytbServiceImpl.java
  29. 3 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserPageVo.java
  30. 113 0
      src/main/java/com/xjrsoft/module/teacher/controller/ClassHomeworkController.java
  31. 132 0
      src/main/java/com/xjrsoft/module/teacher/controller/ClassInternshipDynamicController.java
  32. 52 3
      src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java
  33. 66 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddClassHomeworkDto.java
  34. 32 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddClassHomeworkReadDto.java
  35. 58 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddClassInternshipDynamicDto.java
  36. 32 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddClassInternshipDynamicReadDto.java
  37. 36 0
      src/main/java/com/xjrsoft/module/teacher/dto/ClassHomeworkPageDto.java
  38. 34 0
      src/main/java/com/xjrsoft/module/teacher/dto/ClassHomeworkReadListDto.java
  39. 34 0
      src/main/java/com/xjrsoft/module/teacher/dto/ClassInternshipDynamicPageDto.java
  40. 33 0
      src/main/java/com/xjrsoft/module/teacher/dto/ClassInternshipDynamicReadListDto.java
  41. 3 0
      src/main/java/com/xjrsoft/module/teacher/dto/XjrUserPageDto.java
  42. 109 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassHomework.java
  43. 88 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassHomeworkClass.java
  44. 88 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassHomeworkRead.java
  45. 103 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassInternshipDynamic.java
  46. 88 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassInternshipDynamicClass.java
  47. 88 0
      src/main/java/com/xjrsoft/module/teacher/entity/ClassInternshipDynamicRead.java
  48. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassHomeworkClassMapper.java
  49. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassHomeworkMapper.java
  50. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassHomeworkReadMapper.java
  51. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassInternshipDynamicClassMapper.java
  52. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassInternshipDynamicMapper.java
  53. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ClassInternshipDynamicReadMapper.java
  54. 35 0
      src/main/java/com/xjrsoft/module/teacher/service/IClassHomeworkService.java
  55. 34 0
      src/main/java/com/xjrsoft/module/teacher/service/IClassInternshipDynamicService.java
  56. 1 1
      src/main/java/com/xjrsoft/module/teacher/service/ITeacherbaseManagerService.java
  57. 452 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/ClassHomeworkServiceImpl.java
  58. 471 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/ClassInternshipDynamicServiceImpl.java
  59. 99 18
      src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java
  60. 81 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassHomeworkPageVo.java
  61. 41 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassHomeworkReadListVo.java
  62. 74 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassHomeworkVo.java
  63. 73 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassInternshipDynamicPageVo.java
  64. 37 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassInternshipDynamicReadListVo.java
  65. 67 0
      src/main/java/com/xjrsoft/module/teacher/vo/ClassInternshipDynamicVo.java
  66. 1 1
      src/main/java/com/xjrsoft/module/xycxedu/controller/ExamPlanController.java
  67. 3 0
      src/main/resources/mapper/organization/UserMapper.xml
  68. 1 1
      src/main/resources/mapper/student/BaseStudentMapper.xml
  69. 154 0
      src/main/resources/sqlScript/20250427_sql.sql
  70. 26 6
      src/main/resources/sqlScript/教师视图.sql
  71. 150 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 1 - 1
src/main/java/com/xjrsoft/common/xss/XssHttpServletRequestWrapper.java

@@ -34,7 +34,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
 
     private String method;
 
-    private final List<String> ignoreXssUrl = ListUtil.toList("/magic-api/**", "/magic/web/**", "/workflow/execute/*", "/oa/wfMeetingApply/update_meetingSummary");
+    private final List<String> ignoreXssUrl = ListUtil.toList("/magic-api/**", "/magic/web/**", "/workflow/execute/*", "/oa/wfMeetingApply/update_meetingSummary", "/base/baseClassDynamics", "/teacher/classInternshipDynamic", "/teacher/classHomework");
     //html过滤
     private final static HTMLFilter HTML_FILTER = new HTMLFilter();
 

+ 13 - 11
src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java

@@ -13,6 +13,7 @@ import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.OutInStatusEnum;
 import com.xjrsoft.common.enums.StudyStatusEnum;
+import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
@@ -135,6 +136,7 @@ public class StatisticsController {
                         .ge(AttendanceRuleCategory::getEndDate, LocalDate.now())
         );
         if(!ruleCategories.isEmpty()){
+            //查询所有需要考勤的人
             BaseTeacherPageDto teacherPageDto = new BaseTeacherPageDto();
             List<Long> userIds = new ArrayList<>();
             List<Long> deptIds = new ArrayList<>();
@@ -151,25 +153,25 @@ public class StatisticsController {
                     }
                 }
             }
-            if(dto.getDeptId() == null){
-                teacherPageDto.setDeptIds(deptIds);
-            }else{
-                deptIds = new ArrayList<>();
-                deptIds.add(dto.getDeptId());
-            }
+            teacherPageDto.setDeptIds(deptIds);
             List<XjrUserPageVo> attendanceTeacherList = teacherbaseManagerService.getList(teacherPageDto);
 
             teacherPageDto = new BaseTeacherPageDto();
             teacherPageDto.setUserIds(userIds);
             attendanceTeacherList.addAll(teacherbaseManagerService.getList(teacherPageDto));
+            //将所有需要考勤的人的id存入set集合
+            Set<String> attendanceUserIdSet = attendanceTeacherList.stream().map(XjrUserPageVo::getId).collect(Collectors.toSet());
 
+            //查询所有人
             teacherPageDto = new BaseTeacherPageDto();
-            List<Long> dtoDeptIds = new ArrayList<>();
-            dtoDeptIds.add(dto.getDeptId());
-            teacherPageDto.setDeptIds(dtoDeptIds);
-            List<XjrUserPageVo> allTeacherList = teacherbaseManagerService.getList(teacherPageDto);
+            if(dto.getDeptId() != null){
+                List<Long> dtoDeptIds = new ArrayList<>();
+                dtoDeptIds.add(dto.getDeptId());
+                teacherPageDto.setDeptIds(dtoDeptIds);
+            }
 
-            statisticsVo.setNotAttendanceCount(allTeacherList.size() - attendanceTeacherList.size());
+            List<XjrUserPageVo> allTeacherList = teacherbaseManagerService.getList(teacherPageDto);
+            statisticsVo.setNotAttendanceCount(allTeacherList.stream().filter(x -> !attendanceUserIdSet.contains(x.getId())).collect(Collectors.toList()).size());
         }
 
 

+ 4 - 3
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassServiceImpl.java

@@ -630,9 +630,10 @@ public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskC
                 .filter(x -> x.getIsReport() == 0)
                 .collect(Collectors.toList());
         result.setNotArrivedCount(notArrivedList.size());
-
-        BigDecimal divide = BigDecimal.valueOf(result.getArrivedCount()).divide(BigDecimal.valueOf(result.getAllCount()), 4, RoundingMode.HALF_UP);
-        result.setReportRate(divide.doubleValue() + "");
+        if(result.getAllCount() != 0){
+            BigDecimal divide = BigDecimal.valueOf(result.getArrivedCount()).divide(BigDecimal.valueOf(result.getAllCount()), 4, RoundingMode.HALF_UP);
+            result.setReportRate(divide.doubleValue() + "");
+        }
 
         return result;
     }

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

@@ -84,7 +84,7 @@ public class BaseClassController {
         if(!classTeacherChangeList.isEmpty()){
             classTeacherChangeService.saveBatch(classTeacherChangeList);
         }
-        return RT.ok(baseClassService.updateBatchById(classList));
+        return RT.ok(baseClassService.removeByIds(ids));
     }
 
     @GetMapping(value = "/info")

+ 42 - 27
src/main/java/com/xjrsoft/module/base/controller/BaseClassDynamicsController.java

@@ -6,6 +6,7 @@ import cn.hutool.core.bean.BeanUtil;
 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.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
@@ -13,16 +14,17 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.dto.AddBaseClassDynamicsDto;
 import com.xjrsoft.module.base.dto.BaseClassDynamicsPageDto;
+import com.xjrsoft.module.base.dto.BaseClassDynamicsRelationPageDto;
 import com.xjrsoft.module.base.dto.UpdateBaseClassDynamicsDto;
 import com.xjrsoft.module.base.entity.BaseClassDynamics;
-import com.xjrsoft.module.base.entity.BaseUserStudent;
+import com.xjrsoft.module.base.entity.BaseClassDynamicsRelation;
 import com.xjrsoft.module.base.service.IBaseClassDynamicsService;
-import com.xjrsoft.module.base.service.IBaseUserStudentService;
 import com.xjrsoft.module.base.vo.BaseClassDynamicsPageVo;
+import com.xjrsoft.module.base.vo.BaseClassDynamicsRelationPageVo;
 import com.xjrsoft.module.base.vo.BaseClassDynamicsVo;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
-import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.service.IFileService;
 import io.swagger.annotations.Api;
@@ -38,7 +40,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
-import java.util.ArrayList;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -56,8 +58,6 @@ public class BaseClassDynamicsController {
 
 
     private final IBaseClassDynamicsService baseClassDynamicsService;
-    private final IBaseStudentSchoolRollService rollService;
-    private final IBaseUserStudentService userStudentService;
     private final IUserService userService;
     private final IFileService fileService;
 
@@ -66,34 +66,46 @@ public class BaseClassDynamicsController {
     @SaCheckPermission("baseclassdynamics:detail")
     @XjrLog(value = "班级动态表列表(分页)")
     public RT<PageOutput<BaseClassDynamicsPageVo>> page(@Valid BaseClassDynamicsPageDto dto) {
-        List<String> roleList = StpUtil.getRoleList();
         long userId = StpUtil.getLoginIdAsLong();
-        Integer roleType = null;
-        List<Long> classIds = new ArrayList<>();
-        if (roleList.contains("STUDENT")) {
-            roleType = 3;
-            classIds.add(rollService.getClassIdByUserId(userId));
-        }
-        if (roleList.contains("PARENT")) {
-            roleType = 4;
-            List<BaseUserStudent> list = userStudentService.list(new QueryWrapper<BaseUserStudent>().lambda().eq(BaseUserStudent::getUserId, userId));
-            for (BaseUserStudent userStudent : list) {
-                classIds.add(rollService.getClassIdByUserId(userStudent.getStudentId()));
-            }
-        }
+        MPJLambdaWrapper<BaseClassDynamics> queryWrapper = new MPJLambdaWrapper<>();
 
-        LambdaQueryWrapper<BaseClassDynamics> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper
-                .orderByDesc(BaseClassDynamics::getId)
+                .select(BaseClassDynamics::getId)
                 .select(BaseClassDynamics.class, x -> VoToColumnUtil.fieldsToColumns(BaseClassDynamicsPageVo.class).contains(x.getProperty()))
-                .like(roleType != null, BaseClassDynamics::getRoleType, roleType)
-                .in(!classIds.isEmpty(), BaseClassDynamics::getClassId, classIds)
+                .innerJoin(BaseClassDynamicsRelation.class, BaseClassDynamicsRelation::getBaseClassDynamicsId, BaseClassDynamics::getId)
+                .eq(BaseClassDynamicsRelation::getUserId, userId)
+                .orderByDesc(BaseClassDynamics::getId)
         ;
+        if(dto.getStartDate() != null && dto.getEndDate() != null){
+            queryWrapper.between(BaseClassDynamics::getCreateDate, dto.getStartDate().atStartOfDay(), dto.getEndDate().atTime(23,59,59));
+        }
+
         IPage<BaseClassDynamics> page = baseClassDynamicsService.page(ConventPage.getPage(dto), queryWrapper);
         PageOutput<BaseClassDynamicsPageVo> pageOutput = ConventPage.getPageOutput(page, BaseClassDynamicsPageVo.class);
         return RT.ok(pageOutput);
     }
 
+    @GetMapping(value = "/reader-page")
+    @ApiOperation(value = "班级动态读者信息(分页)")
+    @SaCheckPermission("baseclassdynamics:detail")
+    @XjrLog(value = "班级动态读者信息(分页)")
+    public RT<PageOutput<BaseClassDynamicsRelationPageVo>> page(@Valid BaseClassDynamicsRelationPageDto dto) {
+        MPJLambdaWrapper<User> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .select(User::getId)
+                .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                .select(BaseClassDynamicsRelation::getReadDate)
+                .select(BaseClassDynamicsRelation::getReadMark)
+                .innerJoin(BaseClassDynamicsRelation.class, BaseClassDynamicsRelation::getUserId, User::getId)
+                .innerJoin(BaseStudent.class, BaseStudent::getUserId, User::getId)
+                .eq(dto.getReadMark() != null, BaseClassDynamicsRelation::getReadMark, dto.getReadMark())
+                .eq(BaseClassDynamicsRelation::getBaseClassDynamicsId, dto.getBaseClassDynamicsId())
+        ;
+        IPage<BaseClassDynamicsRelationPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), BaseClassDynamicsRelationPageVo.class, queryWrapper);
+        PageOutput<BaseClassDynamicsRelationPageVo> pageOutput = ConventPage.getPageOutput(page, BaseClassDynamicsRelationPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
     @GetMapping(value = "/release-page")
     @ApiOperation(value = "班主任发布列表(分页)")
     @SaCheckPermission("baseclassdynamics:detail")
@@ -105,6 +117,9 @@ public class BaseClassDynamicsController {
                 .orderByDesc(BaseClassDynamics::getId)
                 .select(BaseClassDynamics.class, x -> VoToColumnUtil.fieldsToColumns(BaseClassDynamicsPageVo.class).contains(x.getProperty()))
                 .eq(BaseClassDynamics::getCreateUserId, userId);
+        if(dto.getStartDate() != null && dto.getEndDate() != null){
+            queryWrapper.between(BaseClassDynamics::getCreateDate, dto.getStartDate().atStartOfDay(), dto.getEndDate().atTime(23,59,59));
+        }
         IPage<BaseClassDynamics> page = baseClassDynamicsService.page(ConventPage.getPage(dto), queryWrapper);
         PageOutput<BaseClassDynamicsPageVo> pageOutput = ConventPage.getPageOutput(page, BaseClassDynamicsPageVo.class);
         return RT.ok(pageOutput);
@@ -131,6 +146,8 @@ public class BaseClassDynamicsController {
             }
         }
 
+        baseClassDynamicsService.read(id);
+
         return RT.ok(dynamicsVo);
     }
 
@@ -140,9 +157,7 @@ public class BaseClassDynamicsController {
     @SaCheckPermission("baseclassdynamics:add")
     @XjrLog(value = "新增班级动态表", saveResponseData = true)
     public RT<Boolean> add(@Valid @RequestBody AddBaseClassDynamicsDto dto) {
-        BaseClassDynamics baseClassDynamics = BeanUtil.toBean(dto, BaseClassDynamics.class);
-        baseClassDynamics.setCreateDate(new Date());
-        boolean isSuccess = baseClassDynamicsService.save(baseClassDynamics);
+        Boolean isSuccess = baseClassDynamicsService.add(dto);
         return RT.ok(isSuccess);
     }
 

+ 10 - 0
src/main/java/com/xjrsoft/module/base/dto/BaseClassDynamicsPageDto.java

@@ -1,8 +1,12 @@
 package com.xjrsoft.module.base.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;
 
 
 /**
@@ -15,5 +19,11 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = false)
 public class BaseClassDynamicsPageDto extends PageInput {
 
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("开始时间")
+    private LocalDate startDate;
 
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("结束时间")
+    private LocalDate endDate;
 }

+ 27 - 0
src/main/java/com/xjrsoft/module/base/dto/BaseClassDynamicsRelationPageDto.java

@@ -0,0 +1,27 @@
+package com.xjrsoft.module.base.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;
+
+
+/**
+ * @title: 班级动态表分页查询入参
+ * @Author dzx
+ * @Date: 2024-09-04
+ * @Version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseClassDynamicsRelationPageDto extends PageInput {
+
+    @ApiModelProperty("是否已阅读(0:否 1:是)")
+    private Integer readMark;
+
+    @ApiModelProperty("动态id(base_class_dynamics)")
+    private Long baseClassDynamicsId;
+}

+ 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

+ 2 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseClass.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.base.entity;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -39,6 +40,7 @@ public class BaseClass implements Serializable {
     private Date modifyDate;
 
     @ApiModelProperty("删除标记")
+    @TableLogic
     private Integer deleteMark;
 
     @ApiModelProperty("有效标志")

+ 53 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseClassDynamicsRelation.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.base.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+
+/**
+ * @title: 班级动态表阅读表
+ * @Author dzx
+ * @Date: 2025年4月27日
+ * @Version 1.0
+ */
+@Data
+@TableName("base_class_dynamics_relation")
+@ApiModel(value = "base_class_dynamics_relation", description = "班级动态表阅读表")
+public class BaseClassDynamicsRelation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+
+    @ApiModelProperty("阅读时间")
+    private LocalDateTime readDate;
+
+    @ApiModelProperty("动态id(base_class_dynamics)")
+    private Long baseClassDynamicsId;
+
+    @ApiModelProperty("是否已阅读(0:否 1:是)")
+    private Integer readMark;
+
+
+    @ApiModelProperty("阅读用户")
+    private Long userId;
+
+    @ApiModelProperty("回复内容")
+    private String replyContent;
+
+}

+ 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

+ 6 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseClassroom.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.module.base.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 io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -39,9 +42,12 @@ public class BaseClassroom implements Serializable {
     private Date modifyDate;
 
     @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
     private Integer deleteMark;
 
     @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
 
     @ApiModelProperty("教室名称")

+ 6 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseGrade.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.module.base.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 io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -39,9 +42,12 @@ public class BaseGrade implements Serializable {
     private Date modifyDate;
 
     @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
     private Integer deleteMark;
 
     @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
 
     @ApiModelProperty("年级名称")

+ 6 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseLabel.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.module.base.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 io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -39,9 +42,12 @@ public class BaseLabel implements Serializable {
     private Date modifyDate;
 
     @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
     private Integer deleteMark;
 
     @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
 
     @ApiModelProperty("标签名称")

+ 6 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseMajorSet.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.module.base.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 io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -39,9 +42,12 @@ public class BaseMajorSet implements Serializable {
     private Date modifyDate;
 
     @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
     private Integer deleteMark;
 
     @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
 
     @ApiModelProperty("专业方向名称")

+ 6 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseOfficeBuild.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.module.base.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 io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -39,9 +42,12 @@ public class BaseOfficeBuild implements Serializable {
     private Date modifyDate;
 
     @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
     private Integer deleteMark;
 
     @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
 
     @ApiModelProperty("楼栋名称")

+ 6 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseSemester.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.module.base.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 io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -39,9 +42,12 @@ public class BaseSemester implements Serializable {
     private Date modifyDate;
 
     @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
     private Integer deleteMark;
 
     @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
 
     @ApiModelProperty("学期名称")

+ 17 - 0
src/main/java/com/xjrsoft/module/base/mapper/BaseClassDynamicsRelationMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.base.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.base.entity.BaseClassDynamics;
+import com.xjrsoft.module.base.entity.BaseClassDynamicsRelation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @title: 班级动态表
+ * @Author dzx
+ * @Date: 2024-09-04
+ * @Version 1.0
+ */
+@Mapper
+public interface BaseClassDynamicsRelationMapper extends MPJBaseMapper<BaseClassDynamicsRelation> {
+
+}

+ 5 - 0
src/main/java/com/xjrsoft/module/base/service/IBaseClassDynamicsService.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.base.service;
 
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.base.dto.AddBaseClassDynamicsDto;
 import com.xjrsoft.module.base.entity.BaseClassDynamics;
 
 /**
@@ -11,4 +12,8 @@ import com.xjrsoft.module.base.entity.BaseClassDynamics;
  */
 
 public interface IBaseClassDynamicsService extends MPJBaseService<BaseClassDynamics> {
+
+    Boolean add(AddBaseClassDynamicsDto dto);
+
+    Boolean read(Long baseClassDynamicsId);
 }

+ 155 - 0
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassDynamicsServiceImpl.java

@@ -1,11 +1,43 @@
 package com.xjrsoft.module.base.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.utils.LocalDateTimeUtil;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.module.base.dto.AddBaseClassDynamicsDto;
+import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseClassDynamics;
+import com.xjrsoft.module.base.entity.BaseClassDynamicsRelation;
 import com.xjrsoft.module.base.mapper.BaseClassDynamicsMapper;
+import com.xjrsoft.module.base.mapper.BaseClassDynamicsRelationMapper;
 import com.xjrsoft.module.base.service.IBaseClassDynamicsService;
+import com.xjrsoft.module.base.service.IBaseClassService;
+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.service.IUserService;
+import com.xjrsoft.module.organization.service.IWeChatService;
+import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.service.IBaseStudentService;
+import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
+import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import lombok.AllArgsConstructor;
+import me.zhyd.oauth.log.Log;
+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.Date;
+import java.util.List;
 
 /**
  * @title: 班级动态表
@@ -16,4 +48,127 @@ import org.springframework.stereotype.Service;
 @Service
 @AllArgsConstructor
 public class BaseClassDynamicsServiceImpl extends MPJBaseServiceImpl<BaseClassDynamicsMapper, BaseClassDynamics> implements IBaseClassDynamicsService {
+
+    private final IBaseStudentService studentService;
+    private final IUserService userService;
+    private final BaseClassDynamicsRelationMapper dynamicsRelationMapper;
+    private final CommonPropertiesConfig commonPropertiesConfig;
+    private final IWeChatService weChatService;
+    private final IBaseClassService classService;
+    @Override
+    @Transactional
+    public Boolean add(AddBaseClassDynamicsDto dto) {
+        LocalDateTime now = LocalDateTime.now();
+        BaseClassDynamics baseClassDynamics = BeanUtil.toBean(dto, BaseClassDynamics.class);
+        baseClassDynamics.setCreateDate(new Date());
+        this.save(baseClassDynamics);
+
+        BaseClass aClass = classService.getById(dto.getClassId());
+
+        List<Long> classIds = new ArrayList<>();
+        classIds.add(dto.getClassId());
+        if(baseClassDynamics.getRoleType().contains("3")){
+            List<BaseStudentUserPageVo> studentList = studentService.getStudentList(new BaseStudentUserPageDto() {{
+                setClassIds(classIds);
+            }});
+            for (BaseStudentUserPageVo studentUserPageVo : studentList) {
+                BaseClassDynamicsRelation dynamicsRelation = new BaseClassDynamicsRelation() {{
+                    setBaseClassDynamicsId(baseClassDynamics.getId());
+                    setUserId(Long.parseLong(studentUserPageVo.getId()));
+                    setReadMark(0);
+                }};
+                dynamicsRelationMapper.insert(dynamicsRelation);
+
+                try {
+                    WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                    weChatSendMessageDto.setUserId(studentUserPageVo.getOpenId());
+                    weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
+                    weChatSendMessageDto.setUrl(StrUtil.format("{}pages/student/trends/detail?id={}", commonPropertiesConfig.getDomainApp(), baseClassDynamics.getId()));
+                    weChatSendMessageDto.setMsgId(dynamicsRelation.getId().toString());
+                    JSONObject data = new JSONObject();
+
+                    JSONObject data1 = new JSONObject();
+                    data1.put("value", baseClassDynamics.getTitle());
+                    data.put("thing23", data1);
+
+                    JSONObject data2 = new JSONObject();
+                    data2.put("value", (aClass.getName() == null) ? "重庆铜梁职业教育中心" : aClass.getName());
+                    data.put("thing29", data2);
+
+                    JSONObject data3 = new JSONObject();
+                    data3.put("value", LocalDateTimeUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
+                    data.put("time17", data3);
+                    weChatSendMessageDto.setContent(data);
+                    weChatService.sendTemplateMessage(weChatSendMessageDto);
+                }catch (Exception e){
+                    Log.error(e.getMessage());
+                }
+            }
+        }
+
+        if(baseClassDynamics.getRoleType().contains("4")){
+            List<User> list = userService.list(
+                    new MPJLambdaWrapper<User>()
+                            .select(User::getId)
+                            .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                            .innerJoin(UserStudent.class, UserStudent::getUserId, User::getId)
+                            .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, UserStudent::getStudentId)
+                            .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, UserStudent::getId)
+                            .eq(BaseStudentSchoolRoll::getClassId, dto.getClassId())
+                            .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                            .isNotNull(User::getOpenId)
+            );
+
+            for (User user : list) {
+                BaseClassDynamicsRelation dynamicsRelation = new BaseClassDynamicsRelation() {{
+                    setBaseClassDynamicsId(baseClassDynamics.getId());
+                    setUserId(user.getId());
+                    setReadMark(0);
+                }};
+                dynamicsRelationMapper.insert(dynamicsRelation);
+
+                try {
+                    WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                    weChatSendMessageDto.setUserId(user.getOpenId());
+                    weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
+                    weChatSendMessageDto.setUrl(StrUtil.format("{}pages/student/trends/detail?id={}", commonPropertiesConfig.getDomainApp(), baseClassDynamics.getId()));
+                    weChatSendMessageDto.setMsgId(dynamicsRelation.getId().toString());
+                    JSONObject data = new JSONObject();
+
+                    JSONObject data1 = new JSONObject();
+                    data1.put("value", baseClassDynamics.getTitle());
+                    data.put("thing23", data1);
+
+                    JSONObject data2 = new JSONObject();
+                    data2.put("value", (aClass.getName() == null) ? "重庆铜梁职业教育中心" : aClass.getName());
+                    data.put("thing29", data2);
+
+                    JSONObject data3 = new JSONObject();
+                    data3.put("value", LocalDateTimeUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
+                    data.put("time17", data3);
+                    weChatSendMessageDto.setContent(data);
+                    weChatService.sendTemplateMessage(weChatSendMessageDto);
+                }catch (Exception e){
+                    Log.error(e.getMessage());
+                }
+            }
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional
+    public Boolean read(Long baseClassDynamicsId) {
+        List<BaseClassDynamicsRelation> list = dynamicsRelationMapper.selectList(
+                new QueryWrapper<BaseClassDynamicsRelation>().lambda()
+                        .eq(BaseClassDynamicsRelation::getBaseClassDynamicsId, baseClassDynamicsId)
+                        .eq(BaseClassDynamicsRelation::getUserId, StpUtil.getLoginIdAsLong())
+        );
+        for (BaseClassDynamicsRelation dynamicsRelation : list) {
+            dynamicsRelation.setReadMark(1);
+            dynamicsRelation.setReadDate(LocalDateTime.now());
+            dynamicsRelationMapper.updateById(dynamicsRelation);
+        }
+        return true;
+    }
 }

+ 27 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseClassDynamicsRelationPageVo.java

@@ -0,0 +1,27 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @title: 班级动态表分页列表出参
+ * @Author dzx
+ * @Date: 2024-09-04
+ * @Version 1.0
+ */
+@Data
+public class BaseClassDynamicsRelationPageVo {
+
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ApiModelProperty("阅读时间")
+    private LocalDateTime readDate;
+
+    @ApiModelProperty("是否已阅读(0:否 1:是)")
+    private Integer readMark;
+
+}

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

@@ -154,7 +154,7 @@ public class BaseNewStudentTask {
                 existsNewStudent.setGender(GenderDictionaryEnum.getCode(feeobjupdate.getSex()));
                 existsNewStudent.setModifyDate(new Date());
                 existsNewStudent.setEnrollmentPlanId(planId);
-
+                existsNewStudent.setStatus(0);
                 updateList.add(existsNewStudent);
                 continue;
             }

+ 9 - 0
src/main/java/com/xjrsoft/module/personnel/service/impl/CarMessageApplyServiceImpl.java

@@ -87,6 +87,15 @@ public class CarMessageApplyServiceImpl extends MPJBaseServiceImpl<CarMessageApp
         if(countByCarNumber > 0){
             throw new MyException("已存在该车牌号");
         }
+
+        long count = this.count(
+                new QueryWrapper<CarMessageApply>().lambda()
+                        .eq(CarMessageApply::getUserId, dto.getUserId())
+                        .eq(CarMessageApply::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        if(count > 2){
+            throw new MyException("已添加2辆车,无法继续添加");
+        }
         CarMessageApply carMessageApply = BeanUtil.toBean(dto, CarMessageApply.class);
         this.save(carMessageApply);
         return true;

+ 4 - 0
src/main/java/com/xjrsoft/module/schedule/entity/CourseReceiveMsg.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.schedule.entity;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -41,12 +42,15 @@ public class CourseReceiveMsg implements Serializable {
      * 删除标记
      */
     @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
     private Integer deleteMark;
 
     /**
      * 有效标志
      */
     @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
     /**
      * 序号

+ 6 - 0
src/main/java/com/xjrsoft/module/schedule/entity/WfCourseAdjust.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.module.schedule.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 io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -39,9 +42,12 @@ public class WfCourseAdjust implements Serializable {
     private Date modifyDate;
 
     @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
     private Integer deleteMark;
 
     @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
 
     @ApiModelProperty("序号")

+ 3 - 0
src/main/java/com/xjrsoft/module/student/dto/BaseStudentSimpleInfoDto.java

@@ -20,4 +20,7 @@ public class BaseStudentSimpleInfoDto {
     private String name;
 
     private String idNumber;
+
+    @ApiModelProperty("学籍状态")
+    private String archivesStatus;
 }

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

@@ -274,6 +274,7 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
 
     @Override
     public List<BaseStudentSompleInfoVo> getInfosByParam(BaseStudentSimpleInfoDto dto) {
+        dto.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
         List<BaseStudentSompleInfoVo> userList = userMapper.getInfosByParam(dto);
         if(userList.isEmpty()){
             userList = newStudentMapper.getInfosByParam(dto);

+ 43 - 2
src/main/java/com/xjrsoft/module/student/service/impl/PbVXsxxsfytbServiceImpl.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.student.service.impl;
 
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -13,6 +14,7 @@ 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.BaseSemester;
+import com.xjrsoft.module.base.mapper.BaseSemesterMapper;
 import com.xjrsoft.module.student.dto.*;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
@@ -24,10 +26,14 @@ import com.xjrsoft.module.student.service.IPbVXsxxsfytbService;
 import com.xjrsoft.module.student.vo.*;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -47,10 +53,26 @@ public class PbVXsxxsfytbServiceImpl extends MPJBaseServiceImpl<PbVXsxxsfytbMapp
     private final PbVXsxxsfytbMapper pbVXsxxsfytbMapper;
     private final PbSemesterConfigMapper pbSemesterConfigMapper;
 
+    private final BaseSemesterMapper baseSemesterMapper;
+
     @Override
     public PersonalPortraitFeeInformationVo listCostInformation(PersonalPortraitFeeInformationDto dto) {
+        LocalDate currentDate = LocalDate.now();
+
+        // 获取年份
+        int year = currentDate.getYear();
+        if(StringUtils.isEmpty(dto.getYear())){
+            dto.setYear(year + "");
+        }
+
+        LambdaQueryWrapper<BaseSemester> baseSemesterLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        baseSemesterLambdaQueryWrapper
+                .select(BaseSemester.class, x -> VoToColumnUtil.fieldsToColumns(BaseSemester.class).contains(x.getProperty()))
+                .like(BaseSemester::getName, dto.getYear())
+                ;
+        List<BaseSemester> baseSemesters = baseSemesterMapper.selectList(baseSemesterLambdaQueryWrapper);
 
-        //查出所有的消费记录
+        // 查出所有的消费记录
         MPJLambdaWrapper<PbVXsxxsfytb> pbVXsxxsfytbMPJLambdaWrapper = new MPJLambdaWrapper<>();
         pbVXsxxsfytbMPJLambdaWrapper
                 .selectAs(BaseSemester::getId, PbVXsxxsfytbPersonal::getBaseSemester)
@@ -60,10 +82,29 @@ public class PbVXsxxsfytbServiceImpl extends MPJBaseServiceImpl<PbVXsxxsfytbMapp
                 .leftJoin(PbSemesterConfig.class, PbSemesterConfig::getBeltcode, PbVXsxxsfytb::getBeltcode)
                 .leftJoin(BaseSemester.class, BaseSemester::getId, PbSemesterConfig::getBaseSemesterId)
                 .eq(dto.getUserId() != null && dto.getUserId() > 0, XjrUser::getId, dto.getUserId())
-                .like(dto.getYear() != null && !dto.getYear().equals(""), PbVXsxxsfytb::getBeltcode, dto.getYear())
+                .like(dto.getYear() != null && !dto.getYear().isEmpty(), PbVXsxxsfytb::getBeltcode, dto.getYear())
         ;
         List<PbVXsxxsfytbPersonal> pbVXsxxsfytbPersonalList = this.selectJoinList(PbVXsxxsfytbPersonal.class, pbVXsxxsfytbMPJLambdaWrapper);
 
+        if(CollectionUtils.isEmpty(pbVXsxxsfytbPersonalList)){
+            pbVXsxxsfytbPersonalList = new ArrayList<>();
+            for (BaseSemester b : baseSemesters){
+                PbVXsxxsfytbPersonal pbVXsxxsfytbPersonal = new PbVXsxxsfytbPersonal();
+                pbVXsxxsfytbPersonal.setBaseSemester(b.getId().toString());
+                pbVXsxxsfytbPersonal.setBaseSemesterCn(b.getName());
+                pbVXsxxsfytbPersonal.setBeltcode("无缴费");
+                pbVXsxxsfytbPersonal.setBeltname("无缴费");
+                pbVXsxxsfytbPersonal.setFeeitemcode("无缴费");
+                pbVXsxxsfytbPersonal.setFeeitemname("无缴费");
+                pbVXsxxsfytbPersonal.setFactar(BigDecimal.ZERO);
+                pbVXsxxsfytbPersonal.setFactrecarmny(BigDecimal.ZERO);
+                pbVXsxxsfytbPersonal.setAdjustmny(BigDecimal.ZERO);
+                pbVXsxxsfytbPersonal.setArrearagemny(BigDecimal.ZERO);
+                pbVXsxxsfytbPersonal.setJfzt("已缴费");
+                pbVXsxxsfytbPersonalList.add(pbVXsxxsfytbPersonal);
+            }
+        }
+
         // 统计总消费金额
         BigDecimal totalConsumption = pbVXsxxsfytbPersonalList.stream()
                 .map(p -> p.getFactrecarmny().add((p.getArrearagemny() == null ? BigDecimal.ZERO : p.getArrearagemny())))

+ 3 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserPageVo.java

@@ -53,4 +53,7 @@ public class BaseStudentUserPageVo {
 
     @ApiModelProperty("年级姓名")
     private String gradeName;
+
+    @ApiModelProperty("微信openId")
+    private String openId;
 }

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

@@ -0,0 +1,113 @@
+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.courseTable.entity.CourseTable;
+import com.xjrsoft.module.courseTable.service.ICourseTableService;
+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;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+* @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;
+    private final ICourseTableService courseTableService;
+
+    @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){
+        ClassHomeworkVo vo = classHomeworkService.infoRubAndHand(id);
+
+        if (vo == null) {
+            return RT.error("找不到此数据!");
+        }
+
+        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));
+    }
+
+}

+ 52 - 3
src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java

@@ -50,7 +50,9 @@ import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.text.ParseException;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -84,7 +86,7 @@ public class TeacherbaseManagerController {
                 .like(StrUtil.isNotBlank(dto.getMobile()), XjrUser::getMobile, dto.getMobile())
                 .like(StrUtil.isNotBlank(dto.getName()), XjrUser::getName, dto.getName())
                 .like(StrUtil.isNotBlank(dto.getEmail()), XjrUser::getEmail, dto.getEmail())
-
+                .eq(StrUtil.isNotEmpty(dto.getCredentialNumber()), XjrUser::getCredentialNumber, dto.getCredentialNumber())
                 .orderByDesc(XjrUser::getId)
 
                 .select(XjrUser::getId)
@@ -221,9 +223,56 @@ public class TeacherbaseManagerController {
     @PostMapping("/import")
     @ApiOperation(value = "导入教职工信息")
     @XjrLog(value = "导入教职工信息", saveRequestData = false, saveResponseData = true)
-    public RT<Boolean> importData(@RequestParam("file") MultipartFile file) throws IOException, ParseException {
+    public RT<List<Map<String, String>>> importData(@RequestParam("file") MultipartFile file) throws IOException, ParseException {
         List<Map<Integer, Object>> excelDataList = EasyExcel.read(file.getInputStream()).sheet().headRowNumber(3).doReadSync();
-        return RT.ok(teacherbaseManagerService.importData(excelDataList));
+        List<Map<Integer, Object>> errorList = teacherbaseManagerService.importData(excelDataList);
+        List<Map<String, String>> result = new ArrayList<>();
+        for (Map<Integer, Object> objectMap : errorList) {
+            Map<String, String> object = new LinkedHashMap<>();
+            List<String> errorMsg = new ArrayList<>();
+            if (objectMap.get(0) == null) {
+                errorMsg.add("工号未填写");
+            }
+            if (objectMap.get(1) == null) {
+                errorMsg.add("姓名未填写");
+            }
+            if (objectMap.get(2) == null) {
+                errorMsg.add("性别未填写");
+            }
+            if (objectMap.get(3) == null) {
+                errorMsg.add("证件类型未填写");
+            }
+            if (objectMap.get(4) == null) {
+                errorMsg.add("身份证未填写");
+            }
+            if (objectMap.get(5) == null) {
+                errorMsg.add("手机号未填写");
+            }
+            if (objectMap.get(6) == null) {
+                errorMsg.add("聘用类型未填写");
+            }
+            if (objectMap.get(7) == null) {
+                errorMsg.add("所属机构未填写");
+            }
+            if (objectMap.get(8) == null) {
+                errorMsg.add("岗位未填写");
+            }
+            if (objectMap.get(9) == null) {
+                errorMsg.add("在职状态未填写");
+            }
+            if (objectMap.get(10) == null) {
+                errorMsg.add("来校时间未填写");
+            }
+            if (objectMap.get(11) == null) {
+                errorMsg.add("任课状况未填写");
+            }
+            object.put("姓名", objectMap.get(1) == null ? "" : objectMap.get(1).toString());
+            object.put("身份证", objectMap.get(4) == null ? "" : objectMap.get(4).toString());
+            object.put("手机号", objectMap.get(5) == null ? "" : objectMap.get(5).toString());
+            object.put("错误信息", errorMsg.toString().replace("[", "").replace("]", ""));
+            result.add(object);
+        }
+        return RT.ok(result);
     }
 
     @PostMapping("/professional-title-import")

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

+ 3 - 0
src/main/java/com/xjrsoft/module/teacher/dto/XjrUserPageDto.java

@@ -43,4 +43,7 @@ public class XjrUserPageDto extends PageInput {
     @ApiModelProperty("机构id")
     private Long departmentId;
 
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
+
 }

+ 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> {
+
+}

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

@@ -0,0 +1,35 @@
+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);
+
+    ClassHomeworkVo infoRubAndHand(Long id);
+
+    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);
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/teacher/service/ITeacherbaseManagerService.java

@@ -45,7 +45,7 @@ public interface ITeacherbaseManagerService extends MPJBaseService<XjrUser> {
      */
     Boolean delete(List<Long> ids);
 
-    Boolean importData(List<Map<Integer, Object>> excelDataList) throws ParseException;
+    List<Map<Integer, Object>> importData(List<Map<Integer, Object>> excelDataList) throws ParseException;
 
     void changeIsNormal(String jobState, Integer isNormal);
 

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

@@ -0,0 +1,452 @@
+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 cn.hutool.core.util.StrUtil;
+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.config.CommonPropertiesConfig;
+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.courseTable.entity.CourseTable;
+import com.xjrsoft.module.courseTable.mapper.CourseTableMapper;
+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.teacher.vo.ClassHomeworkVo;
+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;
+    private final CourseTableMapper courseTableMapper;
+    private final CommonPropertiesConfig commonPropertiesConfig;
+
+    @Override
+    public IPage<ClassHomeworkPageVo> pageClassHomework(ClassHomeworkPageDto dto) {
+        if(com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isNotEmpty(dto.getEndDate())){
+            dto.setEndDate(dto.getEndDate().plusDays(1));
+        }
+
+        // 需要划分权限
+        // 教职工看到自己发的所有的,学生和家长看到自己的
+        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);
+
+        // 获取所有的课程
+        MPJLambdaWrapper<CourseTable> courseTableMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        courseTableMPJLambdaWrapper
+                .distinct()
+                .selectAs(CourseTable::getCourseId, CourseTable::getCourseId)
+                .selectAs(CourseTable::getCourseName, CourseTable::getCourseName)
+                ;
+
+        List<CourseTable> courseTables = courseTableMapper.selectJoinList(CourseTable.class, courseTableMPJLambdaWrapper);
+        Map<Long, String> courseTableMap = courseTables.stream()
+                .collect(Collectors.toMap(CourseTable::getCourseId, CourseTable::getCourseName, (n1, n2) -> n1));
+
+        for (ClassHomeworkPageVo vo : page.getRecords()){
+            if(ObjectUtils.isNotEmpty(vo.getBaseCourseSubjectId()) && MapUtils.isNotEmpty(courseTableMap)){
+                String baseCourseSubjectIdCn = courseTableMap.get(vo.getBaseCourseSubjectId());
+                vo.setBaseCourseSubjectIdCn(baseCourseSubjectIdCn);
+            }
+
+            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
+    public ClassHomeworkVo infoRubAndHand(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 = this.selectJoinOne(ClassHomeworkVo.class, queryWrapper);
+
+        if (vo == null) {
+            return vo;
+        }
+
+        MPJLambdaWrapper<CourseTable> courseTableMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        courseTableMPJLambdaWrapper
+                .distinct()
+                .selectAs(CourseTable::getCourseId, CourseTable::getCourseId)
+                .selectAs(CourseTable::getCourseName, CourseTable::getCourseName)
+        ;
+
+        List<CourseTable> courseTables = courseTableMapper.selectJoinList(CourseTable.class, courseTableMPJLambdaWrapper);
+        Map<Long, String> courseTableMap = courseTables.stream()
+                .collect(Collectors.toMap(CourseTable::getCourseId, CourseTable::getCourseName, (n1, n2) -> n1));
+
+        if(ObjectUtils.isNotEmpty(vo.getBaseCourseSubjectId()) && MapUtils.isNotEmpty(courseTableMap)){
+            String baseCourseSubjectIdCn = courseTableMap.get(vo.getBaseCourseSubjectId());
+            vo.setBaseCourseSubjectIdCn(baseCourseSubjectIdCn);
+        }
+
+        if(ObjectUtils.isNotEmpty(vo.getFolderId())){
+            List<File> files = fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId, vo.getFolderId()));
+            vo.setFiles(files);
+        }
+
+        return vo;
+    }
+
+    @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.setUrl(StrUtil.format("{}/pages/homework/info?id=={}", commonPropertiesConfig.getDomainApp(), classHomework.getId()));
+                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)
+                .selectAs(BaseStudentSchoolRoll::getClassId, ClassHomeworkReadListVo::getClassId)
+                .selectAs(BaseClass::getName, ClassHomeworkReadListVo::getClassIdCn)
+                .select("0 as is_read")
+                .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
+                .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
+        ;
+
+        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;
+    }
+}

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

@@ -0,0 +1,471 @@
+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 cn.hutool.core.util.StrUtil;
+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.config.CommonPropertiesConfig;
+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.*;
+import java.util.function.Consumer;
+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;
+    private final CommonPropertiesConfig commonPropertiesConfig;
+
+    @Override
+    public IPage<ClassInternshipDynamicPageVo> pageClassInternshipDynamic(ClassInternshipDynamicPageDto dto) {
+        // 处理日期
+        if (ObjectUtils.isNotEmpty(dto.getEndDate())) {
+            dto.setEndDate(dto.getEndDate().plusDays(1));
+        }
+
+        // 需要划分权限
+        // 教职工看到自己发的所有的,学生和家长看到自己的
+        List<String> roleList = StpUtil.getRoleList();
+        long userId = StpUtil.getLoginIdAsLong();
+
+        // 角色存在标记
+        boolean isParent = roleList.contains("PARENT");
+        boolean isStudent = roleList.contains("STUDENT");
+        boolean isTeacher = roleList.contains("TEACHER");
+
+        List<Long> studentClassIds = new ArrayList<>();
+        List<Long> parentClassIds = new ArrayList<>();
+
+        // 获取学生班级 ID
+        if (isStudent) {
+            studentClassIds.add(rollService.getClassIdByUserId(userId));
+        }
+
+        // 获取家长关联的学生班级 ID
+        if (isParent) {
+            List<BaseUserStudent> userStudents = userStudentService.list(
+                    new QueryWrapper<BaseUserStudent>().lambda()
+                            .eq(BaseUserStudent::getUserId, userId)
+            );
+            for (BaseUserStudent userStudent : userStudents) {
+                Long classId = rollService.getClassIdByUserId(userStudent.getStudentId());
+                if (classId != null) {
+                    parentClassIds.add(classId);
+                }
+            }
+        }
+
+        MPJLambdaWrapper<ClassInternshipDynamic> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.distinct()
+                .select(ClassInternshipDynamic::getId)
+                .select(ClassInternshipDynamic.class, x -> VoToColumnUtil.fieldsToColumns(ClassInternshipDynamicPageVo.class).contains(x.getProperty()))
+                .select("(SELECT GROUP_CONCAT(b.name) FROM class_internship_dynamic_class a INNER JOIN base_class b ON a.class_id = b.id WHERE a.class_internship_dynamic_id = t.id) AS class_id_cns")
+                .select("(SELECT GROUP_CONCAT(a.class_id) FROM class_internship_dynamic_class a WHERE a.class_internship_dynamic_id = t.id) AS class_ids")
+                .leftJoin(XjrUser.class, XjrUser::getId, ClassInternshipDynamic::getPublisherId,
+                        wrapper -> wrapper.selectAs(XjrUser::getName, ClassInternshipDynamicPageVo::getPublisherIdCn)
+                )
+                .innerJoin(ClassInternshipDynamicClass.class, ClassInternshipDynamicClass::getClassInternshipDynamicId, ClassInternshipDynamic::getId)
+                .ge(ObjectUtils.isNotEmpty(dto.getStartDate()), ClassInternshipDynamic::getCreateDate, dto.getStartDate())
+                .le(ObjectUtils.isNotEmpty(dto.getEndDate()), ClassInternshipDynamic::getCreateDate, dto.getEndDate())
+                .orderByDesc(ClassInternshipDynamic::getCreateDate);
+
+        // 收集所有角色的 OR 条件
+        List<Consumer<MPJLambdaWrapper<ClassInternshipDynamic>>> roleConditions = new ArrayList<>();
+        boolean hasConditions = false;
+
+        // 教师条件
+        if (isTeacher) {
+            roleConditions.add(wrapper -> wrapper
+                    .eq(ClassInternshipDynamic::getPublisherId, userId));
+            hasConditions = true;
+        }
+
+        // 学生条件
+        if (isStudent && CollectionUtils.isNotEmpty(studentClassIds)) {
+            roleConditions.add(wrapper -> wrapper
+                    .in(ClassInternshipDynamicClass::getClassId, studentClassIds)
+                    .and(innerWrapper -> innerWrapper
+                            .eq(ClassInternshipDynamic::getRoleType, 1)
+                            .or()
+                            .eq(ClassInternshipDynamic::getRoleType, 3)
+                    ));
+            hasConditions = true;
+        }
+
+        // 家长条件
+        if (isParent && CollectionUtils.isNotEmpty(parentClassIds)) {
+            roleConditions.add(wrapper -> wrapper
+                    .in(ClassInternshipDynamicClass::getClassId, parentClassIds)
+                    .and(innerWrapper -> innerWrapper
+                            .eq(ClassInternshipDynamic::getRoleType, 2)
+                            .or()
+                            .eq(ClassInternshipDynamic::getRoleType, 3)
+                    ));
+            hasConditions = true;
+        }
+
+        // 如果有任意角色条件,则用 and 包裹所有 or 条件
+        if (hasConditions) {
+            queryWrapper.and(wrapper -> {
+                if (!roleConditions.isEmpty()) {
+                    // 从第二个条件开始,前面已经有一个条件了
+                    Iterator<Consumer<MPJLambdaWrapper<ClassInternshipDynamic>>> iterator = roleConditions.iterator();
+                    iterator.next().accept(wrapper); // 添加第一个条件
+
+                    while (iterator.hasNext()) {
+                        wrapper.or(); // 开启 OR 分支
+                        iterator.next().accept(wrapper);
+                    }
+                }
+            });
+        } else {
+            queryWrapper.eq("1", "0"); // 无权限
+        }
+
+//        int roleType = 1;
+//
+//        List<Long> classIds = new ArrayList<>();
+//
+//        if (roleList.contains("PARENT")) {
+//            roleType = 4;
+//            List<BaseUserStudent> list = userStudentService.list(new QueryWrapper<BaseUserStudent>().lambda().eq(BaseUserStudent::getUserId, userId));
+//            for (BaseUserStudent userStudent : list) {
+//                classIds.add(rollService.getClassIdByUserId(userStudent.getStudentId()));
+//            }
+//        }
+//        if (roleList.contains("STUDENT")) {
+//            roleType = 3;
+//            classIds.add(rollService.getClassIdByUserId(userId));
+//        }
+//        if (roleList.contains("TEACHER")) {
+//            roleType = 2;
+//        }
+//
+//        MPJLambdaWrapper<ClassInternshipDynamic> queryWrapper = new MPJLambdaWrapper<>();
+//        queryWrapper
+//                .distinct()
+//                .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().plusDays(1))
+//                .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)
+//                    .and(
+//                            wrapper -> wrapper
+//                                    .eq(ClassInternshipDynamic::getRoleType, 1)
+//                                    .or()
+//                                    .eq(ClassInternshipDynamic::getRoleType, 3)
+//                    )
+//            ;
+//        }
+//
+//        if(roleType == 4){
+//            queryWrapper
+//                    .innerJoin(ClassInternshipDynamicClass.class, ClassInternshipDynamicClass::getClassInternshipDynamicId, ClassInternshipDynamic::getId)
+//                    .in(CollectionUtils.isNotEmpty(classIds), ClassInternshipDynamicClass::getClassId, classIds)
+//                    .and(
+//                            wrapper -> wrapper
+//                                    .eq(ClassInternshipDynamic::getRoleType, 2)
+//                                    .or()
+//                                    .eq(ClassInternshipDynamic::getRoleType, 3)
+//                    )
+//            ;
+//        }
+
+        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);
+        }
+
+        // 发送通知
+        Set<User> combinedUserSet = new LinkedHashSet<>();
+
+        // 找到班上所有的学生
+        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);
+
+        // 根据 roleType 添加对应的角色对象到集合中
+        if (ObjectUtils.isNotEmpty(dto.getRoleType())) {
+            int roleType = dto.getRoleType();
+
+            if (roleType == 1 || roleType == 3) {
+                combinedUserSet.addAll(stuList);
+            }
+            if (roleType == 2 || roleType == 3) {
+                combinedUserSet.addAll(parentList);
+            }
+        }
+
+        // 发布作业的教师
+        User releaseUser = userMapper.selectById(loginId);
+        try {
+            for (User user : combinedUserSet) {
+                WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                weChatSendMessageDto.setUserId(user.getOpenId());
+                weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
+                weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/student/practice/detail?id={}", commonPropertiesConfig.getDomainApp(), classInternshipDynamic.getId()));
+                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;
+    }
+}

+ 99 - 18
src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java

@@ -14,16 +14,30 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.*;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.enums.GenderDictionaryEnum;
+import com.xjrsoft.common.enums.JobStateEnum;
+import com.xjrsoft.common.enums.RoleEnum;
+import com.xjrsoft.common.enums.TeaChangeTypeEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.module.hikvision.util.DataUtil;
-import com.xjrsoft.module.organization.entity.*;
+import com.xjrsoft.module.organization.entity.Department;
+import com.xjrsoft.module.organization.entity.Post;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.organization.entity.UserPostRelation;
+import com.xjrsoft.module.organization.entity.UserRoleRelation;
 import com.xjrsoft.module.organization.mapper.UserDeptRelationMapper;
 import com.xjrsoft.module.organization.mapper.UserRoleRelationMapper;
-import com.xjrsoft.module.organization.service.*;
+import com.xjrsoft.module.organization.service.IDepartmentService;
+import com.xjrsoft.module.organization.service.IPostService;
+import com.xjrsoft.module.organization.service.IUserDeptRelationService;
+import com.xjrsoft.module.organization.service.IUserPostRelationService;
+import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import com.xjrsoft.module.personnel.mapper.CarMessageApplyMapper;
 import com.xjrsoft.module.personnel.service.ITeacherFaceProcessService;
@@ -33,10 +47,55 @@ import com.xjrsoft.module.system.service.IDictionarydetailService;
 import com.xjrsoft.module.teacher.dto.AddXjrUserDto;
 import com.xjrsoft.module.teacher.dto.BaseTeacherPageDto;
 import com.xjrsoft.module.teacher.dto.UpdateXjrUserDto;
-import com.xjrsoft.module.teacher.entity.*;
-import com.xjrsoft.module.teacher.mapper.*;
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
+import com.xjrsoft.module.teacher.entity.BaseTeacherChangeRecord;
+import com.xjrsoft.module.teacher.entity.BaseTeacherContact;
+import com.xjrsoft.module.teacher.entity.BaseTeacherEducation;
+import com.xjrsoft.module.teacher.entity.BaseTeacherEmploy;
+import com.xjrsoft.module.teacher.entity.BaseTeacherFamily;
+import com.xjrsoft.module.teacher.entity.BaseTeacherFamilyMember;
+import com.xjrsoft.module.teacher.entity.BaseTeacherRegular;
+import com.xjrsoft.module.teacher.entity.CoreTeacher;
+import com.xjrsoft.module.teacher.entity.EvaluatorInformation;
+import com.xjrsoft.module.teacher.entity.FacultyContract;
+import com.xjrsoft.module.teacher.entity.JobInformation;
+import com.xjrsoft.module.teacher.entity.LanguageCompetence;
+import com.xjrsoft.module.teacher.entity.OutsideAssociations;
+import com.xjrsoft.module.teacher.entity.ProfessionalTitle;
+import com.xjrsoft.module.teacher.entity.ScientificResearch;
+import com.xjrsoft.module.teacher.entity.TeacherCertification;
+import com.xjrsoft.module.teacher.entity.WfTeacherDepart;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherChangeRecordMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherContactMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherEducationMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherEmployMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherFamilyMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherFamilyMemberMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherMapper;
+import com.xjrsoft.module.teacher.mapper.BaseTeacherRegularMapper;
+import com.xjrsoft.module.teacher.mapper.CoreTeacherMapper;
+import com.xjrsoft.module.teacher.mapper.EvaluatorInformationMapper;
+import com.xjrsoft.module.teacher.mapper.FacultyContractMapper;
+import com.xjrsoft.module.teacher.mapper.JobInformationMapper;
+import com.xjrsoft.module.teacher.mapper.LanguageCompetenceMapper;
+import com.xjrsoft.module.teacher.mapper.OutsideAssociationsMapper;
+import com.xjrsoft.module.teacher.mapper.ProfessionalTitleMapper;
+import com.xjrsoft.module.teacher.mapper.ScientificResearchMapper;
+import com.xjrsoft.module.teacher.mapper.TeacherCertificationMapper;
+import com.xjrsoft.module.teacher.mapper.WfTeacherDepartMapper;
+import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
 import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
-import com.xjrsoft.module.teacher.vo.*;
+import com.xjrsoft.module.teacher.vo.CoreTeacherImportVo;
+import com.xjrsoft.module.teacher.vo.EvaluatorInformationImportVo;
+import com.xjrsoft.module.teacher.vo.FacultyContractImportVo;
+import com.xjrsoft.module.teacher.vo.JobInformationImportVo;
+import com.xjrsoft.module.teacher.vo.LanguageCompetenceImportVo;
+import com.xjrsoft.module.teacher.vo.OutsideAssociationsImportVo;
+import com.xjrsoft.module.teacher.vo.ProfessionalTitleImportVo;
+import com.xjrsoft.module.teacher.vo.ScientificResearchImportVo;
+import com.xjrsoft.module.teacher.vo.TeacherCertificationImportVo;
+import com.xjrsoft.module.teacher.vo.XjrUserPageVo;
 import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
 import lombok.AllArgsConstructor;
@@ -55,7 +114,13 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -572,12 +637,15 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean importData(List<Map<Integer, Object>> excelDataList) throws ParseException {
+    public List<Map<Integer, Object>> importData(List<Map<Integer, Object>> excelDataList) throws ParseException {
+        List<Map<Integer, Object>> errorList = new ArrayList<>();
+
         List<User> userList = userService.list(
                 new MPJLambdaWrapper<User>()
                         .select(User::getId)
                         .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
                         .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
+                        .eq(User::getDeleteMark, DeleteMark.NODELETE.getCode())
         );
         Map<String, User> userMap = userList.stream().collect(Collectors.toMap(User::getCredentialNumber, x -> x));
 
@@ -586,6 +654,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
                         .select(BaseTeacher::getId)
                         .select(BaseTeacher.class, x -> VoToColumnUtil.fieldsToColumns(BaseTeacher.class).contains(x.getProperty()))
                         .innerJoin(User.class, User::getId, BaseTeacher::getUserId)
+                        .eq(User::getDeleteMark, DeleteMark.NODELETE.getCode())
         );
         Map<Long, BaseTeacher> teacherMap = teacherList.stream().collect(Collectors.toMap(BaseTeacher::getUserId, x -> x));
 
@@ -600,7 +669,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
                         .in(DictionaryDetail::getItemId, itemList)
                         .eq(DictionaryDetail::getDeleteMark, DeleteMark.NODELETE.getCode())
         );
-        Map<String, String> dictionaryMap = dictionaryList.stream().collect(Collectors.toMap(DictionaryDetail::getName, DictionaryDetail::getCode));
+        Map<Long, Map<String, String>> dictionaryMap = dictionaryList.stream().collect(Collectors.groupingBy(DictionaryDetail::getItemId, Collectors.toMap(DictionaryDetail::getName, DictionaryDetail::getCode)));
 
         List<Department> departmentList = departmentService.list(
                 new QueryWrapper<Department>().lambda()
@@ -652,20 +721,32 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
         for (Map<Integer, Object> rowData : excelDataList) {
+            boolean isEmpty = false;
+            for (Integer i : rowData.keySet()) {
+                if(rowData.get(i) == null){
+                    errorList.add(rowData);
+                    isEmpty = true;
+                }
+            }
+            if(isEmpty){
+                continue;
+            }
+
+
             String credentialNumber = rowData.get(4).toString();
             if (userMap.containsKey(credentialNumber)) {
                 User user = userMap.get(credentialNumber);
                 user.setName(rowData.get(1).toString());
                 user.setGender(GenderDictionaryEnum.getCode(rowData.get(2).toString()));
-                user.setCredentialType(dictionaryMap.get(rowData.get(3).toString()));
+                user.setCredentialType(dictionaryMap.get(2023000000000000006L).get(rowData.get(3).toString()));
                 user.setCredentialNumber(rowData.get(4).toString());
                 user.setMobile(rowData.get(5).toString());
                 updateUserList.add(user);
 
                 BaseTeacher teacher = teacherMap.get(user.getId());
-                teacher.setEmployType(dictionaryMap.get(rowData.get(6).toString()));
+                teacher.setEmployType(dictionaryMap.get(2023000000000000016L).get(rowData.get(6).toString()));
                 if(rowData.get(9) != null && StrUtil.isNotEmpty(rowData.get(9).toString())){
-                    teacher.setJobState(dictionaryMap.get(rowData.get(9).toString()));
+                    teacher.setJobState(dictionaryMap.get(2023000000000000005L).get(rowData.get(9).toString()));
                 }
                 if(rowData.get(10) != null && StrUtil.isNotEmpty(rowData.get(10).toString())){
                     teacher.setJoinTime(sdf.parse(rowData.get(10).toString()));
@@ -676,7 +757,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
                 if(rowData.get(11) != null && StrUtil.isNotEmpty(rowData.get(11).toString())){
                     BaseTeacherRegular teacherRegular = regularMap.get(user.getId());
                     JSONArray teachingStatus = teacherRegular.getTeachingStatus();
-                    teachingStatus.add(dictionaryMap.get(rowData.get(11).toString()));
+                    teachingStatus.add(dictionaryMap.get(2023000000000000020L).get(rowData.get(11).toString()));
                     teacherRegular.setTeachingStatus(teachingStatus);
                     updateBaseTeacherRegularList.add(teacherRegular);
                 }
@@ -706,18 +787,18 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             user.setIsChangePassword(1);
             user.setName(rowData.get(1).toString());
             user.setGender(GenderDictionaryEnum.getCode(rowData.get(2).toString()));
-            user.setCredentialType(dictionaryMap.get(rowData.get(3).toString()));
+            user.setCredentialType(dictionaryMap.get(2023000000000000006L).get(rowData.get(3).toString()));
             user.setCredentialNumber(rowData.get(4).toString());
             user.setMobile(rowData.get(5).toString());
             user.setCreateDate(LocalDateTime.now());
             userService.save(user);
 
             BaseTeacher teacher = new BaseTeacher();
-            teacher.setEmployType(dictionaryMap.get(rowData.get(6).toString()));
+            teacher.setEmployType(dictionaryMap.get(2023000000000000016L).get(rowData.get(6).toString()));
             teacher.setUserId(user.getId());
             teacher.setCreateDate(LocalDateTime.now());
             if(rowData.get(9) != null && StrUtil.isNotEmpty(rowData.get(9).toString())){
-                teacher.setJobState(dictionaryMap.get(rowData.get(9).toString()));
+                teacher.setJobState(dictionaryMap.get(2023000000000000005L).get(rowData.get(9).toString()));
             }
 
             if(rowData.get(10) != null && StrUtil.isNotEmpty(rowData.get(10).toString())){
@@ -729,7 +810,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             if(rowData.get(11) != null && StrUtil.isNotEmpty(rowData.get(11).toString())){
                 BaseTeacherRegular teacherRegular = new BaseTeacherRegular();
                 JSONArray teachingStatus = new JSONArray();
-                teachingStatus.add(dictionaryMap.get(rowData.get(11).toString()));
+                teachingStatus.add(dictionaryMap.get(2023000000000000020L).get(rowData.get(11).toString()));
                 teacherRegular.setTeachingStatus(teachingStatus);
                 teacherRegular.setCreateDate(LocalDateTime.now());
                 teacherRegular.setCreateUserId(StpUtil.getLoginIdAsLong());
@@ -790,7 +871,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         List<UserPostRelation> postRelationList = userPostRelationService.list(Wrappers.lambdaQuery(UserPostRelation.class));
         redisUtil.set(GlobalConstant.USER_POST_RELATION_CACHE_KEY, postRelationList);
 
-        return true;
+        return errorList;
     }
 
     @Override

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

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

@@ -0,0 +1,41 @@
+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("已读用户班级主键id")
+    private Long classId;
+    @ApiModelProperty("已读用户班级主键id")
+    private String classIdCn;
+
+    @ApiModelProperty("阅读状态(0:未读,1:已读)")
+    private Integer isRead;
+}

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

@@ -0,0 +1,74 @@
+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;
+    /**
+     * 创建时间
+     */
+    @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;
+}

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

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

@@ -0,0 +1,67 @@
+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;
+    /**
+     * 创建时间
+     */
+    @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 String roleType;
+    /**
+    * 内容
+    */
+    @ApiModelProperty("内容")
+    private String content;
+    /**
+    * 附件
+    */
+    @ApiModelProperty("附件")
+    private Long folderId;
+    @ApiModelProperty("附件")
+    private List<File> files;
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/xycxedu/controller/ExamPlanController.java

@@ -73,7 +73,7 @@ public class ExamPlanController {
                 continue;
             }
             String[] split = record.getMilexamids().split(",");
-            List<Long> milexamids = Arrays.asList(split).stream()
+            List<Long> milexamids = Arrays.asList(split).stream().filter(StrUtil::isNotEmpty)
                     .map(Long::parseLong)
                     .collect(Collectors.toList());
             List<XycxeduExamList> list = examListService.list(new QueryWrapper<XycxeduExamList>().lambda().in(XycxeduExamList::getMilexamid, milexamids));

+ 3 - 0
src/main/resources/mapper/organization/UserMapper.xml

@@ -47,6 +47,9 @@
         <if test="dto.userId != null">
             AND t1.id = #{dto.userId}
         </if>
+        <if test="dto.archivesStatus != null and dto.archivesStatus != ''">
+            AND t3.archives_status = ${dto.archivesStatus}
+        </if>
     </select>
     <select id="personPage" parameterType="com.xjrsoft.module.organization.dto.PersonPageDto" resultType="com.xjrsoft.module.organization.vo.PersonPageVo">
         SELECT t1.id,t1.name,t1.user_name,t1.mobile,t3.name AS gender_cn,t2.employ_type,t2.employ_way FROM xjr_user t1

+ 1 - 1
src/main/resources/mapper/student/BaseStudentMapper.xml

@@ -138,7 +138,7 @@
     <select id="getStudentList" parameterType="com.xjrsoft.module.student.dto.BaseStudentUserPageDto" resultType="com.xjrsoft.module.student.vo.BaseStudentUserPageVo">
         SELECT t1.id,t4.name AS class_name,t5.name AS teacher_name,t1.name,t1.gender AS gender_cn,t1.credential_number,
         t1.mobile,t3.archives_status AS archives_status_cn ,t3.stduy_status AS stduy_status_cn,t3.student_type AS student_type_cn,
-        t3.learn_status as learn_status_cn,t3.grade_id,t6.name as grade_name,t3.class_id FROM xjr_user t1
+        t3.learn_status as learn_status_cn,t3.grade_id,t6.name as grade_name,t3.class_id,t1.open_id FROM xjr_user t1
         INNER JOIN base_student t2 ON t1.id = t2.user_id
         LEFT JOIN base_student_school_roll t3 ON t1.id = t3.user_id
         LEFT JOIN base_class t4 ON t4.id = t3.class_id

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

@@ -0,0 +1,154 @@
+-- --------------------------------------------------------------------------------------------
+-- 教师布置作业记录表
+-- --------------------------------------------------------------------------------------------
+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(64)  not null comment '作业主题',
+    completion_deadline    date          not null comment '完成截止时间',
+    content                longtext 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(64)  not null comment '实习主题',
+    role_type      int           null comment '发送范围(1:学生、2:家长、3:学生和家长)',
+    content        longtext 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 ='实习动态已读表';
+
+-- --------------------------------------------------------------------------------------------
+-- 班级动态表阅读表
+-- --------------------------------------------------------------------------------------------
+DROP TABLE IF EXISTS base_class_dynamics_relation;
+CREATE TABLE `base_class_dynamics_relation` (
+`id` BIGINT NOT NULL,
+`base_class_dynamics_id` BIGINT DEFAULT NULL COMMENT '动态id(base_class_dynamics)',
+`read_mark` INT DEFAULT NULL COMMENT '是否已阅读(0:否 1:是)',
+`read_date` DATETIME DEFAULT NULL COMMENT '阅读时间',
+`user_id` BIGINT DEFAULT NULL COMMENT '阅读用户',
+`reply_content` VARCHAR(250) DEFAULT NULL COMMENT '回复内容',
+PRIMARY KEY (`id`)
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='班级动态表阅读表';
+
+
+
+
+
+
+
+

+ 26 - 6
src/main/resources/sqlScript/教师视图.sql

@@ -2,12 +2,19 @@
 DROP VIEW IF EXISTS teacher_data;
 CREATE VIEW teacher_data AS
 SELECT t1.name,t1.user_name AS userName,t1.mobile,
-(SELECT GROUP_CONCAT(a1.name) FROM xjr_department a1
-INNER JOIN xjr_user_dept_relation a2 ON a1.id = a2.dept_id
-WHERE a1.delete_mark = 0 AND a2.user_id = t1.id
-) AS deptName,t3.name AS employType,t1.credential_number AS credentialNumber,t1.email FROM xjr_user t1
-INNER JOIN base_teacher t2 ON t1.id = t2.user_id
-LEFT JOIN xjr_dictionary_detail t3 ON t2.employ_type = t3.code
+       (SELECT GROUP_CONCAT(a1.name) FROM xjr_department a1
+                                              INNER JOIN xjr_user_dept_relation a2 ON a1.id = a2.dept_id
+        WHERE a1.delete_mark = 0 AND a2.user_id = t1.id
+       ) AS deptName,t3.name AS employType,t1.credential_number AS credentialNumber,t1.email,
+       t4.name AS jobState,t2.join_time AS joinTime,(
+           SELECT GROUP_CONCAT(a2.name) FROM base_teacher_regular a1
+                                                 LEFT JOIN xjr_dictionary_detail a2 ON JSON_UNQUOTE(a1.teaching_status) LIKE CONCAT('%', a2.code, '%')
+               AND a2.item_id = 2023000000000000020
+           WHERE a1.user_id = t1.id
+       ) AS teachingStatus FROM xjr_user t1
+                                    INNER JOIN base_teacher t2 ON t1.id = t2.user_id
+                                    LEFT JOIN xjr_dictionary_detail t3 ON t2.employ_type = t3.code
+                                    LEFT JOIN xjr_dictionary_detail t4 ON t2.job_state = t4.code
 WHERE t1.delete_mark = 0;
 
 INSERT INTO data_expert_source(id,create_user_id,create_date,delete_mark,enabled_mark,sort_code,NAME,source_type,view_name)
@@ -26,4 +33,17 @@ INSERT INTO data_expert_source_field(id,create_user_id,create_date,delete_mark,e
 VALUES
 (1713872370,1000000000000000000,NOW(),0,1,7,1713871534,'email','邮箱','基础信息');
 
+INSERT INTO data_expert_source_field(id,create_user_id,create_date,delete_mark,enabled_mark,sort_code,data_expert_source_id,field_name,show_name,data_group)
+VALUES
+    (1713872371,1000000000000000000,NOW(),0,1,7,1713871534,'jobState','在职状态','基础信息');
+
+INSERT INTO data_expert_source_field(id,create_user_id,create_date,delete_mark,enabled_mark,sort_code,data_expert_source_id,field_name,show_name,data_group)
+VALUES
+    (1713872372,1000000000000000000,NOW(),0,1,7,1713871534,'joinTime','来校时间','基础信息');
+
+INSERT INTO data_expert_source_field(id,create_user_id,create_date,delete_mark,enabled_mark,sort_code,data_expert_source_id,field_name,show_name,data_group)
+VALUES
+    (1713872373,1000000000000000000,NOW(),0,1,7,1713871534,'teachingStatus','任课状况','基础信息');
+
+
 

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