Pārlūkot izejas kodu

1、课外训练-教学

Joburgess 5 gadi atpakaļ
vecāks
revīzija
ce27be43ce
18 mainītis faili ar 825 papildinājumiem un 10 dzēšanām
  1. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesReplyDao.java
  3. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  4. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentExercisesSituationDto.java
  5. 158 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentExtracurricularExercisesSituation.java
  6. 100 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentExercisesSituationQueryInfo.java
  7. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesReplyService.java
  8. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentExtracurricularExercisesSituationService.java
  9. 68 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  10. 61 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  11. 12 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  12. 29 0
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesReplyMapper.xml
  13. 180 0
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  14. 3 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. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/StudentExercisesSituationStatisticsTask.java
  17. 65 0
      mec-web/src/main/java/com/ym/mec/web/controller/StudentExtracurricularExercisesSituationController.java
  18. 10 2
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

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

@@ -236,4 +236,13 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return
      */
     List<Map<Integer,String>> getStudentIdMap(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
+    /**
+     * @describe 获取在指定时间之后不存在网管课的学员编号列表
+     * @author Joburgess
+     * @date 2020/4/10
+     * @param date:
+     * @return java.util.List<java.lang.Integer>
+     */
+    List<Integer> findNoPracticeStudentIdsAfterStartTime(@Param("date")String date);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesReplyDao.java

@@ -62,5 +62,16 @@ public interface ExtracurricularExercisesReplyDao extends BaseDAO<Long, Extracur
 
     List<ExtraExerciseStudentsDto> findExtraExercises(Map<String, Object> params);
     int countExtraExercises(Map<String, Object> params);
+
+    /**
+     * @describe 获取在指定星期内无网管课学员的课外训练
+     * @author Joburgess
+     * @date 2020/4/10
+     * @param monday:
+     * @param sunday:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply>
+     */
+    List<ExtracurricularExercisesReply> findNoPracticeStudentExercisesInWeek(@Param("monday") String monday,
+                                                                             @Param("sunday") String sunday);
 	
 }

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

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.dto.StudentExercisesSituationDto;
+import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Long, StudentExtracurricularExercisesSituation> {
+
+    /**
+     * @describe 批量插入
+     * @author Joburgess
+     * @date 2020/4/10
+     * @param situations:
+     * @return int
+     */
+    int batchInsert(@Param("situations")List<StudentExtracurricularExercisesSituation> situations);
+
+    /**
+     * @describe 根据周一日期删除统计信息
+     * @author Joburgess
+     * @date 2020/4/10
+     * @param monday:
+     * @return int
+     */
+    int deleteByMonday(@Param("monday") String monday);
+
+    List<StudentExercisesSituationDto> findExercisesSituations(@Param("params") Map<String, Object> params);
+    int countExercisesSituations(@Param("params")Map<String, Object> params);
+	
+}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentExercisesSituationDto.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/4/10
+ */
+public class StudentExercisesSituationDto extends StudentExtracurricularExercisesSituation {
+
+    private String studentName;
+
+    private String organName;
+
+    private String teacherName;
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+}

+ 158 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentExtracurricularExercisesSituation.java

@@ -0,0 +1,158 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(student_extracurricular_exercises_situation_):
+ */
+public class StudentExtracurricularExercisesSituation {
+
+	/**  */
+	private Long id;
+	
+	/**  */
+	private Integer studentId;
+	
+	/** 周数 */
+	private Integer weekOfYear;
+	
+	/** 周一日期 */
+	private java.util.Date monday;
+	
+	/** 周末日期 */
+	private java.util.Date sunday;
+	
+	/**  */
+	private Integer teacherId;
+	
+	/** 预期训练次数 */
+	private Integer expectExercisesNum;
+	
+	/** 实际训练次数 */
+	private Integer actualExercisesNum;
+	
+	/** 提交训练次数 */
+	private Integer exercisesReplyNum;
+	
+	/** 训练评价次数 */
+	private Integer exercisesMessageNum;
+	
+	/** 及时训练评价次数 */
+	private Integer exercisesMessageTimelyNum;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setStudentId(Integer studentId){
+		this.studentId = studentId;
+	}
+	
+	public Integer getStudentId(){
+		return this.studentId;
+	}
+			
+	public void setWeekOfYear(Integer weekOfYear){
+		this.weekOfYear = weekOfYear;
+	}
+	
+	public Integer getWeekOfYear(){
+		return this.weekOfYear;
+	}
+			
+	public void setMonday(java.util.Date monday){
+		this.monday = monday;
+	}
+	
+	public java.util.Date getMonday(){
+		return this.monday;
+	}
+			
+	public void setSunday(java.util.Date sunday){
+		this.sunday = sunday;
+	}
+	
+	public java.util.Date getSunday(){
+		return this.sunday;
+	}
+			
+	public void setTeacherId(Integer teacherId){
+		this.teacherId = teacherId;
+	}
+	
+	public Integer getTeacherId(){
+		return this.teacherId;
+	}
+			
+	public void setExpectExercisesNum(Integer expectExercisesNum){
+		this.expectExercisesNum = expectExercisesNum;
+	}
+	
+	public Integer getExpectExercisesNum(){
+		return this.expectExercisesNum;
+	}
+			
+	public void setActualExercisesNum(Integer actualExercisesNum){
+		this.actualExercisesNum = actualExercisesNum;
+	}
+	
+	public Integer getActualExercisesNum(){
+		return this.actualExercisesNum;
+	}
+			
+	public void setExercisesReplyNum(Integer exercisesReplyNum){
+		this.exercisesReplyNum = exercisesReplyNum;
+	}
+	
+	public Integer getExercisesReplyNum(){
+		return this.exercisesReplyNum;
+	}
+			
+	public void setExercisesMessageNum(Integer exercisesMessageNum){
+		this.exercisesMessageNum = exercisesMessageNum;
+	}
+	
+	public Integer getExercisesMessageNum(){
+		return this.exercisesMessageNum;
+	}
+			
+	public void setExercisesMessageTimelyNum(Integer exercisesMessageTimelyNum){
+		this.exercisesMessageTimelyNum = exercisesMessageTimelyNum;
+	}
+	
+	public Integer getExercisesMessageTimelyNum(){
+		return this.exercisesMessageTimelyNum;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 100 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentExercisesSituationQueryInfo.java

@@ -0,0 +1,100 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/4/10
+ */
+public class StudentExercisesSituationQueryInfo extends QueryInfo {
+
+    private String organIdList;
+
+    @ApiModelProperty(value = "周一日期")
+    private java.util.Date monday;
+
+    @ApiModelProperty(value = "周日日期")
+    private java.util.Date sunday;
+
+    @ApiModelProperty(value = "预期训练次数")
+    private Integer expectExercisesNum;
+
+    @ApiModelProperty(value = "实际训练次数")
+    private Integer actualExercisesNum;
+
+    @ApiModelProperty(value = "提交训练次数")
+    private Integer exercisesReplyNum;
+
+    @ApiModelProperty(value = "训练评价次数")
+    private Integer exercisesMessageNum;
+
+    @ApiModelProperty(value = "及时训练评价次数")
+    private Integer exercisesMessageTimelyNum;
+
+    public String getOrganIdList() {
+        return organIdList;
+    }
+
+    public void setOrganIdList(String organIdList) {
+        this.organIdList = organIdList;
+    }
+
+    public Date getMonday() {
+        return monday;
+    }
+
+    public void setMonday(Date monday) {
+        this.monday = monday;
+    }
+
+    public Date getSunday() {
+        return sunday;
+    }
+
+    public void setSunday(Date sunday) {
+        this.sunday = sunday;
+    }
+
+    public Integer getExpectExercisesNum() {
+        return expectExercisesNum;
+    }
+
+    public void setExpectExercisesNum(Integer expectExercisesNum) {
+        this.expectExercisesNum = expectExercisesNum;
+    }
+
+    public Integer getActualExercisesNum() {
+        return actualExercisesNum;
+    }
+
+    public void setActualExercisesNum(Integer actualExercisesNum) {
+        this.actualExercisesNum = actualExercisesNum;
+    }
+
+    public Integer getExercisesReplyNum() {
+        return exercisesReplyNum;
+    }
+
+    public void setExercisesReplyNum(Integer exercisesReplyNum) {
+        this.exercisesReplyNum = exercisesReplyNum;
+    }
+
+    public Integer getExercisesMessageNum() {
+        return exercisesMessageNum;
+    }
+
+    public void setExercisesMessageNum(Integer exercisesMessageNum) {
+        this.exercisesMessageNum = exercisesMessageNum;
+    }
+
+    public Integer getExercisesMessageTimelyNum() {
+        return exercisesMessageTimelyNum;
+    }
+
+    public void setExercisesMessageTimelyNum(Integer exercisesMessageTimelyNum) {
+        this.exercisesMessageTimelyNum = exercisesMessageTimelyNum;
+    }
+}

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

@@ -58,4 +58,12 @@ public interface ExtracurricularExercisesReplyService extends BaseService<Long,
      */
     PageInfo<ExtraExerciseStudentsDto> findExtraExercises(ExtraExercilseReplyQueryInfo queryInfo);
 
+    /**
+     * @describe 学生服务信息统计
+     * @author Joburgess
+     * @date 2020/4/10
+     * @param : 
+     * @return void
+     */
+    void exercisesSituationStatistics();
 }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentExtracurricularExercisesSituationService.java

@@ -0,0 +1,13 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.StudentExercisesSituationDto;
+import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
+import com.ym.mec.biz.dal.page.StudentExercisesSituationQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.BaseService;
+
+public interface StudentExtracurricularExercisesSituationService extends BaseService<Long, StudentExtracurricularExercisesSituation> {
+
+    PageInfo<StudentExercisesSituationDto> findStudentExtracurricularExercisesSituations(StudentExercisesSituationQueryInfo queryInfo);
+
+}

+ 68 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -1,16 +1,11 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ExtracurricularExercisesDao;
-import com.ym.mec.biz.dal.dao.ExtracurricularExercisesReplyDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
 import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
-import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
-import com.ym.mec.biz.dal.entity.StudentCourseHomework;
-import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
@@ -23,11 +18,16 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -39,6 +39,10 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 	@Autowired
 	private ExtracurricularExercisesDao extracurricularExercisesDao;
 	@Autowired
+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+	@Autowired
+	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+	@Autowired
 	private SysMessageService sysMessageService;
 	@Autowired
 	private TeacherDao teacherDao;
@@ -176,4 +180,61 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void exercisesSituationStatistics() {
+		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+		LocalDate sunDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue());
+		List<Integer> noPracticeStudentIds = courseScheduleStudentPaymentDao.findNoPracticeStudentIdsAfterStartTime(monDayDate.toString());
+		if(CollectionUtils.isEmpty(noPracticeStudentIds)){
+			return;
+		}
+		List<ExtracurricularExercisesReply> noPracticeStudentExercisesInWeek = extracurricularExercisesReplyDao.findNoPracticeStudentExercisesInWeek(monDayDate.toString(), sunDayDate.toString());
+		Map<Integer, List<ExtracurricularExercisesReply>> studentExercisesMap = noPracticeStudentExercisesInWeek.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getUserId));
+
+		List<StudentExtracurricularExercisesSituation> results=new ArrayList<>();
+		for (Integer noPracticeStudentId : noPracticeStudentIds) {
+			StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation();
+			studentExtracurricularExercisesSituation.setStudentId(noPracticeStudentId);
+			studentExtracurricularExercisesSituation.setExpectExercisesNum(1);
+			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"));
+			List<ExtracurricularExercisesReply> studentExercises = studentExercisesMap.get(noPracticeStudentId);
+			if(CollectionUtils.isEmpty(studentExercises)){
+				studentExtracurricularExercisesSituation.setActualExercisesNum(0);
+				studentExtracurricularExercisesSituation.setExercisesReplyNum(0);
+				studentExtracurricularExercisesSituation.setExercisesMessageNum(0);
+				studentExtracurricularExercisesSituation.setExercisesMessageTimelyNum(0);
+				results.add(studentExtracurricularExercisesSituation);
+				continue;
+			}
+			long exercisesNum = studentExercises.stream().map(ExtracurricularExercisesReply::getUserId).distinct().count();
+			studentExtracurricularExercisesSituation.setActualExercisesNum(Integer.valueOf(Long.valueOf(exercisesNum).toString()));
+			long replyNum = studentExercises.stream().filter(e -> StringUtils.isNotBlank(e.getAttachments())).count();
+			studentExtracurricularExercisesSituation.setExercisesReplyNum(Integer.valueOf(Long.valueOf(replyNum).toString()));
+			int exercisesMessageNum=0;
+			int exercisesMessageTimelyNum=0;
+			for (ExtracurricularExercisesReply studentExercise : studentExercises) {
+				if(Objects.isNull(studentExercise.getCreateTime())){
+					continue;
+				}
+				exercisesMessageNum+=1;
+				if(Objects.isNull(studentExercise.getSubmitTime())){
+					continue;
+				}
+				int hours = DateUtil.hoursBetween(studentExercise.getSubmitTime(), studentExercise.getCreateTime());
+				if(hours<=12){
+					exercisesMessageTimelyNum+=1;
+				}
+			}
+			studentExtracurricularExercisesSituation.setExercisesMessageNum(exercisesMessageNum);
+			studentExtracurricularExercisesSituation.setExercisesMessageTimelyNum(exercisesMessageTimelyNum);
+			results.add(studentExtracurricularExercisesSituation);
+		}
+		studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString());
+		studentExtracurricularExercisesSituationDao.batchInsert(results);
+	}
 }

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

@@ -0,0 +1,61 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.StudentExercisesSituationDto;
+import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
+import com.ym.mec.biz.dal.page.StudentExercisesSituationQueryInfo;
+import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class StudentExtracurricularExercisesSituationServiceImpl extends BaseServiceImpl<Long, StudentExtracurricularExercisesSituation> implements StudentExtracurricularExercisesSituationService {
+	
+	@Autowired
+	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+	@Autowired
+	private TeacherDao teacherDao;
+
+	@Override
+	public BaseDAO<Long, StudentExtracurricularExercisesSituation> getDAO() {
+		return studentExtracurricularExercisesSituationDao;
+	}
+
+	@Override
+	public PageInfo<StudentExercisesSituationDto> findStudentExtracurricularExercisesSituations(StudentExercisesSituationQueryInfo queryInfo) {
+		PageInfo<StudentExercisesSituationDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<StudentExercisesSituationDto> dataList = null;
+		int count = studentExtracurricularExercisesSituationDao.countExercisesSituations(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = studentExtracurricularExercisesSituationDao.findExercisesSituations(params);
+			List<Integer> teacherIds = dataList.stream().filter(t-> Objects.nonNull(t.getTeacherId())).map(StudentExercisesSituationDto::getTeacherId).collect(Collectors.toList());
+			if(!CollectionUtils.isEmpty(teacherIds)){
+				List<SimpleUserDto> teachers = teacherDao.findSimpleTeachers(teacherIds);
+				Map<Integer, String> idNameMap = teachers.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, SimpleUserDto::getUserName));
+				for (StudentExercisesSituationDto exercisesSituationDto : dataList) {
+					exercisesSituationDto.setTeacherName(idNameMap.get(exercisesSituationDto.getTeacherId()));
+				}
+			}
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+}

+ 12 - 1
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -303,7 +303,18 @@
 		GROUP BY cssp.course_schedule_id_
 	</select>
 
-	<delete id="deleteStudentCourseSchedule">
+    <select id="findNoPracticeStudentIdsAfterStartTime" resultType="java.lang.Integer">
+		SELECT
+			cssp.user_id_
+		FROM
+			course_schedule_student_payment cssp
+			LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
+		WHERE cssp.group_type_='PRACTICE'
+		GROUP BY cssp.user_id_
+		HAVING MAX(cs.class_date_)&lt;#{date} ORDER BY cssp.user_id_
+	</select>
+
+    <delete id="deleteStudentCourseSchedule">
 		DELETE FROM course_schedule_student_payment WHERE user_id_ = #{userId} AND course_schedule_id_ IN
 		<foreach collection="courseScheduleList" item="courseSchedule" index="index" open="(" close=")" separator=",">
 			#{courseSchedule.id}

+ 29 - 0
mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesReplyMapper.xml

@@ -294,4 +294,33 @@
 		left join organization o on o.id_ = t.organ_id_
 		<include refid="queryExtraExercisesCondition"/>
 	</select>
+    <select id="findNoPracticeStudentExercisesInWeek" resultMap="ExtracurricularExercisesReply">
+		SELECT
+			eer.id_,
+			eer.user_id_,
+			eer.status_,
+			eer.submit_time_,
+			eem.create_time_
+		FROM
+			extracurricular_exercises_reply eer
+		LEFT JOIN extracurricular_exercises_message eem ON eer.id_=eem.extracurricular_exercises_reply_id_ AND eem.role_='TEACHER'
+		WHERE
+			DATE_FORMAT( eer.create_time_, '%Y-%m-%d' ) BETWEEN #{monday} AND #{sunday}
+			AND EXISTS (
+			SELECT
+				cssp.user_id_
+			FROM
+				course_schedule_student_payment cssp
+			LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
+			WHERE
+			cssp.group_type_ = 'PRACTICE'
+			AND eer.user_id_ = cssp.user_id_
+			GROUP BY
+			cssp.user_id_
+			HAVING
+			MAX( cs.class_date_ ) &lt; #{monday}
+			ORDER BY
+			cssp.user_id_
+			)
+	</select>
 </mapper>

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

@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation" id="StudentExtracurricularExercisesSituation">
+		<result column="id_" property="id" />
+		<result column="student_id_" property="studentId" />
+		<result column="week_of_year_" property="weekOfYear" />
+		<result column="monday_" property="monday" />
+		<result column="sunday_" property="sunday" />
+		<result column="teacher_id_" property="teacherId" />
+		<result column="expect_exercises_num_" property="expectExercisesNum" />
+		<result column="actual_exercises_num_" property="actualExercisesNum" />
+		<result column="exercises_reply_num_" property="exercisesReplyNum" />
+		<result column="exercises_message_num_" property="exercisesMessageNum" />
+		<result column="exercises_message_timely_num_" property="exercisesMessageTimelyNum" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+
+	<resultMap id="StudentExercisesSituationDto" type="com.ym.mec.biz.dal.dto.StudentExercisesSituationDto" extends="StudentExtracurricularExercisesSituation">
+		<result column="student_name_" property="studentName"/>
+		<result column="teacher_name_" property="teacherName"/>
+		<result column="organ_name_" property="organName"/>
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="StudentExtracurricularExercisesSituation" >
+		SELECT * FROM student_extracurricular_exercises_situation_ WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="StudentExtracurricularExercisesSituation">
+		SELECT * FROM student_extracurricular_exercises_situation_ ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		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_)
+		VALUES(#{id},#{studentId},#{weekOfYear},#{monday},#{sunday},#{teacherId},#{expectExercisesNum},#{actualExercisesNum},#{exercisesReplyNum},#{exercisesMessageNum},#{exercisesMessageTimelyNum},NOW(),NOW())
+	</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_)
+		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())
+		</foreach>
+	</insert>
+
+    <!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation">
+		UPDATE student_extracurricular_exercises_situation_
+		<set>
+			<if test="exercisesReplyNum != null">
+				exercises_reply_num_ = #{exercisesReplyNum},
+			</if>
+			<if test="monday != null">
+				monday_ = #{monday},
+			</if>
+			<if test="id != null">
+				id_ = #{id},
+			</if>
+			<if test="weekOfYear != null">
+				week_of_year_ = #{weekOfYear},
+			</if>
+			<if test="exercisesMessageNum != null">
+				exercises_message_num_ = #{exercisesMessageNum},
+			</if>
+			<if test="createTime != null">
+				create_time_ = #{createTime},
+			</if>
+			<if test="teacherId != null">
+				teacher_id_ = #{teacherId},
+			</if>
+			<if test="actualExercisesNum != null">
+				actual_exercises_num_ = #{actualExercisesNum},
+			</if>
+			<if test="exercisesMessageTimelyNum != null">
+				exercises_message_timely_num_ = #{exercisesMessageTimelyNum},
+			</if>
+			<if test="studentId != null">
+				student_id_ = #{studentId},
+			</if>
+			<if test="expectExercisesNum != null">
+				expect_exercises_num_ = #{expectExercisesNum},
+			</if>
+			<if test="sunday != null">
+				sunday_ = #{sunday},
+			</if>
+			update_time_ = #{updateTime}
+		</set> WHERE id_ = #{id}
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM student_extracurricular_exercises_situation_ WHERE id_ = #{id} 
+	</delete>
+	<delete id="deleteByMonday">
+		DELETE FROM student_extracurricular_exercises_situation_ WHERE monday_ = #{monday}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="StudentExtracurricularExercisesSituation" parameterType="map">
+		SELECT * FROM student_extracurricular_exercises_situation_ ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM student_extracurricular_exercises_situation_
+	</select>
+
+	<select id="findExercisesSituations" resultMap="StudentExercisesSituationDto">
+		SELECT
+			student_id_,
+			stu.username_ student_name_,
+			o.name_ organ_name_,
+			MAX( teacher_id_ ) teacher_id_,
+			SUM( expect_exercises_num_ ) expect_exercises_num_,
+			SUM( actual_exercises_num_ ) actual_exercises_num_,
+			SUM( exercises_reply_num_ ) exercises_reply_num_,
+			SUM( exercises_message_num_ ) exercises_message_num_,
+			SUM( exercises_message_timely_num_ ) exercises_message_timely_num_
+		FROM
+			student_extracurricular_exercises_situation_ sees
+			LEFT JOIN sys_user stu ON sut.id_=sees.student_id_
+			LEFT JOIN organization o ON stu.organ_id_=o.id_
+		WHERE
+			sees.monday_ &gt;= #{monday}
+			AND sees.sunday_ &lt;= #{sunday}
+			<if test="search!=null">
+				AND stu.username_ LIKE CONCAT('%', #{search}, '%')
+			</if>
+			GROUP BY
+			student_id_
+			<trim prefix="HAVING" suffix=";" suffixOverrides="and">
+				<if test="expectExercisesNum!=null">  SUM( expect_exercises_num_ ) = #{expectExercisesNum}</if>
+				<if test="actualExercisesNum!=null "> SUM( actual_exercises_num_ )= #{actualExercisesNum} and</if>
+				<if test="exercisesReplyNum!=null "> SUM( exercises_reply_num_ ) = #{exercisesReplyNum} and</if>
+				<if test="exercisesMessageNum!=null "> SUM( exercises_message_num_ ) = #{exercisesMessageNum} and</if>
+				<if test="exercisesMessageTimelyNum!=null "> SUM( exercises_message_timely_num_ ) = #{exercisesMessageTimelyNum} and</if>
+			</trim>
+		ORDER BY student_id_
+		<include refid="global.limit"/>
+	</select>
+
+	<select id="countExercisesSituations" resultType="int">
+		SELECT COUNT(1) FROM (
+			SELECT
+			1
+			FROM
+			student_extracurricular_exercises_situation_ sees
+			LEFT JOIN sys_user stu ON sut.id_=sees.student_id_
+			WHERE
+			sees.monday_ &gt;= #{monday}
+			AND sees.sunday_ &lt;= #{sunday}
+			<if test="search!=null">
+				AND stu.username_ LIKE CONCAT('%', #{search}, '%')
+			</if>
+			GROUP BY
+			student_id_
+			<trim prefix="HAVING" suffix=";" suffixOverrides="and">
+				<if test="expectExercisesNum!=null">  SUM( expect_exercises_num_ ) = #{expectExercisesNum}</if>
+				<if test="actualExercisesNum!=null "> SUM( actual_exercises_num_ )= #{actualExercisesNum} and</if>
+				<if test="exercisesReplyNum!=null "> SUM( exercises_reply_num_ ) = #{exercisesReplyNum} and</if>
+				<if test="exercisesMessageNum!=null "> SUM( exercises_message_num_ ) = #{exercisesMessageNum} and</if>
+				<if test="exercisesMessageTimelyNum!=null "> SUM( exercises_message_timely_num_ ) = #{exercisesMessageTimelyNum} and</if>
+			</trim>
+		) tmp
+	</select>
+</mapper>

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

@@ -102,4 +102,7 @@ public interface TaskRemoteService {
 
 	@GetMapping("task/finishCourseGroup")
 	void finishCourseGroup();
+
+	@GetMapping("task/exercisesSituationStatistics")
+	void exercisesSituationStatistics();
 }

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

@@ -130,4 +130,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void finishCourseGroup() {
 		logger.info("更新对外课程组至已结束失败");
 	}
+
+	@Override
+	public void exercisesSituationStatistics() {
+		logger.info("学员服务信息统计失败");
+	}
 }

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/StudentExercisesSituationStatisticsTask.java

@@ -0,0 +1,19 @@
+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;
+
+@Service
+public class StudentExercisesSituationStatisticsTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.exercisesSituationStatistics();
+	}
+}

+ 65 - 0
mec-web/src/main/java/com/ym/mec/web/controller/StudentExtracurricularExercisesSituationController.java

@@ -0,0 +1,65 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.page.StudentExercisesSituationQueryInfo;
+import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/4/10
+ */
+@RequestMapping("exercisesSituation")
+@Api(tags = "课外训练统计服务")
+@RestController
+public class StudentExtracurricularExercisesSituationController extends BaseController {
+
+    @Autowired
+    private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private EmployeeDao employeeDao;
+
+    @ApiOperation(value = "课外训练-教学")
+    @GetMapping("/findStudentExtracurricularExercisesSituations")
+    @PreAuthorize("@pcs.hasPermissions('exercisesSituation/findStudentExtracurricularExercisesSituations')")
+    public HttpResponseResult findStudentExtracurricularExercisesSituations(StudentExercisesSituationQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        if(!sysUser.getIsSuperAdmin()){
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isEmpty(queryInfo.getOrganIdList())) {
+                queryInfo.setOrganIdList(employee.getOrganIdList());
+            }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+                return failed("用户所在分部异常");
+            }else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if(!list.containsAll(Arrays.asList(queryInfo.getOrganIdList().split(",")))){
+                    return failed("非法请求");
+                }
+            }
+        }
+        return succeed(studentExtracurricularExercisesSituationService.findStudentExtracurricularExercisesSituations(queryInfo));
+    }
+
+}

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

@@ -1,13 +1,12 @@
 package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.ym.mec.common.controller.BaseController;
-
 import java.util.Date;
 
 @RequestMapping("task")
@@ -56,6 +55,9 @@ public class TaskController extends BaseController {
 	@Autowired
 	private CoursesGroupService coursesGroupService;
 
+	@Autowired
+	private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
+
 	@GetMapping("/refreshPaymentFeeStatus")
 	// 刷新付费状态
 	public void refreshPaymentFeeStatus() {
@@ -205,4 +207,10 @@ public class TaskController extends BaseController {
 	public void finishCourseGroup(){
 		coursesGroupService.finishCourseGroup();
 	}
+
+	//学生服务信息统计
+	@GetMapping("/exercisesSituationStatistics")
+	public void exercisesSituationStatistics(){
+		extracurricularExercisesReplyService.exercisesSituationStatistics();
+	}
 }