Bläddra i källkod

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

dzx 7 månader sedan
förälder
incheckning
307a0c4069

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

@@ -96,6 +96,10 @@ public class ClassHomeworkServiceImpl extends MPJBaseServiceImpl<ClassHomeworkMa
 
     @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();

+ 211 - 95
src/main/java/com/xjrsoft/module/teacher/service/impl/ClassInternshipDynamicServiceImpl.java

@@ -53,21 +53,19 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
+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
-*/
+ * @title: 实习动态表
+ * @Author szs
+ * @Date: 2025-04-27
+ * @Version 1.0
+ */
 @Service
 @AllArgsConstructor
 public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassInternshipDynamicMapper, ClassInternshipDynamic> implements IClassInternshipDynamicService {
@@ -84,68 +82,188 @@ public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassI
 
     @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();
 
-        int roleType = 1;
+        // 角色存在标记
+        boolean isParent = roleList.contains("PARENT");
+        boolean isStudent = roleList.contains("STUDENT");
+        boolean isTeacher = roleList.contains("TEACHER");
 
-        List<Long> classIds = new ArrayList<>();
+        List<Long> studentClassIds = new ArrayList<>();
+        List<Long> parentClassIds = new ArrayList<>();
 
-        if (roleList.contains("TEACHER")) {
-            roleType = 2;
-        }
-        if (roleList.contains("STUDENT")) {
-            roleType = 3;
-            classIds.add(rollService.getClassIdByUserId(userId));
+        // 获取学生班级 ID
+        if (isStudent) {
+            studentClassIds.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()));
+
+        // 获取家长关联的学生班级 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
+        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")
+                .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)
+                        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)
-        ;
-        if(roleType == 2){
-            queryWrapper
-                    .eq(ClassInternshipDynamic::getPublisherId, userId);
+                .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(roleType == 3){
-            queryWrapper
-                    .innerJoin(ClassInternshipDynamicClass.class, ClassInternshipDynamicClass::getClassInternshipDynamicId, ClassInternshipDynamic::getId)
-                    .in(CollectionUtils.isNotEmpty(classIds), ClassInternshipDynamicClass::getClassId, classIds);
+        // 家长条件
+        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())){
+        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);
             }
@@ -167,7 +285,7 @@ public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassI
 
         this.save(classInternshipDynamic);
 
-        for (Long classid : dto.getClassIds()){
+        for (Long classid : dto.getClassIds()) {
             ClassInternshipDynamicClass classInternshipDynamicClass = new ClassInternshipDynamicClass();
             classInternshipDynamicClass.setClassInternshipDynamicId(classInternshipDynamic.getId());
             classInternshipDynamicClass.setClassId(classid);
@@ -178,49 +296,47 @@ public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassI
         }
 
         // 发送通知
-        List<User> combinedList = new ArrayList<>();
-        if(ObjectUtils.isNotEmpty(dto.getRoleType()) && dto.getRoleType() == 1){
-            // 找到班上所有的学生
-            MPJLambdaWrapper<User> stuMPJLambdaWrapper = new MPJLambdaWrapper<>();
-            stuMPJLambdaWrapper
-                    .distinct()
-                    .select(User::getId)
-                    .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
-                    .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
-                    .in(BaseStudentSchoolRoll::getClassId, dto.getClassIds());
-            List<User> stuList = userMapper.selectJoinList(User.class, stuMPJLambdaWrapper);
-
-            combinedList.addAll(stuList);
-        }
-
-        if(ObjectUtils.isNotEmpty(dto.getRoleType()) && dto.getRoleType() == 2){
-            // 找到班上所有的学生的家长
-            MPJLambdaWrapper<User> parentMPJLambdaWrapper = new MPJLambdaWrapper<>();
-            parentMPJLambdaWrapper
-                    .distinct()
-                    .disableSubLogicDel()
-                    .select(User::getId).select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
-                    .leftJoin(UserStudent.class, UserStudent::getUserId, User::getId)
-                    .leftJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, UserStudent::getId)
-                    .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
-                    .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
-                    .in(BaseStudentSchoolRoll::getClassId, dto.getClassIds());
-            List<User> parentList = userMapper.selectJoinList(User.class, parentMPJLambdaWrapper);
-
-            // 合并两个列表,并根据 User 的 id 去重
-            combinedList = new ArrayList<>(Stream.concat(combinedList.stream(), parentList.stream())
-                    .collect(Collectors.toMap(
-                            User::getId, // 键:User 的 id
-                            user -> user, // 值:User 对象本身
-                            (existing, replacement) -> existing // 如果有重复的键,保留旧值(existing)
-                    ))
-                    .values());
+        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 : combinedList) {
+            for (User user : combinedUserSet) {
                 WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
                 weChatSendMessageDto.setUserId(user.getOpenId());
                 weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
@@ -265,7 +381,7 @@ public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassI
                 .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
         ;
 
-        if(ObjectUtils.isEmpty(dto.getClassId())){
+        if (ObjectUtils.isEmpty(dto.getClassId())) {
             LambdaQueryWrapper<ClassInternshipDynamicClass> classLambdaQueryWrapper = new LambdaQueryWrapper<>();
             classLambdaQueryWrapper
                     .eq(ClassInternshipDynamicClass::getClassInternshipDynamicId, dto.getClassInternshipDynamicId())
@@ -273,7 +389,7 @@ public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassI
             ;
 
             List<ClassInternshipDynamicClass> classeList = classInternshipDynamicClassMapper.selectList(classLambdaQueryWrapper);
-            if(CollectionUtils.isEmpty(classeList)){
+            if (CollectionUtils.isEmpty(classeList)) {
                 return new ArrayList<>();
             }
 
@@ -285,7 +401,7 @@ public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassI
 
             xjrUserMPJLambdaWrapper
                     .in(BaseStudentSchoolRoll::getClassId, uniqueClassIds);
-        }else {
+        } else {
             xjrUserMPJLambdaWrapper
                     .eq(BaseStudentSchoolRoll::getClassId, dto.getClassId());
         }
@@ -314,13 +430,13 @@ public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassI
         }
 
         List<ClassInternshipDynamicReadListVo> result = new ArrayList<>();
-        if(ObjectUtils.isNotEmpty(dto.getIsRead())){
+        if (ObjectUtils.isNotEmpty(dto.getIsRead())) {
             for (ClassInternshipDynamicReadListVo vo : list) {
-                if(Objects.equals(vo.getIsRead(), dto.getIsRead())){
+                if (Objects.equals(vo.getIsRead(), dto.getIsRead())) {
                     result.add(vo);
                 }
             }
-        }else {
+        } else {
             return list;
         }
 
@@ -334,13 +450,13 @@ public class ClassInternshipDynamicServiceImpl extends MPJBaseServiceImpl<ClassI
         // 查询用户是否已经阅读当前作业
         LambdaQueryWrapper<ClassInternshipDynamicRead> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper
-                .select(ClassInternshipDynamicRead.class,x -> VoToColumnUtil.fieldsToColumns(ClassInternshipDynamicRead.class).contains(x.getProperty()))
+                .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)){
+        if (ObjectUtils.isEmpty(classInternshipDynamicRead)) {
             ClassInternshipDynamicRead insert = BeanUtil.toBean(dto, ClassInternshipDynamicRead.class);
             insert.setUserId(loginId);