소스 검색

Merge remote-tracking branch 'origin/master'

zouxuan 4 년 전
부모
커밋
36980a5261
24개의 변경된 파일787개의 추가작업 그리고 149개의 파일을 삭제
  1. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  3. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  4. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceDto.java
  5. 78 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServeCourseDto.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java
  7. 34 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentExtracurricularExercisesSituation.java
  8. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  9. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/event/listener/CourseEventListener.java
  10. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  11. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesMessageService.java
  12. 14 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentServeService.java
  13. 9 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  14. 48 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  15. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  16. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  17. 195 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  18. 9 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  19. 197 119
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  20. 38 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  21. 9 4
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  22. 7 2
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  23. 5 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseHomeworkReplyController.java
  24. 5 2
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -440,4 +440,16 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
     BigDecimal countFinishCoursePriceWithMusicGroup(@Param("groupId") String groupId,
                                                     @Param("groupType") GroupType groupType,
                                                     @Param("userId") Integer userId);
+
+    /**
+     * @describe 获取学生指定日期之前指定类型的最后一节课
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param studentId:
+     * @param monday:
+     * @return com.ym.mec.biz.dal.entity.CourseSchedule
+     */
+    CourseSchedule getStudentHistoryLastCourse(@Param("studentId") Integer studentId,
+                                               @Param("monday") String monday,
+                                               @Param("courseType")CourseSchedule.CourseScheduleType courseType);
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -97,6 +97,9 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
 
     List<StudentServeCourseDto> getServeStudentCourseStartTimes(@Param("monday") String monday);
 
+    List<StudentServeCourseDto> getStudentFutureCourseInfo(@Param("monday") String monday,
+                                                           @Param("studentIds") List<Integer> studentIds);
+
     /**
      * @param monday:
      * @return java.util.List<com.ym.mec.biz.dal.dto.StudentServeDto>

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java

@@ -20,6 +20,8 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
      */
     int batchInsert(@Param("situations")List<StudentExtracurricularExercisesSituation> situations);
 
+    int batchUpdate(@Param("situations")List<StudentExtracurricularExercisesSituation> situations);
+
     /**
      * @describe 根据周一日期删除统计信息
      * @author Joburgess
@@ -54,6 +56,8 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
     List<TeacherExercisesServiceDto> findTeacherExercisesServiceSituations(@Param("monday") String monday,
                                                                            @Param("teacherIds") List<Integer> teacherIds);
 
+    List<StudentExtracurricularExercisesSituation> findTeacherNoStartServices(@Param("teacherId") Integer teacherId);
+
     /**
      * @describe 统计上周数据今日跟新的条数
      * @author Joburgess
@@ -83,4 +87,23 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
      */
     List<Map<Integer, Long>> getNoFinishedServiceTeacher(@Param("monday") String monday);
 
+    /**
+     * @describe 统计指定星期的服务记录数量
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param sunday:
+     * @return int
+     */
+    int countWeekServiceNum(@Param("sunday") String sunday);
+
+    /**
+     * @describe 获取指定周指定学员的服务指标
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param monday:
+     * @param studentIds:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation>
+     */
+    List<StudentExtracurricularExercisesSituation> findWeekServiceWithStudents(@Param("monday") String monday,
+                                                                               @Param("studentIds") List<Integer> studentIds);
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceDto.java

@@ -17,11 +17,24 @@ public class StudentAttendanceDto {
 
     private Long courseScheduleId;
 
+    @ApiModelProperty(value = "签退附件")
+    private String signOutAttachments;
+
     @ApiModelProperty(value = "备注",required = false)
     private String remark;
 
+    private String deviceNum;
+
     private List<StudentAttendance> studentAttendances;
 
+    public String getDeviceNum() {
+        return deviceNum;
+    }
+
+    public void setDeviceNum(String deviceNum) {
+        this.deviceNum = deviceNum;
+    }
+
     public String getRemark() {
         return remark;
     }
@@ -61,4 +74,12 @@ public class StudentAttendanceDto {
     public void setStudentAttendances(List<StudentAttendance> studentAttendances) {
         this.studentAttendances = studentAttendances;
     }
+
+    public String getSignOutAttachments() {
+        return signOutAttachments;
+    }
+
+    public void setSignOutAttachments(String signOutAttachments) {
+        this.signOutAttachments = signOutAttachments;
+    }
 }

+ 78 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServeCourseDto.java

@@ -1,5 +1,9 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.TeachModeEnum;
+
 import java.util.Date;
 
 /**
@@ -10,10 +14,48 @@ public class StudentServeCourseDto {
 
     private Integer studentId;
 
+    private Integer leadTeacherId;
+
+    private Long courseScheduleId;
+
+    private GroupType groupType;
+
+    private String musicGroupId;
+
+    private CourseSchedule.CourseScheduleType type;
+
+    private Integer actualTeacherId;
+
     private Date courseStartTime;
 
     private Date serviceTagUpdateTime;
 
+    private TeachModeEnum teachMode;
+
+    public Integer getLeadTeacherId() {
+        return leadTeacherId;
+    }
+
+    public void setLeadTeacherId(Integer leadTeacherId) {
+        this.leadTeacherId = leadTeacherId;
+    }
+
+    public TeachModeEnum getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(TeachModeEnum teachMode) {
+        this.teachMode = teachMode;
+    }
+
+    public Date getCourseStartTime() {
+        return courseStartTime;
+    }
+
+    public void setCourseStartTime(Date courseStartTime) {
+        this.courseStartTime = courseStartTime;
+    }
+
     public Date getServiceTagUpdateTime() {
         return serviceTagUpdateTime;
     }
@@ -30,11 +72,43 @@ public class StudentServeCourseDto {
         this.studentId = studentId;
     }
 
-    public Date getCourseStartTime() {
-        return courseStartTime;
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
     }
 
-    public void setCourseStartTime(Date courseStartTime) {
-        this.courseStartTime = courseStartTime;
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public CourseSchedule.CourseScheduleType getType() {
+        return type;
+    }
+
+    public void setType(CourseSchedule.CourseScheduleType type) {
+        this.type = type;
+    }
+
+    public Integer getActualTeacherId() {
+        return actualTeacherId;
+    }
+
+    public void setActualTeacherId(Integer actualTeacherId) {
+        this.actualTeacherId = actualTeacherId;
     }
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java

@@ -88,10 +88,21 @@ public class TeacherAttendanceDto {
     @ApiModelProperty(value = "是否是第一次进行学生点名")
     private int studentAttendanceIsFirstTime;
 
+    @ApiModelProperty(value = "能否布置作业")
+    private int enableAssignHomework;
+
     private Integer enableStudentAttendanceTimeRange;
 
     private Integer enableStudentAttendanceTimeRangeVip;
 
+    public int getEnableAssignHomework() {
+        return enableAssignHomework;
+    }
+
+    public void setEnableAssignHomework(int enableAssignHomework) {
+        this.enableAssignHomework = enableAssignHomework;
+    }
+
     public Integer getEnableStudentAttendanceTimeRangeVip() {
         return enableStudentAttendanceTimeRangeVip;
     }

+ 34 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentExtracurricularExercisesSituation.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.util.Date;
@@ -52,6 +53,34 @@ public class StudentExtracurricularExercisesSituation {
 
 	private String serveType;
 
+	private String courseIds;
+
+	public StudentExtracurricularExercisesSituation() {
+	}
+
+	public StudentExtracurricularExercisesSituation(Integer studentId, Integer teacherId, Integer weekOfYear, Date monday, Date sunday,  String serveType, String courseIds) {
+		this.studentId = studentId;
+		this.weekOfYear = weekOfYear;
+		this.monday = monday;
+		this.sunday = sunday;
+		this.teacherId = teacherId;
+		this.serveType = serveType;
+		this.courseIds = courseIds;
+		this.expectExercisesNum = 1;
+		this.actualExercisesNum = 0;
+		this.exercisesReplyNum = 0;
+		this.exercisesMessageNum = 0;
+		this.exercisesMessageTimelyNum = 0;
+	}
+
+	public String getCourseIds() {
+		return courseIds;
+	}
+
+	public void setCourseIds(String courseIds) {
+		this.courseIds = courseIds;
+	}
+
 	public String getServeType() {
 		return serveType;
 	}
@@ -171,7 +200,11 @@ public class StudentExtracurricularExercisesSituation {
 	public java.util.Date getUpdateTime(){
 		return this.updateTime;
 	}
-			
+
+	public String getStuAndTeaCode(){
+		return StringUtils.join(this.studentId, this.teacherId);
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java

@@ -102,6 +102,17 @@ public class TeacherAttendance {
 	@ApiModelProperty(value = "考勤申述凭证")
 	private String url;
 
+	@ApiModelProperty(value = "设备号")
+	private String deviceNum;
+
+	public String getDeviceNum() {
+		return deviceNum;
+	}
+
+	public void setDeviceNum(String deviceNum) {
+		this.deviceNum = deviceNum;
+	}
+
 	public String getUrl() {
 		return url;
 	}

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/event/listener/CourseEventListener.java

@@ -1,7 +1,10 @@
 package com.ym.mec.biz.event.listener;
 
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.event.CourseStatusChangeEvent;
 import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.common.redis.service.RedisCache;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -9,8 +12,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * @Author qnc99
@@ -27,6 +34,10 @@ public class CourseEventListener {
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
     @Autowired
     private RedisCache<String, Object> redisCache;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private StudentServeService studentServeService;
 
     @Async
     @EventListener
@@ -50,4 +61,29 @@ public class CourseEventListener {
             redisCache.delete(KEY);
         }
     }
+
+    @Async
+    @EventListener
+    public void courseStatusChangeMonitor2(CourseStatusChangeEvent courseStatusChangeEvent){
+        if(redisCache.getRedisTemplate().opsForValue().size("exercisesSituationStatistics2")>0){
+            return;
+        }
+
+        Boolean success = redisCache.getRedisTemplate().opsForValue().setIfAbsent("exercisesSituationStatistics2", Thread.currentThread().getId(), 1, TimeUnit.HOURS);
+        if(!success){
+            return;
+        }
+
+
+        try{
+            List<CourseScheduleStudentPayment> cssps = courseScheduleStudentPaymentDao.findByCourseScheduleIds(new ArrayList<>(courseStatusChangeEvent.getCourseIds()));
+            if(CollectionUtils.isEmpty(cssps)){
+                return;
+            }
+            List<Integer> studentIds = cssps.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
+            studentServeService.exercisesSituationStatistics2(null,studentIds);
+        } finally {
+            redisCache.delete("exercisesSituationStatistics2");
+        }
+    }
 }

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java

@@ -185,4 +185,22 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherAttendanceDto>
      */
     List<TeacherAttendancesDto> getCourseTeachers(Long courseScheduleId);
+
+    /**
+     * @describe 工资奖金标记
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @return void
+     */
+    void salaryMark();
+
+    /**
+     * @describe 组合工资,使其最接近给定的金额
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param salaries:
+     * @param targetSalary:
+     * @return void
+     */
+    List<BigDecimal> salaryComposition(List<BigDecimal> salaries, BigDecimal targetSalary);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesMessageService.java

@@ -16,6 +16,8 @@ public interface ExtracurricularExercisesMessageService extends BaseService<Long
      */
     void addStudentExtraExerciseComment(ExtracurricularExercisesMessage extracurricularExercisesMessage);
 
+
+
     /**
      * @describe 获取学生课外作业评论列表
      * @author Joburgess

+ 14 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/StudentServeService.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.service;
 
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @Author Joburgess
@@ -17,6 +19,8 @@ public interface StudentServeService {
      */
     void exercisesSituationStatistics(String monday);
 
+    void exercisesSituationStatistics2(String monday, List<Integer> studentIds);
+
     /**
      * @describe
      * @author Joburgess
@@ -25,6 +29,15 @@ public interface StudentServeService {
      * @param studentIds:
      * @return int
      */
-    Map<String, Object> checkeIsAssignHomework(Long courseScheduleId, String studentIds);
+    Map<String, Object> checkeIsAssignHomework(Long courseScheduleId, String studentIds, Integer teacherId);
+
+    /**
+     * @describe 获取教师应布置课程编号列表
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param teacherId:
+     * @return java.util.Set<java.lang.Long>
+     */
+    Set<Long> getTeacherServeCourseIds(Integer teacherId);
 
 }

+ 9 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -30,6 +30,7 @@ import java.util.TreeSet;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import com.ym.mec.biz.service.*;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -144,17 +145,6 @@ import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseScheduleRecordQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
 import com.ym.mec.biz.event.source.CourseEventSource;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.PracticeGroupService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
@@ -252,6 +242,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
     @Autowired
 	private CourseEventSource courseEventSource;
+    @Autowired
+	private StudentServeService studentServeService;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -297,7 +289,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             currentCourseDetail.setOnlyNormal(YesOrNoEnum.NO);
         }
 
-        currentCourseDetail.setCurrentClassTimes(courseScheduleDao.countClassGroupOverCourseNum(currentCourseDetail.getClassId()));
+		Set<Long> teacherServeCourseIds = studentServeService.getTeacherServeCourseIds(user.getId());
+        if(teacherServeCourseIds.contains(courseID)){
+			currentCourseDetail.setEnableAssignHomework(1);
+		}
+
+		currentCourseDetail.setCurrentClassTimes(courseScheduleDao.countClassGroupOverCourseNum(currentCourseDetail.getClassId()));
         SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE);
         SysConfig sysConfigVip = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
         currentCourseDetail.setEnableStudentAttendanceTimeRange(sysConfig.getParanValue(Integer.class));

+ 48 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -1352,4 +1352,52 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         }
         return result;
     }
+
+    @Override
+    public void salaryMark() {
+
+    }
+
+    @Override
+    public List<BigDecimal> salaryComposition(List<BigDecimal> salaries, BigDecimal targetSalary) {
+        int target = targetSalary.intValue();
+        BigDecimal zero = new BigDecimal(0);
+
+        List<List<List<BigDecimal>>> result = new LinkedList<>();
+        for(int j=0;j<2;j++){
+            result.add(new ArrayList<>());
+            for(int i=0;i<target+1;i++){
+                List<List<BigDecimal>> t=new ArrayList<>();
+                List<BigDecimal> b = new ArrayList<BigDecimal>();
+                b.add(zero);
+                t.add(b);
+                result.get(j).addAll(t);
+            }
+        }
+
+        int salary_index_pre = 0;
+        int salary_index_cur = 1;
+
+        for(int i=1;i<salaries.size()+1;i++){
+            for(int j = 1;j<target+1;j++){
+                if(j<salaries.get(i-1).intValue()){
+                    result.get(salary_index_cur).get(j).clear();
+                    result.get(salary_index_cur).get(j).addAll(result.get(salary_index_pre).get(j));
+                }else{
+                    BigDecimal pre = result.get(salary_index_pre).get(j).stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+                    BigDecimal t = result.get(salary_index_pre).get(j-salaries.get(i-1).intValue()).stream().reduce(BigDecimal.ZERO, BigDecimal::add).add(salaries.get(i-1));
+                    if(t.compareTo(pre)>0){
+                        result.get(salary_index_cur).get(j).clear();
+                        result.get(salary_index_cur).get(j).addAll(result.get(salary_index_pre).get(j-salaries.get(i-1).intValue()));
+                        result.get(salary_index_cur).get(j).add(salaries.get(i-1));
+                    }else{
+                        result.get(salary_index_cur).get(j).clear();
+                        result.get(salary_index_cur).get(j).addAll(result.get(salary_index_pre).get(j));
+                    }
+                }
+            }
+            Collections.swap(result, 0, 1);
+        }
+        return result.get(0).get(target);
+    }
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -278,6 +278,8 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         teacherAttendance.setSignOutStatus(isInScore?YesOrNoEnum.YES:YesOrNoEnum.NO);
         teacherAttendance.setCurrentClassTimes(classTimes + 1);
         teacherAttendance.setRemark(studentAttendanceInfos.getRemark());
+        teacherAttendance.setDeviceNum(studentAttendanceInfos.getDeviceNum());
+        teacherAttendance.setSignOutAttachments(studentAttendanceInfos.getSignOutAttachments());
         if (Objects.nonNull(teacherAttendance.getId())) {
             teacherAttendanceDao.update(teacherAttendance);
         } else {

+ 0 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java

@@ -60,8 +60,6 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 			pageInfo.setTotal(count);
 			params.put("offset", pageInfo.getOffset());
 			dataList = studentExtracurricularExercisesSituationDao.findExercisesSituations(params);
-			long until = LocalDateTime.ofInstant(queryInfo.getMonday().toInstant(), DateUtil.zoneId).until(LocalDateTime.ofInstant(queryInfo.getSunday().toInstant(), DateUtil.zoneId), ChronoUnit.WEEKS);
-
 			List<Integer> studentIds = dataList.stream().map(StudentExtracurricularExercisesSituation::getStudentId).collect(Collectors.toList());
 			List<Map<Integer, Long>> studentVipCoursesMaps = courseScheduleDao.countStudentVipCoursesWithDate(studentIds, queryInfo.getMonday(), queryInfo.getSunday(), GroupType.VIP);
 			Map<Integer, Long> studentVipCourseMap = MapUtil.convertIntegerMap(studentVipCoursesMaps);

+ 195 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java

@@ -45,6 +45,8 @@ public class StudentServeServiceImpl implements StudentServeService {
     private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
     @Autowired
     private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+    @Autowired
+    private StudentServeService studentServeService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -288,8 +290,189 @@ public class StudentServeServiceImpl implements StudentServeService {
     }
 
     @Override
-    public Map<String, Object> checkeIsAssignHomework(Long courseScheduleId, String studentIdsStr) {
+    @Transactional(rollbackFor = Exception.class)
+    public void exercisesSituationStatistics2(String monday, List<Integer> studentIds) {
+        LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+
+        if(StringUtils.isNotBlank(monday)){
+            nowDate=LocalDate.parse(monday, DateUtil.dateFormatter);
+        }
+
+        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+        LocalDate sunDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue());
+        Date nextMonday = Date.from(sunDayDate.plusDays(1).atStartOfDay(DateUtil.zoneId).toInstant());
+
+        int weekServiceNum = studentExtracurricularExercisesSituationDao.countWeekServiceNum(monDayDate.toString());
+        if(weekServiceNum>0&&CollectionUtils.isEmpty(studentIds)){
+            return;
+        }
+
+        List<StudentServeCourseDto> studentFutureCourseInfo = studentDao.getStudentFutureCourseInfo(monDayDate.toString(), studentIds);
+        Map<Integer, List<StudentServeCourseDto>> studentCourseMap = studentFutureCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getStudentId));
+
+        List<StudentExtracurricularExercisesSituation> results=new ArrayList<>();
+
+        for (Map.Entry<Integer, List<StudentServeCourseDto>> studentCourseMapEntry : studentCourseMap.entrySet()) {
+            Map<CourseSchedule.CourseScheduleType, List<StudentServeCourseDto>> typeCourseMap = studentCourseMapEntry.getValue().stream().collect(Collectors.groupingBy(StudentServeCourseDto::getType));
+
+            if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.SINGLE)){
+                List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.SINGLE);
+                List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.SINGLE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(weekCourseInfo)){
+                    StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                            futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                            DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                            "EXERCISE", null);
+                    results.add(studentExtracurricularExercisesSituation);
+                }else{
+                    Map<String, List<StudentServeCourseDto>> groupCourseInfo = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getMusicGroupId));
+                    Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
+                    for (Map.Entry<String, List<StudentServeCourseDto>> groupCourseInfoEntry : groupCourseInfo.entrySet()) {
+                        StudentServeCourseDto courseInfo = groupCourseInfoEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
+                        if(!teacherServiceCourseIdMap.containsKey(courseInfo.getActualTeacherId())){
+                            teacherServiceCourseIdMap.put(courseInfo.getActualTeacherId(), new HashSet<>());
+                        }
+                        teacherServiceCourseIdMap.get(courseInfo.getActualTeacherId()).add(courseInfo.getCourseScheduleId());
+                    }
+                    for (Map.Entry<Integer, Set<Long>> teacherServiceCourseIdMapEntry : teacherServiceCourseIdMap.entrySet()) {
+                        StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                teacherServiceCourseIdMapEntry.getKey(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                "HOMEWORK", StringUtils.join(teacherServiceCourseIdMapEntry.getValue(), ","));
+                        studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherServiceCourseIdMapEntry.getValue().size());
+                        results.add(studentExtracurricularExercisesSituation);
+                    }
+                }
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.VIP)){
+                List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP);
+                List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP).stream().filter(c -> TeachModeEnum.ONLINE.equals(c.getTeachMode()) && c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(weekCourseInfo)){
+                    StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                            futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                            DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                            "EXERCISE", null);
+                    results.add(studentExtracurricularExercisesSituation);
+                }else{
+                    Map<Integer, List<StudentServeCourseDto>> teacherCourseMap = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getActualTeacherId));
+                    Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
+                    for (Map.Entry<Integer, List<StudentServeCourseDto>> teacherCourseMapEntry : teacherCourseMap.entrySet()) {
+                        StudentServeCourseDto courseInfo = teacherCourseMapEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
+                        teacherServiceCourseIdMap.put(teacherCourseMapEntry.getKey(), new HashSet<>());
+                        teacherServiceCourseIdMap.get(teacherCourseMapEntry.getKey()).add(courseInfo.getCourseScheduleId());
+                    }
+                    for (Map.Entry<Integer, Set<Long>> teacherServiceCourseIdMapEntry : teacherServiceCourseIdMap.entrySet()) {
+                        StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                teacherServiceCourseIdMapEntry.getKey(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                "HOMEWORK", StringUtils.join(teacherServiceCourseIdMapEntry.getValue(), ","));
+                        studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherServiceCourseIdMapEntry.getValue().size());
+                        results.add(studentExtracurricularExercisesSituation);
+                    }
+                }
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.MIX)){
+                CourseSchedule studentHistoryLastCourse = courseScheduleStudentPaymentDao.getStudentHistoryLastCourse(studentCourseMapEntry.getKey(), monDayDate.toString(), CourseSchedule.CourseScheduleType.SINGLE);
+                StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                        Objects.isNull(studentHistoryLastCourse)?studentCourseMapEntry.getValue().get(0).getLeadTeacherId():studentHistoryLastCourse.getActualTeacherId(),
+                        nowDate.get(DateUtil.weekFields.weekOfYear()),
+                        DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                        "EXERCISE", null);
+                if(Objects.isNull(studentExtracurricularExercisesSituation.getTeacherId())){
+                    continue;
+                }
+                results.add(studentExtracurricularExercisesSituation);
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.PRACTICE)){
+                List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE);
+                List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(weekCourseInfo)){
+                    StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                            futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                            DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                            "EXERCISE", null);
+                    results.add(studentExtracurricularExercisesSituation);
+                }else{
+                    Map<Integer, List<StudentServeCourseDto>> teacherCourseMap = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getActualTeacherId));
+                    Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
+                    for (Map.Entry<Integer, List<StudentServeCourseDto>> teacherCourseMapEntry : teacherCourseMap.entrySet()) {
+                        StudentServeCourseDto courseInfo = teacherCourseMapEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
+                        teacherServiceCourseIdMap.put(teacherCourseMapEntry.getKey(), new HashSet<>());
+                        teacherServiceCourseIdMap.get(teacherCourseMapEntry.getKey()).add(courseInfo.getCourseScheduleId());
+                    }
+                    for (Map.Entry<Integer, Set<Long>> teacherServiceCourseIdMapEntry : teacherServiceCourseIdMap.entrySet()) {
+                        StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                teacherServiceCourseIdMapEntry.getKey(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                "HOMEWORK", StringUtils.join(teacherServiceCourseIdMapEntry.getValue(), ","));
+                        studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherServiceCourseIdMapEntry.getValue().size());
+                        results.add(studentExtracurricularExercisesSituation);
+                    }
+                }
+            }else{
+                continue;
+            }
+        }
+
+        if(CollectionUtils.isEmpty(studentIds)){
+            studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString());
+            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);
+                currentPage1=currentPage1.add(BigDecimal.ONE);
+            }
+            return;
+        }
+
+        List<StudentExtracurricularExercisesSituation> weekServiceWithStudents = studentExtracurricularExercisesSituationDao.findWeekServiceWithStudents(monDayDate.toString(), studentIds);
+        Map<String, StudentExtracurricularExercisesSituation> codeServeMap = weekServiceWithStudents.stream().collect(Collectors.toMap(StudentExtracurricularExercisesSituation::getStuAndTeaCode, s -> s, (s1, s2) -> s1));
+
+        Set<String> newCodes = results.stream().map(StudentExtracurricularExercisesSituation::getStuAndTeaCode).collect(Collectors.toSet());
+        for (StudentExtracurricularExercisesSituation weekServiceWithStudent : weekServiceWithStudents) {
+            if(weekServiceWithStudent.getActualExercisesNum()>0||newCodes.contains(weekServiceWithStudent.getStuAndTeaCode())){
+                continue;
+            }
+            studentExtracurricularExercisesSituationDao.delete(weekServiceWithStudent.getId());
+        }
+
+        List<StudentExtracurricularExercisesSituation> newService = new ArrayList<>();
+        List<StudentExtracurricularExercisesSituation> updateService = new ArrayList<>();
+        for (StudentExtracurricularExercisesSituation result : results) {
+            if(codeServeMap.containsKey(result.getStuAndTeaCode())){
+                StudentExtracurricularExercisesSituation s = codeServeMap.get(result.getStuAndTeaCode());
+                List<Long> courseIds = new ArrayList<>();
+                if(StringUtils.isNotBlank(s.getCourseIds())&&s.getActualExercisesNum()>0){
+                    courseIds = Arrays.stream(s.getCourseIds().split(",")).map(id->Long.valueOf(id)).collect(Collectors.toList());
+                }
+                if(StringUtils.isNotBlank(result.getCourseIds())){
+                    courseIds.addAll(Arrays.stream(result.getCourseIds().split(",")).map(id->Long.valueOf(id)).collect(Collectors.toList()));
+                }
+                s.setCourseIds(StringUtils.join(courseIds, ","));
+                s.setExpectExercisesNum(courseIds.size());
+                updateService.add(s);
+            }else{
+                newService.add(result);
+            }
+        }
+        if(!CollectionUtils.isEmpty(updateService))
+            studentExtracurricularExercisesSituationDao.batchUpdate(updateService);
+        if(!CollectionUtils.isEmpty(newService))
+            studentExtracurricularExercisesSituationDao.batchInsert(newService);
+    }
+
+    @Override
+    public Map<String, Object> checkeIsAssignHomework(Long courseScheduleId, String studentIdsStr, Integer teacherId) {
         Map<String, Object> result=new HashMap<>();
+
+        Set<Long> teacherServeCourseIds = studentServeService.getTeacherServeCourseIds(teacherId);
+        if(teacherServeCourseIds.contains(courseScheduleId)){
+            result.put("enableAssignHomework", 1);
+        }else{
+            result.put("enableAssignHomework", 0);
+        }
+
         if(Objects.isNull(courseScheduleId)&&Objects.isNull(studentIdsStr)){
             result.put("isAssignHomework", 0);
             return result;
@@ -330,4 +513,15 @@ public class StudentServeServiceImpl implements StudentServeService {
         result.put("isAssignHomework", 1);
         return result;
     }
+
+    @Override
+    public Set<Long> getTeacherServeCourseIds(Integer teacherId) {
+        List<StudentExtracurricularExercisesSituation> teacherNoStartServices = studentExtracurricularExercisesSituationDao.findTeacherNoStartServices(teacherId);
+        List<String> courseIdsList = teacherNoStartServices.stream().filter(s->StringUtils.isNotBlank(s.getCourseIds())).map(StudentExtracurricularExercisesSituation::getCourseIds).collect(Collectors.toList());
+        Set<Long> courseIds = new HashSet<>();
+        for (String courseIdStr : courseIdsList) {
+            courseIds.addAll(Arrays.stream(courseIdStr.split(",")).mapToLong(Long::valueOf).boxed().collect(Collectors.toSet()));
+        }
+        return courseIds;
+    }
 }

+ 9 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -674,4 +674,13 @@
 		SELECT SUM(expect_price_)-SUM(actual_price_) FROM course_schedule_student_payment
 		WHERE music_group_id_=#{groupId} AND user_id_=#{userId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 	</select>
+
+    <select id="getStudentHistoryLastCourse" resultMap="com.ym.mec.biz.dal.dao.CourseScheduleDao.CourseSchedule">
+		SELECT cs.* FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_=cssp.user_id_
+		WHERE cssp.user_id_=#{studentId}
+		  AND cs.class_date_&lt;#{monday}
+		  AND cs.type_=#{courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+		ORDER BY CONCAT(cs.class_date_, ' ', cs.start_class_time_) LIMIT 1
+	</select>
 </mapper>

+ 197 - 119
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -22,6 +22,7 @@
 		<result column="update_time_" property="updateTime" />
 		<result column="last_submit_time_" property="lastSubmitTime"/>
 		<result column="serve_type_" property="serveType"/>
+		<result column="course_ids_" property="courseIds"/>
 	</resultMap>
 
 	<resultMap id="StudentExercisesSituationDto" type="com.ym.mec.biz.dal.dto.StudentExercisesSituationDto" extends="StudentExtracurricularExercisesSituation">
@@ -48,15 +49,24 @@
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</selectKey>
 		-->
-		INSERT INTO student_extracurricular_exercises_situation_ (id_,student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,actual_exercises_num_,exercises_reply_num_,exercises_message_num_,exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,serve_type_)
-		VALUES(#{id},#{studentId},#{weekOfYear},#{monday},#{sunday},#{teacherId},#{expectExercisesNum},#{actualExercisesNum},#{exercisesReplyNum},#{exercisesMessageNum},#{exercisesMessageTimelyNum},NOW(),NOW(),#{lastSubmitTime},#{serveType})
+		INSERT INTO student_extracurricular_exercises_situation_ (id_,student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,
+		                                                          actual_exercises_num_,exercises_reply_num_,exercises_message_num_,
+		                                                          exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,
+		                                                          serve_type_,course_ids_)
+		VALUES(#{id},#{studentId},#{weekOfYear},#{monday},#{sunday},#{teacherId},#{expectExercisesNum},#{actualExercisesNum},#{exercisesReplyNum},
+		       #{exercisesMessageNum},#{exercisesMessageTimelyNum},NOW(),NOW(),#{lastSubmitTime},#{serveType},#{courseIds})
 	</insert>
 
 	<insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO student_extracurricular_exercises_situation_ (student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,actual_exercises_num_,exercises_reply_num_,exercises_message_num_,exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,serve_type_)
+		INSERT INTO student_extracurricular_exercises_situation_ (student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,
+		                                                          actual_exercises_num_,exercises_reply_num_,exercises_message_num_,
+		                                                          exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,
+		                                                          serve_type_,course_ids_)
 		VALUES
 		<foreach collection="situations" item="situation" separator=",">
-			(#{situation.studentId},#{situation.weekOfYear},#{situation.monday},#{situation.sunday},#{situation.teacherId},#{situation.expectExercisesNum},#{situation.actualExercisesNum},#{situation.exercisesReplyNum},#{situation.exercisesMessageNum},#{situation.exercisesMessageTimelyNum},NOW(),NOW(),#{situation.lastSubmitTime},#{situation.serveType})
+			(#{situation.studentId},#{situation.weekOfYear},#{situation.monday},#{situation.sunday},#{situation.teacherId},#{situation.expectExercisesNum},
+			#{situation.actualExercisesNum},#{situation.exercisesReplyNum},#{situation.exercisesMessageNum},#{situation.exercisesMessageTimelyNum},
+			NOW(),NOW(),#{situation.lastSubmitTime},#{situation.serveType},#{situation.courseIds})
 		</foreach>
 	</insert>
 
@@ -106,10 +116,61 @@
 			<if test="serveType!=null">
 				serve_type_=#{serveType},
 			</if>
+			<if test="courseIds!=null and courseIds!=''">
+				course_ids_=#{courseIds},
+			</if>
 			update_time_ = #{updateTime}
 		</set> WHERE id_ = #{id}
 	</update>
 
+	<update id="batchUpdate" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation">
+		<foreach collection="situations" item="situation" separator=";">
+			UPDATE student_extracurricular_exercises_situation_
+			<set>
+				<if test="situation.exercisesReplyNum != null">
+					exercises_reply_num_ = #{situation.exercisesReplyNum},
+				</if>
+				<if test="situation.monday != null">
+					monday_ = #{situation.monday},
+				</if>
+				<if test="situation.weekOfYear != null">
+					week_of_year_ = #{situation.weekOfYear},
+				</if>
+				<if test="situation.exercisesMessageNum != null">
+					exercises_message_num_ = #{situation.exercisesMessageNum},
+				</if>
+				<if test="situation.teacherId != null">
+					teacher_id_ = #{situation.teacherId},
+				</if>
+				<if test="situation.actualExercisesNum != null">
+					actual_exercises_num_ = #{situation.actualExercisesNum},
+				</if>
+				<if test="situation.exercisesMessageTimelyNum != null">
+					exercises_message_timely_num_ = #{situation.exercisesMessageTimelyNum},
+				</if>
+				<if test="situation.studentId != null">
+					student_id_ = #{situation.studentId},
+				</if>
+				<if test="situation.expectExercisesNum != null">
+					expect_exercises_num_ = #{situation.expectExercisesNum},
+				</if>
+				<if test="situation.sunday != null">
+					sunday_ = #{situation.sunday},
+				</if>
+				<if test="situation.lastSubmitTime!=null">
+					last_submit_time_=#{situation.lastSubmitTime},
+				</if>
+				<if test="situation.serveType!=null">
+					serve_type_=#{situation.serveType},
+				</if>
+				<if test="situation.courseIds!=null and situation.courseIds!=''">
+					course_ids_=#{situation.courseIds},
+				</if>
+				update_time_ = NOW()
+			</set> WHERE id_ = #{situation.id}
+		</foreach>
+	</update>
+
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM student_extracurricular_exercises_situation_ WHERE id_ = #{id} 
@@ -133,31 +194,31 @@
 
 	<select id="findExercisesSituations" resultMap="StudentExercisesSituationDto">
 		SELECT
-		MAX(sees.id_) id_,
+		sees.id_ id_,
 		student_id_,
 		stu.username_ student_name_,
-		GROUP_CONCAT(DISTINCT tea.real_name_ ORDER BY tea.id_) teacher_name_,
+		tea.real_name_ teacher_name_,
 		o.name_ organ_name_,
-		SUM( expect_exercises_num_ ) expect_exercises_num_,
-		SUM( actual_exercises_num_ ) actual_exercises_num_,
+		expect_exercises_num_ expect_exercises_num_,
+		actual_exercises_num_ actual_exercises_num_,
 		<if test="submitStartDate==null or submitEndDate==null">
-			SUM( exercises_reply_num_ ) exercises_reply_num_,
-			SUM( exercises_message_num_ ) exercises_message_num_,
-			SUM( exercises_message_timely_num_ ) exercises_message_timely_num_,
-			MAX(last_submit_time_) last_submit_time_
+			exercises_reply_num_ exercises_reply_num_,
+			exercises_message_num_ exercises_message_num_,
+			exercises_message_timely_num_ exercises_message_timely_num_,
+			last_submit_time_ last_submit_time_
 		</if>
 		<if test="submitStartDate!=null and submitEndDate!=null">
-			SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) exercises_reply_num_,
-			SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) exercises_message_num_,
-			SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) exercises_message_timely_num_,
-			MAX(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},last_submit_time_, NULL)) last_submit_time_
+			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) exercises_reply_num_,
+			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) exercises_message_num_,
+			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) exercises_message_timely_num_,
+			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},last_submit_time_, NULL) last_submit_time_
 		</if>
 		FROM
-		student_extracurricular_exercises_situation_ sees
-		LEFT JOIN sys_user stu ON stu.id_=sees.student_id_
-		LEFT JOIN teacher t ON t.id_=sees.teacher_id_
-		LEFT JOIN sys_user tea ON tea.id_=sees.teacher_id_
-		LEFT JOIN organization o ON stu.organ_id_=o.id_
+			student_extracurricular_exercises_situation_ sees
+			LEFT JOIN sys_user stu ON stu.id_=sees.student_id_
+			LEFT JOIN teacher t ON t.id_=sees.teacher_id_
+			LEFT JOIN sys_user tea ON tea.id_=sees.teacher_id_
+			LEFT JOIN organization o ON stu.organ_id_=o.id_
 		WHERE
 		sees.monday_ &gt;= #{monday}
 		AND sees.sunday_ &lt;= #{sunday}
@@ -182,57 +243,56 @@
 		<if test="existPracticeCourse!=null and existPracticeCourse==0">
 			AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN #{monday} AND #{sunday})
 		</if>
-		GROUP BY
-		student_id_
-		<trim prefix="HAVING" suffixOverrides="and">
-			<if test="expectExercisesNum!=null">  SUM( expect_exercises_num_ ) = #{expectExercisesNum}</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
-				SUM( actual_exercises_num_ )&lt;SUM( expect_exercises_num_ ) and
-			</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
-				SUM( actual_exercises_num_ )&gt;=SUM( expect_exercises_num_ ) and
-			</if>
-			<if test="submitStartDate==null or submitEndDate==null">
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-					SUM( exercises_reply_num_ ) &lt; SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-					SUM( exercises_reply_num_ ) &gt;= SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-					SUM( exercises_message_num_ ) &lt; SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-					SUM( exercises_message_num_ ) &gt;= SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-					SUM( exercises_message_timely_num_ ) &lt; SUM( exercises_message_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-					SUM( exercises_message_timely_num_ ) &gt;= SUM( exercises_message_num_ ) and
-				</if>
+
+		<if test="expectExercisesNum!=null">
+			AND expect_exercises_num_ = #{expectExercisesNum}
+		</if>
+		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
+			AND actual_exercises_num_ &lt; expect_exercises_num_
+		</if>
+		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
+			AND actual_exercises_num_ &gt;= expect_exercises_num_
+		</if>
+		<if test="submitStartDate==null or submitEndDate==null">
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+				AND exercises_reply_num_ &lt; SUM( actual_exercises_num_ )
 			</if>
-			<if test="submitStartDate!=null and submitEndDate!=null">
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) &lt; SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) &gt;= SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) &lt; SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) &gt;= SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) &lt; SUM( exercises_message_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) &gt;= SUM( exercises_message_num_ ) and
-				</if>
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+				AND exercises_reply_num_ &gt;= actual_exercises_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+				AND exercises_message_num_ &lt; exercises_reply_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+				AND exercises_message_num_ &gt;= exercises_reply_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+				AND exercises_message_timely_num_ &lt; exercises_message_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+				AND exercises_message_timely_num_ &gt;= exercises_message_num_
+			</if>
+		</if>
+		<if test="submitStartDate!=null and submitEndDate!=null">
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &lt; actual_exercises_num_
+			</if>
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &gt;= actual_exercises_num_
 			</if>
-		</trim>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &lt; exercises_message_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &gt;= exercises_message_num_
+			</if>
+		</if>
 		ORDER BY student_id_
 		<include refid="global.limit"/>
 	</select>
@@ -271,65 +331,66 @@
 		<if test="existPracticeCourse!=null and existPracticeCourse==0">
 			AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN #{monday} AND #{sunday})
 		</if>
-		GROUP BY
-		student_id_
-		<trim prefix="HAVING" suffixOverrides="and">
-			<if test="expectExercisesNum!=null">  SUM( expect_exercises_num_ ) = #{expectExercisesNum}</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
-				SUM( actual_exercises_num_ )&lt;SUM( expect_exercises_num_ ) and
-			</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
-				SUM( actual_exercises_num_ )&gt;=SUM( expect_exercises_num_ ) and
-			</if>
-			<if test="submitStartDate==null or submitEndDate==null">
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-					SUM( exercises_reply_num_ ) &lt; SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-					SUM( exercises_reply_num_ ) &gt;= SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-					SUM( exercises_message_num_ ) &lt; SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-					SUM( exercises_message_num_ ) &gt;= SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-					SUM( exercises_message_timely_num_ ) &lt; SUM( exercises_message_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-					SUM( exercises_message_timely_num_ ) &gt;= SUM( exercises_message_num_ ) and
-				</if>
+
+		<if test="expectExercisesNum!=null">
+			AND expect_exercises_num_ = #{expectExercisesNum}
+		</if>
+		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
+			AND actual_exercises_num_ &lt; expect_exercises_num_
+		</if>
+		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
+			AND actual_exercises_num_ &gt;= expect_exercises_num_
+		</if>
+		<if test="submitStartDate==null or submitEndDate==null">
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+				AND exercises_reply_num_ &lt; SUM( actual_exercises_num_ )
 			</if>
-			<if test="submitStartDate!=null and submitEndDate!=null">
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) &lt; SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) &gt;= SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) &lt; SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) &gt;= SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) &lt; SUM( exercises_message_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) &gt;= SUM( exercises_message_num_ ) and
-				</if>
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+				AND exercises_reply_num_ &gt;= actual_exercises_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+				AND exercises_message_num_ &lt; exercises_reply_num_
 			</if>
-		</trim>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+				AND exercises_message_num_ &gt;= exercises_reply_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+				AND exercises_message_timely_num_ &lt; exercises_message_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+				AND exercises_message_timely_num_ &gt;= exercises_message_num_
+			</if>
+		</if>
+		<if test="submitStartDate!=null and submitEndDate!=null">
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &lt; actual_exercises_num_
+			</if>
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &gt;= actual_exercises_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &lt; exercises_message_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &gt;= exercises_message_num_
+			</if>
+		</if>
 		) tmp
 	</select>
+
 	<select id="findExercisesSituationsById" resultMap="StudentExtracurricularExercisesSituation">
 		SELECT * FROM student_extracurricular_exercises_situation_ WHERE id_ IN
 		<foreach collection="ids" item="id" separator="," open="(" close=")">
 			#{id}
 		</foreach>
 	</select>
+
 	<select id="findTeacherExercisesServiceSituations" resultType="com.ym.mec.biz.dal.dto.TeacherExercisesServiceDto">
 		SELECT
 		teacher_id_ teacherId,
@@ -346,12 +407,15 @@
 		GROUP BY
 		teacher_id_;
 	</select>
+
 	<select id="findLastWeekTodayUpdateNum" resultType="int">
 		SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE sunday_=#{sunday} AND DATE_FORMAT(update_time_,'%Y-%m-%d')=DATE_FORMAT(NOW(),'%Y-%m-%d')
     </select>
+
 	<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',
@@ -366,4 +430,18 @@
 		GROUP BY
 			teacher_id_
 	</select>
+
+	<select id="countWeekServiceNum" resultType="int">
+		SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE monday_=#{sunday}
+	</select>
+
+	<select id="findWeekServiceWithStudents" resultMap="StudentExtracurricularExercisesSituation">
+		SELECT * FROM student_extracurricular_exercises_situation_ WHERE monday_=#{monday} AND student_id_ IN
+		<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+			#{studentId}
+		</foreach>
+	</select>
+    <select id="findTeacherNoStartServices" resultMap="StudentExtracurricularExercisesSituation">
+		SELECT * FROM student_extracurricular_exercises_situation_ WHERE teacher_id_=#{teacherId} AND actual_exercises_num_&lt;=0 AND serve_type_='HOMEWORK';
+	</select>
 </mapper>

+ 38 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -471,6 +471,44 @@
         WHERE stu.service_tag_=1 AND class_date_&gt;=#{monday}
     </select>
 
+    <resultMap id="StudentServeCourseDto" type="com.ym.mec.biz.dal.dto.StudentServeCourseDto">
+        <result column="student_id_" property="studentId"/>
+        <result column="lead_teacher_id_" property="leadTeacherId"/>
+        <result column="course_schedule_id_" property="courseScheduleId"/>
+        <result column="group_type_" property="groupType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="music_group_id_" property="musicGroupId"/>
+        <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="actual_teacher_id_" property="actualTeacherId"/>
+        <result column="course_start_time_" property="courseStartTime"/>
+        <result column="" property="teachMode"/>
+    </resultMap>
+
+    <select id="getStudentFutureCourseInfo" resultMap="StudentServeCourseDto">
+        SELECT
+            cssp.user_id_ student_id_,
+            stu.teacher_id_ lead_teacher_id_,
+            cs.id_ course_schedule_id_,
+            cs.group_type_,
+            cs.music_group_id_,
+            cs.type_,
+            cs.actual_teacher_id_,
+            CONCAT(cs.class_date_, ' ', cs.start_class_time_) course_start_time_,
+            cs.teach_mode_
+        FROM course_schedule_student_payment cssp
+            LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+            LEFT JOIN student stu ON cssp.user_id_ = stu.user_id_
+        WHERE stu.service_tag_=1
+            AND cs.class_date_&gt;=#{monday}
+            AND cs.type_ IN ('SINGLE','VIP','MIX','PRACTICE')
+            <if test="studentIds!=null and studentIds.size()>0">
+                AND cssp.user_id_ IN
+                <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                    #{studentId}
+                </foreach>
+            </if>
+        ORDER BY cssp.user_id_,start_class_time_
+    </select>
+
     <select id="getStudentNames" resultType="string">
         SELECT username_ FROM sys_user WHERE id_ IN
         <foreach collection="studentIds" item="studentId" separator="," open="(" close=")">

+ 9 - 4
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -34,6 +34,7 @@
         <result column="sign_out_attachments_" property="signOutAttachments"/>
         <result column="sign_out_remark_" property="signOutRemark"/>
         <result column="url_" property="url"/>
+        <result column="device_num_" property="deviceNum"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -58,12 +59,12 @@
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,
         sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_,
-        sign_out_remark_,update_attendance_type_,url_)
+        sign_out_remark_,update_attendance_type_,url_,device_num_)
         VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherId},
         #{musicGroupId},#{classGroupId},#{courseScheduleId},#{signInTime},#{signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{remark},
         now(),#{signOutTime},#{signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{currentClassTimes},#{signInLongitudeLatitude},#{signOutLongitudeLatitude},#{currentScheduleId},#{signOutAttachments},#{signOutRemark},
-        #{updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{url})
+        #{updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{url},#{deviceNum})
     </insert>
 
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
@@ -71,7 +72,7 @@
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,
         remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_,
-        sign_out_remark_,update_attendance_type_,url_)
+        sign_out_remark_,update_attendance_type_,url_,device_num_)
         VALUE
         <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
             (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -82,7 +83,8 @@
             #{teacherAttendance.signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude},#{teacherAttendance.currentScheduleId},
             #{teacherAttendance.signOutAttachments},#{teacherAttendance.signOutRemark},
-            #{teacherAttendance.updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.url})
+            #{teacherAttendance.updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.url},
+            #{teacherAttendance.deviceNum})
         </foreach>
     </insert>
 
@@ -162,6 +164,9 @@
             <if test="signOutRemark != null">
                 sign_out_remark_ = #{signOutRemark},
             </if>
+            <if test="deviceNum != null and deviceNum!=''">
+                device_num_ = #{deviceNum},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>

+ 7 - 2
mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml

@@ -560,10 +560,13 @@
         sys_user_cash_account suca
         LEFT JOIN sys_user su ON suca.user_id_=su.id_
         WHERE
-        suca.course_balance_ >0
+            1=1
+        AND su.user_type_ LIKE '%STUDENT%'
+#         suca.course_balance_ >0
         <if test="search!=null and search!=''">
             AND (su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
         </if>
+        ORDER BY suca.course_balance_ DESC
         <include refid="global.limit"/>
     </select>
     <select id="countHaveCourseBalanceStudentNum" resultType="int">
@@ -573,7 +576,9 @@
         sys_user_cash_account suca
         LEFT JOIN sys_user su ON suca.user_id_=su.id_
         WHERE
-        suca.course_balance_ >0
+            1=1
+        AND su.user_type_ LIKE '%STUDENT%'
+#         suca.course_balance_ >0
         <if test="search!=null and search!=''">
             AND (su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
         </if>

+ 5 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseHomeworkReplyController.java

@@ -97,7 +97,11 @@ public class TeacherCourseHomeworkReplyController extends BaseController {
     @ApiOperation(value = "检测是否都布置了作业")
     @GetMapping("/checkeIsAssignHomework")
     public HttpResponseResult checkeIsAssignHomework(Long courseScheduleId, String studentIds){
-        return succeed(studentServeService.checkeIsAssignHomework(courseScheduleId, studentIds));
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(studentServeService.checkeIsAssignHomework(courseScheduleId, studentIds, user.getId()));
     }
 
 }

+ 5 - 2
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -8,6 +8,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 
 @RequestMapping("task")
@@ -261,8 +263,9 @@ public class TaskController extends BaseController {
 	//学生服务信息统计
 	@GetMapping("/exercisesSituationStatistics")
 	public void exercisesSituationStatistics(){
-//		extracurricularExercisesReplyService.exercisesSituationStatistics2(null);
-		studentServeService.exercisesSituationStatistics(null);
+		studentServeService.exercisesSituationStatistics2(null,null);
+//		studentServeService.exercisesSituationStatistics2(null,new ArrayList<>(Arrays.asList(1095257)));
+//		studentServeService.exercisesSituationStatistics(null);
 	}
 
 	//更新学生运营指标