Przeglądaj źródła

Merge branch 'adapay_new'

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
#	mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
#	mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
#	mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
Joburgess 4 lat temu
rodzic
commit
058bf31113
37 zmienionych plików z 638 dodań i 77 usunięć
  1. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  2. 16 20
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  4. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserContractsDao.java
  5. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  6. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseGroupExportDto.java
  7. 101 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleStudentListDto.java
  8. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  9. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseHomework.java
  10. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  11. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseScheduleStudentPaymentQueryInfo.java
  12. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  13. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseHomeworkService.java
  14. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  15. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  16. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserContractsService.java
  17. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  18. 69 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  19. 19 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  20. 68 23
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  21. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  22. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserContractsServiceImpl.java
  23. 19 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  24. 16 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  25. 7 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  26. 4 0
      mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml
  27. 17 0
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  28. 6 5
      mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java
  29. 7 0
      mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java
  30. 5 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupMessage.java
  31. 3 1
      mec-im/src/main/java/com/ym/config/ResourceServerConfig.java
  32. 13 1
      mec-im/src/main/java/com/ym/controller/GroupController.java
  33. 1 2
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java
  34. 56 0
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleStudentPaymentController.java
  35. 14 2
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  36. 34 17
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  37. 39 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysUserContractsController.java

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
@@ -155,6 +156,9 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
     List<StudentAttendanceViewDto> findStudentByCourseWithPage(Map<String, Object> params);
     int countStudentByCourseWithPage(Map<String, Object> params);
 
+    List<CourseScheduleStudentPayment> queryAll(Map<String, Object> params);
+    int countAll(Map<String, Object> params);
+
     /**
      * 查找班级学生对应关系
      *

+ 16 - 20
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -8,6 +8,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -24,11 +25,11 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
     int batchInsert(List<CourseScheduleStudentPayment> courseScheduleStudentPayments);
 
     /**
-     * @param courseScheduleStudentPayments:
-     * @return int
      * @describe 批量更新
      * @author Joburgess
      * @date 2020/1/10
+     * @param courseScheduleStudentPayments:
+     * @return int
      */
     int batchUpdate(@Param("courseScheduleStudentPayments") List<CourseScheduleStudentPayment> courseScheduleStudentPayments);
 
@@ -140,7 +141,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 根据乐团编号删除记录
-     *
      * @param musicGroupId
      * @return
      */
@@ -148,7 +148,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 根据乐团编号,和groupTYpe获取学员剩余课程数
-     *
      * @param musicGroupIds
      * @param userId
      * @param groupType
@@ -169,24 +168,21 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 根据乐团,vip状态获取编号
-     *
      * @return
      */
     Set<Integer> queryMusicStudentPer();
-
     /**
      * 根据乐团,vip状态获取编号
-     *
      * @return
      */
     Set<Integer> queryVipStudentPer();
 
     /**
-     * @param courseIds: 统计课程上的学生人数
-     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
      * @describe
      * @author Joburgess
      * @date 2020/1/8
+     * @param courseIds: 统计课程上的学生人数
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
      */
     List<Map<Integer, Integer>> countCourseStudentNum(@Param("courseIds") List<Long> courseIds);
 
@@ -221,7 +217,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 获取课程学员数量
-     *
      * @param courseScheduleId
      * @return
      */
@@ -240,7 +235,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 获取当前课程的学员列表
-     *
      * @param courseScheduleId
      * @return
      */
@@ -248,18 +242,17 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 获取课程的学员编号列表
-     *
      * @param courseScheduleIds
      * @return
      */
     List<Map<Integer, String>> getStudentIdMap(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
     /**
-     * @param monday:
-     * @return java.util.List<java.lang.Integer>
      * @describe 获取在指定时间之后不存在网管课的学员编号列表
      * @author Joburgess
      * @date 2020/4/10
+     * @param monday:
+     * @return java.util.List<java.lang.Integer>
      */
     List<Practice4ExercisesSituationDto> findNoPracticeStudentIdsOnWeek(@Param("monday") String monday,
                                                                         @Param("sunday") String sunday);
@@ -268,7 +261,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 从指定时间开始查询学的线上可数
-     *
      * @return
      */
     List<StudentCourseTimesDto> queryStudentNotStartCourseTimesOfOnline();
@@ -286,7 +278,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 获取学员指定课程类型的剩余课时数
-     *
      * @param studentId
      * @param courseScheduleType
      * @return
@@ -296,7 +287,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 批量操作节拍器状态
-     *
      * @param courseScheduleId
      * @param userId
      */
@@ -304,7 +294,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 获取用户的节拍器信息
-     *
      * @param userIds
      * @param courseScheduleId
      * @return
@@ -313,7 +302,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 获取单个用户的midi
-     *
      * @param courseScheduleId
      * @param userId
      * @return
@@ -333,7 +321,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
 
     /**
      * 获取未进入教室的学员列表
-     *
      * @param roomId
      * @param courseScheduleId
      * @return
@@ -354,4 +341,13 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * 获取学生班级未开始的课程
      */
     List<CourseScheduleStudentPayment> getClassGroupNoStartCourse(@Param("classGroupIds") List<Integer> classGroupIds);
+
+    /**
+     * @describe 获取指定学员的最后一节课时间
+     * @author Joburgess
+     * @date 2020/11/17 0017
+     * @param StudentIds:
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.util.Date>>
+     */
+    List<Map<Integer, Date>> findStudentLastCourseSchedule(@Param("studentIds") List<Integer> StudentIds);
 }

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

@@ -17,6 +17,8 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
 
     int lockUser(@Param("userId") Integer userId);
 
+    List<Student> findByStudentIds(@Param("studentIds") List<Integer> studentIds);
+
     SysUser lockUserReturnInfo(@Param("userId") Integer userId);
 
     List<SysUser> findStudents(Map<String, Object> params);

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserContractsDao.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.SysUserContracts;
 import com.ym.mec.common.dal.BaseDAO;
+
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -19,4 +20,10 @@ public interface SysUserContractsDao extends BaseDAO<Long, SysUserContracts> {
     List<SysUserContracts> getUserContractWithType(@Param("userId") Integer userId,
                                                    @Param("contractType") SysUserContracts.ContractType contractType);
 	
+    /**
+     * 获取最近一次的协议
+     * @param userId
+     * @return
+     */
+    SysUserContracts getLatestUserContract(Integer userId);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java

@@ -92,6 +92,8 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      */
     List<SimpleUserDto> findSimpleTeachers(@Param("userIds") List<Integer> userIds);
 
+    List<SimpleUserDto> getUsersSimpleInfo(@Param("userIds") List<Integer> userIds);
+
     /**
      * @param organId:   分部编号
      * @param subjectId: 声部编号列表

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseGroupExportDto.java

@@ -17,6 +17,7 @@ public class CourseGroupExportDto {
     private Date expireDate;
     private Date classStartDate;
     private Date classEndDate;
+    private Date lastClassDate;
     private Integer totalClassTimes = 0;
     private Integer noStartClassTimes = 0;
     //是否购买
@@ -30,6 +31,14 @@ public class CourseGroupExportDto {
         this.buyPractice = buyPractice;
     }
 
+    public Date getLastClassDate() {
+        return lastClassDate;
+    }
+
+    public void setLastClassDate(Date lastClassDate) {
+        this.lastClassDate = lastClassDate;
+    }
+
     public String getOrganName() {
         return organName;
     }

+ 101 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleStudentListDto.java

@@ -0,0 +1,101 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/11/17 0017
+ */
+public class CourseScheduleStudentListDto {
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer studentId;
+
+    @ApiModelProperty(value = "学员名称")
+    private String studentName;
+
+    @ApiModelProperty(value = "声部编号")
+    private String subjectIds;
+
+    @ApiModelProperty(value = "声部名称")
+    private String subjectNames;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "签到时间")
+    private Date signInTime;
+
+    @ApiModelProperty(value = "签退时间")
+    private Date signOutTime;
+
+    @ApiModelProperty(value = "状态(正常、旷课、请假、休学)",required = false)
+    private StudentAttendanceStatusEnum status;
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getSubjectIds() {
+        return subjectIds;
+    }
+
+    public void setSubjectIds(String subjectIds) {
+        this.subjectIds = subjectIds;
+    }
+
+    public String getSubjectNames() {
+        return subjectNames;
+    }
+
+    public void setSubjectNames(String subjectNames) {
+        this.subjectNames = subjectNames;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Date getSignInTime() {
+        return signInTime;
+    }
+
+    public void setSignInTime(Date signInTime) {
+        this.signInTime = signInTime;
+    }
+
+    public Date getSignOutTime() {
+        return signOutTime;
+    }
+
+    public void setSignOutTime(Date signOutTime) {
+        this.signOutTime = signOutTime;
+    }
+
+    public StudentAttendanceStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(StudentAttendanceStatusEnum status) {
+        this.status = status;
+    }
+}

+ 8 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java

@@ -2,10 +2,17 @@ package com.ym.mec.biz.dal.entity;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import com.ym.mec.auth.api.entity.SysUser;
+
 /**
  * 对应数据库表(student):
  */
-public class Student {
+public class Student extends SysUser {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -5869690088559659057L;
 
 	/**  */
 	private Integer userId;

+ 0 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseHomework.java

@@ -232,5 +232,4 @@ public class StudentCourseHomework {
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}
-
 }

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

@@ -52,6 +52,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     IM_HOMEWORK_REMIND("IM_HOMEWORK_REMIND", "作业提醒"),
     IM_HOMEWORK_REMIND_DETAIL("IM_HOMEWORK_REMIND_DETAIL", "作业提醒"),
     IM_HOMEWORK_SUBMIT_PUSH("IM_HOMEWORK_SUBMIT_PUSH", "作业提交提醒"),
+    IM_HOMEWORK_SUBMIT_PUSH_GROUP("IM_HOMEWORK_SUBMIT_PUSH_GROUP", "作业提交提醒"),
     IM_HOMEWORK_STUDENT_REPLY_PUSH("IM_HOMEWORK_STUDENT_REPLY_PUSH", "作业回复提醒"),
     IM_HOMEWORK_TEACHER_REPLY_PUSH("IM_HOMEWORK_TEACHER_REPLY_PUSH", "作业点评提醒"),
     STUDENT_PUSH_CLASS_MESSAGE("STUDENT_PUSH_CLASS_MESSAGE", "班级消息"),

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseScheduleStudentPaymentQueryInfo.java

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/11/17 0017
+ */
+public class CourseScheduleStudentPaymentQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "课程编号")
+    private Integer courseScheduleId;
+
+    public Integer getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Integer courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+}

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java

@@ -1,9 +1,15 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.common.service.BaseService;
+import org.snaker.engine.access.Page;
 
 import java.util.List;
 
@@ -83,4 +89,13 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	List<CourseScheduleStudentPayment> getClassGroupNoStartCourse(List<Integer> classGroupIds);
 
 	int deleteByMusicGroupId(String musicGroupId, GroupType music);
+	/**
+	 * @describe 查询课程上学员列表
+	 * @author Joburgess
+	 * @date 2020/11/17 0017
+	 * @param queryInfo:
+	 * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto>
+	 */
+	PageInfo<CourseScheduleStudentListDto> queryCourseStudentList(CourseScheduleStudentPaymentQueryInfo queryInfo);
+
 }

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseHomeworkService.java

@@ -70,4 +70,10 @@ public interface StudentCourseHomeworkService extends BaseService<Long, StudentC
      * @return com.ym.mec.common.page.PageInfo
      */
     PageInfo findStudentHomeworkRecord(CourseHomeworkQueryInfo queryInfo);
+
+    /**
+     * 提交作业
+     * @param studentCourseHomework
+     */
+    void add(StudentCourseHomework studentCourseHomework);
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -5,6 +5,7 @@ import java.util.Map;
 
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
 import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
@@ -140,7 +141,7 @@ public interface StudentManageService {
      * @param sysUser
      * @return
      */
-    int studentUpdate(SysUser sysUser);
+    int studentUpdate(Student student);
 
     /**
      * 获取激活比例

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

@@ -37,6 +37,14 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	void batchSendImMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);
 
 	/**
+	 * 推送im文本消息,包换调整链接
+	 * @param senderId
+	 * @param messageType
+	 * @return
+	 */
+	void batchSendImGroupMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);
+
+	/**
 	 * 推送im自定义节拍器消息
 	 * @param senderId
 	 * @param roomId

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserContractsService.java

@@ -17,4 +17,10 @@ public interface SysUserContractsService extends BaseService<Long, SysUserContra
      */
     List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType);
 
+    /**
+     * 获取最近一次的协议
+     * @param userId
+     * @return
+     */
+    SysUserContracts getLatestUserContract(Integer userId);
 }

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

@@ -2716,6 +2716,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if(groupType == VIP){
 			VipGroup vipGroup = vipGroupDao.get(vipGroupCourseAdjustInfo.getVipGroupId().longValue());
 
+			CourseSchedule courseSchedule = courseSchedules.stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get();
+			if(courseSchedule.getEndClassTime().compareTo(vipGroup.getCoursesExpireDate())>0){
+				throw new BizException("调整失败:课程时间超过课程有效期");
+			}
+
 			BigDecimal teacherSalary=BigDecimal.ZERO;
 
 			Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, vipGroup.getUserId(), null, null);

+ 69 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -2,18 +2,27 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
 import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 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.thirdparty.yqpay.DateUtils;
 import com.ym.mec.util.date.DateUtil;
 import org.springframework.beans.BeanUtils;
+import com.ym.mec.util.collection.MapUtil;
+import io.swagger.models.auth.In;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
@@ -51,6 +60,12 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
 	@Autowired
 	private TeacherDao teacherDao;
+	@Autowired
+	private StudentAttendanceDao studentAttendanceDao;
+	@Autowired
+	private StudentDao studentDao;
+	@Autowired
+	private SubjectDao subjectDao;
 
 	@Override
 	public BaseDAO<Long, CourseScheduleStudentPayment> getDAO() {
@@ -440,4 +455,58 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 		return courseScheduleStudentPaymentDao.deleteByMusicGroupId(musicGroupId,music);
 	}
 
+
+	@Override
+	public PageInfo<CourseScheduleStudentListDto> queryCourseStudentList(CourseScheduleStudentPaymentQueryInfo queryInfo) {
+		PageInfo<CourseScheduleStudentListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<CourseScheduleStudentListDto> dataList = new ArrayList<>();
+		int count = classGroupStudentMapperDao.countAll(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			List<CourseScheduleStudentPayment> courseScheduleStudentPayments = classGroupStudentMapperDao.queryAll(params);
+			Set<Integer> studentIds = courseScheduleStudentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toSet());
+			List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseId(queryInfo.getCourseScheduleId().longValue());
+			List<SimpleUserDto> usersSimpleInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(studentIds));
+			List<Student> students = studentDao.findByStudentIds(new ArrayList<>(studentIds));
+			Set<Integer> subjectIds = new HashSet<>();
+			for (Student student : students) {
+				if(StringUtils.isBlank(student.getSubjectIdList())){
+					continue;
+				}
+				Set<Integer> studentSubjectIds = Arrays.stream(student.getSubjectIdList().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toSet());
+				subjectIds.addAll(studentSubjectIds);
+			}
+			List<Subject> subjects = new ArrayList<>();
+			if(!CollectionUtils.isEmpty(subjectIds)){
+				subjects = subjectDao.findBySubjectIds(new ArrayList<>(subjectIds));
+			}
+			Map<Integer, StudentAttendance> studentAttendanceMap = studentAttendances.stream().collect(Collectors.toMap(StudentAttendance::getUserId, s -> s, (s1, s2) -> s1));
+			Map<Integer, SimpleUserDto> studentInfoMap = usersSimpleInfo.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, s -> s, (s1, s2) -> s1));
+			Map<Integer, Student> studentMap = students.stream().collect(Collectors.toMap(Student::getUserId, s -> s, (s1, s2) -> s1));
+			for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
+				CourseScheduleStudentListDto cssld=new CourseScheduleStudentListDto();
+				cssld.setStudentId(courseScheduleStudentPayment.getUserId());
+				cssld.setPhone(studentInfoMap.containsKey(cssld.getStudentId())?studentInfoMap.get(cssld.getStudentId()).getPhone():"");
+				cssld.setSubjectIds(studentMap.containsKey(cssld.getStudentId())?studentMap.get(cssld.getStudentId()).getSubjectIdList():"");
+				if(StringUtils.isNotBlank(cssld.getSubjectIds())){
+					Set<Integer> studentSubjectIds = Arrays.stream(cssld.getSubjectIds().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toSet());
+					List<String> subjectNames = subjects.stream().filter(s -> studentSubjectIds.contains(s.getId())).map(Subject::getName).collect(Collectors.toList());
+					cssld.setSubjectNames(StringUtils.join(subjectNames, ","));
+				}
+				if(studentAttendanceMap.containsKey(cssld.getStudentId())){
+					StudentAttendance studentAttendance = studentAttendanceMap.get(cssld.getStudentId());
+					cssld.setSignInTime(studentAttendance.getSignInTime());
+					cssld.setSignOutTime(studentAttendance.getSignOutTime());
+					cssld.setStatus(studentAttendance.getStatus());
+				}
+				dataList.add(cssld);
+			}
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
 }

+ 19 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -49,8 +49,9 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
+    private ClassGroupDao classGroupDao;
+    @Autowired
     private SysUserFeignService sysUserFeignService;
-
     @Autowired
     private SysMessageService sysMessageService;
     @Autowired
@@ -58,8 +59,6 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     @Autowired
     private TeacherDao teacherDao;
     @Autowired
-    private SysConfigDao sysConfigDao;
-    @Autowired
     private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
 
     @Override
@@ -336,4 +335,21 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+    @Override
+    public void add(StudentCourseHomework studentCourseHomework) {
+        studentCourseHomework.setStatus(YesOrNoEnum.YES);
+        studentCourseHomeworkDao.insert(studentCourseHomework);
+        CourseHomework courseHomework = courseHomeworkDao.get(studentCourseHomework.getCourseHomeworkId());
+        Date date = new Date();
+        if(date.before(courseHomework.getExpiryDate())){
+            ClassGroup classGroup = classGroupDao.findByCourseSchedule(studentCourseHomework.getCourseScheduleId().intValue(), 0);
+            if(classGroup != null){
+                SysUser sysUser = sysUserFeignService.queryUserById(studentCourseHomework.getUserId());
+                sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_HOMEWORK_SUBMIT_PUSH_GROUP,studentCourseHomework.getUserId().toString(),null,
+                        new String[]{classGroup.getId().toString()},
+                        null, sysUser.getUsername());
+            }
+        }
+    }
 }

+ 68 - 23
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -1,12 +1,67 @@
 package com.ym.mec.biz.service.impl;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
 import 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.*;
-import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
+import com.ym.mec.biz.dal.dao.StudentManageDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.VipGroupDao;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.ConditionDto;
+import com.ym.mec.biz.dal.dto.MusicCardDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentSignDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.Student4operating;
+import com.ym.mec.biz.dal.dto.StudentManageAccountBaseInfoDto;
+import com.ym.mec.biz.dal.dto.StudentManageBaseInfoOfMusicGroupDto;
+import com.ym.mec.biz.dal.dto.StudentManageCourseListDto;
+import com.ym.mec.biz.dal.dto.StudentManageListDto;
+import com.ym.mec.biz.dal.dto.StudentManageVipGroupClassDto;
+import com.ym.mec.biz.dal.dto.StudentManageVipGroupDto;
+import com.ym.mec.biz.dal.dto.StudentRegisterPerDto;
+import com.ym.mec.biz.dal.dto.UserGoodsDto;
+import com.ym.mec.biz.dal.entity.MusicGroupQuit;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.SubjectChange;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageVipClassQueryInfo;
+import com.ym.mec.biz.dal.page.StudentOperatingQueryInfo;
+import com.ym.mec.biz.dal.page.StudentSignQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherPaymentRecordInfo;
 import com.ym.mec.biz.service.StudentManageService;
 import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.entity.ImResult;
@@ -15,15 +70,6 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.collection.MapUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
-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
@@ -485,24 +531,23 @@ public class StudentManageServiceImpl implements StudentManageService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int studentUpdate(SysUser sysUser) {
-        Integer userId = sysUser.getId();
-        if (userId == null || StringUtils.isEmpty(sysUser.getPhone())) {
+    public int studentUpdate(Student student) {
+        Integer userId = student.getId();
+        if (userId == null || StringUtils.isEmpty(student.getPhone())) {
             throw new BizException("参数校验失败");
         }
-        SysUser sysUser1 = sysUserFeignService.queryUserByMobile(sysUser.getPhone());
+        SysUser sysUser1 = sysUserFeignService.queryUserByMobile(student.getPhone());
         if (sysUser1 != null && !userId.equals(sysUser1.getId())) {
             throw new BizException("手机号已被占用");
         }
-        teacherDao.updateUser(sysUser);
-        Student student = new Student(userId, studentRegistrationDao.getSubjectIds(userId));
-        student.setOperatingTag(sysUser.getOperatingTag());
+        teacherDao.updateUser(student);
+        student.setOperatingTag(student.getOperatingTag());
         student.setOperatingTempTag(0);
-        student.setServiceTag(sysUser.getServiceTag() == 0 ? 2 : 1);
-        student.setTeacherId(sysUser.getTeacherId());
+        student.setServiceTag(student.getServiceTag() == 0 ? 2 : 1);
+        student.setTeacherId(student.getTeacherId());
         studentService.upSet(student);
         if (new Integer(2).equals(student.getServiceTag())) {
-            studentExtracurricularExercisesSituationDao.deleteByStudent(sysUser.getId());
+            studentExtracurricularExercisesSituationDao.deleteByStudent(student.getId());
         }
         return userId;
     }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.SysMessageDao;
@@ -192,6 +193,27 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		imFeignService.privateSend(privateMessage);
 	}
 
+	@Override
+	@Async
+	public void batchSendImGroupMessage(MessageTypeEnum type, String senderId,String extra, String[] targetIds, String url, Object... args) {
+		SysMessageConfig messageConfig = sysMessageConfigService.queryByType(type);
+		if (messageConfig == null) {
+			throw new BizException("消息类型错误");
+		}else if(messageConfig.getSendFlag() == null || messageConfig.getSendFlag() == 0){
+			return;
+		}
+		String content = MessageFormatter.arrayFormat(messageConfig.getContent(), args);
+		if(StringUtils.isNotEmpty(url)){
+			content += url;
+		}
+		ImGroupMessage groupMessage = new ImGroupMessage();
+		groupMessage.setObjectName("RC:TxtMsg");
+		groupMessage.setTargetId(targetIds);
+		groupMessage.setSenderId(senderId);
+		groupMessage.setContent(new ImTxtMessage(content,extra));
+		imFeignService.groupSend(groupMessage);
+	}
+
 	/*@Override
 	public void batchSendImPlayMidiMessage(String senderId,String roomId, String content) {
 		ImGroupMessage groupMessage = new ImGroupMessage();

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserContractsServiceImpl.java

@@ -26,5 +26,10 @@ public class SysUserContractsServiceImpl extends BaseServiceImpl<Long, SysUserCo
 	public List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType) {
 		return sysUserContractsDao.getUserContractWithType(userId, contractType);
 	}
+
+	@Override
+	public SysUserContracts getLatestUserContract(Integer userId) {
+		return sysUserContractsDao.getLatestUserContract(userId);
+	}
 	
 }

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

@@ -554,4 +554,23 @@
         ) t
         LEFT JOIN sys_user su ON t.educational_teacher_id_=su.id_
     </select>
+
+    <sql id="queryAllCondition">
+        <where>
+            <if test="courseScheduleId != null">
+                course_schedule_id_ = #{courseScheduleId}
+            </if>
+        </where>
+    </sql>
+
+    <select id="queryAll" resultMap="ClassGroupStudentMapper">
+        SELECT * FROM course_schedule_student_payment
+        <include refid="queryAllCondition" />
+        ORDER BY id_
+        <include refid="global.limit"/>
+    </select>
+    <select id="countAll" resultType="int">
+        SELECT COUNT(*) FROM course_schedule_student_payment
+        <include refid="queryAllCondition" />
+    </select>
 </mapper>

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

@@ -535,4 +535,20 @@
 		</foreach>
         AND cs.status_ = 'NOT_START' ORDER BY cssp.id_ ASC
 	</select>
+
+	<select id="findStudentLastCourseSchedule" resultType="java.util.Map">
+		SELECT
+			cssp.user_id_ AS 'key',
+			MAX(CONCAT( cs.class_date_, ' ', cs.start_class_time_ )) AS 'value'
+		FROM
+			course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
+		WHERE
+			cssp.user_id_ IN
+			<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+				#{studentId}
+			</foreach>
+			AND CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) &lt; NOW( )
+		GROUP BY user_id_;
+	</select>
 </mapper>

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

@@ -517,4 +517,11 @@
             #{id}
         </foreach>
     </select>
+
+    <select id="findByStudentIds" resultMap="Student">
+        SELECT * FROM student WHERE user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+    </select>
 </mapper>

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml

@@ -87,4 +87,8 @@
 	<select id="getUserContractWithType" resultMap="SysUserContracts">
 		SELECT * FROM sys_user_contracts WHERE user_id_=#{userId} AND type_=#{contractType}
 	</select>
+
+	<select id="getLatestUserContract" resultMap="SysUserContracts">
+		SELECT * FROM sys_user_contracts WHERE user_id_=#{userId} order by id_ desc limit 0,1
+	</select>
 </mapper>

+ 17 - 0
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -373,6 +373,7 @@
             </if>
         </where>
     </select>
+
     <select id="findSimpleTeachers" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
         SELECT su.id_ userId,su.real_name_ userName FROM sys_user su
         LEFT JOIN teacher t ON su.id_=t.id_
@@ -385,6 +386,22 @@
             </if>
         </where>
     </select>
+
+    <select id="getUserSimpleInfo" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
+        SELECT
+            su.id_ userId,
+            su.real_name_ userName,
+            su.phone_ phone
+        FROM sys_user su
+        <where>
+            <if test="userIds != null">
+                su.id_ IN
+                <foreach collection="userIds" separator="," open="(" close=")" item="item">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
     <select id="findTeaTeachersByOrganAndSubject" resultMap="TeacherBasicDto">
         SELECT
             su.id_,

+ 6 - 5
mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java

@@ -1,10 +1,11 @@
 package com.ym.mec.im;
 
 import com.ym.mec.common.entity.*;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.bind.annotation.*;
 
 import com.ym.mec.common.config.FeignConfiguration;
 import com.ym.mec.im.fallback.ImFeignServiceFallback;
@@ -92,11 +93,11 @@ public interface ImFeignService {
 	 * @return
 	 */
 	@PostMapping(value = "private/send")
-	//body模板
-	//{"senderId":"325","targetId":[1094986],"objectName":"RC:TxtMsg",
-	// "content":{"content":"www.baidu.com"}}
 	Object privateSend(@RequestBody ImPrivateMessage privateMessage);
 
+	@PostMapping(value = "group/send")
+	Object groupSend(@RequestBody ImGroupMessage imGroupMessage);
+
 	/**
 	 * 发送群组自定义消息
 	 * @param groupMessage

+ 7 - 0
mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java

@@ -2,8 +2,10 @@ package com.ym.mec.im.fallback;
 
 import com.ym.mec.common.entity.*;
 import com.ym.mec.im.ImFeignService;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
+import javax.xml.ws.Action;
 import java.util.List;
 
 @Component
@@ -59,6 +61,11 @@ public class ImFeignServiceFallback implements ImFeignService {
     public Object privateSend(ImPrivateMessage privateMessage) {
         return null;
     }
+
+    @Override
+    public Object groupSend(ImGroupMessage imGroupMessage) {
+        return null;
+    }
 /*
     @Override
     public Object privateSendCustom(ImGroupMessage groupMessage) {

+ 5 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupMessage.java

@@ -7,6 +7,11 @@ public class ImGroupMessage extends ImMessageModel {
     public String[] toUserId;
     private String type;
 
+    public ImGroupMessage setContent(ImTxtMessage content) {
+        super.setContent(content);
+        return this;
+    }
+
     public ImGroupMessage() {
     }
 

+ 3 - 1
mec-im/src/main/java/com/ym/config/ResourceServerConfig.java

@@ -10,6 +10,8 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.R
 public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
     @Override
     public void configure(HttpSecurity http) throws Exception {
-        http.authorizeRequests().antMatchers("/v2/api-docs","/user/register","/group/join","/group/create","/room/leave","/room/statusSync","/room/statusImMsg","/group/batchDismiss","/private/send").permitAll().anyRequest().authenticated().and().csrf().disable();
+        http.authorizeRequests().antMatchers("/v2/api-docs","/user/register",
+                "/group/join","/group/create","/room/leave","/room/statusSync",
+                "/room/statusImMsg","/group/batchDismiss","/private/send","/group/send").permitAll().anyRequest().authenticated().and().csrf().disable();
     }
 }

+ 13 - 1
mec-im/src/main/java/com/ym/controller/GroupController.java

@@ -1,12 +1,16 @@
 package com.ym.controller;
 
+import com.ym.mec.common.entity.ImGroupMessage;
+import com.ym.mec.common.entity.ImTxtMessage;
 import com.ym.service.GroupService;
 import com.ym.service.MessageService;
+import io.rong.messages.TxtMessage;
 import io.rong.models.group.GroupMember;
 import io.rong.models.group.GroupModel;
 import io.rong.models.group.UserGroup;
 import io.rong.models.message.GroupMessage;
 import io.rong.models.message.MentionMessage;
+import io.rong.models.message.PrivateMessage;
 import io.rong.models.message.RecallMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -29,7 +33,15 @@ public class GroupController{
     GroupService groupService;
 
     @RequestMapping(value = "/send", method = RequestMethod.POST)
-    public Object send(@RequestBody GroupMessage groupMessage) throws Exception {
+    public Object send(@RequestBody ImGroupMessage imGroupMessage) throws Exception {
+        GroupMessage groupMessage = new GroupMessage();
+        ImTxtMessage content = (ImTxtMessage)imGroupMessage.getContent();
+        TxtMessage txtMessage = new TxtMessage(content.getContent(),content.getExtra());
+        groupMessage.setContent(txtMessage);
+        groupMessage.setTargetId(imGroupMessage.getTargetId());
+        groupMessage.setSenderId(imGroupMessage.getSenderId());
+        groupMessage.setObjectName(imGroupMessage.getObjectName());
+        groupMessage.setIsIncludeSender(1);
         return messageService.groupSend(groupMessage);
     }
 

+ 1 - 2
mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java

@@ -39,8 +39,7 @@ public class StudentCourseHomeworkController extends BaseController {
     @ApiOperation(value = "提交作业")
     @PostMapping(value = "/add",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     public Object add(@RequestBody StudentCourseHomework studentCourseHomework){
-        studentCourseHomework.setStatus(YesOrNoEnum.YES);
-        studentCourseHomeworkService.insert(studentCourseHomework);
+        studentCourseHomeworkService.add(studentCourseHomework);
         return succeed();
     }
 

+ 56 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleStudentPaymentController.java

@@ -0,0 +1,56 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto;
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
+import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
+import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+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.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/11/17 0017
+ */
+@RestController
+@RequestMapping("courseScheduleStudentPayment")
+@Api(tags = "学生课程之缴费记录服务")
+public class CourseScheduleStudentPaymentController extends BaseController {
+
+    @Autowired
+    private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
+
+    @ApiOperation(value = "分页查询指定课程上的学员")
+    @GetMapping("/queryCourseStudentList")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleStudentPayment/queryCourseStudentList')")
+    public HttpResponseResult queryCourseStudentList(CourseScheduleStudentPaymentQueryInfo queryInfo) {
+        PageInfo<CourseScheduleStudentListDto> pageInfo = courseScheduleStudentPaymentService.queryCourseStudentList(queryInfo);
+        List<CourseScheduleStudentListDto> courseScheduleStudentList = pageInfo.getRows();
+
+        Map<String, Integer> countInfo = new HashMap<>();
+        countInfo.put("totalStudentNum", courseScheduleStudentList.size());
+        countInfo.put("signInStudentNum", (int) courseScheduleStudentList.stream().filter(s -> Objects.nonNull(s.getSignInTime())).count());
+        countInfo.put("leaveStudentNum", (int) courseScheduleStudentList.stream().filter(s -> StudentAttendanceStatusEnum.LEAVE.equals(s.getStatus())).count());
+        countInfo.put("truantStudentNum", (int) courseScheduleStudentList.stream().filter(s -> StudentAttendanceStatusEnum.TRUANT.equals(s.getStatus())).count());
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("pageInfo", pageInfo);
+        result.put("countInfo", countInfo);
+
+        return succeed(result);
+    }
+
+}

+ 14 - 2
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -106,6 +106,8 @@ public class ExportController extends BaseController {
     private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
     @Autowired
     private SellOrderService sellOrderService;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
     @ApiOperation(value = "乐团管理--修改--缴费设置--缴费记录导出")
     @PostMapping("export/musicGroupPaymentCalenderDetail")
@@ -1266,11 +1268,21 @@ public class ExportController extends BaseController {
         }
         OutputStream outputStream = response.getOutputStream();
         Set<Integer> studentIds = vipGroupExports.stream().map(CourseGroupExportDto::getStudentId).collect(Collectors.toSet());
+        List<Map<Integer, Date>> studentLastCourseSchedule = courseScheduleStudentPaymentDao.findStudentLastCourseSchedule(new ArrayList<>(studentIds));
+        Map<Integer, String> studentLastCourseMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(studentLastCourseSchedule)){
+            studentLastCourseMap = MapUtil.convertMybatisMap(studentLastCourseSchedule);
+        }
         List<CourseGroupExportDto> studentCourseInfos = courseScheduleDao.getStudentVipCourseInfo(studentIds);
         List<CourseGroupExportDto> totalClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, null);
         List<CourseGroupExportDto> noStartClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, CourseStatusEnum.NOT_START);
         for (CourseGroupExportDto vipGroupExport : vipGroupExports) {
 
+            String lastClassDateStr = studentLastCourseMap.get(vipGroupExport.getStudentId());
+            if(StringUtils.isNotBlank(lastClassDateStr)){
+                vipGroupExport.setLastClassDate(DateUtil.stringToDate(lastClassDateStr));
+            }
+
             for (CourseGroupExportDto studentCourseInfo : studentCourseInfos) {
                 if (studentCourseInfo.getStudentId().equals(vipGroupExport.getStudentId())) {
                     vipGroupExport.setTeacherIds(studentCourseInfo.getTeacherIds());
@@ -1295,8 +1307,8 @@ public class ExportController extends BaseController {
         }
 
         try {
-            String[] header = {"分部", "学生编号", "学生姓名", "指导老师id", "指导老师", "教务老师id", "教务老师", "课程开始时间", "课程截止时间", "总课时", "剩余课时"};
-            String[] body = {"organName", "studentId", "studentName", "teacherIds", "teacherName", "eduTeacherIds", "eduTeacherName", "classStartDate", "classEndDate", "totalClassTimes", "noStartClassTimes"};
+            String[] header = {"分部", "学生编号", "学生姓名", "指导老师id", "指导老师", "教务老师id", "教务老师", "课程开始时间", "课程截止时间", "上次课时间", "总课时", "剩余课时"};
+            String[] body = {"organName", "studentId", "studentName", "teacherIds", "teacherName", "eduTeacherIds", "eduTeacherName", "classStartDate", "classEndDate", "lastClassDate", "totalClassTimes", "noStartClassTimes"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, vipGroupExports);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");

+ 34 - 17
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -1,30 +1,47 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.EmployeeDao;
-import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
-import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.page.*;
-import com.ym.mec.biz.service.*;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.HttpResponseResult;
-import com.ym.mec.common.exception.BizException;
-import com.ym.mec.common.page.QueryInfo;
-import io.swagger.annotations.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 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;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.Arrays;
-import java.util.List;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageVipClassQueryInfo;
+import com.ym.mec.biz.dal.page.StudentOperatingQueryInfo;
+import com.ym.mec.biz.dal.page.StudentSignQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherPaymentRecordInfo;
+import com.ym.mec.biz.service.MusicGroupStudentFeeService;
+import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentManageService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.QueryInfo;
 
 @Api(tags = "学生管理")
 @RestController
@@ -93,8 +110,8 @@ public class StudentManageController extends BaseController {
     @ApiOperation(value = "修改学员信息")
     @PostMapping("/studentUpdate")
     @PreAuthorize("@pcs.hasPermissions('studentManage/studentUpdate')")
-    public Object studentUpdate(SysUser sysUser){
-        return succeed(studentManageService.studentUpdate(sysUser));
+    public Object studentUpdate(Student student){
+        return succeed(studentManageService.studentUpdate(student));
     }
 
     @ApiOperation(value = "乐团管理--乐团详情--获取学员列表")

+ 39 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysUserContractsController.java

@@ -0,0 +1,39 @@
+package com.ym.mec.web.controller;
+
+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.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.biz.dal.entity.SysUserContracts;
+import com.ym.mec.biz.service.SysUserContractsService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+
+@RequestMapping("sysUserContracts")
+@Api(tags = "用户协议服务")
+@RestController
+public class SysUserContractsController extends BaseController {
+
+	@Autowired
+	private SysUserContractsService sysUserContractsService;
+	
+    @ApiOperation(value = "查询学生最新协议")
+    @GetMapping("/getLatest")
+    @PreAuthorize("@pcs.hasPermissions('sysUserContracts/getLatest')")
+	public HttpResponseResult<SysUserContracts> getLatest(Integer userId) {
+		
+		SysUserContracts sysUserContracts = sysUserContractsService.getLatestUserContract(userId);
+		
+		if(sysUserContracts == null){
+			return failed("该学员尚未签署协议");
+		}
+
+		return succeed(sysUserContracts);
+	}
+
+}