Sfoglia il codice sorgente

Merge branch 'master' of http://git.dayaedu.com/yonge/mec into zouxuan

zouxuan 5 anni fa
parent
commit
9950ed942c
18 ha cambiato i file con 337 aggiunte e 137 eliminazioni
  1. 20 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  2. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  3. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPauseInfoDao.java
  4. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  5. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesService.java
  6. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  7. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  8. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  9. 145 126
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  10. 7 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  11. 14 0
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  12. 44 1
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  13. 7 0
      mec-biz/src/main/resources/config/mybatis/StudentPauseInfoMapper.xml
  14. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  15. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  16. 23 0
      mec-task/src/main/java/com/ym/mec/task/jobs/StudentServeRemindTask.java
  17. 8 4
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  18. 9 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

+ 20 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.GroupType;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -73,13 +74,31 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     List<Student> getServiceStudents();
 
     /**
+     * @describe 获取被服务学员id列表
+     * @author Joburgess
+     * @date 2020.06.04
+     * @return java.util.List<java.lang.Integer>
+     */
+    List<Integer> getServeStudentIds();
+
+    /**
      * @describe 查询被服务学员信息
      * @author Joburgess
      * @date 2020.05.27
      * @param monday:
      * @return java.util.List<com.ym.mec.biz.dal.dto.StudentServeDto>
      */
-    List<StudentServeDto> getBeServiceStudents(@Param("monday") String monday);
+    List<StudentServeDto> getBeServiceStudents(@Param("monday") String monday,
+                                               @Param("courseExpireDate")Date courseExpireDate);
+
+
+    List<StudentServeDto> getBeServiceStudentsInfoWithStudents(@Param("monday") String monday,
+                                               @Param("courseExpireDate")Date courseExpireDate,
+                                               @Param("studentIds") List<Integer> studentIds);
+
+    List<StudentServeDto> getBeServiceStudentsInfoWithStudentsForHistory(@Param("monday") String monday,
+                                                               @Param("courseExpireDate")Date courseExpireDate,
+                                                               @Param("studentIds") List<Integer> studentIds);
 
     /**
      * @describe 更新指定学员的服务指标或运营指标

+ 10 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java

@@ -73,5 +73,14 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
      */
     StudentExtracurricularExercisesSituation findStudentExercisesSituationsWithMonDay(@Param("monday") String monday,
                                                                           @Param("studentId") Integer studentId);
-	
+
+    /**
+     * @describe 获取还需布置课外训练的老师,及布置学生数量
+     * @author Joburgess
+     * @date 2020.06.03
+     * @param monday:
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Long>>
+     */
+    List<Map<Integer, Long>> getNoFinishedServiceTeacher(@Param("monday") String monday);
+
 }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPauseInfoDao.java

@@ -37,4 +37,17 @@ public interface StudentPauseInfoDao extends BaseDAO<Long, StudentPauseInfo> {
     List<StudentPauseInfo> findByGroup(@Param("groupType") GroupType groupType,
                                        @Param("groupId") String groupId);
 
+    /**
+     * @describe 删除学员在指定课程组下的休学信息
+     * @author Joburgess
+     * @date 2020.06.04
+     * @param groupType:
+     * @param groupId:
+     * @param userId:
+     * @return int
+     */
+    int deleteUserPauseInfoWithGroup(@Param("groupType") GroupType groupType,
+                                     @Param("groupId") String groupId,
+                                     @Param("userId") Integer userId);
+
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -41,6 +41,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     PAY_PRACTICE_BUY_SUCCESS("PAY_PRACTICE_BUY_SUCCESS", "网管课购买成功"),
     PRACTICE_COMPLETED_STUDY_REPORT("PRACTICE_COMPLETED_STUDY_REPORT", "网管课完成学习报告"),
     PRACTICE_RENEW_REMIND_PUSH("PRACTICE_RENEW_REMIND_PUSH", "网管课续费推送"),
+    PUBLIC_EXTRA_REMIND("PUBLIC_EXTRA_REMIND", "本周应布置课外训练"),
     FREE_PRACTICE_APPLY_PUSH("FREE_PRACTICE_APPLY_PUSH", "免费陪练课预约推送"),
     STUDENT_PUSH_NAMES_ACHIEVE("STUDENT_PUSH_NAMES_ACHIEVE", "点名完成"),
     SCHEDULE_CHANGE("SCHEDULE_CHANGE", "课表变动"),

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesService.java

@@ -38,4 +38,12 @@ public interface ExtracurricularExercisesService extends BaseService<Long, Extra
      */
     List<BasicUserDto> getDontServeStudents(Integer teacherId, String search);
 
+    /**
+     * @describe 应布置课外训练提醒
+     * @author Joburgess
+     * @date 2020.06.03
+     * @return void
+     */
+    void studentServeRemind();
+
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -154,6 +154,7 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 			StudentExtracurricularExercisesSituation studentExercisesSituation = studentExtracurricularExercisesSituationDao.findStudentExercisesSituationsWithMonDay(createMonday.toString(), existExtra.getUserId());
 			if(Objects.nonNull(studentExercisesSituation)){
 				studentExercisesSituation.setExercisesReplyNum(1);
+				studentExercisesSituation.setLastSubmitTime(now);
 				studentExtracurricularExercisesSituationDao.update(studentExercisesSituation);
 			}
 		}

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.ExtracurricularExercisesDao;
 import com.ym.mec.biz.dal.dao.ExtracurricularExercisesReplyDao;
+import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
@@ -41,6 +42,8 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 	@Autowired
 	private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
 	@Autowired
+	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+	@Autowired
 	private SysMessageService sysMessageService;
 	@Autowired
 	private TeacherDao teacherDao;
@@ -166,4 +169,18 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
 		return extracurricularExercisesDao.findNoExercisesStudentsInThisWeekWithTeacher(teacherId, monDayDate.toString(), search);
 	}
+
+	@Override
+	public void studentServeRemind() {
+		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+		List<Map<Integer, Long>> noFinishedServiceTeacher = studentExtracurricularExercisesSituationDao.getNoFinishedServiceTeacher(monDayDate.toString());
+		Map<Integer, Long> noFinishedServiceTeacherMap= MapUtil.convertIntegerMap(noFinishedServiceTeacher);
+		for (Map.Entry<Integer, Long> integerLongEntry : noFinishedServiceTeacherMap.entrySet()) {
+			Map<Integer, String> userMap = new HashMap<>();
+			userMap.put(integerLongEntry.getKey(), integerLongEntry.getKey().toString());
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PUBLIC_EXTRA_REMIND,
+					userMap, null, 0, "11" , "TEACHER", integerLongEntry.getValue());
+		}
+	}
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -119,6 +119,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             StudentExtracurricularExercisesSituation studentExercisesSituation = studentExtracurricularExercisesSituationDao.findStudentExercisesSituationsWithMonDay(createMonday.toString(), existHomework.getUserId());
             if(Objects.nonNull(studentExercisesSituation)){
                 studentExercisesSituation.setExercisesReplyNum(1);
+                studentExercisesSituation.setLastSubmitTime(now);
                 studentExtracurricularExercisesSituationDao.update(studentExercisesSituation);
             }
         }

+ 145 - 126
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java

@@ -61,165 +61,184 @@ public class StudentServeServiceImpl implements StudentServeService {
         LocalDate sunDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue());
         Date nextMonday = Date.from(sunDayDate.plusDays(1).atStartOfDay(DateUtil.zoneId).toInstant());
 
-        List<StudentServeDto> serviceStudents = studentDao.getBeServiceStudents(monDayDate.toString());
-        if(CollectionUtils.isEmpty(serviceStudents)){
-            return;
-        }
+        List<Integer> beServeStudentIds=studentDao.getServeStudentIds();
+        BigDecimal currentPage=BigDecimal.ONE,
+                pageSize=new BigDecimal(1000),
+                total=new BigDecimal(beServeStudentIds.size()),
+                totalPage=total.divide(pageSize, BigDecimal.ROUND_UP);
 
-        Map<Integer, List<StudentServeDto>> studentCoursesMap = serviceStudents.stream().collect(Collectors.groupingBy(StudentServeDto::getUserId));
+        List<StudentExtracurricularExercisesSituation> results=new ArrayList<>();
 
-        //本周不服务学员列表
-        Set<Integer> dontServeInCurrentWeekStudentIds=new HashSet<>();
-        //本周有课学员编号集合
-        Set<Integer> haveClassStudentIds=new HashSet<>();
-        //本周无课学员编号集合
-        Set<Integer> noClassStudentIds=new HashSet<>();
-        for (Map.Entry<Integer, List<StudentServeDto>> studentCoursesEntry : studentCoursesMap.entrySet()) {
+        while (currentPage.compareTo(totalPage)<=0){
+            List<Integer> studentIds=beServeStudentIds.stream().skip(pageSize.multiply(currentPage.subtract(BigDecimal.ONE)).longValue()).limit(pageSize.longValue()).collect(Collectors.toList());
 
-            List<StudentServeDto> haveCourseStudents = studentCoursesEntry.getValue().stream().filter(e -> Objects.nonNull(e.getCourseStartTime())).collect(Collectors.toList());
-            if(CollectionUtils.isEmpty(haveCourseStudents)){
-                noClassStudentIds.add(studentCoursesEntry.getKey());
-                continue;
-            }
-            StudentServeDto studentServeDto = haveCourseStudents.stream().min(Comparator.comparing(StudentServeDto::getCourseStartTime)).get();
-            if(Objects.isNull(studentServeDto.getCourseStartTime())){
-                noClassStudentIds.add(studentCoursesEntry.getKey());
-                continue;
-            }
-            if(!studentServeDto.getCourseStartTime().before(nextMonday)){
-                dontServeInCurrentWeekStudentIds.add(studentCoursesEntry.getKey());
-                continue;
-            }
-            long count = haveCourseStudents.stream().filter(e -> (GroupType.PRACTICE.equals(e.getGroupType()) ||
-                    (GroupType.MUSIC.equals(e.getGroupType()) && TeachModeEnum.OFFLINE.equals(e.getTeachMode())))
-                    &&nextMonday.after(e.getCourseStartTime())).count();
-            if(count>0){
-                haveClassStudentIds.add(studentCoursesEntry.getKey());
+            List<StudentServeDto> serviceStudents;
+            if(sunDayDate.isBefore(LocalDate.now())){
+                serviceStudents = studentDao.getBeServiceStudentsInfoWithStudentsForHistory(monDayDate.toString(), nextMonday,studentIds);
             }else{
-                noClassStudentIds.add(studentCoursesEntry.getKey());
+                serviceStudents = studentDao.getBeServiceStudentsInfoWithStudents(monDayDate.toString(), new Date(),studentIds);
+            }
+            if(CollectionUtils.isEmpty(serviceStudents)){
+                return;
             }
-        }
 
-        Set<Integer> allServeStudentIds=new HashSet<>();
-        allServeStudentIds.addAll(haveClassStudentIds);
-        allServeStudentIds.addAll(noClassStudentIds);
+            Map<Integer, List<StudentServeDto>> studentCoursesMap = serviceStudents.stream().collect(Collectors.groupingBy(StudentServeDto::getUserId));
 
-        Map<Integer, List<StudentServeCourseHomeworkDto>> studentHomeworkMap=new HashMap<>();
-        Map<Integer, List<ExtracurricularExercisesReply>> studentExercisesMap=new HashMap<>();
+            //本周不服务学员列表
+            Set<Integer> dontServeInCurrentWeekStudentIds=new HashSet<>();
+            //本周有课学员编号集合
+            Set<Integer> haveClassStudentIds=new HashSet<>();
+            //本周无课学员编号集合
+            Set<Integer> noClassStudentIds=new HashSet<>();
+            for (Map.Entry<Integer, List<StudentServeDto>> studentCoursesEntry : studentCoursesMap.entrySet()) {
 
-        if (!CollectionUtils.isEmpty(allServeStudentIds)){
-            List<StudentServeCourseHomeworkDto> studentHomeworks = studentCourseHomeworkDao.findStudentHomeworkWithCourseDateRange(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(allServeStudentIds));
-            studentHomeworkMap = studentHomeworks.stream().filter(h -> DateUtil.daysBetween(h.getCourseStartTime(), h.getHomeworkCreateTime())<3).collect(Collectors.groupingBy(StudentServeCourseHomeworkDto::getUserId));
-        }
+                List<StudentServeDto> haveCourseStudents = studentCoursesEntry.getValue().stream().filter(e -> Objects.nonNull(e.getCourseStartTime())).collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(haveCourseStudents)){
+                    noClassStudentIds.add(studentCoursesEntry.getKey());
+                    continue;
+                }
+                StudentServeDto studentServeDto = haveCourseStudents.stream().min(Comparator.comparing(StudentServeDto::getCourseStartTime)).get();
+                if(Objects.isNull(studentServeDto.getCourseStartTime())){
+                    noClassStudentIds.add(studentCoursesEntry.getKey());
+                    continue;
+                }
+                if(!studentServeDto.getCourseStartTime().before(nextMonday)){
+                    dontServeInCurrentWeekStudentIds.add(studentCoursesEntry.getKey());
+                    continue;
+                }
+                long count = haveCourseStudents.stream().filter(e -> (GroupType.PRACTICE.equals(e.getGroupType()) ||
+                        (GroupType.MUSIC.equals(e.getGroupType()) && TeachModeEnum.OFFLINE.equals(e.getTeachMode())))
+                        &&nextMonday.after(e.getCourseStartTime())).count();
+                if(count>0){
+                    haveClassStudentIds.add(studentCoursesEntry.getKey());
+                }else{
+                    noClassStudentIds.add(studentCoursesEntry.getKey());
+                }
+            }
 
-        if(!CollectionUtils.isEmpty(allServeStudentIds)){
-            List<ExtracurricularExercisesReply> studentExercises = extracurricularExercisesReplyDao.getStudentExercisesWithTimeZone(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(allServeStudentIds));
-            studentExercisesMap = studentExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getUserId));
-        }
+            Set<Integer> allServeStudentIds=new HashSet<>();
+            allServeStudentIds.addAll(haveClassStudentIds);
+            allServeStudentIds.addAll(noClassStudentIds);
 
-        List<StudentExtracurricularExercisesSituation> results=new ArrayList<>();
-        for (Map.Entry<Integer, List<StudentServeDto>> studentCoursesEntry : studentCoursesMap.entrySet()) {
+            Map<Integer, List<StudentServeCourseHomeworkDto>> studentHomeworkMap=new HashMap<>();
+            Map<Integer, List<ExtracurricularExercisesReply>> studentExercisesMap=new HashMap<>();
 
-            if(dontServeInCurrentWeekStudentIds.contains(studentCoursesEntry.getKey())){
-                continue;
+            if (!CollectionUtils.isEmpty(allServeStudentIds)){
+                List<StudentServeCourseHomeworkDto> studentHomeworks = studentCourseHomeworkDao.findStudentHomeworkWithCourseDateRange(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(allServeStudentIds));
+                studentHomeworkMap = studentHomeworks.stream().filter(h -> DateUtil.daysBetween(h.getCourseStartTime(), h.getHomeworkCreateTime())<3).collect(Collectors.groupingBy(StudentServeCourseHomeworkDto::getUserId));
             }
 
-            StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation();
-            studentExtracurricularExercisesSituation.setStudentId(studentCoursesEntry.getKey());
-            studentExtracurricularExercisesSituation.setTeacherId(studentCoursesEntry.getValue().get(0).getTeacherId());
-            studentExtracurricularExercisesSituation.setExpectExercisesNum(1);
-            studentExtracurricularExercisesSituation.setActualExercisesNum(0);
-            studentExtracurricularExercisesSituation.setExercisesReplyNum(0);
-            studentExtracurricularExercisesSituation.setExercisesMessageNum(0);
-            studentExtracurricularExercisesSituation.setExercisesMessageTimelyNum(0);
-            studentExtracurricularExercisesSituation.setWeekOfYear(nowDate.get(DateUtil.weekFields.weekOfYear()));
-            studentExtracurricularExercisesSituation.setMonday(DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"));
-            studentExtracurricularExercisesSituation.setSunday(DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"));
-
-            if(haveClassStudentIds.contains(studentCoursesEntry.getKey())){
-                studentExtracurricularExercisesSituation.setServeType("HOMEWORK");
+            if(!CollectionUtils.isEmpty(allServeStudentIds)){
+                List<ExtracurricularExercisesReply> studentExercises = extracurricularExercisesReplyDao.getStudentExercisesWithTimeZone(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(allServeStudentIds));
+                studentExercisesMap = studentExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getUserId));
             }
 
-            if(noClassStudentIds.contains(studentCoursesEntry.getKey())){
-                studentExtracurricularExercisesSituation.setServeType("EXERCISE");
-            }
+            for (Map.Entry<Integer, List<StudentServeDto>> studentCoursesEntry : studentCoursesMap.entrySet()) {
 
-            List<StudentServeCourseHomeworkDto> studentHomeworks = studentHomeworkMap.get(studentCoursesEntry.getKey());
-            if(!CollectionUtils.isEmpty(studentHomeworks)){
-                studentExtracurricularExercisesSituation.setActualExercisesNum(1);
-                long replyNum = studentHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())).count();
-                studentExtracurricularExercisesSituation.setExercisesReplyNum(replyNum>0?1:0);
-                long haveSubmitTimes = studentHomeworks.stream().filter(e -> Objects.nonNull(e.getSubmitTime())).count();
-                if(replyNum>0&&haveSubmitTimes>0){
-                    Date lastSubmitTime = studentHomeworks.stream().filter(e->Objects.nonNull(e.getSubmitTime())).max(Comparator.comparing(StudentServeCourseHomeworkDto::getSubmitTime)).get().getSubmitTime();
-                    studentExtracurricularExercisesSituation.setLastSubmitTime(lastSubmitTime);
+                if(dontServeInCurrentWeekStudentIds.contains(studentCoursesEntry.getKey())){
+                    continue;
                 }
-                int exercisesMessageNum=0;
-                int exercisesMessageTimelyNum=0;
-                for (StudentServeCourseHomeworkDto studentHomework : studentHomeworks) {
-                    if(!YesOrNoEnum.YES.equals(studentHomework.getStatus())){
-                        continue;
-                    }
-                    if(!YesOrNoEnum.YES.equals(studentHomework.getIsReplied())){
-                        continue;
-                    }
-                    exercisesMessageNum+=1;
-                    if(new Integer(1).equals(studentHomework.getIsRepliedTimely())){
-                        exercisesMessageTimelyNum+=1;
-                    }
+
+                StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation();
+                studentExtracurricularExercisesSituation.setStudentId(studentCoursesEntry.getKey());
+                studentExtracurricularExercisesSituation.setTeacherId(studentCoursesEntry.getValue().get(0).getTeacherId());
+                studentExtracurricularExercisesSituation.setExpectExercisesNum(1);
+                studentExtracurricularExercisesSituation.setActualExercisesNum(0);
+                studentExtracurricularExercisesSituation.setExercisesReplyNum(0);
+                studentExtracurricularExercisesSituation.setExercisesMessageNum(0);
+                studentExtracurricularExercisesSituation.setExercisesMessageTimelyNum(0);
+                studentExtracurricularExercisesSituation.setWeekOfYear(nowDate.get(DateUtil.weekFields.weekOfYear()));
+                studentExtracurricularExercisesSituation.setMonday(DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"));
+                studentExtracurricularExercisesSituation.setSunday(DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"));
+
+                if(haveClassStudentIds.contains(studentCoursesEntry.getKey())){
+                    studentExtracurricularExercisesSituation.setServeType("HOMEWORK");
                 }
-                studentExtracurricularExercisesSituation.setExercisesMessageNum(exercisesMessageNum>0?1:0);
-                studentExtracurricularExercisesSituation.setExercisesMessageTimelyNum(exercisesMessageTimelyNum>0?1:0);
-            }
 
-            List<ExtracurricularExercisesReply> studentExercises = studentExercisesMap.get(studentCoursesEntry.getKey());
-            if(!CollectionUtils.isEmpty(studentExercises)){
-                studentExtracurricularExercisesSituation.setActualExercisesNum(1);
-                long replyNum = studentExercises.stream().filter(e -> e.getStatus()==1).count();
-                if(studentExtracurricularExercisesSituation.getExercisesReplyNum()<=0){
-                    studentExtracurricularExercisesSituation.setExercisesReplyNum(replyNum>0?1:0);
+                if(noClassStudentIds.contains(studentCoursesEntry.getKey())){
+                    studentExtracurricularExercisesSituation.setServeType("EXERCISE");
                 }
-                long haveSubmitTimes = studentExercises.stream().filter(e->Objects.nonNull(e.getSubmitTime())).count();
-                if(replyNum>0&&haveSubmitTimes>0){
-                    Date lastSubmitTime = studentExercises.stream().filter(e->Objects.nonNull(e.getSubmitTime())).max(Comparator.comparing(ExtracurricularExercisesReply::getSubmitTime)).get().getSubmitTime();
-                    if(Objects.isNull(studentExtracurricularExercisesSituation.getLastSubmitTime())||lastSubmitTime.after(studentExtracurricularExercisesSituation.getLastSubmitTime())){
+
+                List<StudentServeCourseHomeworkDto> studentHomeworks = studentHomeworkMap.get(studentCoursesEntry.getKey());
+                if(!CollectionUtils.isEmpty(studentHomeworks)){
+                    studentExtracurricularExercisesSituation.setActualExercisesNum(1);
+                    long replyNum = studentHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())).count();
+                    studentExtracurricularExercisesSituation.setExercisesReplyNum(replyNum>0?1:0);
+                    long haveSubmitTimes = studentHomeworks.stream().filter(e -> Objects.nonNull(e.getSubmitTime())).count();
+                    if(replyNum>0&&haveSubmitTimes>0){
+                        Date lastSubmitTime = studentHomeworks.stream().filter(e->Objects.nonNull(e.getSubmitTime())).max(Comparator.comparing(StudentServeCourseHomeworkDto::getSubmitTime)).get().getSubmitTime();
                         studentExtracurricularExercisesSituation.setLastSubmitTime(lastSubmitTime);
                     }
+                    int exercisesMessageNum=0;
+                    int exercisesMessageTimelyNum=0;
+                    for (StudentServeCourseHomeworkDto studentHomework : studentHomeworks) {
+                        if(!YesOrNoEnum.YES.equals(studentHomework.getStatus())){
+                            continue;
+                        }
+                        if(!YesOrNoEnum.YES.equals(studentHomework.getIsReplied())){
+                            continue;
+                        }
+                        exercisesMessageNum+=1;
+                        if(new Integer(1).equals(studentHomework.getIsRepliedTimely())){
+                            exercisesMessageTimelyNum+=1;
+                        }
+                    }
+                    studentExtracurricularExercisesSituation.setExercisesMessageNum(exercisesMessageNum>0?1:0);
+                    studentExtracurricularExercisesSituation.setExercisesMessageTimelyNum(exercisesMessageTimelyNum>0?1:0);
                 }
-                int exercisesMessageNum=0;
-                int exercisesMessageTimelyNum=0;
-                for (ExtracurricularExercisesReply studentHomework : studentExercises) {
-                    if(!new Integer(1).equals(studentHomework.getStatus())){
-                        continue;
+
+                List<ExtracurricularExercisesReply> studentExercises = studentExercisesMap.get(studentCoursesEntry.getKey());
+                if(!CollectionUtils.isEmpty(studentExercises)){
+                    studentExtracurricularExercisesSituation.setActualExercisesNum(1);
+                    long replyNum = studentExercises.stream().filter(e -> e.getStatus()==1).count();
+                    if(studentExtracurricularExercisesSituation.getExercisesReplyNum()<=0){
+                        studentExtracurricularExercisesSituation.setExercisesReplyNum(replyNum>0?1:0);
                     }
-                    if(!new Integer(1).equals(studentHomework.getIsReplied())){
-                        continue;
+                    long haveSubmitTimes = studentExercises.stream().filter(e->Objects.nonNull(e.getSubmitTime())).count();
+                    if(replyNum>0&&haveSubmitTimes>0){
+                        Date lastSubmitTime = studentExercises.stream().filter(e->Objects.nonNull(e.getSubmitTime())).max(Comparator.comparing(ExtracurricularExercisesReply::getSubmitTime)).get().getSubmitTime();
+                        if(Objects.isNull(studentExtracurricularExercisesSituation.getLastSubmitTime())||lastSubmitTime.after(studentExtracurricularExercisesSituation.getLastSubmitTime())){
+                            studentExtracurricularExercisesSituation.setLastSubmitTime(lastSubmitTime);
+                        }
                     }
-                    exercisesMessageNum+=1;
-                    if(new Integer(1).equals(studentHomework.getIsRepliedTimely())){
-                        exercisesMessageTimelyNum+=1;
+                    int exercisesMessageNum=0;
+                    int exercisesMessageTimelyNum=0;
+                    for (ExtracurricularExercisesReply studentHomework : studentExercises) {
+                        if(!new Integer(1).equals(studentHomework.getStatus())){
+                            continue;
+                        }
+                        if(!new Integer(1).equals(studentHomework.getIsReplied())){
+                            continue;
+                        }
+                        exercisesMessageNum+=1;
+                        if(new Integer(1).equals(studentHomework.getIsRepliedTimely())){
+                            exercisesMessageTimelyNum+=1;
+                        }
+                    }
+                    if(studentExtracurricularExercisesSituation.getExercisesMessageNum()<=0){
+                        studentExtracurricularExercisesSituation.setExercisesMessageNum(exercisesMessageNum>0?1:0);
+                    }
+                    if(studentExtracurricularExercisesSituation.getExercisesMessageTimelyNum()<=0){
+                        studentExtracurricularExercisesSituation.setExercisesMessageTimelyNum(exercisesMessageTimelyNum>0?1:0);
                     }
                 }
-                if(studentExtracurricularExercisesSituation.getExercisesMessageNum()<=0){
-                    studentExtracurricularExercisesSituation.setExercisesMessageNum(exercisesMessageNum>0?1:0);
-                }
-                if(studentExtracurricularExercisesSituation.getExercisesMessageTimelyNum()<=0){
-                    studentExtracurricularExercisesSituation.setExercisesMessageTimelyNum(exercisesMessageTimelyNum>0?1:0);
-                }
+                results.add(studentExtracurricularExercisesSituation);
             }
-            results.add(studentExtracurricularExercisesSituation);
+
+            currentPage=currentPage.add(BigDecimal.ONE);
         }
 
         studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString());
 
-        BigDecimal currentPage=BigDecimal.ONE,
-                pageSize=new BigDecimal(10000),
-                total=new BigDecimal(results.size()),
-                totalPage=total.divide(pageSize, BigDecimal.ROUND_UP);
-        while (currentPage.compareTo(totalPage)<=0){
-            List<StudentExtracurricularExercisesSituation> rows=results.stream().skip(pageSize.multiply(currentPage.subtract(BigDecimal.ONE)).longValue()).limit(pageSize.longValue()).collect(Collectors.toList());
+        BigDecimal currentPage1=BigDecimal.ONE,
+                pageSize1=new BigDecimal(10000),
+                total1=new BigDecimal(results.size()),
+                totalPage1=total1.divide(pageSize1, BigDecimal.ROUND_UP);
+
+        while (currentPage1.compareTo(totalPage1)<=0){
+            List<StudentExtracurricularExercisesSituation> rows=results.stream().skip(pageSize1.multiply(currentPage1.subtract(BigDecimal.ONE)).longValue()).limit(pageSize1.longValue()).collect(Collectors.toList());
             studentExtracurricularExercisesSituationDao.batchInsert(rows);
-            currentPage=currentPage.add(BigDecimal.ONE);
+            currentPage1=currentPage1.add(BigDecimal.ONE);
         }
     }
 }

+ 7 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -1511,9 +1511,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(Objects.isNull(vipGroupId)||Objects.isNull(studentId)){
 			throw new BizException("请指定小课与学生");
 		}
-		if(Objects.isNull(amount)){
-			throw new BizException("请确定退费金额");
-		}
 		VipGroup vipGroup=vipGroupDao.get(vipGroupId);
 		if(Objects.isNull(vipGroup)){
 			throw new BizException("指定的课程不存在");
@@ -1541,8 +1538,14 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		}
 
         if(classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT_SCHOOL)){
-            throw new BizException("当前学生已是休学状态");
+			classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT);
+			classGroupStudentMapperDao.update(classStudentMapperByUserIdAndClassGroupId);
+			studentPauseInfoDao.deleteUserPauseInfoWithGroup(GroupType.VIP, vipGroupId.toString(), studentId);
+			return;
         }
+		if(Objects.isNull(amount)){
+			throw new BizException("请确定退费金额");
+		}
 
 		sysUserCashAccountService.updateBalance(studentId, amount);
 		SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(studentId);

+ 14 - 0
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -299,4 +299,18 @@
     <select id="findStudentExercisesSituationsWithMonDay" resultMap="StudentExtracurricularExercisesSituation">
 		SELECT * FROM student_extracurricular_exercises_situation_ WHERE monday_=#{monday} AND student_id_=#{studentId}
 	</select>
+    <select id="getNoFinishedServiceTeacher" resultType="java.util.Map">
+		SELECT
+			teacher_id_ AS 'key',
+			COUNT( student_id_ ) AS 'value'
+		FROM
+			student_extracurricular_exercises_situation_
+		WHERE
+			actual_exercises_num_ = 0
+			AND serve_type_ = 'EXERCISE'
+			AND monday_ = #{monday}
+			AND teacher_id_ IS NOT NULL
+		GROUP BY
+			teacher_id_
+	</select>
 </mapper>

+ 44 - 1
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -398,7 +398,7 @@
             s.teacher_id_,
             cs.group_type_,
             cs.teach_mode_,
-            IF(CONCAT( cs.class_date_, ' ', cs.end_class_time_ )&lt;NOW() AND (sa.status_ != 'NORMAL' OR sa.status_ IS NULL), NULL, cs.class_date_) course_start_time_
+            IF(CONCAT( cs.class_date_, ' ', cs.end_class_time_ )&lt;#{courseExpireDate} AND (sa.status_ != 'NORMAL' OR sa.status_ IS NULL), NULL, cs.class_date_) course_start_time_
         FROM
             student s
             LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = s.user_id_
@@ -409,4 +409,47 @@
         WHERE
             s.service_tag_ = 1
     </select>
+    <select id="getBeServiceStudentsInfoWithStudents" resultMap="StudentServeDto">
+        SELECT
+            s.user_id_,
+            s.teacher_id_,
+            cs.group_type_,
+            cs.teach_mode_,
+            IF(CONCAT( cs.class_date_, ' ', cs.end_class_time_ )&lt;#{courseExpireDate} AND (sa.status_ != 'NORMAL' OR sa.status_ IS NULL), NULL, cs.class_date_) course_start_time_
+        FROM
+          student s
+        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = s.user_id_
+        LEFT JOIN student_attendance sa ON cssp.course_schedule_id_=sa.course_schedule_id_ AND sa.user_id_=cssp.user_id_
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        AND cs.group_type_ IN ('VIP', 'PRACTICE')
+        AND CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) > #{monday}
+        WHERE
+        s.service_tag_ = 1 AND s.user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+    </select>
+    <select id="getBeServiceStudentsInfoWithStudentsForHistory" resultMap="StudentServeDto">
+        SELECT
+            s.student_id_ user_id_,
+            s.teacher_id_,
+            cs.group_type_,
+            cs.teach_mode_,
+            IF(CONCAT( cs.class_date_, ' ', cs.end_class_time_ )&lt;#{courseExpireDate} AND (sa.status_ != 'NORMAL' OR sa.status_ IS NULL), NULL, cs.class_date_) course_start_time_
+        FROM
+          student_extracurricular_exercises_situation_ s
+        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = s.student_id_
+        LEFT JOIN student_attendance sa ON cssp.course_schedule_id_=sa.course_schedule_id_ AND sa.user_id_=cssp.user_id_
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        AND cs.group_type_ IN ('VIP', 'PRACTICE')
+        AND CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) > #{monday}
+        WHERE
+        s.monday_ = #{monday} AND s.student_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+    </select>
+    <select id="getServeStudentIds" resultType="int">
+        SELECT user_id_ FROM student WHERE service_tag_=1
+    </select>
 </mapper>

+ 7 - 0
mec-biz/src/main/resources/config/mybatis/StudentPauseInfoMapper.xml

@@ -71,6 +71,13 @@
     <delete id="delete">
 		DELETE FROM student_pause_info WHERE id_ = #{id}
 	</delete>
+    <update id="deleteUserPauseInfoWithGroup">
+        UPDATE student_pause_info SET del_flag_ = 1
+        WHERE
+            group_type_ = #{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            AND music_group_id_ = #{groupId}
+            AND user_id_ = #{userId}
+    </update>
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="StudentPauseInfo" parameterType="map">

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -125,4 +125,8 @@ public interface TaskRemoteService {
 	@GetMapping("task/updateMusicGroupPaymentCalenderStatus")
 	void updateMusicGroupPaymentCalenderStatus();
 
+	//老师本周应布置课外训练
+	@GetMapping("task/studentServeRemind")
+	void studentServeRemind();
+
 }

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -155,4 +155,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void pushTeacherExceptionAttendanceTask() {
 		logger.info("教师异常考勤推送失败");
 	}
+
+	@Override
+	public void studentServeRemind() {
+		logger.info("本周应布置课外训练推送失败");
+	}
 }

+ 23 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/StudentServeRemindTask.java

@@ -0,0 +1,23 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author Joburgess
+ * @Date 2020.06.04
+ */
+@Service
+public class StudentServeRemindTask extends BaseTask {
+
+    @Autowired
+    private TaskRemoteService taskRemoteService;
+
+    @Override
+    public void execute() throws TaskException {
+        taskRemoteService.studentServeRemind();
+    }
+}

+ 8 - 4
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -756,6 +756,9 @@ public class ExportController extends BaseController {
             if (row.getActualAmount() == null) {
                 row.setActualAmount(BigDecimal.ZERO);
             }
+            if (row.getBalancePaymentAmount() == null) {
+                row.setBalancePaymentAmount(BigDecimal.ZERO);
+            }
             BigDecimal transferFee = (row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_UP);
             row.setTransferFee(transferFee);
             BigDecimal musicalFee = BigDecimal.ZERO;
@@ -855,9 +858,9 @@ public class ExportController extends BaseController {
         }
 
         try {
-            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "支付金额", "到账时间",
+            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户","应付金额", "现金支付","余额支付", "到账时间",
                     "关联乐团ID/VIP课ID", "课程形态", "课程费用", "减免费用", "押金", "乐器", "教辅费用", "零星收款费用", "零星收款类别", "手续费", "专业", "分部", "单位/学校", "合作机构", "备注"};
-            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "actualAmount", "payTime", "musicGroupId",
+            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos","expectAmount", "actualAmount","balancePaymentAmount", "payTime", "musicGroupId",
                     "groupType.desc", "courseFee", "remitFee", "leaseFee", "musicalFee", "teachingFee", "sporadicAmount", "sporadicType", "transferFee", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
             response.setContentType("application/octet-stream");
@@ -1273,8 +1276,9 @@ public class ExportController extends BaseController {
         OutputStream ouputStream = null;
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(
-                    new String[]{"学员编号", "学员姓名", "所属分部", "指导老师","教务老师", "预期安排", "实际安排", "提交次数", "评价次数", "及时评价次数", "付费网管课", "VIP课"},
-                    new String[]{"studentId", "studentName", "organName", "teacherName","educationalTeacherName", "expectExercisesNum", "actualExercisesNum", "exercisesReplyNum", "exercisesMessageNum", "exercisesMessageTimelyNum", "existPracticeCourse", "existVipCourse"}, rows);
+                    new String[]{"学员编号", "学员姓名", "所属分部", "指导老师","教务老师", "预期安排", "实际安排", "提交次数", "评价次数", "及时评价次数", "付费网管课", "VIP课", "作业提交时间"},
+                    new String[]{"studentId", "studentName", "organName", "teacherName","educationalTeacherName", "expectExercisesNum", "actualExercisesNum", "exercisesReplyNum",
+                            "exercisesMessageNum", "exercisesMessageTimelyNum", "existPracticeCourse", "existVipCourse", "lastSubmitTime"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
             ouputStream = response.getOutputStream();

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -58,6 +58,9 @@ public class TaskController extends BaseController {
 
 	@Autowired
 	private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
+
+	@Autowired
+	private ExtracurricularExercisesService extracurricularExercisesService;
 	
 	@Autowired
 	private StudentService studentService;
@@ -251,4 +254,10 @@ public class TaskController extends BaseController {
 	public void pushTeacherExceptionAttendanceTask() {
 		teacherAttendanceService.pushTeacherExceptionAttendanceTask();
 	}
+
+	//应布置课外训练提醒
+	@GetMapping("/studentServeRemind")
+	public void studentServeRemind(){
+		extracurricularExercisesService.studentServeRemind();
+	}
 }