Joburgess 5 년 전
부모
커밋
2dbdfc4831
46개의 변경된 파일1669개의 추가작업 그리고 136개의 파일을 삭제
  1. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  3. 25 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/DemoGroupCoursesPlanDao.java
  4. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/DemoGroupDao.java
  5. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java
  6. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupStudentFeeDao.java
  7. 42 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java
  8. 12 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectDao.java
  9. 39 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java
  10. 137 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleResponse.java
  11. 85 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceResponse.java
  12. 106 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceStatisticsResponse.java
  13. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceStatusCountDto.java
  14. 122 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAbnormalAttendanceInfoDto.java
  15. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java
  16. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DemoGroup.java
  17. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DemoGroupCoursesPlan.java
  18. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  19. 8 8
      mec-biz/src/main/java/com/ym/mec/biz/service/DemoGroupService.java
  20. 22 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java
  21. 35 2
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java
  22. 10 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  23. 97 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DemoGroupServiceImpl.java
  24. 115 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  25. 19 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  26. 42 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupActivityServiceImpl.java
  27. 49 35
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  28. 14 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  29. 32 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  30. 22 3
      mec-biz/src/main/resources/config/mybatis/DemoGroupCoursesPlanMapper.xml
  31. 19 0
      mec-biz/src/main/resources/config/mybatis/DemoGroupMapper.xml
  32. 5 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml
  33. 13 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupStudentFeeMapper.xml
  34. 65 0
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  35. 14 0
      mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  36. 74 0
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  37. 2 1
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  38. 43 1
      mec-education/src/main/java/com/ym/mec/education/controller/TeacherAttendanceController.java
  39. 10 11
      mec-education/src/main/java/com/ym/mec/education/entity/ClassGroup.java
  40. 29 12
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/DemoGroupController.java
  41. 27 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/LeaveCategoryController.java
  42. 43 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherDefaultVipGroupSalaryController.java
  43. 1 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherVipGroupController.java
  44. 0 5
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupActivityController.java
  45. 0 6
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupCategoryController.java
  46. 158 11
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -38,6 +38,21 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     int batchAddCourseSchedules(List<CourseSchedule> courseSchedules);
 
     /**
+     * @describe 统计教师再指定时间区段内存在冲突的课程数量
+     * @author Joburgess
+     * @date 2019/10/28
+     * @param teacherId: 教师编号
+     * @param classDate: 上课日期
+     * @param startTime: 开始时间
+     * @param endTime: 结束时间
+     * @return int
+     */
+    int countExistRepeatInDateZone(@Param("teacherId") Integer teacherId,
+                                   @Param("classDate") Date classDate,
+                                   @Param("startTime") Date startTime,
+                                   @Param("endTime") Date endTime);
+
+    /**
      * @Author: Joburgess
      * @Date: 2019/9/17
      * 统计学生所属班级数量

+ 13 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -1,11 +1,13 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.StudentAttendanceStatisticsResponse;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseScheduleStudentPayment> {
 
@@ -34,4 +36,14 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return
      */
     int deleteStudentCourseSchedule(@Param("userId") Integer userId, @Param("courseScheduleList") List<CourseSchedule> courseScheduleList);
-}
+
+    /**
+     * @describe 获取指定班级中的学生
+     * @author Joburgess
+     * @date 2019/10/28
+     * @param params: 班级编号
+     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentAttendanceStatisticsResp>
+     */
+    List<StudentAttendanceStatisticsResponse> findStudentByClassGroup(Map<String,Object> params);
+    int countStudentByClassGroup(Map<String,Object> params);
+}

+ 25 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/DemoGroupCoursesPlanDao.java

@@ -17,5 +17,29 @@ public interface DemoGroupCoursesPlanDao extends BaseDAO<Long, DemoGroupCoursesP
     int batchInsertByDates(@Param("dates") List<Date> dates,
                            @Param("demoGroupId") Long demoGroupId,
                            @Param("classMinutes") Integer classMinutes);
+
+    /**
+     * @describe 根据时间区段获取指定老师的试听课计划
+     * @author Joburgess
+     * @date 2019/10/27
+     * @param startTime: 开始时间
+     * @param endTime: 结束时间
+     * @param userId: 用户编号
+     * @return java.util.List<com.ym.mec.biz.dal.entity.DemoGroupCoursesPlan>
+     */
+    List<DemoGroupCoursesPlan> findByDateZone(@Param("startTime") Date startTime,
+                                              @Param("endTime") Date endTime,
+                                              @Param("userId") Integer userId);
+
+    /**
+     * @describe 删除指定日期之后的未被预约的试听课计划
+     * @author Joburgess
+     * @date 2019/10/27
+     * @param date: 日期
+     * @param demoGroupId: 试听课编号
+     * @return int
+     */
+    int deleteAfterDate(@Param("date") Date date,
+                        @Param("demoGroupId") Integer demoGroupId);
 	
-}
+}

+ 5 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/DemoGroupDao.java

@@ -21,6 +21,8 @@ public interface DemoGroupDao extends BaseDAO<Long, DemoGroup> {
      */
     List<Integer> organIdListByDemoGroupId(Long demoGroupId);
 
+    DemoGroup findById(Long id);
+
     /**
      * @Author: Joburgess
      * @Date: 2019/9/25
@@ -108,4 +110,6 @@ public interface DemoGroupDao extends BaseDAO<Long, DemoGroup> {
      * @return
      */
     List<Map<Integer, Long>> countTeacherDemoGroupNum(String teacherIds);
-}
+
+
+}

+ 9 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java

@@ -5,5 +5,13 @@ import com.ym.mec.common.dal.BaseDAO;
 
 public interface MusicGroupQuitDao extends BaseDAO<Long, MusicGroupQuit> {
 
+    /**
+     * @describe 统计指定乐团退团人数
+     * @author Joburgess
+     * @date 2019/10/28
+     * @param musicGroupId: 乐团编号
+     * @return int
+     */
+    int countMusicGroupQuitNum(String musicGroupId);
 	
-}
+}

+ 12 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupStudentFeeDao.java

@@ -65,4 +65,15 @@ public interface MusicGroupStudentFeeDao extends BaseDAO<Long, MusicGroupStudent
 	 * @return
 	 */
 	List<Map<String,String>> queryUserPaymentStatus(@Param("userId") Integer userId, @Param("musicGroupIds") String musicGroupIds);
-}
+
+	/**
+	 * @describe 获取学生对应乐团下的连续旷课次数
+	 * @author Joburgess
+	 * @date 2019/10/28
+	 * @param musicGroupId: 乐团编号
+	 * @param userIds: 用户编号列表
+	 * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
+	 */
+	List<Map<Integer,Integer>> findContinuousAbsenteeismTimesByUsersAndMusicGroup(@Param("musicGroupId") String musicGroupId,
+																				  @Param("userIds") List<Integer> userIds);
+}

+ 42 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -1,10 +1,11 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.StudentAttendanceResponse;
+import com.ym.mec.biz.dal.dto.StudentAttendanceStatusCountDto;
 import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
 import com.ym.mec.biz.dal.dto.StudentStatusCountUtilEntity;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.common.dal.BaseDAO;
-
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -94,4 +95,44 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return java.util.Date
      */
     Date findLatestAttendanceDate(Long courseScheduleId);
+
+    /**
+     * @describe 根据班级和学生编号查询签到记录
+     * @author Joburgess
+     * @date 2019/10/28
+     * @param classGroupId: 班级编号
+     * @param userIds: 学生编号列表
+     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentAttendanceResponse>
+     */
+    List<StudentAttendanceResponse> findByClassGroupAndUsers(@Param("classGroupId") Long classGroupId,
+                                                             @Param("userIds") List<Integer> userIds);
+
+    /**
+     * @describe 统计指定班级中学生不同签到状态的次数
+     * @author Joburgess
+     * @date 2019/10/28
+     * @param classGroupId: 班级编号
+     * @param userIds: 用户编号
+     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentAttendanceStatusCountDto>
+     */
+    List<StudentAttendanceStatusCountDto> countStudentAttendanceStatus(@Param("classGroupId") Long classGroupId,
+                                                                       @Param("userIds") List<Integer> userIds);
+
+    /**
+     * @describe 获取课程的当前课次
+     * @author Joburgess
+     * @date 2019/10/28
+     * @param courseScheduleIds: 课程编号列表
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
+     */
+    List<Map<Integer,Integer>> getCurrentClassTimesByCourses(@Param("courseScheduleIds") List<Integer> courseScheduleIds);
+
+    /**
+     * @describe 获取班级做后点名的时间
+     * @author Joburgess
+     * @date 2019/10/28
+     * @param classGroupId: 班级编号
+     * @return java.util.Date
+     */
+    Date findLatestSignInDate(Integer classGroupId);
 }

+ 12 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectDao.java

@@ -2,7 +2,6 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.ConditionDto;
 import com.ym.mec.biz.dal.dto.SubjectApplyDetailDto;
-import com.ym.mec.biz.dal.dto.UserGoodsDto;
 import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.common.dal.BaseDAO;
@@ -10,7 +9,6 @@ import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 public interface SubjectDao extends BaseDAO<Integer, Subject> {
 
@@ -105,4 +103,15 @@ public interface SubjectDao extends BaseDAO<Integer, Subject> {
 
     List<Subject> findBySubjectByIdList(@Param("subjectIdList") List<Integer> subjectIdList);
 
-}
+    /**
+     * @describe 获取乐团下对应用户的科目名称
+     * @author Joburgess
+     * @date 2019/10/28
+     * @param musicGroupId: 乐团编号
+     * @param userIds: 用户编号列表
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
+     */
+    List<Map<Integer,String>> findByMusicGroupAndUsers(@Param("musicGroupId") String musicGroupId,
+                                                       @Param("userIds") List<Integer> userIds);
+
+}

+ 39 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java

@@ -1,10 +1,12 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.TeacherAbnormalAttendanceInfoDto;
 import com.ym.mec.biz.dal.dto.TeacherPersonalAttendanceDto;
 import com.ym.mec.biz.dal.entity.TeacherAttendance;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -47,4 +49,40 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
      * @return
      */
     List<TeacherAttendance> queryNoSignOutListByOverMinutes(Integer minutes);
-}
+
+    /**
+     * @describe 根据日期获取部门下异常签到的课程记录
+     * @author Joburgess
+     * @date 2019/10/25
+     * @param organId: 部门编号
+     * @param date: 日期
+     * @param signInStatus: 签到状态:0异常,1正常,null未签到
+     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherAbnormalAttendanceInfoDto>
+     */
+    List<TeacherAbnormalAttendanceInfoDto> findTeacherAbnormalSignInCourseScheduleRecord(@Param("organId") Integer organId,
+                                                                                         @Param("date") Date date,
+                                                                                         @Param("signInStatus") Integer signInStatus);
+
+    /**
+     * @describe 根据月份获取部门下异常签到的日期
+     * @author Joburgess
+     * @date 2019/10/25
+     * @param organId: 部门编号
+     * @param date: 日期
+     * @return java.util.List<java.util.Date>
+     */
+    List<Date> findTeacherAbnormalSignInDates(@Param("organId") Integer organId,@Param("date") Date date);
+
+    /**
+     * @describe 根据日期获取对应签到状态的课程数量
+     * @author Joburgess
+     * @date 2019/10/25
+     * @param organId: 部门编号
+     * @param date: 日期
+     * @param signInStatus: 签到状态:0异常,1正常,null未签到
+     * @return int
+     */
+    int countTeacherAbnormalSignInClassTimes(@Param("organId") Integer organId,
+                                             @Param("date") Date date,
+                                             @Param("signInStatus") Integer signInStatus);
+}

+ 137 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleResponse.java

@@ -0,0 +1,137 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @program: mec
+ * @description: 课表出参
+ * @author: xw
+ * @create: 2019-09-26 20:58
+ */
+@ApiModel(description = "课表出参")
+public class CourseScheduleResponse implements Serializable {
+
+    @ApiModelProperty(value = "上课日期")
+    private String classDate;
+
+    @ApiModelProperty(value = "上课时间")
+    private String classTime;
+
+    @ApiModelProperty(value = "声部名称")
+    private List<String> subjectName;
+
+    @ApiModelProperty(value = "上课老师")
+    private String teacher;
+
+    @ApiModelProperty(value = "最后提交时间")
+    private String lastCommitDate;
+
+    @ApiModelProperty(value = "到课比")
+    private String attendanceRate;
+
+    @ApiModelProperty(value = "请假人数")
+    private Integer leaveNum;
+
+    @ApiModelProperty(value = "已上课时")
+    private String alreadyInClass;
+
+    @ApiModelProperty(value = "学生人数")
+    private Integer studentNum;
+
+    @ApiModelProperty(value = "退团人数")
+    private Integer leagueNum;
+    @ApiModelProperty(value = "课程id")
+    private Long id;
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getClassTime() {
+        return classTime;
+    }
+
+    public void setClassTime(String classTime) {
+        this.classTime = classTime;
+    }
+
+    public List<String> getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(List<String> subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getTeacher() {
+        return teacher;
+    }
+
+    public void setTeacher(String teacher) {
+        this.teacher = teacher;
+    }
+
+    public String getLastCommitDate() {
+        return lastCommitDate;
+    }
+
+    public void setLastCommitDate(String lastCommitDate) {
+        this.lastCommitDate = lastCommitDate;
+    }
+
+    public String getAttendanceRate() {
+        return attendanceRate;
+    }
+
+    public void setAttendanceRate(String attendanceRate) {
+        this.attendanceRate = attendanceRate;
+    }
+
+    public Integer getLeaveNum() {
+        return leaveNum;
+    }
+
+    public void setLeaveNum(Integer leaveNum) {
+        this.leaveNum = leaveNum;
+    }
+
+    public String getAlreadyInClass() {
+        return alreadyInClass;
+    }
+
+    public void setAlreadyInClass(String alreadyInClass) {
+        this.alreadyInClass = alreadyInClass;
+    }
+
+    public Integer getStudentNum() {
+        return studentNum;
+    }
+
+    public void setStudentNum(Integer studentNum) {
+        this.studentNum = studentNum;
+    }
+
+    public Integer getLeagueNum() {
+        return leagueNum;
+    }
+
+    public void setLeagueNum(Integer leagueNum) {
+        this.leagueNum = leagueNum;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+}

+ 85 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceResponse.java

@@ -0,0 +1,85 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.util.date.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @program: mec
+ * @description: 学生考勤出参
+ * @author: xw
+ * @create: 2019-09-26 15:24
+ */
+@ApiModel(description = "学生考勤出参")
+public class StudentAttendanceResponse implements Serializable {
+
+    @ApiModelProperty(value = "用户编号")
+    private Integer userId;
+
+    @ApiModelProperty(value = "上课日期")
+    private Date classDate;
+
+    @ApiModelProperty(value = "上课时间")
+    private String classTime;
+
+    @ApiModelProperty(value = "考勤状态")
+    private String status;
+
+    @ApiModelProperty(value = "上课星期")
+    private String classWeek;
+
+    @ApiModelProperty(value = "课程计划id")
+    private Long courseScheduleId;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(Date classDate) {
+        this.classDate = classDate;
+        this.classWeek=DateUtil.date2Week(classDate);
+    }
+
+    public String getClassTime() {
+        return classTime;
+    }
+
+    public void setClassTime(String classTime) {
+        this.classTime = classTime;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getClassWeek() {
+        return classWeek;
+    }
+
+    public void setClassWeek(String classWeek) {
+        this.classWeek = classWeek;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+}

+ 106 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceStatisticsResponse.java

@@ -0,0 +1,106 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @program: mec
+ * @description: 考勤统计出参
+ * @author: xw
+ * @create: 2019-09-28 23:29
+ */
+@ApiModel(description = "考勤统计出参")
+public class StudentAttendanceStatisticsResponse implements Serializable {
+
+    @ApiModelProperty(value = "用户编号")
+    private Integer userId;
+
+    @ApiModelProperty(value = "学生姓名")
+    private String studentName;
+
+    @ApiModelProperty(value = "是否连续旷课")
+    private boolean isTruant = false;
+
+    @ApiModelProperty(value = "声部名称")
+    private String subjectName;
+
+    @ApiModelProperty(value = "到课天数")
+    private Integer normalDay;
+
+    @ApiModelProperty(value = "旷课天数")
+    private Integer truantDay;
+
+    @ApiModelProperty(value = "请假天数")
+    private Integer leaveDay;
+
+    @ApiModelProperty(value = "考勤明细列表")
+    private List<StudentAttendanceResponse> list;
+
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public boolean isTruant() {
+        return isTruant;
+    }
+
+    public void setTruant(boolean truant) {
+        isTruant = truant;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Integer getNormalDay() {
+        return normalDay;
+    }
+
+    public void setNormalDay(Integer normalDay) {
+        this.normalDay = normalDay;
+    }
+
+    public Integer getTruantDay() {
+        return truantDay;
+    }
+
+    public void setTruantDay(Integer truantDay) {
+        this.truantDay = truantDay;
+    }
+
+    public Integer getLeaveDay() {
+        return leaveDay;
+    }
+
+    public void setLeaveDay(Integer leaveDay) {
+        this.leaveDay = leaveDay;
+    }
+
+    public List<StudentAttendanceResponse> getList() {
+        return list;
+    }
+
+    public void setList(List<StudentAttendanceResponse> list) {
+        this.list = list;
+    }
+}

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceStatusCountDto.java

@@ -0,0 +1,44 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/10/28
+ */
+public class StudentAttendanceStatusCountDto {
+
+    @ApiModelProperty(value = "用户编号")
+    private Integer userId;
+
+    @ApiModelProperty(value = "签到状态")
+    private StudentAttendanceStatusEnum status;
+
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public StudentAttendanceStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(StudentAttendanceStatusEnum status) {
+        this.status = status;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+}

+ 122 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAbnormalAttendanceInfoDto.java

@@ -0,0 +1,122 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/10/25
+ */
+public class TeacherAbnormalAttendanceInfoDto {
+
+    @ApiModelProperty(value = "教师签到记录编号")
+    private Integer teacherAttendanceId;
+
+    @ApiModelProperty(value = "课程编号")
+    private Integer courseScheduleId;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseScheduleName;
+
+    @ApiModelProperty(value = "上课日期")
+    private Date classDate;
+
+    @ApiModelProperty(value = "上课时间")
+    private Date startClassTime;
+
+    @ApiModelProperty(value = "结束时间")
+    private Date endClassTime;
+
+    @ApiModelProperty(value = "签到时间")
+    private Date signInTime;
+
+    @ApiModelProperty(value = "教师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty(value = "教师名称")
+    private String teacherName;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    public Integer getTeacherAttendanceId() {
+        return teacherAttendanceId;
+    }
+
+    public void setTeacherAttendanceId(Integer teacherAttendanceId) {
+        this.teacherAttendanceId = teacherAttendanceId;
+    }
+
+    public Integer getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Integer courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getCourseScheduleName() {
+        return courseScheduleName;
+    }
+
+    public void setCourseScheduleName(String courseScheduleName) {
+        this.courseScheduleName = courseScheduleName;
+    }
+
+    public Date getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(Date classDate) {
+        this.classDate = classDate;
+    }
+
+    public Date getStartClassTime() {
+        return startClassTime;
+    }
+
+    public void setStartClassTime(Date startClassTime) {
+        this.startClassTime = startClassTime;
+    }
+
+    public Date getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(Date endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+
+    public Date getSignInTime() {
+        return signInTime;
+    }
+
+    public void setSignInTime(Date signInTime) {
+        this.signInTime = signInTime;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

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

@@ -80,6 +80,17 @@ public class TeacherAttendanceDto {
     @ApiModelProperty(value = "当前课次",required = false)
     private Integer currentClassTimes;
 
+    @ApiModelProperty(value = "学生数量")
+    private Integer studentNum;
+
+    public Integer getStudentNum() {
+        return studentNum;
+    }
+
+    public void setStudentNum(Integer studentNum) {
+        this.studentNum = studentNum;
+    }
+
     public Integer getTotalClassTimes() {
         return totalClassTimes;
     }

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

@@ -39,6 +39,17 @@ public class DemoGroup {
 	@ApiModelProperty(value = "科目编号",required = false)
 	private Integer subjectId;
 
+	@ApiModelProperty(value = "科目名称")
+	private String subjectName;
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
 	public Integer getSubjectId() {
 		return subjectId;
 	}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DemoGroupCoursesPlan.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
@@ -20,6 +21,8 @@ public class DemoGroupCoursesPlan {
 	@ApiModelProperty(value = "上课日期")
 	private Date courseDate;
 
+	private String courseDateStr;
+
 	@ApiModelProperty(value = "上课时间")
 	private Date startTime;
 
@@ -38,6 +41,15 @@ public class DemoGroupCoursesPlan {
 
 	public void setCourseDate(Date courseDate) {
 		this.courseDate = courseDate;
+		this.courseDateStr= DateUtil.format(courseDate,DateUtil.DEFAULT_PATTERN);
+	}
+
+	public String getCourseDateStr() {
+		return courseDateStr;
+	}
+
+	public void setCourseDateStr(String courseDateStr) {
+		this.courseDateStr = courseDateStr;
 	}
 
 	public Date getStartTime() {

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

@@ -231,4 +231,5 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
      * @return
      */
     List<CourseSchedule> findNoStartCoursesByClassGroupId(Integer classGroupId);
+
 }

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

@@ -2,16 +2,14 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.DemoGroupApplyDto;
 import com.ym.mec.biz.dal.dto.EducationDemoGroupListDto;
-import com.ym.mec.biz.dal.dto.TeacherManageDemoGroupListDto;
 import com.ym.mec.biz.dal.entity.DemoGroup;
 import com.ym.mec.biz.dal.page.StudentDemoGroupQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherManageDemoGroupQueryInfo;
 import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
-import org.hibernate.validator.constraints.EAN;
 
 import java.util.List;
+import java.util.Map;
 
 public interface DemoGroupService extends BaseService<Long, DemoGroup> {
 
@@ -58,9 +56,11 @@ public interface DemoGroupService extends BaseService<Long, DemoGroup> {
     List<EducationDemoGroupListDto> findDemoGroupStartClassTimesWithWeekByTeacherId(Long teacherID);
 
     /**
-     *
-     * @param teacherId
-     * @return
+     * @describe 获取试老师下周的试听课
+     * @author Joburgess
+     * @date 2019/10/28
+     * @param teacherId:
+     * @return java.util.Map<java.lang.String,java.lang.Object>
      */
-    DemoGroup findByTeacherId(Integer teacherId);
-}
+    Map<String,Object> findByTeacherId(Integer teacherId);
+}

+ 22 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java

@@ -1,7 +1,9 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.CourseScheduleResponse;
 import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
+import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
@@ -42,4 +44,23 @@ public interface StudentAttendanceService extends BaseService<Long, StudentAtten
 	 * @return
 	 */
 	boolean leave(Integer userId, Long courseScheduleId, String remark);
-}
+
+	/**
+	 * @describe 历史考勤详情
+	 * @author Joburgess
+	 * @date 2019/10/28
+	 * @param queryInfo: 请求参数
+	 * @return java.lang.Object
+	 */
+	PageInfo statisticsList(CourseHomeworkQueryInfo queryInfo);
+
+	/**
+	 * @describe 历史考勤头部信息
+	 * @author Joburgess
+	 * @date 2019/10/28
+	 * @param classGroupId: 班级编号
+	 * @return com.ym.mec.biz.dal.dto.CourseScheduleResponse
+	 */
+	CourseScheduleResponse getStatisticsInfo(Integer classGroupId);
+
+}

+ 35 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java

@@ -1,12 +1,14 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.TeacherAbnormalAttendanceInfoDto;
 import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
 import com.ym.mec.biz.dal.entity.TeacherAttendance;
-import com.ym.mec.biz.dal.page.TeacherAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 public interface TeacherAttendanceService extends BaseService<Long, TeacherAttendance> {
@@ -29,4 +31,35 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * @return
 	 */
 	boolean pushNoSignOutMessage();
-}
+
+	/**
+	 * @describe 根据日期获取部门下异常签到的课程记录
+	 * @author Joburgess
+	 * @date 2019/10/25
+	 * @param organId: 部门编号
+	 * @param date: 日期
+	 * @param signInStatus: 签到状态:0异常,1正常,null未签到
+	 * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherAbnormalAttendanceInfoDto>
+	 */
+	List<TeacherAbnormalAttendanceInfoDto> findTeacherAbnormalSignInCourseScheduleRecord(Integer organId,Date date,Integer signInStatus);
+
+	/**
+	 * @describe 根据月份获取部门下异常签到的日期
+	 * @author Joburgess
+	 * @date 2019/10/25
+	 * @param organId: 部门编号
+	 * @param date: 日期
+	 * @return java.util.List<java.util.Date>
+	 */
+	List<Date> findTeacherAbnormalSignInDates(Integer organId, Date date);
+
+	/**
+	 * @describe 根据日期获取对应签到状态的课程数量
+	 * @author Joburgess
+	 * @date 2019/10/25
+	 * @param organId: 部门编号
+	 * @param date: 日期
+	 * @return int
+	 */
+	Map countTeacherAbnormalSignInClassTimes(Integer organId, Date date);
+}

+ 10 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -3,10 +3,7 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.ClassDateAdjustDto;
-import com.ym.mec.biz.dal.dto.CourseAttendanceDetailHeadInfoDto;
-import com.ym.mec.biz.dal.dto.CourseScheduleDto;
-import com.ym.mec.biz.dal.dto.TeacherAttendanceDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
@@ -643,7 +640,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		Map<String, Object> params = new HashMap<>();
 		MapUtil.populateMap(params, queryInfo);
 
-		List dataList = null;
+		List<TeacherClassCourseSchudeleDto> dataList = null;
 		int count = 0;
 		if(Objects.isNull(queryInfo.getOnlyHistory())||queryInfo.getOnlyHistory()==0){
 			count = courseScheduleDao.countTeacherClassCourseSchedule(params);
@@ -657,6 +654,14 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				dataList = courseScheduleDao.queryTeacherClassCourseSchedule(params);
 			}else{
 				dataList = courseScheduleDao.queryTeacherHistoryClassCourseSchedule(params);
+				List<Integer> courseIds = dataList.stream().map(teacherClassCourseSchudeleDto -> teacherClassCourseSchudeleDto.getCourseScheduleId().intValue()).collect(Collectors.toList());
+				List<Map<Integer, Integer>> currentClassTimesByCourses = studentAttendanceDao.getCurrentClassTimesByCourses(courseIds);
+				if(!CollectionUtils.isEmpty(currentClassTimesByCourses)){
+					Map<Integer, Integer> currentClassTimesWithCourse = MapUtil.convertMybatisMap(currentClassTimesByCourses);
+					dataList.forEach(e->{
+						e.setCurrentClassTimes(currentClassTimesWithCourse.get(e.getCourseScheduleId()));
+					});
+				}
 			}
 		}
 		if (count == 0) {

+ 97 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/DemoGroupServiceImpl.java

@@ -18,12 +18,15 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang.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.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author Joburgess
@@ -59,21 +62,59 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void demoGroupApply(DemoGroupApplyDto demoGroupApplyDto) {
-		SysUser user = sysUserFeignService.queryUserInfo();
 
-		if(null!=demoGroupDao.findDemoGroupByTeacherId(user.getId())){
-			throw new BizException("请勿多次创建试听课!");
-		}
+		Date now=new Date();
+		Date dayEnd = DateUtil.dayEnd(now);
+		//下周一日期
+		Date nextMonday= DateUtil.getNextWeekMonday(now);
+		//下周日日期
+		Date nextSunday=DateUtil.getNextWeekSunday(now);
+
+		//当前教师下周的试听课计划
+		List<DemoGroupCoursesPlan> nextWeekDemoGroupCoursePlan = demoGroupCoursesPlanDao.findByDateZone(nextMonday, nextSunday, demoGroupApplyDto.getUserId());
 
 		SysConfig singleClassMinutes = sysConfigService.findByParamName(SysConfigService.DEMO_GROUP_SINGLE_CLASS_MINUTES_);
 
-		demoGroupApplyDto.setUserId(user.getId());
-		demoGroupApplyDto.setOrganIdList(user.getOrganId().toString());
 		demoGroupApplyDto.setSingleClassMinutes(Integer.parseInt(singleClassMinutes.getParanValue()));
-		demoGroupDao.insert(demoGroupApplyDto);
-		demoGroupCoursesPlanDao.batchInsertByDates(demoGroupApplyDto.getCourseDates(),
-				demoGroupApplyDto.getId(),
-				demoGroupApplyDto.getSingleClassMinutes());
+
+		if(CollectionUtils.isEmpty(nextWeekDemoGroupCoursePlan)){
+			demoGroupDao.insert(demoGroupApplyDto);
+			demoGroupCoursesPlanDao.batchInsertByDates(demoGroupApplyDto.getCourseDates(),
+					demoGroupApplyDto.getId(),
+					demoGroupApplyDto.getSingleClassMinutes());
+		}else{
+			if(Objects.isNull(demoGroupApplyDto.getId())){
+				throw new BizException("请指定试听课");
+			}
+			List<DateUtil.DateZone> dateZones=new ArrayList<>();
+			List<Date> newDates=new ArrayList<>();
+			Map<YesOrNoEnum, List<DemoGroupCoursesPlan>> demoGroupPlanByStatus = nextWeekDemoGroupCoursePlan.stream().collect(Collectors.groupingBy(DemoGroupCoursesPlan::getStatus));
+			//已生成课程的试听课计划
+			List<DemoGroupCoursesPlan> demoGroupCoursesPlansWithCreated = demoGroupPlanByStatus.get(YesOrNoEnum.YES);
+			if(!CollectionUtils.isEmpty(demoGroupCoursesPlansWithCreated)){
+				demoGroupCoursesPlansWithCreated.forEach(demoGroupCoursesPlan -> {
+					dateZones.add(new DateUtil.DateZone(demoGroupCoursesPlan.getStartTime(),demoGroupCoursesPlan.getEndTime()));
+				});
+			}
+			demoGroupApplyDto.getCourseDates().forEach(startTime->{
+				if(dayEnd.before(startTime)){
+					Date endTime = DateUtil.addMilliseconds(startTime, demoGroupApplyDto.getSingleClassMinutes());
+					dateZones.add(new DateUtil.DateZone(startTime,endTime));
+					newDates.add(startTime);
+				}
+			});
+			boolean isHaveOverlap = DateUtil.checkDateZoneOverlap(dateZones);
+			if(isHaveOverlap){
+				throw new BizException("上课时间存在冲突");
+			}
+			demoGroupDao.update(demoGroupApplyDto);
+			demoGroupCoursesPlanDao.deleteAfterDate(dayEnd,demoGroupApplyDto.getId().intValue());
+			if(!CollectionUtils.isEmpty(newDates)){
+				demoGroupCoursesPlanDao.batchInsertByDates(newDates,
+						demoGroupApplyDto.getId(),
+						demoGroupApplyDto.getSingleClassMinutes());
+			}
+		}
 	}
 
 	@Override
@@ -117,13 +158,30 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 	 * 创建上课计划及跟新所属分部列表
 	 */
 	public void createCourseScheduleAndUpdateOrganId(Long demoGroupId,Long coursePlanId){
+
+		if(Objects.isNull(demoGroupId)){
+			throw new BizException("请指定试听课");
+		}
+
 		DemoGroup demoGroup=demoGroupDao.get(demoGroupId);
 
+		if(Objects.isNull(demoGroup)){
+			throw new BizException("指定的试听课不存在");
+		}
+
 		DemoGroupCoursesPlan demoGroupCoursesPlan1 = demoGroupCoursesPlanDao.get(coursePlanId);
 		if(demoGroupCoursesPlan1.getStatus()==YesOrNoEnum.YES){
 			throw new BizException("该时段课程已被预约");
 		}
 
+		int i = courseScheduleDao.countExistRepeatInDateZone(demoGroup.getUserId(),
+				demoGroupCoursesPlan1.getCourseDate(),
+				demoGroupCoursesPlan1.getStartTime(),
+				demoGroupCoursesPlan1.getEndTime());
+		if(i>0){
+			throw new BizException("此课程教师在该时段内的课程存在冲突");
+		}
+
 		SysUser user = sysUserFeignService.queryUserInfo();
 
 		//创建班级
@@ -204,7 +262,34 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 	}
 
 	@Override
-	public DemoGroup findByTeacherId(Integer teacherId) {
-		return demoGroupDao.findDemoGroupByTeacherId(teacherId);
+	public Map<String,Object> findByTeacherId(Integer teacherId) {
+		Date now=new Date();
+		//下周一日期
+		Date nextMonday= DateUtil.getNextWeekMonday(now);
+		//下周日日期
+		Date nextSunday=DateUtil.getNextWeekSunday(now);
+
+		Map<String,Object> result=new HashMap<>();
+
+		//当前教师下周的试听课计划
+		List<DemoGroupCoursesPlan> nextWeekDemoGroupCoursePlan = demoGroupCoursesPlanDao.findByDateZone(nextMonday, nextSunday, teacherId);
+		if(CollectionUtils.isEmpty(nextWeekDemoGroupCoursePlan)){
+			result.put("baseInfo",new Object());
+			result.put("list",new ArrayList<>());
+		}else{
+			DemoGroup demoGroup = demoGroupDao.findById(nextWeekDemoGroupCoursePlan.get(0).getDemoGroupId());
+			result.put("baseInfo",demoGroup);
+			List<Map<String,Object>> courses=new ArrayList<>();
+			Map<String, List<DemoGroupCoursesPlan>> collect = nextWeekDemoGroupCoursePlan.stream().collect(Collectors.groupingBy(DemoGroupCoursesPlan::getCourseDateStr));
+			for(String key:collect.keySet()){
+				Map<String,Object> r=new HashMap<>();
+				r.put("day",key);
+				r.put("list",collect.get(key));
+				courses.add(r);
+			}
+			result.put("list",courses);
+		}
+		return result;
+
 	}
 }

+ 115 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -2,19 +2,14 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
-import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
-import com.ym.mec.biz.dal.dto.StudentStatusCountUtilEntity;
-import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.StudentAttendance;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -41,11 +36,20 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 	private MusicGroupStudentFeeDao studentFeeDao;
 	@Autowired
 	private CourseScheduleDao courseScheduleDao;
-	
+	@Autowired
+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+	@Autowired
+	private ClassGroupDao classGroupDao;
 	@Autowired
 	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private SubjectDao subjectDao;
+	@Autowired
+	private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
+	@Autowired
+	private MusicGroupQuitDao musicGroupQuitDao;
 
 	@Override
 	public BaseDAO<Long, StudentAttendance> getDAO() {
@@ -192,4 +196,104 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 		
 		return true;
 	}
-}
+
+	@Override
+	public PageInfo statisticsList(CourseHomeworkQueryInfo queryInfo) {
+
+		if(Objects.isNull(queryInfo.getClassGroupId())){
+			throw new BizException("请指定班级");
+		}
+
+		PageInfo pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<StudentAttendanceStatisticsResponse> dataList = null;
+		int count = courseScheduleStudentPaymentDao.countStudentByClassGroup(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			ClassGroup classGroup = classGroupDao.get(queryInfo.getClassGroupId().intValue());
+			if(Objects.isNull(classGroup)){
+				throw new BizException("班级不存在");
+			}
+			dataList = courseScheduleStudentPaymentDao.findStudentByClassGroup(params);
+			//学生编号列表
+			List<Integer> userIds = dataList.stream().map(StudentAttendanceStatisticsResponse::getUserId).collect(Collectors.toList());
+			//学生-科目名称关联集合
+			List<Map<Integer, String>> byMusicGroupAndUsers = subjectDao.findByMusicGroupAndUsers(classGroup.getMusicGroupId(), userIds);
+			Map<Integer, String> userSubjectNameMap = MapUtil.convertMybatisMap(byMusicGroupAndUsers);
+			//学生-旷课次数关联集合
+			List<Map<Integer, Integer>> continuousAbsenteeismTimesByUsersAndMusicGroup = musicGroupStudentFeeDao.findContinuousAbsenteeismTimesByUsersAndMusicGroup(classGroup.getMusicGroupId(), userIds);
+			Map<Integer,Integer> continuousAbsenteeismTimesWithUser=MapUtil.convertMybatisMap(continuousAbsenteeismTimesByUsersAndMusicGroup);
+			//学生签到记录列表
+			List<StudentAttendanceResponse> studentAttendances = studentAttendanceDao.findByClassGroupAndUsers(queryInfo.getClassGroupId(), userIds);
+			//学生签到状态统计列表
+			List<StudentAttendanceStatusCountDto> studentAttendanceStatusCountDtos = studentAttendanceDao.countStudentAttendanceStatus(queryInfo.getClassGroupId(), userIds);
+			Map<Integer, List<StudentAttendanceStatusCountDto>> studentAttendanceStatusCountDtosByUser = studentAttendanceStatusCountDtos.stream().collect(Collectors.groupingBy(StudentAttendanceStatusCountDto::getUserId));
+
+			if(!CollectionUtils.isEmpty(studentAttendances)){
+				//学生-签到记录关联集合
+				Map<Integer, List<StudentAttendanceResponse>> studentAttendanceByUser = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendanceResponse::getUserId));
+
+				dataList.forEach(student->{
+					//判断是否是连续签到
+					Integer continuousAbsenteeismTimes = continuousAbsenteeismTimesWithUser.get(student.getUserId());
+					if(Objects.nonNull(continuousAbsenteeismTimes)){
+						if(continuousAbsenteeismTimes>=3){
+							student.setTruant(true);
+						}
+					}
+					//获取科目名
+					String userSubjectName = userSubjectNameMap.get(student.getSubjectName());
+					if(Objects.nonNull(userSubjectName)){
+						student.setSubjectName(userSubjectName);
+					}
+					//当前学生的签到状态统计
+					List<StudentAttendanceStatusCountDto> currentStudentAttendanceStatusCountDtos = studentAttendanceStatusCountDtosByUser.get(student.getUserId());
+					if(!CollectionUtils.isEmpty(currentStudentAttendanceStatusCountDtos)){
+						Map<StudentAttendanceStatusEnum, Integer> statusAndNumMap = currentStudentAttendanceStatusCountDtos.stream().collect(Collectors.toMap(StudentAttendanceStatusCountDto::getStatus, StudentAttendanceStatusCountDto::getNum));
+						student.setNormalDay(statusAndNumMap.get(StudentAttendanceStatusEnum.NORMAL));
+						student.setNormalDay(statusAndNumMap.get(StudentAttendanceStatusEnum.TRUANT));
+						student.setNormalDay(statusAndNumMap.get(StudentAttendanceStatusEnum.LEAVE));
+					}
+
+					//当前学生签到记录
+					List<StudentAttendanceResponse> studentAttendanceResps = studentAttendanceByUser.get(student.getUserId());
+					if(Objects.nonNull(studentAttendanceResps)){
+						student.setList(studentAttendanceResps);
+					}
+				});
+			}
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	public CourseScheduleResponse getStatisticsInfo(Integer classGroupId) {
+		if(Objects.isNull(classGroupId)){
+			throw new BizException("请指定班级");
+		}
+		ClassGroup classGroup = classGroupDao.get(classGroupId);
+		CourseScheduleResponse courseScheduleResp = new CourseScheduleResponse();
+		if (Objects.nonNull(classGroup)) {
+			if (Objects.nonNull(classGroup.getCurrentClassTimes()) && Objects.nonNull(classGroup.getTotalClassTimes())) {
+				courseScheduleResp.setAlreadyInClass(classGroup.getCurrentClassTimes() + "/" + classGroup.getTotalClassTimes());
+			}
+			if (Objects.nonNull(classGroup.getStudentNum())) {
+				courseScheduleResp.setStudentNum(classGroup.getStudentNum());
+			}
+			Date latestSignInDate = studentAttendanceDao.findLatestSignInDate(classGroupId);
+			if(Objects.nonNull(latestSignInDate)){
+				courseScheduleResp.setClassDate(DateUtil.format(latestSignInDate,DateUtil.DATE_FORMAT_MIN));
+				courseScheduleResp.setClassTime(DateUtil.date2Week(latestSignInDate));
+			}
+			courseScheduleResp.setLeagueNum(musicGroupQuitDao.countMusicGroupQuitNum(classGroup.getMusicGroupId()));
+		}
+		return courseScheduleResp;
+	}
+}

+ 19 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.TeacherAbnormalAttendanceInfoDto;
 import com.ym.mec.biz.dal.dto.TeacherAttendanceDto;
 import com.ym.mec.biz.dal.dto.TeacherPersonalAttendanceDto;
 import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
@@ -200,4 +201,21 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		return true;
 	}
 
-}
+	@Override
+	public List<TeacherAbnormalAttendanceInfoDto> findTeacherAbnormalSignInCourseScheduleRecord(Integer organId, Date date, Integer signInStatus) {
+		return teacherAttendanceDao.findTeacherAbnormalSignInCourseScheduleRecord(organId,date,signInStatus);
+	}
+
+	@Override
+	public List<Date> findTeacherAbnormalSignInDates(Integer organId, Date date) {
+		return teacherAttendanceDao.findTeacherAbnormalSignInDates(organId,date);
+	}
+
+	@Override
+	public Map countTeacherAbnormalSignInClassTimes(Integer organId, Date date) {
+		Map<String,Integer> result=new HashMap<>();
+		result.put("abnormalSignInNum",teacherAttendanceDao.countTeacherAbnormalSignInClassTimes(organId,date,YesOrNoEnum.NO.getCode()));
+		result.put("noSignInNum",teacherAttendanceDao.countTeacherAbnormalSignInClassTimes(organId,date,null));
+		return result;
+	}
+}

+ 42 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupActivityServiceImpl.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dao.VipGroupActivityDao;
 import com.ym.mec.biz.dal.dto.VipGroupActivityAddDto;
+import com.ym.mec.biz.dal.dto.VipGroupSalarySettlementDto;
 import com.ym.mec.biz.dal.entity.VipGroupActivity;
 import com.ym.mec.biz.service.VipGroupActivityService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -31,6 +32,46 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
 			throw new BizException("请指定部门!");
 		}
 
+		VipGroupSalarySettlementDto vipGroupSalarySettlement = vipGroupActivityAddDto.getVipGroupSalarySettlement();
+		if(Objects.nonNull(vipGroupSalarySettlement.getOnlineSalarySettlement())){
+			switch (vipGroupSalarySettlement.getOnlineSalarySettlement().getSalarySettlementType()){
+				case TEACHER_DEFAULT:
+					break;
+				case RATIO_DISCOUNT:
+					if(Objects.isNull(vipGroupSalarySettlement.getOnlineSalarySettlement().getSettlementValue())){
+						throw new BizException("请指定线下课单价折算比例");
+					}
+					break;
+				case FIXED_SALARY:
+					if(Objects.isNull(vipGroupSalarySettlement.getOnlineSalarySettlement().getSettlementValue())){
+						throw new BizException("请指定线下课固定课酬");
+					}
+					break;
+				default:
+					throw new BizException("未指定课酬结算标准!");
+			}
+		}
+
+		if(Objects.nonNull(vipGroupSalarySettlement.getOfflineSalarySettlement())){
+			switch (vipGroupSalarySettlement.getOfflineSalarySettlement().getSalarySettlementType()){
+				case TEACHER_DEFAULT:
+					break;
+				case RATIO_DISCOUNT:
+					if(Objects.isNull(vipGroupSalarySettlement.getOfflineSalarySettlement().getSettlementValue())){
+						throw new BizException("请指定线线上课单价折算比例");
+					}
+					break;
+				case FIXED_SALARY:
+					if(Objects.isNull(vipGroupSalarySettlement.getOfflineSalarySettlement().getSettlementValue())){
+						throw new BizException("请指定线上课固定课酬");
+					}
+					break;
+				default:
+					throw new BizException("未指定课酬结算标准!");
+			}
+		}
+
+
 		vipGroupActivityAddDto.setSalarySettlementJson(JSON.toJSONString(vipGroupActivityAddDto.getVipGroupSalarySettlement()));
 		super.insert(vipGroupActivityAddDto);
 	}
@@ -54,4 +95,4 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
 		}
 		return vipGroupActivityDao.findByCategory(categoryId);
 	}
-}
+}

+ 49 - 35
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -180,6 +180,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		classGroup.setTotalClassTimes(vipGroupApplyBaseInfoDto.getOnlineClassesNum()+vipGroupApplyBaseInfoDto.getOfflineClassesNum());
 		classGroup.setType(ClassGroupTypeEnum.VIP);
 		classGroup.setDelFlag(YesOrNoEnum.NO);
+		classGroup.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
 		classGroupDao.insert(classGroup);
 
 		//创建vip课班级关联记录
@@ -216,6 +217,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             }
 		    courseSchedule.setSchoolId(vipGroup.getVipGroupApplyBaseInfo().getTeacherSchoolId());
 		    courseSchedule.setTeacherId(vipGroupApplyBaseInfoDto.getUserId().longValue());
+			courseSchedule.setActualTeacherId(vipGroupApplyBaseInfoDto.getUserId().longValue());
 			courseSchedule.setStatus(CourseStatusEnum.NOT_START);
 		    courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
 			courseSchedule.setClassGroupId(classGroup.getId());
@@ -329,8 +331,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		}
 		pageInfo.setRows(dataList);
 		TeachingRecordBaseInfo classTimes = vipGroupDao.getClassTimes(queryInfo.getVipGroupId());
-		classTimes.setIsSalaryNum(vipGroupDao.countIsSalaryNum(queryInfo.getVipGroupId()));
-		classTimes.setComplaintsNum(vipGroupDao.countComplaintsNum(queryInfo.getVipGroupId()));
+		if(!Objects.isNull(classTimes)){
+			classTimes.setIsSalaryNum(vipGroupDao.countIsSalaryNum(queryInfo.getVipGroupId()));
+			classTimes.setComplaintsNum(vipGroupDao.countComplaintsNum(queryInfo.getVipGroupId()));
+		}
 		Map<String,Object> result=new HashMap<>();
 		result.put("pageInfo",pageInfo);
 		result.put("baseInfo",classTimes);
@@ -499,41 +503,46 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		BigDecimal onlineClassNum=new BigDecimal(vipGroup.getOnlineClassesNum());
 		BigDecimal onlineVipGroupCharge = onlineClassesUnitPrice.multiply(onlineClassNum);
 		BigDecimal offlineVipGroupCharge = offlineClassesUnitPrice.multiply(offlineClassNum);
+		BigDecimal totalClassNum=offlineClassNum.add(onlineClassNum);
 
 		//教师课酬线上单课酬计算
-		switch (vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSalarySettlementType()){
-			case TEACHER_DEFAULT:
-				if(Objects.isNull(teacherDefaultVipGroupSalary)){
-					throw new BizException("未设置教师默认课酬");
-				}
-				results.put("onlineTeacherSalary",teacherDefaultVipGroupSalary.getOfflineClassesSalary().multiply(classTimeDuty));
-				break;
-			case RATIO_DISCOUNT:
-				results.put("onlineTeacherSalary",onlineClassesUnitPrice.multiply((vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSettlementValue())));
-				break;
-			case FIXED_SALARY:
-				results.put("onlineTeacherSalary",vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSettlementValue());
-				break;
-			default:
-				throw new BizException("未指定课酬结算标准!");
+		if(Objects.nonNull(vipGroupSalarySettlementDto.getOnlineSalarySettlement())){
+			switch (vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSalarySettlementType()){
+				case TEACHER_DEFAULT:
+					if(Objects.isNull(teacherDefaultVipGroupSalary)){
+						throw new BizException("未设置教师默认课酬");
+					}
+					results.put("onlineTeacherSalary",teacherDefaultVipGroupSalary.getOnlineClassesSalary().multiply(classTimeDuty));
+					break;
+				case RATIO_DISCOUNT:
+					results.put("onlineTeacherSalary",onlineClassesUnitPrice.multiply((vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSettlementValue())).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP));
+					break;
+				case FIXED_SALARY:
+					results.put("onlineTeacherSalary",vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSettlementValue());
+					break;
+				default:
+					throw new BizException("未指定课酬结算标准!");
+			}
 		}
 
 		//教师线下单课酬计算
-		switch (vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSalarySettlementType()){
-			case TEACHER_DEFAULT:
-				if(Objects.isNull(teacherDefaultVipGroupSalary)){
-					throw new BizException("未设置教师默认课酬");
-				}
-				results.put("offlineTeacherSalary",teacherDefaultVipGroupSalary.getOfflineClassesSalary().multiply(classTimeDuty));
-				break;
-			case RATIO_DISCOUNT:
-				results.put("offlineTeacherSalary",offlineClassesUnitPrice.multiply(vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSettlementValue()));
-				break;
-			case FIXED_SALARY:
-				results.put("offlineTeacherSalary",vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSettlementValue());
-				break;
-			default:
-				throw new BizException("未指定课酬结算标准!");
+		if(Objects.nonNull(vipGroupSalarySettlementDto.getOfflineSalarySettlement())){
+			switch (vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSalarySettlementType()){
+				case TEACHER_DEFAULT:
+					if(Objects.isNull(teacherDefaultVipGroupSalary)){
+						throw new BizException("未设置教师默认课酬");
+					}
+					results.put("offlineTeacherSalary",teacherDefaultVipGroupSalary.getOfflineClassesSalary().multiply(classTimeDuty));
+					break;
+				case RATIO_DISCOUNT:
+					results.put("offlineTeacherSalary",offlineClassesUnitPrice.multiply(vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSettlementValue()).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP));
+					break;
+				case FIXED_SALARY:
+					results.put("offlineTeacherSalary",vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSettlementValue());
+					break;
+				default:
+					throw new BizException("未指定课酬结算标准!");
+			}
 		}
 
 		if(computeTotalPrice){
@@ -546,16 +555,16 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				case DISCOUNT:
 					BigDecimal discount=new BigDecimal(vipGroupActivity.getAttribute1());
 					totalPrice=onlineVipGroupCharge.add(offlineVipGroupCharge);
-					totalPrice=totalPrice.multiply(discount);
+					totalPrice=totalPrice.multiply(discount).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP);
 					break;
 				case GIVE_CLASS:
 					if(vipGroup.getGiveTeachMode()==TeachModeEnum.OFFLINE){
-						if(offlineClassNum.compareTo(new BigDecimal(vipGroupActivity.getAttribute1()))>-1){
+						if(totalClassNum.compareTo(new BigDecimal(vipGroupActivity.getAttribute1()))>-1){
 							offlineClassNum=offlineClassNum.subtract(new BigDecimal(vipGroupActivity.getAttribute2()));
 						}
 						offlineVipGroupCharge = offlineClassesUnitPrice.multiply(offlineClassNum);
 					}else if(vipGroup.getGiveTeachMode()==TeachModeEnum.ONLINE){
-						if(onlineClassNum.compareTo(new BigDecimal(vipGroupActivity.getAttribute1()))>-1){
+						if(totalClassNum.compareTo(new BigDecimal(vipGroupActivity.getAttribute1()))>-1){
 							onlineClassNum=onlineClassNum.subtract(new BigDecimal(vipGroupActivity.getAttribute2()));
 						}
 						onlineVipGroupCharge = onlineClassesUnitPrice.multiply(onlineClassNum);
@@ -609,6 +618,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		VipGroupClassGroupMapper vipGroupClassGroupMapper = vipGroupClassGroupMapperDao.findByVipGroupId(vipGroup.getId());
 
+		if(Objects.isNull(vipGroupClassGroupMapper)){
+			throw new BizException("课程信息错误");
+		}
+
 		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
 		StudentPaymentOrder studentPaymentOrder=new StudentPaymentOrder();
 		studentPaymentOrder.setUserId(user.getId());
@@ -616,6 +629,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		studentPaymentOrder.setOrderNo(orderNo);
 		studentPaymentOrder.setType(OrderTypeEnum.SMALL_CLASS_TO_BUY);
 		studentPaymentOrder.setExpectAmount(vipGroup.getTotalPrice());
+		studentPaymentOrder.setMusicGroupId(vipGroup.getId().toString());
 		if(vipGroupActivity.getType()==VipGroupActivityTypeEnum.DISCOUNT){
 			studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount().multiply(new BigDecimal(vipGroupActivity.getAttribute1())));
 		}else{

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

@@ -181,6 +181,7 @@
         <result property="signInTime" column="sign_in_time_"/>
         <result column="total_class_times_" property="totalClassTimes"/>
         <result column="current_class_times_" property="currentClassTimes"/>
+        <result column="student_num_" property="studentNum"/>
     </resultMap>
 
     <select id="getCurrentCourseDetail"
@@ -196,6 +197,7 @@
         cg.name_ class_name,
         cg.total_class_times_,
         cg.current_class_times_,
+        cg.student_num_,
         cs.type_ class_type,
         mg.id_ music_group_id,
         mg.name_ music_group_name,
@@ -978,4 +980,16 @@
         WHERE spo.type_ != 'OTHER' AND spo.music_group_id_ IS NOT NULL AND spo.user_id_ = #{userId}
         <include refid="global.limit"/>
     </select>
+    <select id="countExistRepeatInDateZone" resultType="int">
+        SELECT
+          COUNT(csts.course_schedule_id_)
+        FROM
+          course_schedule_teacher_salary csts
+        LEFT JOIN course_schedule cs ON csts.course_schedule_id_=cs.id_
+        WHERE
+            csts.user_id_=#{teacherId}
+            AND cs.class_date_ = DATE_FORMAT( #{classDate}, '%Y-%m-%d' )
+            AND DATE_FORMAT( #{startTime}, '%H:%i:%S' ) &lt;= DATE_FORMAT( cs.end_class_time_, '%H:%i:%S' )
+            AND DATE_FORMAT( #{endTime}, '%H:%i:%S' ) &gt;= DATE_FORMAT( cs.start_class_time_, '%H:%i:%S' )
+    </select>
 </mapper>

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

@@ -101,6 +101,38 @@
 		</foreach>
     </select>
 
+	<resultMap id="StudentAttendanceStatisticsResp" type="com.ym.mec.biz.dal.dto.StudentAttendanceStatisticsResponse">
+		<result property="userId" column="user_id_"/>
+		<result property="studentName" column="real_name_"/>
+	</resultMap>
+
+	<select id="findStudentByClassGroup" resultMap="StudentAttendanceStatisticsResp">
+		SELECT
+			cssp.user_id_,
+			su.real_name_
+		FROM
+			course_schedule_student_payment cssp
+			LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
+			LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
+		WHERE
+			cs.class_group_id_ = #{classGroupId}
+		GROUP BY
+			cssp.user_id_
+		ORDER BY cssp.user_id_
+		<include refid="global.limit"/>
+	</select>
+
+	<select id="countStudentByClassGroup" resultType="int">
+		SELECT
+			COUNT(DISTINCT cssp.user_id_)
+		FROM
+			course_schedule_student_payment cssp
+			LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
+			LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
+		WHERE
+			cs.class_group_id_ = #{classGroupId}
+	</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=",">

+ 22 - 3
mec-biz/src/main/resources/config/mybatis/DemoGroupCoursesPlanMapper.xml

@@ -33,10 +33,10 @@
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</selectKey>
 		-->
-		INSERT INTO demo_group_courses_plan (demo_group_id_,create_time_,status_,course_date_,start_time_,end_time_)
+		INSERT INTO demo_group_courses_plan (demo_group_id_,create_time_,course_date_,start_time_,end_time_)
 		VALUE
 		<foreach collection="dates" item="date" separator=",">
-			(#{demoGroupId},now(),#{status},#{date},#{date},DATE_ADD(#{date},INTERVAL #{classMinutes} MINUTE))
+			(#{demoGroupId},now(),#{date},#{date},DATE_ADD(#{date},INTERVAL #{classMinutes} MINUTE))
 		</foreach>
 	</insert>
 
@@ -82,7 +82,10 @@
 	<delete id="delete" >
 		DELETE FROM demo_group_courses_plan WHERE id_ = #{id} 
 	</delete>
-	
+	<delete id="deleteAfterDate">
+		DELETE FROM demo_group_courses_plan WHERE demo_group_id_=#{demoGroupId} AND course_date_>=#{date} AND status_=0
+	</delete>
+
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="DemoGroupCoursesPlan" parameterType="map">
 		SELECT * FROM demo_group_courses_plan ORDER BY id_ <include refid="global.limit"/>
@@ -92,4 +95,20 @@
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM demo_group_courses_plan
 	</select>
+
+    <select id="findByDateZone" resultMap="DemoGroupCoursesPlan">
+		SELECT
+			dgcp.id_,
+			dgcp.demo_group_id_,
+			dgcp.create_time_,
+			dgcp.status_,
+			dgcp.course_date_,
+			CONCAT(dgcp.course_date_,' ',dgcp.start_time_) start_time_,
+			CONCAT(dgcp.course_date_,' ',dgcp.end_time_) end_time_
+		FROM
+			`demo_group_courses_plan` dgcp
+			LEFT JOIN demo_group dg ON dgcp.demo_group_id_=dg.id_
+			WHERE dg.user_id_=#{userId}
+			AND (DATE_FORMAT(dgcp.course_date_,'%Y%m') BETWEEN DATE_FORMAT(#{startTime},'%Y%m') AND DATE_FORMAT(#{endTime},'%Y%m'))
+	</select>
 </mapper>

+ 19 - 0
mec-biz/src/main/resources/config/mybatis/DemoGroupMapper.xml

@@ -16,6 +16,7 @@
         <result column="user_id_" property="userId"/>
         <result column="price_" property="price"/>
         <result column="subject_id_" property="subjectId"/>
+        <result column="subject_name_" property="subjectName"/>
     </resultMap>
 
     <resultMap id="studentDemoGroupListDto" type="com.ym.mec.biz.dal.dto.StudentDemoGroupListDto">
@@ -40,6 +41,24 @@
 		SELECT * FROM demo_group ORDER BY id_
 	</select>
 
+    <select id="findById" resultMap="DemoGroup">
+        SELECT
+            dg.id_,
+            dg.name_,
+            dg.single_class_minutes_,
+            dg.organ_id_list_,
+            dg.create_time_,
+            dg.update_time_,
+            dg.user_id_,
+            dg.price_,
+            dg.subject_id_,
+            s.name_ subject_name_
+        FROM
+            demo_group dg
+            LEFT JOIN `subject` s ON dg.subject_id_=s.id_
+        WHERE dg.id_ = #{id}
+    </select>
+
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.DemoGroup" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">

+ 5 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml

@@ -87,4 +87,9 @@
 		SELECT COUNT(*) FROM
 		music_group_quit
 	</select>
+	<select id="countMusicGroupQuitNum" resultType="int">
+		SELECT COUNT( * )
+		FROM music_group_quit
+		WHERE music_group_id_=#{musicGroupId} AND status_='APPROVED'
+	</select>
 </mapper>

+ 13 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupStudentFeeMapper.xml

@@ -134,6 +134,19 @@
         WHERE user_id_ = #{userId} AND FIND_IN_SET(music_group_id_,#{musicGroupIds})
     </select>
 
+    <select id="findContinuousAbsenteeismTimesByUsersAndMusicGroup" resultType="map">
+        SELECT
+            mgsf.user_id_ AS 'key',
+            mgsf.continuous_absenteeism_times_ AS 'value'
+        FROM
+            music_group_student_fee_ mgsf
+            WHERE mgsf.music_group_id_=#{musicGroupId}
+            AND mgsf.user_id_ IN
+            <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+                #{userId}
+            </foreach>
+    </select>
+
     <update id="batchUpdate" parameterType="java.util.List">
     	<foreach collection="list" item="item" index="index" open="" close="" separator=";">
         UPDATE music_group_student_fee_

+ 65 - 0
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -233,4 +233,69 @@
     <select id="findLatestAttendanceDate" resultType="date">
       SELECT MAX(create_time_) FROM student_attendance WHERE course_schedule_id_=#{courseScheduleId}
     </select>
+
+    <resultMap id="StudentAttendanceResponse" type="com.ym.mec.biz.dal.dto.StudentAttendanceResponse">
+        <result property="userId" column="user_id_"/>
+        <result property="classDate" column="class_date_"/>
+        <result property="status" column="status_"/>
+        <result property="courseScheduleId" column="course_schedule_id_"/>
+    </resultMap>
+
+    <select id="findByClassGroupAndUsers" resultMap="StudentAttendanceResponse">
+        SELECT
+            cs.id_ course_schedule_id_,
+            cs.class_date_,
+            sa.user_id_,
+            sa.status_
+        FROM
+            student_attendance sa
+            LEFT JOIN course_schedule cs ON sa.course_schedule_id_=cs.id_
+            WHERE sa.class_group_id_=#{classGroupId}
+            AND sa.user_id_ IN
+            <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+                #{userId}
+            </foreach>
+    </select>
+
+    <resultMap id="StudentAttendanceStatusCountDto" type="com.ym.mec.biz.dal.dto.StudentAttendanceStatusCountDto">
+        <result property="userId" column="user_id_"/>
+        <result property="status" column="status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="num" column="num_"/>
+    </resultMap>
+
+    <select id="countStudentAttendanceStatus" resultMap="StudentAttendanceStatusCountDto">
+        SELECT
+            user_id_,
+            status_,
+            COUNT(course_schedule_id_) num_
+        FROM
+            student_attendance
+            WHERE class_group_id_=#{classGroupId}
+            AND user_id_ IN
+            <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+                #{userId}
+            </foreach>
+        GROUP BY user_id_,status_
+    </select>
+
+    <select id="getCurrentClassTimesByCourses" resultType="map">
+        SELECT
+            course_schedule_id_ AS 'key',
+            current_class_times_ AS 'value'
+        FROM
+            student_attendance
+        WHERE
+            course_schedule_id_ IN
+            <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+                #{courseScheduleId}
+            </foreach>
+            GROUP BY course_schedule_id_,current_class_times_
+    </select>
+    <select id="findLatestSignInDate" resultType="java.util.Date">
+        SELECT
+            MAX(create_time_)
+        FROM
+            student_attendance
+            WHERE class_group_id_=#{classGroupId}
+    </select>
 </mapper>

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

@@ -154,4 +154,18 @@
             #{subjectId}
         </foreach>
     </select>
+
+    <select id="findByMusicGroupAndUsers" resultType="map">
+        SELECT
+            sr.user_id_ AS 'key',
+            s.name_ AS 'value'
+        FROM
+            student_registration sr
+            LEFT JOIN `subject` s ON sr.actual_subject_id_=s.id_
+            WHERE sr.music_group_id_=#{musicGroupId}
+            AND sr.user_id_ IN
+            <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+                #{userId}
+            </foreach>
+    </select>
 </mapper>

+ 74 - 0
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -153,4 +153,78 @@
         SELECT * FROM teacher_attendance WHERE teacher_id_=#{teacherId} AND course_schedule_id_=#{courseScheduleId}
     </select>
 
+    <resultMap id="TeacherAbnormalAttendanceInfoDto" type="com.ym.mec.biz.dal.dto.TeacherAbnormalAttendanceInfoDto">
+        <result property="teacherAttendanceId" column="teacher_attendance_id_"/>
+        <result property="courseScheduleId" column="course_schedule_id_"/>
+        <result property="courseScheduleName" column="course_schedule_name_"/>
+        <result property="classDate" column="class_date_"/>
+        <result property="startClassTime" column="start_class_time_"/>
+        <result property="endClassTime" column="end_class_time_"/>
+        <result property="signInTime" column="sign_in_time_"/>
+        <result property="teacherId" column="teacher_id_"/>
+        <result property="teacherName" column="teacher_name_"/>
+        <result property="remark" column="remark_"/>
+    </resultMap>
+
+    <select id="findTeacherAbnormalSignInCourseScheduleRecord" resultMap="TeacherAbnormalAttendanceInfoDto">
+        SELECT
+            ta.id_ teacher_attendance_id_,
+            cs.id_ course_schedule_id_,
+            cs.name_ course_schedule_name_,
+            cs.class_date_,
+            CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) start_class_time_,
+            CONCAT( cs.class_date_, ' ', cs.end_class_time_ ) end_class_time_,
+            ta.sign_in_time_,
+            ta.teacher_id_,
+            su.username_ teacher_name_,
+            ta.remark_
+        FROM
+            teacher_attendance ta
+            LEFT JOIN course_schedule cs ON ta.course_schedule_id_ = cs.id_
+            LEFT JOIN music_group mg ON ta.music_group_id_ = mg.id_
+            LEFT JOIN sys_user su ON su.id_ = ta.teacher_id_
+        WHERE
+            mg.organ_id_ = #{organId}
+            AND ta.sign_in_status_ = #{signInStatus}
+            <if test="date==null">
+                AND DATE_FORMAT( ta.sign_in_time_, '%Y%m%d' ) = DATE_FORMAT( NOW(), '%Y%m%d' )
+            </if>
+            <if test="date!=null">
+                AND DATE_FORMAT( ta.sign_in_time_, '%Y%m%d' ) = DATE_FORMAT( #{date}, '%Y%m%d' )
+            </if>
+    </select>
+    <select id="findTeacherAbnormalSignInDates" resultType="java.util.Date">
+        SELECT
+            DATE_FORMAT(ta.sign_in_time_,'%Y%m%d') sign_date_
+        FROM
+            teacher_attendance ta
+            LEFT JOIN music_group mg ON ta.music_group_id_ = mg.id_
+        WHERE
+            mg.organ_id_ = #{organId}
+            AND ta.sign_in_status_ != 1
+            <if test="date==null">
+                AND DATE_FORMAT( ta.sign_in_time_, '%Y%m' ) = DATE_FORMAT( NOW(), '%Y%m' )
+            </if>
+            <if test="date!=null">
+                AND DATE_FORMAT( ta.sign_in_time_, '%Y%m' ) = DATE_FORMAT( #{date}, '%Y%m' )
+            </if>
+        GROUP BY DATE_FORMAT(ta.sign_in_time_,'%Y%m%d')
+    </select>
+    <select id="countTeacherAbnormalSignInClassTimes" resultType="int">
+        SELECT
+            COUNT(*)
+        FROM
+          teacher_attendance ta
+        LEFT JOIN music_group mg ON ta.music_group_id_ = mg.id_
+        WHERE
+          mg.organ_id_ = #{organId}
+        AND ta.sign_in_status_ = #{signInStatus}
+        <if test="date==null">
+            AND DATE_FORMAT( ta.sign_in_time_, '%Y%m%d' ) = DATE_FORMAT( NOW(), '%Y%m%d' )
+        </if>
+        <if test="date!=null">
+            AND DATE_FORMAT( ta.sign_in_time_, '%Y%m%d' ) = DATE_FORMAT( #{date}, '%Y%m%d' )
+        </if>
+    </select>
+
 </mapper>

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

@@ -142,7 +142,7 @@
             LEFT JOIN class_group cg ON vgcgm.class_group_id_=cg.id_
             LEFT JOIN vip_group_activity vga ON vg.vip_group_activity_id_=vga.id_
         <include refid="vipGroupQueryCondition"/>
-        ORDER BY vg.id_
+        ORDER BY vg.id_ DESC
         <include refid="global.limit"/>
 	</select>
 
@@ -259,6 +259,7 @@
         <where>
             vg.status_!=3
             AND vg.audit_status_='PASS'
+            AND vg.status_=1
             <if test="subjectId!=null">
                AND FIND_IN_SET(#{subjectId},cg.subject_id_list_)
             </if>

+ 43 - 1
mec-education/src/main/java/com/ym/mec/education/controller/TeacherAttendanceController.java

@@ -1,16 +1,24 @@
 package com.ym.mec.education.controller;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.TeacherAttendanceService;
+import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.education.base.PageResponse;
 import com.ym.mec.education.req.TeacherLeaveRecordReq;
 import com.ym.mec.education.service.ITeacherAttendanceService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Date;
+import java.util.Objects;
+
 /**
  * @program: mec
  * @description: 老师考勤 上课
@@ -20,14 +28,48 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("api/teacherAttendance")
 @Api(tags = "老师考勤/上课")
-public class TeacherAttendanceController {
+public class TeacherAttendanceController extends BaseController {
 
     @Autowired
     private ITeacherAttendanceService teacherAttendanceService;
+    @Autowired
+    private TeacherAttendanceService iteacherAttendanceService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
 
     @PostMapping("/list")
     @ApiOperation("老师上课记录列表")
     public PageResponse list(@RequestBody TeacherLeaveRecordReq teacherLeaveRecordReq) {
         return teacherAttendanceService.getPage(teacherLeaveRecordReq);
     }
+
+    @PostMapping("/findTeacherAbnormalSignInCourseScheduleRecord")
+    @ApiOperation("根据日期获取部门下异常签到的课程记录")
+    public Object findTeacherAbnormalSignInCourseScheduleRecord(Date date, Integer signInStatus) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(iteacherAttendanceService.findTeacherAbnormalSignInCourseScheduleRecord(user.getOrganId(),date,signInStatus));
+    }
+
+    @PostMapping("/findTeacherAbnormalSignInDates")
+    @ApiOperation("根据月份获取部门下异常签到的日期")
+    public Object findTeacherAbnormalSignInDates(Date month) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(iteacherAttendanceService.findTeacherAbnormalSignInDates(user.getOrganId(),month));
+    }
+
+    @PostMapping("/countTeacherAbnormalSignInClassTimes")
+    @ApiOperation("根据日期获取对应签到状态的课程数量")
+    public Object countTeacherAbnormalSignInClassTimes(Date date) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return iteacherAttendanceService.countTeacherAbnormalSignInClassTimes(user.getOrganId(),date);
+    }
 }

+ 10 - 11
mec-education/src/main/java/com/ym/mec/education/entity/ClassGroup.java

@@ -62,8 +62,8 @@ public class ClassGroup extends Model<ClassGroup> {
     /**
      * 教学形式(线上、线下)
      */
-    @TableField("teach_mode_")
-    private String teachMode;
+//    @TableField("teach_mode_")
+//    private String teachMode;
     /**
      * 总课次
      */
@@ -163,14 +163,14 @@ public class ClassGroup extends Model<ClassGroup> {
         return this;
     }
 
-    public String getTeachMode() {
-        return teachMode;
-    }
-
-    public ClassGroup setTeachMode(String teachMode) {
-        this.teachMode = teachMode;
-        return this;
-    }
+//    public String getTeachMode() {
+//        return teachMode;
+//    }
+//
+//    public ClassGroup setTeachMode(String teachMode) {
+//        this.teachMode = teachMode;
+//        return this;
+//    }
 
     public Integer getTotalClassTimes() {
         return totalClassTimes;
@@ -208,7 +208,6 @@ public class ClassGroup extends Model<ClassGroup> {
         ", updateTime=" + updateTime +
         ", type=" + type +
         ", delFlag=" + delFlag +
-        ", teachMode=" + teachMode +
         ", totalClassTimes=" + totalClassTimes +
         ", currentClassTimes=" + currentClassTimes +
         "}";

+ 29 - 12
mec-teacher/src/main/java/com/ym/mec/teacher/controller/DemoGroupController.java

@@ -1,15 +1,20 @@
 package com.ym.mec.teacher.controller;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.DemoGroupApplyDto;
-import com.ym.mec.biz.dal.entity.DemoGroup;
-import com.ym.mec.biz.dal.page.TeacherManageDemoGroupQueryInfo;
+import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.biz.service.DemoGroupService;
+import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Objects;
+
 /**
  * @Author Joburgess
  * @Date 2019/9/25
@@ -21,14 +26,31 @@ public class DemoGroupController extends BaseController {
 
     @Autowired
     private DemoGroupService demoGroupService;
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
 
     @ApiOperation(value = "试听课申请")
     @PostMapping("/demoGroupApply")
     public Object demoGroupApply(@RequestBody DemoGroupApplyDto demoGroup){
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        demoGroup.setUserId(user.getId());
+        demoGroup.setOrganIdList(user.getOrganId().toString());
         demoGroupService.demoGroupApply(demoGroup);
         return succeed();
     }
 
+    @ApiOperation(value = "获取试听课课程时长")
+    @GetMapping("/getSingleClassMinutes")
+    public Object getSingleClassMinutes(){
+        SysConfig byParamName = sysConfigService.findByParamName(SysConfigService.DEMO_GROUP_SINGLE_CLASS_MINUTES_);
+        return succeed(byParamName.getParanValue().split(","));
+    }
+
     @ApiOperation(value = "获取老师试听课")
     @GetMapping("/getDemoGroupByTeacherId")
     public Object getDemoGroupByTeacherId() throws Exception {
@@ -37,17 +59,12 @@ public class DemoGroupController extends BaseController {
 
     @ApiOperation(value = "获取指定老师试听课")
     @GetMapping("/findByTeacherId")
-    public Object findByTeacherId(Integer teacherId){
-        if(teacherId == null){
-            return failed("参数校验失败");
+    public Object findByTeacherId(){
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
         }
-        return succeed(demoGroupService.findByTeacherId(teacherId));
-    }
-
-    @ApiOperation(value = "修改试听课")
-    @PostMapping("/update")
-    public Object findByTeacherId(DemoGroup demoGroup){
-        return succeed(demoGroupService.update(demoGroup));
+        return succeed(demoGroupService.findByTeacherId(user.getId()));
     }
 
 }

+ 27 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/LeaveCategoryController.java

@@ -0,0 +1,27 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.biz.service.LeaveCategoryService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("leaveCategory")
+@Api(tags = "请假类型服务")
+@RestController
+public class LeaveCategoryController extends BaseController {
+
+    @Autowired
+    private LeaveCategoryService leaveCategoryService;
+
+    @ApiOperation(value = "分页查询请假类型列表")
+    @PostMapping("/queryPage")
+    public Object queryPage(QueryInfo queryInfo) {
+        return succeed(leaveCategoryService.queryPage(queryInfo));
+    }
+
+}

+ 43 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherDefaultVipGroupSalaryController.java

@@ -0,0 +1,43 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.TeacherDefaultVipGroupSalaryService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+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.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/10/9
+ */
+@Api(tags = "老师默认VIP课薪酬")
+@RequestMapping("teacherDefaultVipGroupSalary")
+@RestController
+public class TeacherDefaultVipGroupSalaryController extends BaseController {
+
+    @Autowired
+    private TeacherDefaultVipGroupSalaryService teacherDefaultVipGroupSalaryService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "根据老师编号及课程类型编号获取默认课酬")
+    @GetMapping("/findByTeacherAndCategory")
+    public Object findByTeacherAndCategory(Long categoryId){
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(teacherDefaultVipGroupSalaryService.findByTeacherAndCategory(user.getId().longValue(),categoryId));
+    }
+
+}

+ 1 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherVipGroupController.java

@@ -41,6 +41,7 @@ public class TeacherVipGroupController extends BaseController {
 		if (Objects.isNull(user)) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
+		vipGroupApplyDto.getVipGroupApplyBaseInfo().setUserId(user.getId());
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setTeacherId(Long.valueOf(user.getId()));
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganIdList(user.getOrganId().toString());
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(user.getOrganId());

+ 0 - 5
mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupActivityController.java

@@ -7,7 +7,6 @@ import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -25,7 +24,6 @@ public class VipGroupActivityController extends BaseController {
 
     @ApiOperation(value = "新增vip课活动方案")
     @PostMapping("/addVipGroupActivity")
-    @PreAuthorize("@pcs.hasPermissions('vipGroupActivity/addVipGroupActivity')")
     public Object addVipGroupActivity(@RequestBody VipGroupActivityAddDto vipGroupActivityAddDto){
         vipGroupActivityService.addVipGroupActivity(vipGroupActivityAddDto);
         return succeed();
@@ -33,14 +31,12 @@ public class VipGroupActivityController extends BaseController {
 
     @ApiOperation(value = "分页查询活动方案")
     @GetMapping("/queryPage")
-    @PreAuthorize("@pcs.hasPermissions('vipGroupActivity/queryPage')")
     public Object queryPage(VipGroupActivityQueryInfo queryInfo){
         return succeed(vipGroupActivityService.queryPage(queryInfo));
     }
 
     @ApiOperation(value = "修改活动方案")
     @PostMapping("/update")
-    @PreAuthorize("@pcs.hasPermissions('vipGroupActivity/update')")
     public Object update(@RequestBody VipGroupActivityAddDto vipGroupActivityAddDto){
         vipGroupActivityService.updateVipGroupActivity(vipGroupActivityAddDto);
         return succeed();
@@ -48,7 +44,6 @@ public class VipGroupActivityController extends BaseController {
 
     @ApiOperation(value = "根据课程类型获取对应课程活动方案")
     @GetMapping("/findByVipGroupCategory")
-    @PreAuthorize("@pcs.hasPermissions('vipGroupActivity/findByVipGroupCategory')")
     public Object findByVipGroupCategory(Long categoryId){
         return succeed(vipGroupActivityService.findByVipGroupCategory(categoryId));
     }

+ 0 - 6
mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupCategoryController.java

@@ -9,7 +9,6 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -31,14 +30,12 @@ public class VipGroupCategoryController extends BaseController {
 
 	@ApiOperation("单查询")
 	@GetMapping(value = "/query")
-    @PreAuthorize("@pcs.hasPermissions('vipGroupCategory/query')")
 	public Object query(int id) {
 		return succeed(vipGroupCategoryService.get(id));
 	}
 
 	@ApiOperation("全查询")
 	@GetMapping(value = "/queryAll")
-    @PreAuthorize("@pcs.hasPermissions('vipGroupCategory/queryAll')")
 	public Object queryAll() {
 		SysUser user = sysUserFeignService.queryUserInfo();
 		if (Objects.isNull(user)) {
@@ -49,7 +46,6 @@ public class VipGroupCategoryController extends BaseController {
 
 	@ApiOperation("新增")
 	@PostMapping(value = "/add")
-    @PreAuthorize("@pcs.hasPermissions('vipGroupCategory/add')")
 	public Object add(VipGroupCategory vipGroupCategory) {
 		Date date = new Date();
 		vipGroupCategory.setCreateTime(date);
@@ -61,7 +57,6 @@ public class VipGroupCategoryController extends BaseController {
 
 	@ApiOperation("修改")
 	@PostMapping(value = "/update")
-    @PreAuthorize("@pcs.hasPermissions('vipGroupCategory/update')")
 	public Object update(VipGroupCategory vipGroupCategory) {
 		Date date = new Date();
 		vipGroupCategory.setUpdateTime(date);
@@ -71,7 +66,6 @@ public class VipGroupCategoryController extends BaseController {
 
 	@ApiOperation("删除")
 	@PostMapping(value = "/delete")
-    @PreAuthorize("@pcs.hasPermissions('vipGroupCategory/delete')")
 	public Object delete(int id) {
 		VipGroupCategory vipGroupCategory = vipGroupCategoryService.get(id);
 		Date date = new Date();

+ 158 - 11
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -1,12 +1,11 @@
 package com.ym.mec.util.date;
 
-import java.text.DateFormat;
+import org.apache.commons.lang.StringUtils;
+
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
-import org.apache.commons.lang.StringUtils;
-
 /**
  * 与日期、时间操作有关的工具类。
  * <p>
@@ -20,6 +19,8 @@ public class DateUtil {
 
 	public static final String DEFAULT_PATTERN = "yyyy-MM-dd";
 
+	public static final String DATE_FORMAT_MIN = "yyyy年MM月dd日";
+
 	/**
 	 * 默认使用的Locale。默认Locale为 US
 	 */
@@ -865,18 +866,14 @@ public class DateUtil {
 		return df.format(date);
 	}
 
-	public static void main(String[] args) throws ParseException {
-		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
-		// DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-		System.out.println(daysBetween(df.parse("2017-07-20 10:07:42"), df.parse(df.format(new Date()))));
-	}
-
 	/**
-	 * 获取时间段内对应星期数的集合
+	 * @describe 获取时间段内对应星期数的集合
+	 * @author Joburgess
+	 * @date 2019/10/25
 	 * @param startTime 开始时间
 	 * @param endTime 结束时间
 	 * @param weekNum 周几
-	 * @return
+	 * @return java.util.List<java.util.Date>
 	 */
 	public static List<Date> getWeekDays(Date startTime, Date endTime, int weekNum){
 		Calendar calendar = Calendar.getInstance();
@@ -893,6 +890,59 @@ public class DateUtil {
 	}
 
 	/**
+	 * @describe 根据日期获取所在周的周一
+	 * @author Joburgess
+	 * @date 2019/10/25
+	 * @param date: 日期
+	 * @return java.util.Date
+	 */
+	public static Date getWeekMondayWithDate(Date date) {
+		Calendar cal = Calendar.getInstance();
+		try {
+			date=new SimpleDateFormat(DEFAULT_PATTERN).parse(new SimpleDateFormat(DEFAULT_PATTERN).format(date));
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		cal.setTime(date);
+		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
+		if (1 == dayWeek) {
+			cal.add(Calendar.DAY_OF_MONTH, -1);
+		}
+		cal.setFirstDayOfWeek(Calendar.MONDAY);
+		int day = cal.get(Calendar.DAY_OF_WEEK);
+		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
+		return cal.getTime();
+	}
+
+	/**
+	 * @describe 根据日期获取所在周获取下周一的时间
+	 * @author Joburgess
+	 * @date 2019/10/25
+	 * @param date:
+	 * @return java.util.Date
+	 */
+	public static Date getNextWeekMonday(Date date) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(getWeekMondayWithDate(date));
+		cal.add(Calendar.DATE, 7);
+		return cal.getTime();
+	}
+
+	/**
+	 * @describe 根据日期获取所在周获取下周日的时间
+	 * @author Joburgess
+	 * @date 2019/10/25
+	 * @param date:
+	 * @return java.util.Date
+	 */
+	public static Date getNextWeekSunday(Date date) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(getWeekMondayWithDate(date));
+		cal.add(Calendar.DATE, 13);
+		return cal.getTime();
+	}
+
+	/**
 	 * 时间转换为中文格式
 	 * @param date
 	 * @return
@@ -900,4 +950,101 @@ public class DateUtil {
 	public static String date2ChineseDate(Date date){
 		return new SimpleDateFormat(CHINESE_DATA_FORMAT).format(date);
 	}
+
+	/**
+	 * @describe 判断多个时间区段是否存在重叠
+	 * @author Joburgess
+	 * @date 2019/10/27
+	 * @param dateZones:
+	 * @return boolean
+	 */
+	public static boolean checkDateZoneOverlap(List<DateZone> dateZones){
+		dateZones.sort(Comparator.comparing(DateZone::getStartTime));
+		if(dateZones.size()<=1){
+			return false;
+		}else{
+			for (int i=0;i<dateZones.size()-1;i++){
+				if(dateZones.get(i+1).getStartTime().before(dateZones.get(i).getEndTime())){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @describe 时间区段辅助类
+	 * @author Joburgess
+	 * @date 2019/10/27
+	 * @return
+	 */
+	public static class DateZone{
+		private Date startTime;
+		private Date endTime;
+
+		public DateZone() {
+		}
+
+		public DateZone(Date startTime, Date endTime) {
+			this.startTime = startTime;
+			this.endTime = endTime;
+		}
+
+		public Date getStartTime() {
+			return startTime;
+		}
+
+		public void setStartTime(Date startTime) {
+			this.startTime = startTime;
+		}
+
+		public Date getEndTime() {
+			return endTime;
+		}
+
+		public void setEndTime(Date endTime) {
+			this.endTime = endTime;
+		}
+	}
+
+	/**
+	 * @describe 时间转换为星期数
+	 * @author Joburgess
+	 * @date 2019/10/28
+	 * @param date: 日期
+	 * @return java.lang.String
+	 */
+	public static String date2Week(Date date) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		int i = calendar.get(Calendar.DAY_OF_WEEK);
+		switch (i) {
+			case 1:
+				return "星期日";
+			case 2:
+				return "星期一";
+			case 3:
+				return "星期二";
+			case 4:
+				return "星期三";
+			case 5:
+				return "星期四";
+			case 6:
+				return "星期五";
+			case 7:
+				return "星期六";
+			default:
+				return "";
+		}
+	}
+
+	public static void main(String[] args) throws ParseException {
+//		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+		// DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//		System.out.println(daysBetween(df.parse("2017-07-20 10:07:42"), df.parse(df.format(new Date()))));
+		System.out.println(getWeekMondayWithDate(new Date()));
+		System.out.println(getNextWeekMonday(new Date()));
+		System.out.println(getNextWeekSunday(new Date()));
+        System.out.println(dayEnd(new Date()));
+	}
 }