ソースを参照

Merge branch 'online1' of http://git.dayaedu.com/yonge/mec into homework_replace

zouxuan 4 年 前
コミット
a3a977365a
97 ファイル変更3253 行追加181 行削除
  1. 11 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java
  2. 6 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherDao.java
  3. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderDao.java
  4. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  5. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  6. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  7. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OrganizationDao.java
  8. 86 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  9. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  10. 57 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java
  11. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  12. 130 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudStudyStudentDataDto.java
  13. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java
  14. 119 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentDataDto.java
  15. 155 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListDto.java
  16. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeDto.java
  17. 98 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicCompareRankingDto.java
  18. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java
  19. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StatDto.java
  20. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentTrainChartDto.java
  21. 43 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentTrainOverviewDto.java
  22. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherMusicStudentOverViewDto.java
  23. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Employee.java
  24. 48 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java
  25. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysSuggestion.java
  26. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/FeatureType.java
  27. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java
  28. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/SuggestionType.java
  29. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java
  30. 63 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMusicCompareRecordQueryInfo.java
  31. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysSuggestionQueryInfo.java
  32. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java
  33. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java
  34. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  35. 40 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  36. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  37. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  38. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  39. 15 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  40. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  41. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  42. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  43. 38 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  44. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OaServiceImpl.java
  45. 1 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java
  46. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ReplacementInstrumentActivityServiceImpl.java
  47. 27 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java
  48. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  49. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  50. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  51. 21 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  52. 162 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  53. 23 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  54. 138 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  55. 23 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  56. 37 1
      mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml
  57. 15 3
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  58. 48 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  59. 8 3
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  60. 25 0
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  61. 19 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  62. 11 0
      mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml
  63. 294 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  64. 7 3
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  65. 14 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  66. 218 6
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  67. 2 2
      mec-biz/src/main/resources/config/mybatis/SysMusicScoreAccompanimentMapper.xml
  68. 31 4
      mec-biz/src/main/resources/config/mybatis/SysSuggestionMapper.xml
  69. 31 0
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  70. 10 0
      mec-client-api/src/main/java/com/ym/mec/oa/entity/OAUser.java
  71. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  72. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  73. 54 0
      mec-student/src/main/java/com/ym/mec/student/controller/CloudStudyController.java
  74. 21 3
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  75. 11 0
      mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java
  76. 16 0
      mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java
  77. 32 15
      mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java
  78. 5 4
      mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java
  79. 12 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentVipGroupController.java
  80. 17 0
      mec-student/src/main/java/com/ym/mec/student/controller/SubjectChangeController.java
  81. 48 0
      mec-student/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java
  82. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/CleanStudentCloudStudySequenceDays.java
  83. 46 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CloudStudyController.java
  84. 6 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SoundController.java
  85. 48 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMusicCompareRecordController.java
  86. 12 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java
  87. 6 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherManageController.java
  88. 1 1
      mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java
  89. 1 0
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java
  90. 9 1
      mec-web/src/main/java/com/ym/mec/web/controller/OrganizationController.java
  91. 28 0
      mec-web/src/main/java/com/ym/mec/web/controller/SoundCompareController.java
  92. 51 6
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  93. 37 10
      mec-web/src/main/java/com/ym/mec/web/controller/SysSuggestionController.java
  94. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  95. 27 8
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduOrganizationController.java
  96. 66 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentController.java
  97. 48 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/SysMusicCompareRecordController.java

+ 11 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java

@@ -135,6 +135,9 @@ public class SysUser implements Serializable{
 
 	private String certificateType;
 
+	@ApiModelProperty(value = "社保部门id",required = false)
+	private Integer deptId;
+
 	@ApiModelProperty(value = "部门ids",required = false)
 	private String deptIds;
 
@@ -476,4 +479,12 @@ public class SysUser implements Serializable{
 	public void setPostDeptIds(String postDeptIds) {
 		this.postDeptIds = postDeptIds;
 	}
+
+	public Integer getDeptId() {
+		return deptId;
+	}
+
+	public void setDeptId(Integer deptId) {
+		this.deptId = deptId;
+	}
 }

+ 6 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherDao.java

@@ -6,6 +6,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 
 public interface CloudTeacherDao extends BaseDAO<Long, CloudTeacher> {
@@ -18,4 +19,8 @@ public interface CloudTeacherDao extends BaseDAO<Long, CloudTeacher> {
      */
     CloudTeacher getByStudentId(@Param("studentId") Integer studentId);
 
-}
+    int getOrganVipStudentNum(@Param("organId") Integer organId);
+    int getOrgansTotalVipStudentNum(@Param("organIds") List<Integer> organIds);
+    List<Map<Integer, Integer>> getOrgansVipStudentNum(@Param("organIds") List<Integer> organId);
+
+}

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

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.dal.dao;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.ibatis.annotations.Param;
 
@@ -46,4 +48,6 @@ public interface CloudTeacherOrderDao extends BaseDAO<Long, CloudTeacherOrder> {
      * @return
      */
     CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId);
+
+    List<Map<Long, String>> queryNoStartByUserIds(@Param("userIds") Set<Integer> userIds);
 }

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

@@ -532,4 +532,24 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @param musicGroupId
      */
     void deletePreCourse(String musicGroupId);
+
+    /**
+     * @describe 查询出指定学员中有小课的学员
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param studentIds:
+     * @return java.util.Set<java.lang.String>
+     */
+    Set<Integer> getHasVipCourseStudentIds(@Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * @describe 查询分部还有小课和网管课的学员数量
+     * @author Joburgess
+     * @date 2021/8/18 0018
+     * @param studentIds:
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
+     */
+    int getHasVPCourseStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrganHasVPCourseStudentNum(@Param("organIds") List<Integer> organIds);
+
 }

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

@@ -320,4 +320,6 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
     List<StudentLeaveCourseDto> queryStudentLeaveCourseList(Map<String, Object> params);
 
     List<Map<Integer, BigDecimal>> getStudentErrorLeaveNumMap(Map<String, Object> params);
+
+    List<IndexBaseMonthData> getOrgansStudentNumData(@Param("dayStr") String dayStr);
 }

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

@@ -460,4 +460,13 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     List<MusicMemberDto> queryMusicMemberList(Map<String, Object> params);
     
 	int updateIsShowRecordOfStudent(@Param("musicGroupId") String musicGroupId, @Param("isShowRecordOfStudent") Boolean isShowRecordOfStudent);
+
+	/**
+	 * @describe 查询乐团相关学员数量
+	 * @author Joburgess
+	 * @date 2021/8/12 0012
+	 * @param params:
+	 * @return java.util.List<java.lang.String>
+	 */
+    List<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverView(@Param("musicGroupIds") List<String> musicGroupIds);
 }

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

@@ -19,6 +19,8 @@ public interface OrganizationDao extends BaseDAO<Integer, Organization> {
 
     List<Organization> findOrgans(@Param("organIds") List<Integer> organIds);
 
+    List<Organization> getOrgans(@Param("organIds") List<Integer> organIds);
+
     /**
      * 根据分部id字符串查询
      * @param organIds

+ 86 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -1,10 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.dto.Student4operating;
-import com.ym.mec.biz.dal.dto.StudentServeCourseDto;
-import com.ym.mec.biz.dal.dto.StudentServeDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.enums.GroupType;
@@ -244,4 +241,89 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     void cleanStudentMember();
 
     void cleanMember(Integer userId);
+
+    /**
+     * @describe 统计分部会员学员数据
+     * @author Joburgess
+     * @date 2021/8/16 0016
+     * @param organId:
+     * @return com.ym.mec.biz.dal.dto.EduOrganStudentDataDto
+     */
+    int getOrganStudentNum(@Param("organId") Integer organId);
+    int getOrgansTotalStudentNum(@Param("organIds") List<Integer> organIds);
+    List<Map<Integer, Integer>> getOrgansStudentNum(@Param("organIds") List<Integer> organIds);
+
+    /**
+     * @describe 统计云教练试用人数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param organId:
+     * @return int
+     */
+    int getCloudStudyStudentNum(@Param("organId") Integer organId);
+    int getOrgansTotalCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
+    List<Map<Integer, Integer>> getOrganCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
+
+    /**
+     * @describe 统计云教练今日使用人数
+     * @author Joburgess
+     * @date 2021/8/18 0018
+     * @param organIds:
+     * @return int
+     */
+    int getOrgansTodayTotalCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
+
+
+    int getCloudStudyLivelyStudentNum(@Param("organId") Integer organId);
+    int getOrganTotalCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds);
+    List<Map<Integer, Integer>> getOrganCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds);
+
+    /**
+     * @describe 查询云教练学员列表数据
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.EduOrganStudentListDto>
+     */
+    List<EduOrganStudentListDto> queryCloudStudyStudentData(Map<String, Object> params);
+    int countCloudStudyStudentData(Map<String, Object> params);
+
+    /**
+     * @describe 更新学员云教练连续使用天数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param userId:
+     * @return int
+     */
+    int addStudentCloudStudySequenceDays(@Param("userId") Integer userId);
+
+    /**
+     * @describe 更新学员云教练连续使用天数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param userId:
+     * @param days:
+     * @return int
+     */
+    int updateStudentsCloudStudySequenceDays(@Param("userIds") List<Integer> userId,
+                                             @Param("days") Integer days);
+
+    /**
+     * @describe 清理学员云教练连续使用天数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @return int
+     */
+    int cleanStudentCloudStudySequenceDays();
+
+    /**
+     * @describe 获取分部下试用会员数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param organId:
+     * @return int
+     */
+    int getOrganEVipStudentNum(@Param("organId") Integer organId);
+    int getOrgansTotalEVipStudentNum(@Param("organIds") List<Integer> organIds);
+    List<Map<Integer, Integer>> getOrgansEVipStudentNum(@Param("organIds") List<Integer> organIds);
 }

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

@@ -666,4 +666,13 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return
      */
     List<Map<String,String>> queryAutoCreateStudentMap(@Param("pushMemberRenew") String pushMemberRenew);
+
+    /**
+     * @describe 查询学员乐团名称字典
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param studentIds:
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
+     */
+    List<Map<Integer, String>> queryStudentMusicGroupNamesMap(@Param("studentIds") List<Integer> studentIds);
 }

+ 57 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java

@@ -1,9 +1,65 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.EduOrganStudentListDto;
+import com.ym.mec.biz.dal.dto.MusicCompareRankingDto;
+import com.ym.mec.biz.dal.dto.StudentTrainChartDto;
+import com.ym.mec.biz.dal.dto.StudentTrainOverviewDto;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareRecord> {
 
+    /**
+     * @describe 获取用户训练汇总数据
+     * @author Joburgess
+     * @date 2021/8/11 0011
+     * @param startTime:
+     * @param endTime:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.MusicCompareRankingDto>
+     */
+    List<MusicCompareRankingDto> getUserTrainStat(@Param("startTime") String startTime,
+                                                  @Param("endTime") String endTime);
+
+    /**
+     * @describe 获取用户训练总览
+     * @author Joburgess
+     * @date 2021/8/11 0011
+     * @param userId:
+     * @return com.ym.mec.biz.dal.dto.StudentTrainOverviewDto
+     */
+    StudentTrainOverviewDto getUserTrainOverView(@Param("userId") Integer userId);
+
+    /**
+     * @describe 获取用户训练图表数据
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param userId:
+     * @param startTime:
+     * @param endTime:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentTrainChartDto>
+     */
+    List<StudentTrainChartDto> getUserTrainChartData(@Param("userId") Integer userId,
+                                                     @Param("startTime") String startTime,
+                                                     @Param("endTime") String endTime);
+
+    List<MusicCompareRankingDto> queryMusicGroupStudentTrainData(Map<String, Object> params);
+    int countMusicGroupStudentTrainData(Map<String, Object> params);
+
+    List<EduOrganStudentListDto> queryStudentTrainData(@Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * @describe 统计分部云教练新增人数
+     * @author Joburgess
+     * @date 2021/8/18 0018
+     * @param organId:
+     * @return int
+     */
+    int getOrganNewCloudStudyNum(@Param("organId") Integer organId);
+    int getOrgansTotalNewCloudStudyNum(@Param("organIds") List<Integer> organIds);
+    List<Map<Integer, Integer>> getOrgansNewCloudStudyNum(@Param("organIds") List<Integer> organIds);
 	
-}
+}

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

@@ -504,4 +504,14 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     List<Integer> queryAllIds();
 
     void eduUpdateTeacher(Teacher teacher);
+
+    /**
+     * @describe 查询教师关联的乐团编号
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherMusicStudentOverViewDto>
+     */
+    List<String> queryTeacherMusicIds(Map<String, Object> params);
+    int countTeacherMusics(Map<String, Object> params);
 }

+ 130 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudStudyStudentDataDto.java

@@ -0,0 +1,130 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/16 0016
+ */
+public class CloudStudyStudentDataDto {
+
+    private Integer organId;
+
+    @ApiModelProperty("分部名称")
+    private String organName;
+
+    @ApiModelProperty("学员总数")
+    private int totalStudentNum;
+
+    @ApiModelProperty("付费会员数")
+    private int vipStudentNum;
+
+    @ApiModelProperty("试用会员数")
+    private int eVipStudentNum;
+
+    @ApiModelProperty("付费会员占比")
+    private float vipStudentDuty;
+
+    @ApiModelProperty("云教练使用人数")
+    private int cloudStudyUseStudentNum;
+
+    @ApiModelProperty("云教练今日使用人数")
+    private int cloudStudyTodayUseStudentNum;
+
+    @ApiModelProperty("云教练使用人数占比")
+    private float cloudStudyUseStudentDuty;
+
+    @ApiModelProperty("活跃人数")
+    private int cloudStudyLivelyStudentNum;
+
+    @ApiModelProperty("云教练新增人数")
+    private int newCloudStudyStudentNum;
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public int getTotalStudentNum() {
+        return totalStudentNum;
+    }
+
+    public void setTotalStudentNum(int totalStudentNum) {
+        this.totalStudentNum = totalStudentNum;
+    }
+
+    public int getVipStudentNum() {
+        return vipStudentNum;
+    }
+
+    public void setVipStudentNum(int vipStudentNum) {
+        this.vipStudentNum = vipStudentNum;
+    }
+
+    public int geteVipStudentNum() {
+        return eVipStudentNum;
+    }
+
+    public void seteVipStudentNum(int eVipStudentNum) {
+        this.eVipStudentNum = eVipStudentNum;
+    }
+
+    public float getVipStudentDuty() {
+        return vipStudentDuty;
+    }
+
+    public void setVipStudentDuty(float vipStudentDuty) {
+        this.vipStudentDuty = vipStudentDuty;
+    }
+
+    public int getCloudStudyUseStudentNum() {
+        return cloudStudyUseStudentNum;
+    }
+
+    public void setCloudStudyUseStudentNum(int cloudStudyUseStudentNum) {
+        this.cloudStudyUseStudentNum = cloudStudyUseStudentNum;
+    }
+
+    public float getCloudStudyUseStudentDuty() {
+        return cloudStudyUseStudentDuty;
+    }
+
+    public void setCloudStudyUseStudentDuty(float cloudStudyUseStudentDuty) {
+        this.cloudStudyUseStudentDuty = cloudStudyUseStudentDuty;
+    }
+
+    public int getCloudStudyTodayUseStudentNum() {
+        return cloudStudyTodayUseStudentNum;
+    }
+
+    public void setCloudStudyTodayUseStudentNum(int cloudStudyTodayUseStudentNum) {
+        this.cloudStudyTodayUseStudentNum = cloudStudyTodayUseStudentNum;
+    }
+
+    public int getCloudStudyLivelyStudentNum() {
+        return cloudStudyLivelyStudentNum;
+    }
+
+    public void setCloudStudyLivelyStudentNum(int cloudStudyLivelyStudentNum) {
+        this.cloudStudyLivelyStudentNum = cloudStudyLivelyStudentNum;
+    }
+
+    public int getNewCloudStudyStudentNum() {
+        return newCloudStudyStudentNum;
+    }
+
+    public void setNewCloudStudyStudentNum(int newCloudStudyStudentNum) {
+        this.newCloudStudyStudentNum = newCloudStudyStudentNum;
+    }
+}

+ 11 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java

@@ -64,7 +64,6 @@ public class CourseHomeworkStudentDetailDto {
 
     private String type;
 
-    @ApiModelProperty(value = "是否有会员",required = false)
     private Integer hasMember;
 
     public Integer getHasMember() {
@@ -75,6 +74,17 @@ public class CourseHomeworkStudentDetailDto {
         this.hasMember = hasMember;
     }
 
+    @ApiModelProperty(value = "提交云教练的作业开关",required = false)
+    private Integer homeworkOpenFlag;
+
+    public Integer getHomeworkOpenFlag() {
+        return homeworkOpenFlag;
+    }
+
+    public void setHomeworkOpenFlag(Integer homeworkOpenFlag) {
+        this.homeworkOpenFlag = homeworkOpenFlag;
+    }
+
     public Integer getMusicScoreId() {
         return musicScoreId;
     }

+ 119 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentDataDto.java

@@ -0,0 +1,119 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/16 0016
+ */
+public class EduOrganStudentDataDto {
+
+    private Integer organId;
+
+    @ApiModelProperty("分部名称")
+    private String organName;
+
+    @ApiModelProperty("学员总数")
+    private int totalStudentNum;
+
+    @ApiModelProperty("付费会员数")
+    private int vipStudentNum;
+
+    @ApiModelProperty("试用会员数")
+    private int eVipStudentNum;
+
+    @ApiModelProperty("付费会员占比")
+    private float vipStudentDuty;
+
+    @ApiModelProperty("云教练试用人数")
+    private int cloudStudyUseStudentNum;
+
+    @ApiModelProperty("云教练使用人数占比")
+    private float cloudStudyUseStudentDuty;
+
+    @ApiModelProperty("活跃人数")
+    private int cloudStudyLivelyStudentNum;
+
+    @ApiModelProperty("云教练新增人数")
+    private int newCloudStudyStudentNum;
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public int getTotalStudentNum() {
+        return totalStudentNum;
+    }
+
+    public void setTotalStudentNum(int totalStudentNum) {
+        this.totalStudentNum = totalStudentNum;
+    }
+
+    public int getVipStudentNum() {
+        return vipStudentNum;
+    }
+
+    public void setVipStudentNum(int vipStudentNum) {
+        this.vipStudentNum = vipStudentNum;
+    }
+
+    public int geteVipStudentNum() {
+        return eVipStudentNum;
+    }
+
+    public void seteVipStudentNum(int eVipStudentNum) {
+        this.eVipStudentNum = eVipStudentNum;
+    }
+
+    public float getVipStudentDuty() {
+        return vipStudentDuty;
+    }
+
+    public void setVipStudentDuty(float vipStudentDuty) {
+        this.vipStudentDuty = vipStudentDuty;
+    }
+
+    public int getCloudStudyUseStudentNum() {
+        return cloudStudyUseStudentNum;
+    }
+
+    public void setCloudStudyUseStudentNum(int cloudStudyUseStudentNum) {
+        this.cloudStudyUseStudentNum = cloudStudyUseStudentNum;
+    }
+
+    public float getCloudStudyUseStudentDuty() {
+        return cloudStudyUseStudentDuty;
+    }
+
+    public void setCloudStudyUseStudentDuty(float cloudStudyUseStudentDuty) {
+        this.cloudStudyUseStudentDuty = cloudStudyUseStudentDuty;
+    }
+
+    public int getCloudStudyLivelyStudentNum() {
+        return cloudStudyLivelyStudentNum;
+    }
+
+    public void setCloudStudyLivelyStudentNum(int cloudStudyLivelyStudentNum) {
+        this.cloudStudyLivelyStudentNum = cloudStudyLivelyStudentNum;
+    }
+
+    public int getNewCloudStudyStudentNum() {
+        return newCloudStudyStudentNum;
+    }
+
+    public void setNewCloudStudyStudentNum(int newCloudStudyStudentNum) {
+        this.newCloudStudyStudentNum = newCloudStudyStudentNum;
+    }
+}

+ 155 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListDto.java

@@ -0,0 +1,155 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/17 0017
+ */
+public class EduOrganStudentListDto {
+
+    @ApiModelProperty("学员编号")
+    private Integer studentId;
+
+    @ApiModelProperty("姓名")
+    private String studentName;
+
+    @ApiModelProperty("指导老师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty("指导老师名称")
+    private String teacherName;
+
+    @ApiModelProperty("声部编号")
+    private Integer subjectId;
+
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+
+    @ApiModelProperty("乐团名称")
+    private String musicGroupNames;
+
+    @ApiModelProperty("是否有小课")
+    private int hasVipGroup;
+
+    @ApiModelProperty("训练次数")
+    private int cloudStudyUseNum;
+
+    @ApiModelProperty("平均时长")
+    private double cloudStudyUseAvgTime;
+
+    @ApiModelProperty("总时长")
+    private  double cloudStudyUseTime;
+
+    @ApiModelProperty("连续天数")
+    private int cloudStudyRunningDays;
+
+    @ApiModelProperty("会员有效期")
+    private String membershipEndTime;
+
+    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 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 Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getMusicGroupNames() {
+        return musicGroupNames;
+    }
+
+    public void setMusicGroupNames(String musicGroupNames) {
+        this.musicGroupNames = musicGroupNames;
+    }
+
+    public int getHasVipGroup() {
+        return hasVipGroup;
+    }
+
+    public void setHasVipGroup(int hasVipGroup) {
+        this.hasVipGroup = hasVipGroup;
+    }
+
+    public int getCloudStudyUseNum() {
+        return cloudStudyUseNum;
+    }
+
+    public void setCloudStudyUseNum(int cloudStudyUseNum) {
+        this.cloudStudyUseNum = cloudStudyUseNum;
+    }
+
+    public double getCloudStudyUseAvgTime() {
+        return cloudStudyUseAvgTime;
+    }
+
+    public void setCloudStudyUseAvgTime(double cloudStudyUseAvgTime) {
+        this.cloudStudyUseAvgTime = cloudStudyUseAvgTime;
+    }
+
+    public double getCloudStudyUseTime() {
+        return cloudStudyUseTime;
+    }
+
+    public void setCloudStudyUseTime(double cloudStudyUseTime) {
+        this.cloudStudyUseTime = cloudStudyUseTime;
+    }
+
+    public int getCloudStudyRunningDays() {
+        return cloudStudyRunningDays;
+    }
+
+    public void setCloudStudyRunningDays(int cloudStudyRunningDays) {
+        this.cloudStudyRunningDays = cloudStudyRunningDays;
+    }
+
+    public String getMembershipEndTime() {
+        return membershipEndTime;
+    }
+
+    public void setMembershipEndTime(String membershipEndTime) {
+        this.membershipEndTime = membershipEndTime;
+    }
+}

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

@@ -60,6 +60,9 @@ public class EmployeeDto {
 
     private String postalCode;
 
+    @ApiModelProperty(value = "社保部门id",required = false)
+    private Integer deptId;
+
     @ApiModelProperty(value = "OA部门ids",required = false)
     private String deptIds;
 
@@ -220,4 +223,12 @@ public class EmployeeDto {
     public void setPostDeptIds(String postDeptIds) {
         this.postDeptIds = postDeptIds;
     }
+
+    public Integer getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Integer deptId) {
+        this.deptId = deptId;
+    }
 }

+ 98 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicCompareRankingDto.java

@@ -0,0 +1,98 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+public class MusicCompareRankingDto {
+
+    @ApiModelProperty("用户编号")
+    private Integer userId;
+
+    @ApiModelProperty("头像")
+    private String avatar;
+
+    @ApiModelProperty("学员姓名")
+    private String studentName;
+
+    @ApiModelProperty("排名")
+    private int rankNum = -1;
+
+    @ApiModelProperty("训练天数")
+    private int trainDays = 0;
+
+    @ApiModelProperty("训练时长")
+    private int trainTime = 0;
+
+    @ApiModelProperty("训练次数")
+    private int trainNum = 0;
+
+    @ApiModelProperty("是否是会员")
+    private int vipUser;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public int getRankNum() {
+        return rankNum;
+    }
+
+    public void setRankNum(int rankNum) {
+        this.rankNum = rankNum;
+    }
+
+    public int getTrainDays() {
+        return trainDays;
+    }
+
+    public void setTrainDays(int trainDays) {
+        this.trainDays = trainDays;
+    }
+
+    public int getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(int trainTime) {
+        this.trainTime = trainTime;
+    }
+
+    public int getTrainNum() {
+        return trainNum;
+    }
+
+    public void setTrainNum(int trainNum) {
+        this.trainNum = trainNum;
+    }
+
+    public int getVipUser() {
+        return vipUser;
+    }
+
+    public void setVipUser(int vipUser) {
+        this.vipUser = vipUser;
+    }
+}

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.service.impl.SoundCompareHandler;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.util.CollectionUtils;
 
+import java.io.File;
 import java.io.RandomAccessFile;
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -25,6 +26,9 @@ public class SoundCompareHelper implements PitchDetectionHandler {
     @ApiModelProperty(value = "设备类型")
     private DeviceTypeEnum deviceType;
 
+    @ApiModelProperty(value = "操作编号")
+    private String behaviorId;
+
     @ApiModelProperty(value = "伴奏编号")
     private Integer musicScoreId;
 
@@ -37,6 +41,8 @@ public class SoundCompareHelper implements PitchDetectionHandler {
     @ApiModelProperty
     private RandomAccessFile accessFile;
 
+    private File file;
+
     @ApiModelProperty(value = "录音文件地址")
     private String recordFilePath;
 
@@ -84,6 +90,14 @@ public class SoundCompareHelper implements PitchDetectionHandler {
         this.musicalNotePitchMap = musicalNotePitchMap;
     }
 
+    public String getBehaviorId() {
+        return behaviorId;
+    }
+
+    public void setBehaviorId(String behaviorId) {
+        this.behaviorId = behaviorId;
+    }
+
     public Integer getSubjectId() {
         return subjectId;
     }
@@ -120,6 +134,14 @@ public class SoundCompareHelper implements PitchDetectionHandler {
         return accessFile;
     }
 
+    public File getFile() {
+        return file;
+    }
+
+    public void setFile(File file) {
+        this.file = file;
+    }
+
     public String getRecordFilePath() {
         return recordFilePath;
     }
@@ -195,6 +217,13 @@ public class SoundCompareHelper implements PitchDetectionHandler {
         if(offsetTime == -1 && !DeviceTypeEnum.IOS.equals(deviceType) && pitch>0){
             int preTimeStamp = CollectionUtils.isEmpty(recordMeasurePithInfo)?0:recordMeasurePithInfo.get(recordMeasurePithInfo.size()-1).getTimeStamp();
             offsetTime = timeStamp - (timeStamp - preTimeStamp)/2;
+            for (MusicPitchDetailDto musicXmlInfo : musicXmlInfos) {
+                if(!musicXmlInfo.getDontEvaluating()){
+                    if(offsetTime > musicXmlInfo.getTimeStamp())
+                        offsetTime = offsetTime - musicXmlInfo.getTimeStamp();
+                    break;
+                }
+            }
             for (Map.Entry<Integer, MusicPitchDetailDto> musicPitchDetailDtoEntry : measureEndTime.entrySet()) {
                 musicPitchDetailDtoEntry.getValue().setTimeStamp(musicPitchDetailDtoEntry.getValue().getTimeStamp() + offsetTime);
                 musicPitchDetailDtoEntry.getValue().setEndTimeStamp(musicPitchDetailDtoEntry.getValue().getEndTimeStamp() + offsetTime);

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StatDto.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.dal.dto;
+
+/**
+ * @Author Joburgess
+ * 统计用
+ * @Date 2021/8/11 0011
+ */
+public class StatDto {
+
+    private Object head;
+
+    private Object detail;
+
+    public Object getHead() {
+        return head;
+    }
+
+    public void setHead(Object head) {
+        this.head = head;
+    }
+
+    public Object getDetail() {
+        return detail;
+    }
+
+    public void setDetail(Object detail) {
+        this.detail = detail;
+    }
+}

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentTrainChartDto.java

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/12 0012
+ */
+public class StudentTrainChartDto {
+
+    @ApiModelProperty("训练时长")
+    private int trainTime = 0;
+
+    @ApiModelProperty("训练次数")
+    private int trainNum = 0;
+
+    @ApiModelProperty("训练日期")
+    private LocalDate trainDate;
+
+    public StudentTrainChartDto() {
+    }
+
+    public StudentTrainChartDto(int trainTime, int trainNum, LocalDate trainDate) {
+        this.trainTime = trainTime;
+        this.trainNum = trainNum;
+        this.trainDate = trainDate;
+    }
+
+    public int getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(int trainTime) {
+        this.trainTime = trainTime;
+    }
+
+    public int getTrainNum() {
+        return trainNum;
+    }
+
+    public void setTrainNum(int trainNum) {
+        this.trainNum = trainNum;
+    }
+
+    public LocalDate getTrainDate() {
+        return trainDate;
+    }
+
+    public void setTrainDate(LocalDate trainDate) {
+        this.trainDate = trainDate;
+    }
+}

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentTrainOverviewDto.java

@@ -0,0 +1,43 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+public class StudentTrainOverviewDto {
+
+    @ApiModelProperty("训练天数")
+    private int trainDays = 0;
+
+    @ApiModelProperty("训练时长")
+    private int trainTime = 0;
+
+    @ApiModelProperty("训练次数")
+    private int trainNum = 0;
+
+    public int getTrainDays() {
+        return trainDays;
+    }
+
+    public void setTrainDays(int trainDays) {
+        this.trainDays = trainDays;
+    }
+
+    public int getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(int trainTime) {
+        this.trainTime = trainTime;
+    }
+
+    public int getTrainNum() {
+        return trainNum;
+    }
+
+    public void setTrainNum(int trainNum) {
+        this.trainNum = trainNum;
+    }
+}

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherMusicStudentOverViewDto.java

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/12 0012
+ */
+public class TeacherMusicStudentOverViewDto {
+
+    @ApiModelProperty("乐团编号")
+    private String musicGroupId;
+
+    @ApiModelProperty("乐团名称")
+    private String musicGroupName;
+
+    @ApiModelProperty("在读学员数")
+    private int normalStudentNum;
+
+    @ApiModelProperty("会员数")
+    private int vipStudentNum;
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public int getNormalStudentNum() {
+        return normalStudentNum;
+    }
+
+    public void setNormalStudentNum(int normalStudentNum) {
+        this.normalStudentNum = normalStudentNum;
+    }
+
+    public int getVipStudentNum() {
+        return vipStudentNum;
+    }
+
+    public void setVipStudentNum(int vipStudentNum) {
+        this.vipStudentNum = vipStudentNum;
+    }
+}

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

@@ -54,6 +54,9 @@ public class Employee extends SysUser {
 	@ApiModelProperty(value = "证件号码",required = false)
 	private String certificateNum;
 
+	@ApiModelProperty(value = "社保部门id",required = false)
+	private Integer deptId;
+
 	@ApiModelProperty(value = "部门ids",required = false)
 	private String depIds;
 
@@ -270,4 +273,12 @@ public class Employee extends SysUser {
 	public void setPostDeptIds(String postDeptIds) {
 		this.postDeptIds = postDeptIds;
 	}
+
+	public Integer getDeptId() {
+		return deptId;
+	}
+
+	public void setDeptId(Integer deptId) {
+		this.deptId = deptId;
+	}
 }

+ 48 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java

@@ -1,9 +1,13 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
+import com.ym.mec.biz.dal.enums.FeatureType;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
 
 /**
  * 对应数据库表(sys_music_compare_record):
@@ -12,12 +16,17 @@ public class SysMusicCompareRecord {
 
 	/**  */
 	private Long id;
+
+	/** 行为编号 */
+	private String behaviorId;
 	
 	/** 用户编号 */
 	private Integer userId;
 	
 	/** 教程编号 */
 	private Integer sysMusicScoreId;
+
+	private String sysMusicScoreName;
 	
 	/** 评分数据 */
 	private String scoreData;
@@ -36,6 +45,11 @@ public class SysMusicCompareRecord {
 
 	/** 录音文件地址 */
 	private String recordFilePath;
+
+	/** 周一日期 */
+	private String monday = LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()).toString();
+
+	private FeatureType feature;
 	
 	/** 创建时间 */
 	private java.util.Date createTime;
@@ -53,7 +67,15 @@ public class SysMusicCompareRecord {
 	public Long getId(){
 		return this.id;
 	}
-			
+
+	public String getBehaviorId() {
+		return behaviorId;
+	}
+
+	public void setBehaviorId(String behaviorId) {
+		this.behaviorId = behaviorId;
+	}
+
 	public void setUserId(Integer userId){
 		this.userId = userId;
 	}
@@ -77,7 +99,15 @@ public class SysMusicCompareRecord {
 	public Integer getSysMusicScoreId(){
 		return this.sysMusicScoreId;
 	}
-			
+
+	public String getSysMusicScoreName() {
+		return sysMusicScoreName;
+	}
+
+	public void setSysMusicScoreName(String sysMusicScoreName) {
+		this.sysMusicScoreName = sysMusicScoreName;
+	}
+
 	public void setScoreData(String scoreData){
 		this.scoreData = scoreData;
 	}
@@ -142,6 +172,22 @@ public class SysMusicCompareRecord {
 		this.playTime = playTime;
 	}
 
+	public String getMonday() {
+		return monday;
+	}
+
+	public void setMonday(String monday) {
+		this.monday = monday;
+	}
+
+	public FeatureType getFeature() {
+		return feature;
+	}
+
+	public void setFeature(FeatureType feature) {
+		this.feature = feature;
+	}
+
 	public void setCreateTime(java.util.Date createTime){
 		this.createTime = createTime;
 	}

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.enums.SuggestionType;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
@@ -30,6 +31,9 @@ public class SysSuggestion {
 	@ApiModelProperty(value = "客户端类型",required = false)
 	private String clientType;
 
+	@ApiModelProperty(value = "建议类型")
+	private SuggestionType type = SuggestionType.APP;
+
 	@ApiModelProperty(value = "用户名",required = false)
 	private String username;
 	
@@ -92,6 +96,14 @@ public class SysSuggestion {
 		this.clientType = clientType;
 	}
 
+	public SuggestionType getType() {
+		return type;
+	}
+
+	public void setType(SuggestionType type) {
+		this.type = type;
+	}
+
 	public void setCreateTime(java.util.Date createTime){
 		this.createTime = createTime;
 	}

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/FeatureType.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum FeatureType implements BaseEnum<String, FeatureType> {
+	CLOUD_STUDY_TRAIN("CLOUD_STUDY_TRAIN", "云教练训练"),
+	CLOUD_STUDY_EVALUATION("CLOUD_STUDY_EVALUATION", "云教练评测");
+
+	private String code;
+
+	private String desc;
+
+	FeatureType(String code, String desc) {
+		this.code = code;
+		this.desc = desc;
+	}
+
+	@Override
+	public String getCode() {
+		return code;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+}

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java

@@ -69,6 +69,13 @@ public enum IndexDataType implements BaseEnum<String, IndexDataType> {
     QUIT_MUSIC_GROUP_STUDENT_NUM("QUIT_MUSIC_GROUP_STUDENT_NUM","退团学员", false, true),
     VIP_PRACTICE_STUDENT_NUM("VIP_PRACTICE_STUDENT_NUM", "VIP/网管在读", false, false),
     VIP_PRACTICE_ADD_STUDENT_NUM("VIP_PRACTICE_ADD_STUDENT_NUM", "VIP/网管新增", false, true),
+
+    //活跃用户统计
+    ORGAN_TOTAL_STUDENT_NUM("ORGAN_TOTAL_STUDENT_NUM", "分部学员总数", false, false),
+    CLOUD_STUDY_LIVELY_STUDENT_NUM("CLOUD_STUDY_LIVELY_STUDENT_NUM", "会员数量", false, false),
+    MEMBER_STUDENT_NUM("MEMBER_STUDENT_NUM", "会员数量", false, false),
+    EXPERIENCE_MEMBER_STUDENT_NUM("EXPERIENCE_MEMBER_STUDENT_NUM", "试用会员数量", false, false),
+    NEW_MEMBER_STUDENT_NUM("NEW_MEMBER_STUDENT_NUM", "新增会员数量", false, false),
     ;
 
     private String code;

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/SuggestionType.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum SuggestionType implements BaseEnum<String, SuggestionType> {
+	APP("APP", "软件反馈"),
+	SMART_PRACTICE("SMART_PRACTICE", "智能陪练");
+
+	private String code;
+
+	private String msg;
+
+	SuggestionType(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public String getCode() {
+		return this.code;
+	}
+}

+ 31 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
 
@@ -16,8 +17,14 @@ public class StudentQueryInfo extends QueryInfo {
 
     private Integer studentId;
 
+    private Integer organId;
+
     private List<String> organIdList;
 
+    private String cloudStudyUseTime;
+
+    private String cloudStudyRunningDays;
+
     public String getGroupType() {
         return groupType;
     }
@@ -42,6 +49,14 @@ public class StudentQueryInfo extends QueryInfo {
         this.studentId = studentId;
     }
 
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
     public List<String> getOrganIdList() {
         return organIdList;
     }
@@ -49,4 +64,20 @@ public class StudentQueryInfo extends QueryInfo {
     public void setOrganIdList(List<String> organIdList) {
         this.organIdList = organIdList;
     }
+
+    public String getCloudStudyUseTime() {
+        return cloudStudyUseTime;
+    }
+
+    public void setCloudStudyUseTime(String cloudStudyUseTime) {
+        this.cloudStudyUseTime = cloudStudyUseTime;
+    }
+
+    public String getCloudStudyRunningDays() {
+        return cloudStudyRunningDays;
+    }
+
+    public void setCloudStudyRunningDays(String cloudStudyRunningDays) {
+        this.cloudStudyRunningDays = cloudStudyRunningDays;
+    }
 }

+ 63 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMusicCompareRecordQueryInfo.java

@@ -0,0 +1,63 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+public class SysMusicCompareRecordQueryInfo extends QueryInfo {
+
+    private Integer userId;
+
+    private String startTime;
+
+    private String endTime;
+
+    private String musicGroupId;
+
+    @ApiModelProperty("排序字段:TRAINDAYS(训练天数);TRAINTIME(训练时长);TRAINNUM(训练次数)")
+    private String sortField = "TRAINDAYS";
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public String getSortField() {
+        return sortField;
+    }
+
+    public void setSortField(String sortField) {
+        this.sortField = sortField;
+    }
+}

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysSuggestionQueryInfo.java

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.biz.dal.enums.SuggestionType;
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/10 0010
+ */
+public class SysSuggestionQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "建议类型")
+    private SuggestionType type;
+
+    private String startTime;
+
+    private String endTime;
+
+    @ApiModelProperty(value = "客户端类型",required = false)
+    private String clientType;
+
+    public SuggestionType getType() {
+        return type;
+    }
+
+    public void setType(SuggestionType type) {
+        this.type = type;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(String clientType) {
+        this.clientType = clientType;
+    }
+}

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java

@@ -8,6 +8,8 @@ import com.ym.mec.common.service.BaseService;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 
 public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacherOrder> {
@@ -84,4 +86,5 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
      */
     CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId);
 
+    List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds);
 }

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

@@ -21,7 +21,7 @@ public interface OrganizationService extends BaseService<Integer, Organization>
      * 获取员工坐在分部列表
      * @return
      */
-    List<Organization> queryEmployeeOrgan() throws Exception;
+    List<Organization> queryEmployeeOrgan(Integer userId) throws Exception;
 
     /**
      * 获取员工坐在分部列表

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java

@@ -3,6 +3,9 @@ package com.ym.mec.biz.service;
 import java.text.ParseException;
 import java.util.List;
 
+import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
+import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.Student;
@@ -10,6 +13,7 @@ import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface StudentService extends BaseService<Integer, Student> {
@@ -87,4 +91,25 @@ public interface StudentService extends BaseService<Integer, Student> {
 
     void cleanMember(Integer userId);
 
+    /**
+     * @describe 分部各类型学员数据统计
+     * @author Joburgess
+     * @date 2021/8/16 0016
+     * @param queryInfo:
+     * @return com.ym.mec.biz.dal.dto.StatDto
+     */
+    StatDto organStudentData(StudentQueryInfo queryInfo);
+
+    List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds);
+
+    CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds);
+
+    /**
+     * @describe 清理学员云教练连续使用天数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param :
+     * @return void
+     */
+    void cleanStudentCloudStudySequenceDays();
 }

+ 40 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java

@@ -1,10 +1,13 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.MusicCompareRankingDto;
 import com.ym.mec.biz.dal.dto.SoundCompareHelper;
+import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.math.BigDecimal;
 import java.util.Map;
 
 public interface SysMusicCompareRecordService extends BaseService<Long, SysMusicCompareRecord> {
@@ -19,4 +22,40 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
      */
     void saveMusicCompareData(String phone, SoundCompareHelper soundCompareInfo);
 
+    /**
+     * @describe 云教练排行榜
+     * @author Joburgess
+     * @date 2021/8/11 0011
+     * @param startDate:
+     * @param endDate:
+     * @return com.ym.mec.biz.dal.dto.StatDto
+     */
+    StatDto rankingList(Integer headUserId, String startDate, String endDate);
+
+    /**
+     * @describe 学员训练数据统计
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param queryInfo:
+     * @return java.util.Map<java.lang.String,java.lang.Object>
+     */
+    Map<String, Object> studentTrainData(SysMusicCompareRecordQueryInfo queryInfo);
+
+    /**
+     * @describe 查询乐团学员训练数据
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.MusicCompareRankingDto>
+     */
+    PageInfo<MusicCompareRankingDto> queryMusicGroupStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo);
+
+    /**
+     * @describe 学员训练数据
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.entity.SysMusicCompareRecord>
+     */
+    PageInfo<SysMusicCompareRecord> queryStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo);
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java

@@ -13,6 +13,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 public interface TeacherService extends BaseService<Integer, Teacher> {
 
@@ -214,4 +215,13 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
      * @return
      */
     List<Integer> queryAllIds();
+
+    /**
+     * @describe 查询教师关联的乐团预览信息
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.TeacherMusicStudentOverViewDto>
+     */
+    PageInfo<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverView(TeacherServeQueryInfo queryInfo);
 }

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -618,7 +618,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             dataList.forEach(e -> {
                 param.put("musicGroupId", e.getMusicGroupId());
                 e.setAttendanceNum(teacherPersonalAttendancesCount);
-                e.setHasRestClass(hasRestClassMap.get(Integer.parseInt(e.getClassGroupIds())).intValue());
+                Long aLong = hasRestClassMap.get(Integer.parseInt(e.getClassGroupIds()));
+                if(aLong != null){
+                    e.setHasRestClass(aLong.intValue());
+                }
             });
         }
         if (count == 0) {

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

@@ -22,6 +22,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -241,4 +242,9 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
 	public CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId) {
 		return cloudTeacherOrderDao.queryOrderInfoByOrderId(orderId);
 	}
+
+    @Override
+    public List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds) {
+        return cloudTeacherOrderDao.queryNoStartByUserIds(userIds);
+    }
 }

+ 15 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -235,20 +235,21 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			currentCourseDetail.setCoursePlan(planList.get(courseNumNo - 1).getPlan());
 		}
 		//获取有会员的学员数
-		String configValue = sysConfigDao.findConfigValue(SysConfigService.HOMEWORK_OPEN_FLAG);
-		if(StringUtils.isEmpty(configValue)){
-			configValue = "0";
-		}
-		if(configValue.equals("0")){
-			currentCourseDetail.setMemberNum(0);
-		}else {
-			MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
-			if(musicGroup != null){
-				currentCourseDetail.setCourseViewType(musicGroup.getCourseViewType());
-			}
-			List<BasicUserDto> students = courseScheduleStudentPaymentDao.findStudents(courseID);
-			currentCourseDetail.setMemberNum(studentDao.getMemberNum(StringUtils.join(students, ",")));
-		}
+//		String configValue = sysConfigDao.findConfigValue(SysConfigService.HOMEWORK_OPEN_FLAG);
+//		if(StringUtils.isEmpty(configValue)){
+//			configValue = "0";
+//		}
+//		if(configValue.equals("0")){
+//			currentCourseDetail.setMemberNum(0);
+//		}else {
+//			CourseSchedule courseSchedule = courseScheduleDao.get(courseID);
+//			MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+//			if(musicGroup != null){
+//				currentCourseDetail.setCourseViewType(musicGroup.getCourseViewType());
+//			}
+//			List<BasicUserDto> students = courseScheduleStudentPaymentDao.findStudents(courseID);
+//			currentCourseDetail.setMemberNum(studentDao.getMemberNum(StringUtils.join(students, ",")));
+//		}
 		return currentCourseDetail;
     }
 

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

@@ -533,6 +533,8 @@ public class ExportServiceImpl implements ExportService {
                     row.setSubjectName(practiceGroup.getSubjectName());
                     row.setEduTeacher(practiceGroup.getEduTeacherName());
                 }
+            } else if (row.getGroupType().equals(GroupType.MEMBER)) {
+                row.setCloudTeacherFee(row.getActualAmount());
             } else if (row.getGroupType().equals(GroupType.REPLACEMENT)) {
                 row.setMusicalFee(row.getActualAmount());
                 ReplacementInstrumentActivityStatDto info = replacementInstrumentActivityDao.getInfo(Integer.parseInt(row.getMusicGroupId()));

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

@@ -107,6 +107,7 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 		if(StringUtils.isEmpty(configValue)){
 			configValue = "0";
 		}
+		detail.setHomeworkOpenFlag(Integer.parseInt(configValue));
 		if(configValue.equals("0")){
 			detail.setHasMember(0);
 		}else {

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -67,6 +67,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 	private StudentRegistrationDao studentRegistrationDao;
 	@Autowired
 	private MusicGroupPerformanceDao musicGroupPerformanceDao;
+	@Autowired
+	private StudentDao studentDao;
 
 	private static ThreadLocal<Set<Integer>> organIds = new ThreadLocal<Set<Integer>>(){
 		@Override
@@ -501,6 +503,39 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM)) {
 			saveData(indexBaseMonthDataDao.getVipPracticeAddStudentData(dayStr), dayStr, IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM);
 		}
+
+		//云教练相关
+//		List<Map<Integer, Integer>> organsStudentNumMapList = studentDao.getOrgansStudentNum(organIds);
+//		Map<String, Long> organsStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organsStudentNumMapList)){
+//			organsStudentNumMap = MapUtil.convertIntegerMap(organsStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organsVipStudentNumMapList = cloudTeacherDao.getOrgansVipStudentNum(organIds);
+//		Map<String, Long> organsVipStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organsVipStudentNumMapList)){
+//			organsVipStudentNumMap = MapUtil.convertIntegerMap(organsVipStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organsEVipStudentNumMapList = studentDao.getOrgansEVipStudentNum(organIds);
+//		Map<String, Long> organsEVipStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organsEVipStudentNumMapList)){
+//			organsEVipStudentNumMap = MapUtil.convertIntegerMap(organsEVipStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organCloudStudyStudentNumMapList = studentDao.getOrganCloudStudyStudentNum(organIds);
+//		Map<String, Long> organCloudStudyStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organCloudStudyStudentNumMapList)){
+//			organCloudStudyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organCloudStudyLivelyStudentNumMapList = studentDao.getOrganCloudStudyLivelyStudentNum(organIds);
+//		Map<String, Long> organCloudStudyLivelyStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organCloudStudyLivelyStudentNumMapList)){
+//			organCloudStudyLivelyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyLivelyStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organsNewCloudStudyNumMapList = sysMusicCompareRecordDao.getOrgansNewCloudStudyNum(organIds);
+//		Map<String, Long> organsNewCloudStudyNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organsNewCloudStudyNumMapList)){
+//			organsNewCloudStudyNumMap = MapUtil.convertIntegerMap(organsNewCloudStudyNumMapList);
+//		}
+
 	}
 
 	/**

+ 38 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -137,6 +137,7 @@ import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PayStatus;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
@@ -1007,10 +1008,20 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         Integer userId = studentRegistration.getUserId();
 
-        StudentPaymentOrder ApplyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
-        if (ApplyOrder == null) {
+        StudentPaymentOrder applyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
+        if (applyOrder == null) {
             throw new BizException("没有支付中订单,请在我的订单中查看订单状态");
         }
+        
+        // 查询订单状态
+        PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+        if(payStatus != PayStatus.FAILED){
+        	if(payStatus == PayStatus.SUCCESSED){
+        		throw new BizException("订单已支付成功,请勿重复支付");
+        	}else if(payStatus == PayStatus.PAYING){
+        		throw new BizException("订单还在交易中,请稍后重试");
+        	}
+        }
 
     	MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(studentRegistration.getMusicGroupId());
         if(musicGroupRegCalender == null){
@@ -1018,9 +1029,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         
         //手动关闭订单
-        ApplyOrder.setStatus(DealStatusEnum.FAILED);
-        ApplyOrder.setMemo("用户手动关闭");
-        studentPaymentOrderService.callOrderCallBack(ApplyOrder);
+        applyOrder.setStatus(DealStatusEnum.FAILED);
+        applyOrder.setMemo("用户手动关闭");
+        studentPaymentOrderService.callOrderCallBack(applyOrder);
 
         BigDecimal amount = registerPayDto.getAmount(); //前端获取的价格
         BigDecimal orderAmount = new BigDecimal("0");
@@ -1792,7 +1803,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("乐团找不到");
         }
 
-        if (!(musicGroup.getStatus() == MusicGroupStatusEnum.PAY ||
+        if (!(musicGroup.getStatus() == MusicGroupStatusEnum.APPLY ||
+        		musicGroup.getStatus() == MusicGroupStatusEnum.PAY ||
                 musicGroup.getStatus() == MusicGroupStatusEnum.PREPARE ||
                 musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS)) {
             throw new BizException("乐团当前状态是[{}],不能延长缴费", musicGroup.getStatus().getMsg());
@@ -2554,15 +2566,22 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         //关闭之前的订单
         if (calenderDetail.getPaymentOrderId() != null) {
             StudentPaymentOrder oldStudentPaymentOrder = studentPaymentOrderDao.get(calenderDetail.getPaymentOrderId());
-            if (oldStudentPaymentOrder != null) {
-                if (oldStudentPaymentOrder.getStatus() == SUCCESS) {
-                    throw new BizException("您已支付请勿重复提交");
-                } else if (oldStudentPaymentOrder.getStatus() == ING) {
-                    oldStudentPaymentOrder.setStatus(CLOSE);
-                    studentPaymentOrderService.update(oldStudentPaymentOrder);
-                    if (oldStudentPaymentOrder.getBalancePaymentAmount() != null && oldStudentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
-                        sysUserCashAccountService.updateBalance(oldStudentPaymentOrder.getUserId(), oldStudentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "关闭订单");
-                    }
+            if (oldStudentPaymentOrder != null && oldStudentPaymentOrder.getStatus() == ING) {
+                
+                // 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(oldStudentPaymentOrder.getPaymentChannel(), oldStudentPaymentOrder.getOrderNo(), oldStudentPaymentOrder.getTransNo());
+                if(payStatus != PayStatus.FAILED){
+                	if(payStatus == PayStatus.SUCCESSED){
+                		throw new BizException("订单已支付成功,请勿重复支付");
+                	}else if(payStatus == PayStatus.PAYING){
+                		throw new BizException("订单还在交易中,请稍后重试");
+                	}
+                }
+                
+                oldStudentPaymentOrder.setStatus(CLOSE);
+                studentPaymentOrderService.update(oldStudentPaymentOrder);
+                if (oldStudentPaymentOrder.getBalancePaymentAmount() != null && oldStudentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+                    sysUserCashAccountService.updateBalance(oldStudentPaymentOrder.getUserId(), oldStudentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "关闭订单");
                 }
             }
         }
@@ -3728,6 +3747,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 		//查询当前乐团报名订单中购买了乐保的订单
 		List<StudentApplyInstrumentDto> maintenanceList = studentPaymentOrderDetailDao.queryByType(musicGroupId, OrderDetailTypeEnum.MAINTENANCE);
 		
+		if(maintenanceList == null || maintenanceList.size() == 0){
+			return true;
+		}
+		
 		List<Long> instrumentIdList = maintenanceList.stream().map(t -> t.getStudentInstrumentId()).collect(Collectors.toList());
 		
 		List<StudentInstrument> studentInstrumentList = studentInstrumentDao.queryById(instrumentIdList);

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

@@ -28,6 +28,7 @@ public class OaServiceImpl implements OaUserService {
         oaUser.setNickName(employee.getRealName());
         oaUser.setPhone(employee.getPhone());
         oaUser.setSex(employee.getGender().toString());
+        oaUser.setDeptId(employee.getDeptId());
         oaUser.setDeptIds(JSON.parseArray(employee.getDeptIds(), Integer.class));
         oaUser.setAvatar(employee.getAvatar());
         oaUser.setPostDeptIds(JSON.parseArray(employee.getPostDeptIds(), PostDept.class));
@@ -47,6 +48,7 @@ public class OaServiceImpl implements OaUserService {
         oaUser.setNickName(employee.getRealName());
         oaUser.setPhone(employee.getPhone());
         oaUser.setSex(employee.getGender().toString());
+        oaUser.setDeptId(employee.getDeptId());
         oaUser.setDeptIds(JSON.parseArray(employee.getDeptIds(), Integer.class));
         oaUser.setAvatar(employee.getAvatar());
         oaUser.setPostDeptIds(JSON.parseArray(employee.getPostDeptIds(), PostDept.class));

+ 1 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java

@@ -42,12 +42,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 	}
 
 	@Override
-	public List<Organization> queryEmployeeOrgan(){
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if(sysUser == null){
-			throw new BizException("获取用户信息失败");
-		}
-		Integer userId = sysUser.getId();
+	public List<Organization> queryEmployeeOrgan(Integer userId){
 		return organizationDao.queryEmployeeOrgan(userId);
 	}
 

+ 13 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ReplacementInstrumentActivityServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
 import ch.qos.logback.core.util.StringCollectionUtil;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
@@ -22,8 +23,8 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
-
 import com.ym.mec.util.http.HttpUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -276,6 +277,17 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
         if (replacementInstrumentActivity.getPayStatus().equals(1) && replacementPayDto.getRePay()) {
             StudentPaymentOrder oldOrder = studentPaymentOrderService.getUserReplacementIngOrder(userId, replacementInstrumentActivity.getId());
             if (oldOrder != null) {
+                
+                // 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(oldOrder.getPaymentChannel(), oldOrder.getOrderNo(), oldOrder.getTransNo());
+                if(payStatus != PayStatus.FAILED){
+                	if(payStatus == PayStatus.SUCCESSED){
+                		throw new BizException("订单已支付成功,请勿重复支付");
+                	}else if(payStatus == PayStatus.PAYING){
+                		throw new BizException("订单还在交易中,请稍后重试");
+                	}
+                }
+                
                 oldOrder.setStatus(DealStatusEnum.FAILED);
                 oldOrder.setMemo("用户手动关闭");
                 studentPaymentOrderService.callOrderCallBack(oldOrder);

+ 27 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java

@@ -19,6 +19,9 @@ import com.ym.mec.biz.service.SysMusicCompareRecordService;
 import com.ym.mec.biz.service.WebSocketEventHandler;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.thirdparty.storage.StoragePluginContext;
+import com.ym.mec.thirdparty.storage.provider.KS3StoragePlugin;
+import com.ym.mec.util.upload.UploadUtil;
 import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,6 +67,8 @@ public class SoundCompareHandler implements WebSocketEventHandler {
     public static final SoundCompareConfig soundCompareConfig = new SoundCompareConfig();
 
     @Autowired
+    private StoragePluginContext storagePluginContext;
+    @Autowired
     private SysMusicCompareRecordService sysMusicCompareRecordService;
     @Autowired
     private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
@@ -101,6 +106,9 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                 if(bodyObject.containsKey("platform")){
                     userSoundInfoMap.get(phone).setDeviceType(DeviceTypeEnum.valueOf(bodyObject.getString("platform")));
                 }
+                if(bodyObject.containsKey("behaviorId")){
+                    userSoundInfoMap.get(phone).setBehaviorId(bodyObject.getString("behaviorId"));
+                }
                 List<Integer> subjectIds = sysMusicScoreAccompanimentDao.findSubjectByMusicScoreId(userSoundInfoMap.get(phone).getMusicScoreId(), null);
                 if(!CollectionUtils.isEmpty(subjectIds)){
                     userSoundInfoMap.get(phone).setSubjectId(subjectIds.get(0));
@@ -124,6 +132,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                 }
                 try {
                     File file = new File(tmpDir+phone + "_"+ userSoundInfoMap.get(phone).getMusicScoreId() +"_"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) +".wav");
+                    userSoundInfoMap.get(phone).setFile(file);
                     userSoundInfoMap.get(phone).setAccessFile(new RandomAccessFile(file, "rw"));
                     userSoundInfoMap.get(phone).setRecordFilePath(file.getAbsolutePath());
                 } catch (FileNotFoundException e) {
@@ -204,7 +213,6 @@ public class SoundCompareHandler implements WebSocketEventHandler {
     @Override
     public void afterConnectionClosed(WebSocketSession session, String phone){
         createHeader(phone);
-        userSoundInfoMap.remove(phone);
     }
 
     /**
@@ -246,6 +254,24 @@ public class SoundCompareHandler implements WebSocketEventHandler {
             }
             userSoundInfoMap.get(phone).setAccessFile(null);
         }
+
+        if(Objects.nonNull(userSoundInfoMap.get(phone).getFile())){
+            String url = null;
+            try {
+                String folder = UploadUtil.getFileFloder();
+                url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME,"soundCompare/" + folder, userSoundInfoMap.get(phone).getFile());
+            } catch (Exception e) {
+                LOGGER.error("录音文件上传失败:{}", e);
+            }
+            userSoundInfoMap.get(phone).setRecordFilePath(url);
+        }
+        //存储评分数据
+        sysMusicCompareRecordService.saveMusicCompareData(phone, userSoundInfoMap.get(phone));
+
+        if(Objects.nonNull(userSoundInfoMap.get(phone).getFile())){
+            userSoundInfoMap.get(phone).getFile().deleteOnExit();
+        }
+
         userSoundInfoMap.remove(phone);
     }
 
@@ -402,9 +428,6 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                     musicXmlInfo.setAvgFrequency(avgPitch.floatValue());
                 }
                 //完成度
-                if(integrityValidNum>0){
-                    integrityValidNum = integrityValidNum;
-                }
                 if(integrityValidNum > compareNum){
                     integrityValidNum = compareNum;
                 }
@@ -467,9 +490,6 @@ public class SoundCompareHandler implements WebSocketEventHandler {
         //计算分数并推送
         createPushInfo(phone, "overall", -1, intonation, cadence, integrity);
 
-        //存储评分数据
-        sysMusicCompareRecordService.saveMusicCompareData(phone, userSoundInfoMap.get(phone));
-
         LOGGER.info("评分数据:{}", JSON.toJSONString(userSoundInfoMap.get(phone)));
     }
 

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

@@ -214,6 +214,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         if(StringUtils.isEmpty(configValue)){
             configValue = "0";
         }
+        courseHomeworkStudentDetail.setHomeworkOpenFlag(Integer.parseInt(configValue));
         if(configValue.equals("0")){
             courseHomeworkStudentDetail.setMusicScoreId(null);
             courseHomeworkStudentDetail.setMusicScoreName(null);

+ 8 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -141,7 +141,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         if(!CollectionUtils.isEmpty(userAllContract)){
             userContractVersionMap = userAllContract.stream().collect(Collectors.groupingBy(SysUserContracts::getUserId, Collectors.mapping(SysUserContracts::getVersion, Collectors.toSet())));
         }
-
+        Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(userIds));
         //List<Subject> studentSubject = studentManageDao.getStudentSubject(userIds);
         StudentListCourseDto studentListCourseDto = null;
         for (StudentManageListDto dto : dataList) {
@@ -165,6 +165,13 @@ public class StudentManageServiceImpl implements StudentManageService {
                 dto.setHasCourse(YesOrNoEnum.NO);
                 dto.setHasPracticeCourse(YesOrNoEnum.NO);
             }
+            //如果会员已过期、是否有未生效的会员
+            if(dto.getMemberRankSettingId() == null){
+                String s = cloudMap.get(dto.getUserId().longValue());
+                if(StringUtils.isNotEmpty(s)){
+                    dto.setMembershipEndTime(DateUtil.toDateTime(s));
+                }
+            }
 
             if(userContractVersionMap.containsKey(dto.getUserId())){
 //                dto.setContractVersions(StringUtils.join(userContractVersionMap.get(dto.getUserId()), ","));

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java

@@ -21,6 +21,7 @@ import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -127,6 +128,17 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             if (orderByOrderNo.getStatus() == SUCCESS) {
                 throw new BizException("您已支付请勿重复提交");
             }else if(orderByOrderNo.getStatus() == ING){
+            	
+            	// 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(orderByOrderNo.getPaymentChannel(), orderByOrderNo.getOrderNo(), orderByOrderNo.getTransNo());
+                if(payStatus != PayStatus.FAILED){
+                	if(payStatus == PayStatus.SUCCESSED){
+                		throw new BizException("订单已支付成功,请勿重复支付");
+                	}else if(payStatus == PayStatus.PAYING){
+                		throw new BizException("订单还在交易中,请稍后重试");
+                	}
+                }
+                
                 orderByOrderNo.setStatus(CLOSE);
                 studentPaymentOrderService.update(orderByOrderNo);
                 if (orderByOrderNo.getBalancePaymentAmount() != null && orderByOrderNo.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {

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

@@ -914,18 +914,18 @@ public class StudentServeServiceImpl implements StudentServeService {
             return result;
         }
 
-        String configValue = sysConfigDao.findConfigValue(SysConfigService.HOMEWORK_OPEN_FLAG);
-        if(StringUtils.isEmpty(configValue)){
-            configValue = "0";
-        }
+//        String configValue = sysConfigDao.findConfigValue(SysConfigService.HOMEWORK_OPEN_FLAG);
+//        if(StringUtils.isEmpty(configValue)){
+//            configValue = "0";
+//        }
         List<Integer> studentIds=new ArrayList<>();
         if(StringUtils.isNotBlank(studentIdsStr)){
-            if(configValue.equals("0")){
-                result.put("memberNum",0);
-            }else {
+//            if(configValue.equals("0")){
+//                result.put("memberNum",0);
+//            }else {
                 //获取有会员的学员数
-                result.put("memberNum", studentDao.getMemberNum(studentIdsStr));
-            }
+//                result.put("memberNum", studentDao.getMemberNum(studentIdsStr));
+//            }
             studentIds= Arrays.asList(studentIdsStr.split(",")).stream().map(id->Integer.valueOf(id)).collect(Collectors.toList());
         }
 
@@ -939,18 +939,18 @@ public class StudentServeServiceImpl implements StudentServeService {
                 result.put("isAssignHomework", 0);
                 return result;
             }
-            if(configValue.equals("0")){
-                result.put("memberNum",0);
-                result.put("courseViewType", CourseViewTypeEnum.COURSE_FEE);
-            }else {
-                MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
-                if(musicGroup != null){
-                    result.put("courseViewType", musicGroup.getCourseViewType());
-                }else if(result.get("memberNum") == null){
-                    Set<Integer> collect = students.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-                    result.put("memberNum", studentDao.getMemberNum(StringUtils.join(collect,",")));
-                }
-            }
+//            if(configValue.equals("0")){
+//                result.put("memberNum",0);
+//                result.put("courseViewType", CourseViewTypeEnum.COURSE_FEE);
+//            }else {
+//                MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+//                if(musicGroup != null){
+//                    result.put("courseViewType", musicGroup.getCourseViewType());
+//                }else if(result.get("memberNum") == null){
+//                    Set<Integer> collect = students.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+//                    result.put("memberNum", studentDao.getMemberNum(StringUtils.join(collect,",")));
+//                }
+//            }
 
             localDate=LocalDateTime.ofInstant(courseSchedule.getClassDate().toInstant(), DateUtil.zoneId).toLocalDate();
             List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseSchedule(courseScheduleId);

+ 162 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -1,25 +1,28 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.StudentClassInfoDto;
-import com.ym.mec.biz.dal.dto.StudentCourseTimesDto;
-import com.ym.mec.biz.dal.dto.StudentTeacherCourseDto;
+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.StudentQueryInfo;
 import com.ym.mec.biz.service.StudentService;
+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.page.QueryInfo;
 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.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 sun.nio.cs.ext.Big5;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -41,6 +44,15 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     private PracticeGroupDao practiceGroupDao;
 
+    @Autowired
+    private SysMusicCompareRecordDao sysMusicCompareRecordDao;
+
+    @Autowired
+    private CloudTeacherDao cloudTeacherDao;
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
     @Override
     public BaseDAO<Integer, Student> getDAO() {
         return studentDao;
@@ -362,4 +374,151 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     public void cleanMember(Integer userId) {
         studentDao.cleanMember(userId);
     }
+
+    @Override
+    public StatDto organStudentData(StudentQueryInfo queryInfo) {
+        PageInfo<EduOrganStudentListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<EduOrganStudentListDto> dataList = new ArrayList<>();
+        int count = studentDao.countCloudStudyStudentData(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentDao.queryCloudStudyStudentData(params);
+            List<Integer> studentIds = dataList.stream().map(EduOrganStudentListDto::getStudentId).collect(Collectors.toList());
+            List<Map<Integer, String>> studentGroupNamesMapList = studentRegistrationDao.queryStudentMusicGroupNamesMap(studentIds);
+            Map<Integer, String> studentGroupNamesMap = MapUtil.convertIntegerMap(studentGroupNamesMapList);
+            Set<Integer> hasVipCourseStudentIds = courseScheduleStudentPaymentDao.getHasVipCourseStudentIds(studentIds);
+
+            for (EduOrganStudentListDto eduOrganStudentListDto : dataList) {
+                if(studentGroupNamesMap.containsKey(eduOrganStudentListDto.getStudentId())){
+                    eduOrganStudentListDto.setMusicGroupNames(studentGroupNamesMap.get(eduOrganStudentListDto.getStudentId()));
+                }
+                if(hasVipCourseStudentIds.contains(eduOrganStudentListDto.getSubjectId())){
+                    eduOrganStudentListDto.setHasVipGroup(1);
+                }
+                if(eduOrganStudentListDto.getCloudStudyUseNum()>0 && eduOrganStudentListDto.getCloudStudyUseTime()>0){
+                    eduOrganStudentListDto.setCloudStudyUseAvgTime(eduOrganStudentListDto.getCloudStudyUseTime()/eduOrganStudentListDto.getCloudStudyUseNum());
+                }
+                eduOrganStudentListDto.setCloudStudyUseTime(eduOrganStudentListDto.getCloudStudyUseTime()/60);
+                eduOrganStudentListDto.setCloudStudyUseAvgTime(eduOrganStudentListDto.getCloudStudyUseAvgTime()/60);
+            }
+        }
+        pageInfo.setRows(dataList);
+
+        StatDto result = new StatDto();
+        if(queryInfo.getPage()==1){
+            EduOrganStudentDataDto organStudentVipData = new EduOrganStudentDataDto();
+            organStudentVipData.setTotalStudentNum(studentDao.getOrganStudentNum(queryInfo.getOrganId()));
+            organStudentVipData.setVipStudentNum(cloudTeacherDao.getOrganVipStudentNum(queryInfo.getOrganId()));
+//            organStudentVipData.seteVipStudentNum(studentDao.getOrganEVipStudentNum(queryInfo.getOrganId()));
+            organStudentVipData.setCloudStudyUseStudentNum(studentDao.getCloudStudyStudentNum(queryInfo.getOrganId()));
+            organStudentVipData.setCloudStudyLivelyStudentNum(studentDao.getCloudStudyLivelyStudentNum(queryInfo.getOrganId()));
+            organStudentVipData.setNewCloudStudyStudentNum(sysMusicCompareRecordDao.getOrganNewCloudStudyNum(queryInfo.getOrganId()));
+            if(organStudentVipData.getVipStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+                organStudentVipData.setVipStudentDuty(new BigDecimal(organStudentVipData.getVipStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+            }
+            result.setHead(organStudentVipData);
+        }
+        result.setDetail(pageInfo);
+
+        return result;
+    }
+
+    @Override
+    public List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds) {
+        List<Organization> organs = organizationDao.getOrgans(organIds);
+
+        if(CollectionUtils.isEmpty(organs)){
+            return Collections.emptyList();
+        }
+
+        List<Map<Integer, Integer>> organsStudentNumMapList = studentDao.getOrgansStudentNum(organIds);
+        Map<String, Long> organsStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsStudentNumMapList)){
+            organsStudentNumMap = MapUtil.convertIntegerMap(organsStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organsVipStudentNumMapList = cloudTeacherDao.getOrgansVipStudentNum(organIds);
+        Map<String, Long> organsVipStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsVipStudentNumMapList)){
+            organsVipStudentNumMap = MapUtil.convertIntegerMap(organsVipStudentNumMapList);
+        }
+//        List<Map<Integer, Integer>> organsEVipStudentNumMapList = studentDao.getOrgansEVipStudentNum(organIds);
+//        Map<String, Long> organsEVipStudentNumMap = new HashMap<>();
+//        if(!CollectionUtils.isEmpty(organsEVipStudentNumMapList)){
+//            organsEVipStudentNumMap = MapUtil.convertIntegerMap(organsEVipStudentNumMapList);
+//        }
+        List<Map<Integer, Integer>> organCloudStudyStudentNumMapList = studentDao.getOrganCloudStudyStudentNum(organIds);
+        Map<String, Long> organCloudStudyStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organCloudStudyStudentNumMapList)){
+            organCloudStudyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organCloudStudyLivelyStudentNumMapList = studentDao.getOrganCloudStudyLivelyStudentNum(organIds);
+        Map<String, Long> organCloudStudyLivelyStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organCloudStudyLivelyStudentNumMapList)){
+            organCloudStudyLivelyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyLivelyStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organsNewCloudStudyNumMapList = sysMusicCompareRecordDao.getOrgansNewCloudStudyNum(organIds);
+        Map<String, Long> organsNewCloudStudyNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsNewCloudStudyNumMapList)){
+            organsNewCloudStudyNumMap = MapUtil.convertIntegerMap(organsNewCloudStudyNumMapList);
+        }
+
+        List<EduOrganStudentDataDto> result = new ArrayList<>();
+
+        for (Organization organ : organs) {
+            EduOrganStudentDataDto organStudentVipData = new EduOrganStudentDataDto();
+            organStudentVipData.setOrganId(organ.getId());
+            organStudentVipData.setOrganName(organ.getName());
+            if(organsStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setTotalStudentNum(organsStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organsVipStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setVipStudentNum(organsVipStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+//            if(organsEVipStudentNumMap.containsKey(organ.getId().toString())){
+//                organStudentVipData.seteVipStudentNum(organsEVipStudentNumMap.get(organ.getId().toString()).intValue());
+//            }
+            if(organCloudStudyStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setCloudStudyUseStudentNum(organCloudStudyStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organCloudStudyLivelyStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setCloudStudyLivelyStudentNum(organCloudStudyLivelyStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organStudentVipData.getVipStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+                organStudentVipData.setVipStudentDuty(new BigDecimal(organStudentVipData.getVipStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+            }
+            if(organStudentVipData.getCloudStudyUseStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+                organStudentVipData.setCloudStudyUseStudentDuty(new BigDecimal(organStudentVipData.getCloudStudyUseStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+            }
+            if(organsNewCloudStudyNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setNewCloudStudyStudentNum(organsNewCloudStudyNumMap.get(organ.getId().toString()).intValue());
+            }
+            result.add(organStudentVipData);
+        }
+        return result;
+    }
+
+    @Override
+    public CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds) {
+        CloudStudyStudentDataDto result = new CloudStudyStudentDataDto();
+        result.setTotalStudentNum(studentDao.getOrgansTotalStudentNum(organIds));
+        result.setVipStudentNum(cloudTeacherDao.getOrgansTotalVipStudentNum(organIds));
+        result.seteVipStudentNum(studentDao.getOrgansTotalEVipStudentNum(organIds));
+        result.setCloudStudyUseStudentNum(studentDao.getOrgansTotalCloudStudyStudentNum(organIds));
+        result.setCloudStudyTodayUseStudentNum(studentDao.getOrgansTodayTotalCloudStudyStudentNum(organIds));
+        result.setCloudStudyLivelyStudentNum(studentDao.getOrganTotalCloudStudyLivelyStudentNum(organIds));
+        result.setNewCloudStudyStudentNum(sysMusicCompareRecordDao.getOrgansTotalNewCloudStudyNum(organIds));
+        if(result.getVipStudentNum()>0&&result.getTotalStudentNum()>0){
+            result.setVipStudentDuty(new BigDecimal(result.getVipStudentNum()).divide(new BigDecimal(result.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+        }
+        return result;
+    }
+
+    @Override
+    public void cleanStudentCloudStudySequenceDays() {
+        studentDao.cleanStudentCloudStudySequenceDays();
+    }
 }

+ 23 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java

@@ -117,10 +117,24 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         SubjectChange subjectChange = subjectChangeDao.get(id);
         if (isRepay) {
             StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.get(subjectChange.getOrderId().longValue());
-            studentPaymentOrder.setStatus(DealStatusEnum.CLOSE);
-            studentPaymentOrder.setUpdateTime(date);
-            studentPaymentOrderService.update(studentPaymentOrder);
-            subjectChange.setStatus(SubjectChangeStatusEnum.WAIT_PAY);
+            
+            if(studentPaymentOrder != null && studentPaymentOrder.getStatus() == DealStatusEnum.ING){
+                
+                // 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(studentPaymentOrder.getPaymentChannel(), studentPaymentOrder.getOrderNo(), studentPaymentOrder.getTransNo());
+                if(payStatus != PayStatus.FAILED){
+                	if(payStatus == PayStatus.SUCCESSED){
+                		throw new BizException("订单已支付成功,请勿重复支付");
+                	}else if(payStatus == PayStatus.PAYING){
+                		throw new BizException("订单还在交易中,请稍后重试");
+                	}
+                }
+                
+                studentPaymentOrder.setStatus(DealStatusEnum.CLOSE);
+                studentPaymentOrder.setUpdateTime(date);
+                studentPaymentOrderService.update(studentPaymentOrder);
+                subjectChange.setStatus(SubjectChangeStatusEnum.WAIT_PAY);
+            }
         }
 
         if (subjectChange.getStatus().equals(SubjectChangeStatusEnum.CANCELED)) {
@@ -237,6 +251,11 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
             throw new BizException("已有未支付的声部更改,请勿重复创建");
         }
         
+        studentWaitPay = subjectChangeDao.getStudentLastChange(subjectChange.getStudentId(), musicGroupId);
+        if (studentWaitPay != null) {
+            throw new BizException("声部更换只能操作一次,请勿重复操作");
+        }
+        
         Set<String> musicGroupIds = new HashSet<String>();
         musicGroupIds.add(musicGroupId);
         

+ 138 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -2,20 +2,28 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dto.SoundCompareHelper;
-import com.ym.mec.common.dal.BaseDAO;
-import org.springframework.beans.factory.annotation.Autowired;
-import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.dal.enums.FeatureType;
+import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
-import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
-import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.Map;
-import java.util.Objects;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysMusicCompareRecord>  implements SysMusicCompareRecordService {
@@ -24,6 +32,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	private SysMusicCompareRecordDao sysMusicCompareRecordDao;
 	@Autowired
 	private TeacherDao teacherDao;
+	@Autowired
+	private StudentDao studentDao;
 
 	@Override
 	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
@@ -31,6 +41,12 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	}
 
 	@Override
+	public long insert(SysMusicCompareRecord bean) {
+		studentDao.addStudentCloudStudySequenceDays(bean.getUserId());
+		return super.insert(bean);
+	}
+
+	@Override
 	public void saveMusicCompareData(String phone, SoundCompareHelper soundCompareInfo) {
 		SysUser user = teacherDao.getUserWithPhone(phone);
 		if(Objects.isNull(user)){
@@ -39,6 +55,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		SysMusicCompareRecord sysMusicCompareRecord = new SysMusicCompareRecord();
 		sysMusicCompareRecord.setUserId(user.getId());
 		sysMusicCompareRecord.setSysMusicScoreId(soundCompareInfo.getMusicScoreId());
+		sysMusicCompareRecord.setBehaviorId(soundCompareInfo.getBehaviorId());
 		sysMusicCompareRecord.setScoreData(JSON.toJSONString(soundCompareInfo.getUserMeasureScoreMap()));
 		if (Objects.nonNull(soundCompareInfo.getUserMeasureScoreMap()) && soundCompareInfo.getUserMeasureScoreMap().containsKey(-1)){
 			Map<String, Object> finalScore = soundCompareInfo.getUserMeasureScoreMap().get(-1);
@@ -50,11 +67,120 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		sysMusicCompareRecord.setRecordFilePath(soundCompareInfo.getRecordFilePath());
 		sysMusicCompareRecord.setDeviceType(soundCompareInfo.getDeviceType());
 		sysMusicCompareRecord.setClientId(soundCompareInfo.getClientId());
-		try {
-			sysMusicCompareRecord.setPlayTime(soundCompareInfo.getAccessFile().length()/(SoundCompareHandler.soundCompareConfig.audioFormat.getFrameSize()*SoundCompareHandler.soundCompareConfig.audioFormat.getFrameRate()));
-		} catch (IOException e) {
-			e.printStackTrace();
+		if(Objects.nonNull(soundCompareInfo.getFile())){
+			sysMusicCompareRecord.setPlayTime(soundCompareInfo.getFile().length()/(SoundCompareHandler.soundCompareConfig.audioFormat.getFrameSize()*SoundCompareHandler.soundCompareConfig.audioFormat.getFrameRate()));
 		}
+		sysMusicCompareRecord.setFeature(FeatureType.CLOUD_STUDY_EVALUATION);
 		sysMusicCompareRecordDao.insert(sysMusicCompareRecord);
+		studentDao.addStudentCloudStudySequenceDays(user.getId());
+	}
+
+	@Override
+	public StatDto rankingList(Integer headUserId, String startDate, String endDate) {
+		SysUser user = teacherDao.getUser(headUserId);
+		StatDto result = new StatDto();
+		MusicCompareRankingDto head = new MusicCompareRankingDto();
+		head.setUserId(headUserId);
+		List<MusicCompareRankingDto> userTrainStat = sysMusicCompareRecordDao.getUserTrainStat(startDate, endDate);
+		List<MusicCompareRankingDto> detail = new ArrayList<>();
+		userTrainStat.sort(Comparator.comparing(m->m.getTrainDays()+m.getTrainNum()+m.getTrainTime()));
+		for (int i = 0; i < userTrainStat.size(); i++) {
+			userTrainStat.get(i).setRankNum(userTrainStat.size()-i);
+			userTrainStat.get(i).setTrainTime(userTrainStat.get(i).getTrainTime()/60);
+			if(userTrainStat.get(i).getUserId().equals(headUserId)){
+				head = userTrainStat.get(i);
+			}
+			if(userTrainStat.get(i).getRankNum()<=10){
+				detail.add(userTrainStat.get(i));
+			}
+		}
+		if(Objects.isNull(head.getRankNum())&&Objects.nonNull(user)){
+			head.setAvatar(user.getAvatar());
+			head.setStudentName(user.getUsername());
+		}
+		result.setHead(head);
+		detail.sort(Comparator.comparing(MusicCompareRankingDto::getRankNum).thenComparing(MusicCompareRankingDto::getUserId));
+		result.setDetail(detail);
+		return result;
+	}
+
+	@Override
+	public Map<String, Object> studentTrainData(SysMusicCompareRecordQueryInfo queryInfo) {
+		StudentTrainOverviewDto userTrainOverView = new StudentTrainOverviewDto();
+
+		List<StudentTrainChartDto> userTrainChartData = new ArrayList<>();
+		if(queryInfo.getPage()==1){
+			userTrainOverView = sysMusicCompareRecordDao.getUserTrainOverView(queryInfo.getUserId());
+			userTrainChartData = sysMusicCompareRecordDao.getUserTrainChartData(queryInfo.getUserId(), queryInfo.getStartTime(), queryInfo.getEndTime());
+		}
+
+		if(CollectionUtils.isEmpty(userTrainChartData)||userTrainChartData.size()!=7){
+			Set<LocalDate> trainDates = userTrainChartData.stream().map(StudentTrainChartDto::getTrainDate).collect(Collectors.toSet());
+			LocalDate startLocalDate = LocalDate.parse(queryInfo.getStartTime(), DateUtil.dateFormatter);
+			for (int i = 1; i <= 7; i++) {
+				if(!trainDates.contains(startLocalDate)){
+					userTrainChartData.add(new StudentTrainChartDto(0, 0, startLocalDate));
+				}
+				startLocalDate=startLocalDate.plusDays(1);
+			}
+		}
+
+		PageInfo<SysMusicCompareRecord> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<SysMusicCompareRecord> dataList = null;
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = this.getDAO().queryPage(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		Map<String, Object> result = new HashMap<>();
+		result.put("userTrainOverView",userTrainOverView);
+		result.put("userTrainChartData",userTrainChartData);
+		result.put("detail",pageInfo);
+		return result;
+	}
+
+	@Override
+	public PageInfo<MusicCompareRankingDto> queryMusicGroupStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo) {
+		PageInfo<MusicCompareRankingDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<MusicCompareRankingDto> dataList = new ArrayList<>();
+		int count = sysMusicCompareRecordDao.countMusicGroupStudentTrainData(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList =sysMusicCompareRecordDao.queryMusicGroupStudentTrainData(params);
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	public PageInfo<SysMusicCompareRecord> queryStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo) {
+		PageInfo<SysMusicCompareRecord> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<SysMusicCompareRecord> dataList = null;
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = this.getDAO().queryPage(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
 	}
 }

+ 23 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java

@@ -16,7 +16,10 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.page.*;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
@@ -41,15 +44,6 @@ import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.ImUserFriendDto;
-import com.ym.mec.biz.dal.dto.MusicGroupStudentApplyDto;
-import com.ym.mec.biz.dal.dto.MusicGroupTeacherAttendanceDto;
-import com.ym.mec.biz.dal.dto.MusicGroupTeachersDto;
-import com.ym.mec.biz.dal.dto.TeacherBasicDto;
-import com.ym.mec.biz.dal.dto.TeacherCloseDto;
-import com.ym.mec.biz.dal.dto.TeacherDefaultSalaryDto;
-import com.ym.mec.biz.dal.dto.TeacherExercisesServiceDto;
 import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.ImUserFriend;
 import com.ym.mec.biz.dal.entity.MusicGroup;
@@ -60,12 +54,6 @@ import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.page.MusicGroupTeacherAttendanceQueryInfo;
-import com.ym.mec.biz.dal.page.MusicGroupTeachersQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherNameQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherQueryInfo;
-import com.ym.mec.biz.dal.page.queryMusicGroupStudentQueryInfo;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.common.constant.CommonConstants;
@@ -773,4 +761,24 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 		return teacherDao.queryAllIds();
 	}
 
+	@Override
+	public PageInfo<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverView(TeacherServeQueryInfo queryInfo) {
+		PageInfo<TeacherMusicStudentOverViewDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<TeacherMusicStudentOverViewDto> dataList = null;
+		int count = teacherDao.countTeacherMusics(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			List<String> musicGroupIds = teacherDao.queryTeacherMusicIds(params);
+			dataList = musicGroupDao.queryTeacherMusicStudentOverView(musicGroupIds);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
 }

+ 37 - 1
mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml

@@ -79,4 +79,40 @@
         FROM cloud_teacher
         WHERE student_id_ = #{studentId}
     </select>
-</mapper>
+
+    <select id="getOrganVipStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT cto.student_id_)
+        FROM cloud_teacher_order cto
+            LEFT JOIN sys_user su ON cto.student_id_=su.id_
+        WHERE su.del_flag_=0 AND cto.status_ IN (1,2) AND su.organ_id_=#{organId}
+    </select>
+
+    <select id="getOrgansTotalVipStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT cto.student_id_)
+        FROM cloud_teacher_order cto
+                 LEFT JOIN sys_user su ON cto.student_id_=su.id_
+        WHERE su.del_flag_=0 AND cto.status_ IN (1,2)
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="getOrgansVipStudentNum" resultType="map">
+        SELECT
+            su.organ_id_ 'key',
+            COUNT(DISTINCT cto.student_id_) 'value'
+        FROM cloud_teacher_order cto
+                 LEFT JOIN sys_user su ON cto.student_id_=su.id_
+        WHERE su.del_flag_=0 AND cto.status_ IN (1,2)
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+</mapper>

+ 15 - 3
mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml

@@ -22,7 +22,7 @@
         <result column="update_time_" property="updateTime"/>
         <result column="music_group_id_" property="musicGroupId"/>
     </resultMap>
-
+    
     <resultMap type="com.ym.mec.biz.dal.dto.CloudTeacherOrderDto" id="CloudTeacherOrderDto">
     	<id column="id_" property="cloudTeacherOrder.id"/>
         <result column="organ_id_" property="cloudTeacherOrder.organId"/>
@@ -39,6 +39,7 @@
         <result column="trans_status_" property="studentPaymentOrder.status"/>
         <result column="expect_amount_" property="studentPaymentOrder.expectAmount"/>
         <result column="pay_time_" property="studentPaymentOrder.payTime"/>
+        <result column="order_create_time_" property="studentPaymentOrder.createTime"/>
         <result column="name_" property="memberRankSetting.name"/>
         <result column="icon_" property="memberRankSetting.icon"/>
         <result column="music_group_id_" property="studentPaymentOrder.musicGroupId"/>
@@ -121,7 +122,7 @@
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="CloudTeacherOrderDto" parameterType="map">
-        SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,spo.pay_time_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto
+        SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,spo.pay_time_,spo.create_time_ order_create_time_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto
         left join student_payment_order spo on cto.order_id_ = spo.id_
         left join member_rank_setting mrs on mrs.id_ = cto.level_
         where spo.type_ = 'MEMBER'
@@ -186,11 +187,22 @@
         SELECT cto.* FROM cloud_teacher_order cto
         WHERE order_id_ = #{orderId}
     </select>
-
+    
     <select id="queryOrderInfoByOrderId" resultMap="CloudTeacherOrderDto">
         SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto
        left join student_payment_order spo on cto.order_id_ = spo.id_
        left join member_rank_setting mrs on mrs.id_ = cto.level_
         where spo.type_ = 'MEMBER' and order_id_ = #{orderId}
     </select>
+    <select id="queryNoStartByUserIds" resultType="java.util.Map">
+        SELECT student_id_ 'key',create_time_ 'value' FROM cloud_teacher_order
+        WHERE status_ = 1
+        <if test="userIds != null and userIds.size > 0">
+            AND student_id_ IN
+            <foreach collection="userIds" separator="," item="userId" open="(" close=")">
+                #{userId}
+            </foreach>
+        </if>
+        GROUP BY student_id_
+    </select>
 </mapper>

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

@@ -765,4 +765,52 @@
 		AND vg.group_status_ IN (0,1,2)
 		ORDER BY vg.create_time_ DESC LIMIT 1
 	</select>
+
+    <select id="getHasVipCourseStudentIds" resultType="map">
+		SELECT cssp.user_id_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+		WHERE cssp.group_type_='VIP' AND cs.del_flag_=0
+		<if test="studentIds!=null and studentIds.size()>0">
+			AND cssp.user_id_ IN
+			<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+				#{studentId}
+			</foreach>
+		</if>
+	</select>
+
+	<select id="getHasVPCourseStudentNum" 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
+			cssp.group_type_ IN ('VIP', 'PRACTICE')
+			AND cs.status_='NOT_START'
+			AND su.del_flag_ = 0
+			AND su.organ_id_ = #{organId}
+	</select>
+
+    <select id="getOrganHasVPCourseStudentNum" resultType="map">
+		SELECT
+			su.organ_id_ 'key',
+			COUNT( DISTINCT cssp.user_id_ ) 'value'
+		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
+			cssp.group_type_ IN ('VIP', 'PRACTICE')
+			  AND cs.status_='NOT_START'
+			  AND su.del_flag_ = 0
+			<if test="studentIds!=null and studentIds.size()>0">
+				AND su.organ_id_ IN
+				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+					#{organId}
+				</foreach>
+			</if>
+		GROUP BY
+			su.organ_id_
+	</select>
 </mapper>

+ 8 - 3
mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -23,6 +23,7 @@
         <result column="demission_date_" property="demissionDate"/>
         <result column="contact_address_" property="contactAddress"/>
         <result column="postal_code_" property="postalCode"/>
+        <result column="dept_id_" property="deptId"/>
         <result column="dept_ids_" property="deptIds"/>
         <result column="post_ids_" property="postIds"/>
         <result column="post_dept_ids_" property="postDeptIds"/>
@@ -75,9 +76,9 @@
         -->
         INSERT INTO employee
         (user_id_,organ_id_list_,job_nature_,is_probation_period_,education_background_,graduate_school_,technical_titles_,
-        entry_date_,certificate_type_,certificate_num_,update_time_,create_time_,introduction_,demission_date_,contact_address_,postal_code_,dept_ids_,post_ids_,post_dept_ids_)
+        entry_date_,certificate_type_,certificate_num_,update_time_,create_time_,introduction_,demission_date_,contact_address_,postal_code_,dept_id_,dept_ids_,post_ids_,post_dept_ids_)
         VALUES(#{userId},#{organIdList},#{jobNature},#{isProbationPeriod},#{educationBackground},#{graduateSchool},
-        #{technicalTitles},#{entryDate},#{certificateType},#{certificateNum},now(),now(),#{introduction},#{demissionDate},#{contactAddress},#{postalCode},#{deptIds},#{postIds},#{postDeptIds})
+        #{technicalTitles},#{entryDate},#{certificateType},#{certificateNum},now(),now(),#{introduction},#{demissionDate},#{contactAddress},#{postalCode},#{deptId},#{deptIds},#{postIds},#{postDeptIds})
     </insert>
     <insert id="batchAddEmployeeRole">
         INSERT INTO sys_user_role(user_id_,role_id_) values
@@ -136,6 +137,9 @@
             <if test="demissionDate != null">
                 demission_date_ = #{demissionDate},
             </if>
+            <if test="deptId != null">
+                dept_id_ = #{deptId},
+            </if>
             <if test="deptIds != null">
                 dept_ids_ = #{deptIds},
             </if>
@@ -201,6 +205,7 @@
         <result property="contactAddress" column="contact_address_"/>
         <result property="postalCode" column="postal_code_"/>
         <result property="organIdStr" column="organ_id_str_"/>
+        <result property="deptId" column="dept_id_"/>
         <result property="deptIds" column="dept_ids_"/>
         <result property="postIds" column="post_ids_"/>
         <result property="postDeptIds" column="post_dept_ids_"/>
@@ -214,7 +219,7 @@
     <select id="queryEmployByOrganId" resultMap="EmployeeDto">
         SELECT ue.*,ue.organ_id_ organ_id_str_,sr.role_name_,sr.id_ role_id_
         FROM (SELECT e.user_id_,su.real_name_,su.gender_,su.phone_,su.user_type_,e.job_nature_,su.lock_flag_,
-        e.entry_date_,e.demission_date_,e.organ_id_list_ organ_id_,e.create_time_,e.contact_address_,e.postal_code_,e.dept_ids_,e.post_ids_,e.post_dept_ids_
+        e.entry_date_,e.demission_date_,e.organ_id_list_ organ_id_,e.create_time_,e.contact_address_,e.postal_code_,e.dept_id_,e.dept_ids_,e.post_ids_,e.post_dept_ids_
         FROM employee e
         LEFT JOIN sys_user su ON e.user_id_ = su.id_
         <if test="roleId != null">

+ 25 - 0
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -1643,4 +1643,29 @@
 		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m') HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_) ORDER BY cs.class_date_ DESC)c
 		GROUP BY c.user_id_
 	</select>
+
+	<select id="getOrgansStudentNumData" resultMap="IndexBaseMonthData">
+		SELECT
+		su.organ_id_,
+		#{dayStr} month_,
+		COUNT( DISTINCT s.user_id_ ) total_num_,
+		COUNT( DISTINCT s.user_id_ ) activate_num_,
+		COUNT( DISTINCT s.user_id_ ) percent_
+		FROM
+		sys_user su
+		LEFT JOIN course_schedule_student_payment s ON su.id_=s.user_id_
+		LEFT JOIN course_schedule_student_payment cssp1 ON s.user_id_=cssp1.user_id_ AND cssp1.create_time_&lt;#{dayStr}
+		LEFT JOIN course_schedule m ON s.course_schedule_id_=m.id_
+		WHERE
+		m.del_flag_ = 0
+		AND (m.is_lock_ = 0 OR m.is_lock_ IS NULL)
+		AND cssp1.id_ IS NULL
+		AND su.organ_id_ IS NOT NULL
+		AND m.group_type_ IN ('VIP', 'PRACTICE')
+		<if test="dayStr!=null and dayStr!=''">
+			AND DATE_FORMAT(s.create_time_, '%Y-%m-%d') = #{dayStr}
+		</if>
+		GROUP BY su.organ_id_
+		ORDER BY su.organ_id_;
+	</select>
 </mapper>

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

@@ -946,4 +946,23 @@
     <update id="updateIsShowRecordOfStudent" parameterType="map">
     	update music_group set is_show_record_of_student_ = #{isShowRecordOfStudent},update_time_ = now() where id_ = #{musicGroupId}
     </update>
+
+    <select id="queryTeacherMusicStudentOverView"
+            resultType="com.ym.mec.biz.dal.dto.TeacherMusicStudentOverViewDto">
+        SELECT
+            sr.music_group_id_ musicGroupId,
+            mg.name_ musicGroupName,
+            COUNT(sr.user_id_) normalStudentNum,
+            SUM(CASE WHEN stu.member_rank_setting_id_ IS NULL THEN 0 ELSE 1 END) vipStudentNum
+        FROM student_registration sr
+                 LEFT JOIN student stu ON sr.user_id_=stu.user_id_
+                 LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+        WHERE sr.music_group_id_ IN
+         <foreach collection="musicGroupIds" item="musicGroupId" open="(" close=")" separator=",">
+             #{musicGroupId}
+         </foreach>
+         AND sr.music_group_status_='NORMAL'
+        GROUP BY sr.music_group_id_
+        ORDER BY mg.create_time_ DESC, mg.id_
+    </select>
 </mapper>

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml

@@ -148,6 +148,17 @@
         </foreach>
     </select>
 
+    <select id="getOrgans" resultMap="Organization">
+        SELECT * FROM organization
+        WHERE 1=1
+         <if test="organIds!=null and organIds.size()>0">
+             AND id_ IN
+             <foreach collection="organIds" item="organId" separator="," open="(" close=")">
+                 #{organId}
+             </foreach>
+         </if>
+    </select>
+
     <select id="getActivityOrgans" resultMap="Organization">
         SELECT o.* FROM practice_group_sell_price pgsp
         LEFT JOIN organization o ON pgsp.organ_id_=o.id_

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

@@ -762,6 +762,288 @@
         AND DATEDIFF(MAX(cto.end_time_),NOW()) = #{pushMemberRenew}
     </select>
 
+    <select id="getOrganStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT user_id_)
+        FROM ((SELECT sr.user_id_
+               FROM student_registration sr
+                        LEFT JOIN sys_user su ON sr.user_id_=su.id_
+               WHERE su.del_flag_=0
+                 AND sr.music_group_status_='NORMAL'
+                 AND su.organ_id_ = #{organId})
+              UNION ALL
+              (SELECT
+                   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
+                   cssp.group_type_ IN ('VIP', 'PRACTICE')
+                 AND cs.status_='NOT_START'
+                 AND su.del_flag_ = 0
+                 AND su.organ_id_ = #{organId})) t
+    </select>
+
+    <select id="getOrgansTotalStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT user_id_)
+        FROM ((SELECT sr.user_id_
+               FROM student_registration sr
+                        LEFT JOIN sys_user su ON sr.user_id_=su.id_
+               WHERE su.del_flag_=0
+                 AND sr.music_group_status_='NORMAL'
+                <if test="organIds!=null and organIds.size()>0">
+                    AND su.organ_id_ IN
+                    <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                        #{organId}
+                    </foreach>
+                </if>)
+              UNION ALL
+              (SELECT
+                   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
+                   cssp.group_type_ IN ('VIP', 'PRACTICE')
+                 AND cs.status_='NOT_START'
+                 AND su.del_flag_ = 0
+                <if test="organIds!=null and organIds.size()>0">
+                    AND su.organ_id_ IN
+                    <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                        #{organId}
+                    </foreach>
+                </if>)) t
+    </select>
+
+    <select id="getOrgansStudentNum" resultType="map">
+        SELECT t.organ_id_ 'key',COUNT(DISTINCT user_id_) 'value'
+        FROM ((SELECT su.organ_id_,sr.user_id_
+        FROM student_registration sr
+        LEFT JOIN sys_user su ON sr.user_id_=su.id_
+        WHERE su.del_flag_=0
+        AND sr.music_group_status_='NORMAL')
+        UNION ALL
+        (SELECT
+        su.organ_id_,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
+        cssp.group_type_ IN ('VIP', 'PRACTICE')
+        AND cs.status_='NOT_START'
+        AND su.del_flag_ = 0)) t
+        WHERE 1=1
+        <if test="organIds!=null and organIds.size()>0">
+            AND t.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY t.organ_id_
+    </select>
+
+    <select id="getCloudStudyStudentNum" resultType="int">
+        SELECT
+            COUNT(DISTINCT smcr.user_id_)
+        FROM sys_music_compare_record smcr
+             LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+             LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+        WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL AND su.organ_id_=#{organId};
+    </select>
+
+    <select id="getOrgansTotalCloudStudyStudentNum" resultType="int">
+        SELECT
+            COUNT(DISTINCT smcr.user_id_)
+        FROM sys_music_compare_record smcr
+                 LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+                 LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+        WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="getOrgansTodayTotalCloudStudyStudentNum" resultType="int">
+        SELECT
+        COUNT(DISTINCT smcr.user_id_)
+        FROM sys_music_compare_record smcr
+        LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+        LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+        WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="getOrganCloudStudyStudentNum" resultType="map">
+        SELECT
+            su.organ_id_ 'key',
+            COUNT(DISTINCT smcr.user_id_) 'value'
+        FROM sys_music_compare_record smcr
+                 LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+                 LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+        WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+
+    <select id="getCloudStudyLivelyStudentNum" resultType="int">
+        SELECT COUNT(user_id_)
+        FROM (SELECT
+            smcr.user_id_,
+            COUNT(DISTINCT(CASE WHEN DATEDIFF(NOW(), smcr.create_time_)&lt;=15 THEN DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') ELSE NULL END)) days
+            FROM sys_music_compare_record smcr
+            LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+            LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+            WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL AND su.organ_id_=#{organId}
+            GROUP BY smcr.user_id_) t WHERE t.days>=5
+    </select>
+
+    <select id="getOrganTotalCloudStudyLivelyStudentNum" resultType="int">
+        SELECT COUNT(user_id_)
+        FROM (SELECT
+                  smcr.user_id_,
+                  COUNT(DISTINCT(CASE WHEN DATEDIFF(NOW(), smcr.create_time_)&lt;=15 THEN DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') ELSE NULL END)) days
+              FROM sys_music_compare_record smcr
+                       LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+                       LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+              WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+                <if test="organIds!=null and organIds.size()>0">
+                    AND su.organ_id_ IN
+                    <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                        #{organId}
+                    </foreach>
+                </if>
+              GROUP BY smcr.user_id_) t WHERE t.days>=5
+    </select>
+
+    <select id="getOrganCloudStudyLivelyStudentNum" resultType="map">
+        SELECT
+               t.organ_id_ 'key',
+               COUNT(user_id_) 'value'
+        FROM (SELECT
+                su.organ_id_,
+                  smcr.user_id_,
+                  COUNT(DISTINCT(CASE WHEN DATEDIFF(NOW(), smcr.create_time_)&lt;=15 THEN DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') ELSE NULL END)) days
+              FROM sys_music_compare_record smcr
+                       LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+                       LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+              WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+                <if test="organIds!=null and organIds.size()>0">
+                    AND su.organ_id_ IN
+                    <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                        #{organId}
+                    </foreach>
+                </if>
+              GROUP BY smcr.user_id_) t WHERE t.days>=5
+        GROUP BY t.organ_id_
+    </select>
+
+    <sql id="queryCloudStudyStudentDataCondition">
+        <where>
+            su.del_flag_=0
+            <if test="organId!=null">
+                AND su.organ_id_=#{organId}
+            </if>
+            <if test="search!=null and search!=''">
+                AND (stu.user_id_=#{search} OR su.username_ LIKE CONCAT('%', #{search}, '%'))
+            </if>
+        </where>
+    </sql>
+
+    <select id="queryCloudStudyStudentData" resultType="com.ym.mec.biz.dal.dto.EduOrganStudentListDto">
+        SELECT
+            stu.user_id_ studentId,
+            su.username_ studentName,
+            stu.teacher_id_ teacherId,
+            tea.real_name_ teacherName,
+            sub.name_	subjectName,
+            stu.cloud_study_sequence_days_ cloudStudyRunningDays,
+            COUNT(DISTINCT smcr.behavior_id_) cloudStudyUseNum,
+            SUM(CASE WHEN smcr.play_time_ IS NULL THEN 0 ELSE play_time_ END) cloudStudyUseTime,
+            DATE_FORMAT(stu.membership_end_time_, '%Y-%m-%d') membershipEndTime
+        FROM student stu
+            LEFT JOIN sys_user su ON stu.user_id_=su.id_
+            LEFT JOIN sys_user tea ON stu.teacher_id_=tea.id_
+            LEFT JOIN `subject` sub ON stu.subject_id_list_ = sub.id_
+            LEFT JOIN sys_music_compare_record smcr ON stu.user_id_ = smcr.user_id_
+        <include refid="queryCloudStudyStudentDataCondition" />
+        GROUP BY stu.user_id_
+        <trim prefix="ORDER BY " suffixOverrides=",">
+            <if test="cloudStudyUseTime==null and cloudStudyRunningDays==null">
+                stu.user_id_,
+            </if>
+            <if test="cloudStudyUseTime!=null">
+                cloudStudyUseTime ${cloudStudyUseTime},
+            </if>
+            <if test="cloudStudyRunningDays!=null">
+                cloudStudyRunningDays ${cloudStudyRunningDays}
+            </if>
+        </trim>
+        <include refid="global.limit"></include>
+    </select>
+    <select id="countCloudStudyStudentData" resultType="int">
+        SELECT
+            COUNT(stu.user_id_)
+        FROM student stu
+        LEFT JOIN sys_user su ON stu.user_id_=su.id_
+        <include refid="queryCloudStudyStudentDataCondition" />
+    </select>
+
+    <select id="getOrganEVipStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT stu.user_id_)
+        FROM student stu
+             LEFT JOIN cloud_teacher_order cto ON stu.user_id_=cto.student_id_
+             LEFT JOIN sys_user su ON su.id_=stu.user_id_
+        WHERE su.del_flag_=0 AND su.organ_id_=#{organId} AND stu.experience_member_rank_setting_id_ IS NOT NULL
+          AND NOT EXISTS (SELECT student_id_ FROM cloud_teacher_order WHERE student_id_=stu.user_id_ AND status_ IN (1,2))
+    </select>
+
+    <select id="getOrgansTotalEVipStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT stu.user_id_)
+        FROM student stu
+                 LEFT JOIN cloud_teacher_order cto ON stu.user_id_=cto.student_id_
+                 LEFT JOIN sys_user su ON su.id_=stu.user_id_
+        WHERE su.del_flag_=0 AND stu.experience_member_rank_setting_id_ IS NOT NULL AND (cto.id_ IS NULL OR cto.status_ NOT IN (1, 2))
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="getOrgansEVipStudentNum" resultType="map">
+        SELECT
+            su.organ_id_ 'key',
+            COUNT(DISTINCT stu.user_id_) 'value'
+        FROM student stu
+                 LEFT JOIN cloud_teacher_order cto ON stu.user_id_=cto.student_id_
+                 LEFT JOIN sys_user su ON su.id_=stu.user_id_
+        WHERE su.del_flag_=0 AND stu.experience_member_rank_setting_id_ IS NOT NULL
+        AND NOT IN (SELECT DISTINCT student_id_ FROM cloud_teacher_order WHERE status_ IN (1,2))
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1
         WHERE current_grade_num_>=1
@@ -784,4 +1066,16 @@
         UPDATE student SET member_rank_setting_id_ = NULL,membership_start_time_ = NULL,membership_end_time_ = NULL
         WHERE user_id_ = #{userId}
     </update>
+
+    <update id="addStudentCloudStudySequenceDays">
+        UPDATE student SET cloud_study_sequence_days_=cloud_study_sequence_days_+1,cloud_study_use_last_day_=curdate() WHERE user_id_=#{userId} AND (cloud_study_use_last_day_ IS NULL OR cloud_study_use_last_day_=date_sub(curdate(), interval 1 day))
+    </update>
+
+    <update id="updateStudentsCloudStudySequenceDays">
+        UPDATE student SET cloud_study_sequence_days_=#{days} WHERE user_id_=#{userId}
+    </update>
+
+    <update id="cleanStudentCloudStudySequenceDays">
+        UPDATE student SET cloud_study_sequence_days_=0,cloud_study_use_last_day_=date_sub(curdate(), interval 1 day) WHERE cloud_study_use_last_day_&lt;date_sub(curdate(), interval 1 day)
+    </update>
 </mapper>

+ 7 - 3
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -984,12 +984,16 @@
     </select>
 
     <select id="getMoneyInMusicApply" resultMap="Mapper">
-        SELECT sum(spo.expect_amount_) value_,spo.music_group_id_ key_ 
-        FROM student_payment_order spo WHERE spo.music_group_id_ IN
+        SELECT spo.music_group_id_ key_, sum(case when a.id_ is null then spo.expect_amount_ else (spo.expect_amount_ + a.goods_margin_) end) value_ from student_payment_order spo LEFT JOIN
+		(
+		SELECT * FROM subject_change WHERE id_ in
+		(SELECT max(sc.id_) id_ from subject_change sc WHERE sc.status_ = 2 GROUP BY music_group_id_,student_id_ ORDER BY id_ desc)
+		) a on spo.music_group_id_ = a.music_group_id_ and spo.user_id_ = a.student_id_
+		WHERE spo.music_group_id_ IN
         <foreach collection="musicGroupIds" item="musicGroupId" open="(" close=")" separator=",">
             #{musicGroupId}
         </foreach>
         AND spo.type_ = 'APPLY' and spo.status_ = 'SUCCESS'
-        GROUP BY spo.music_group_id_
+		GROUP BY spo.music_group_id_
     </select>
 </mapper>

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

@@ -1674,4 +1674,18 @@
         WHERE sr.membership_end_time_ IS NOT NULL AND DATEDIFF(sr.membership_end_time_,NOW()) + 1 = #{pushMemberRenew}
         GROUP BY sr.music_group_id_
     </select>
+
+    <select id="queryStudentMusicGroupNamesMap" resultType="java.util.Map">
+        SELECT sr.user_id_ 'key',GROUP_CONCAT(mg.name_) 'value'
+        FROM student_registration sr
+             LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+        WHERE 1=1
+        <if test="studentIds!=null and studentIds.size()>0">
+            AND sr.user_id_ IN
+            <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                #{studentId}
+            </foreach>
+        </if>
+        GROUP BY sr.user_id_
+    </select>
 </mapper>

+ 218 - 6
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -10,6 +10,8 @@
 		<result column="id_" property="id" />
 		<result column="user_id_" property="userId" />
 		<result column="sys_music_score_id_" property="sysMusicScoreId" />
+		<result column="sys_music_score_name_" property="sysMusicScoreName" />
+		<result column="behavior_id_" property="behaviorId"/>
 		<result column="score_data_" property="scoreData" />
 		<result column="score_" property="score" />
 		<result column="intonation_" property="intonation" />
@@ -19,6 +21,8 @@
 		<result column="device_type_" property="deviceType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
 		<result column="client_id_" property="clientId" />
 		<result column="play_time_" property="playTime"/>
+		<result column="feature_" property="feature" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="monday_" property="monday"/>
 		<result column="create_time_" property="createTime" />
 	</resultMap>
 
@@ -39,10 +43,12 @@
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</selectKey>
 		-->
-		INSERT INTO sys_music_compare_record (id_,user_id_,sys_music_score_id_,score_data_,score_,intonation_,cadence_,integrity_,
-		                                      record_file_path_,device_type_,client_id_,play_time_,create_time_)
-		VALUES(#{id},#{userId},#{sysMusicScoreId},#{scoreData},#{score},#{intonation},#{cadence},#{integrity},
-		       #{recordFilePath},#{deviceType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{clientId},#{playTime},NOW())
+		INSERT INTO sys_music_compare_record (id_,user_id_,sys_music_score_id_,behavior_id_,score_data_,score_,intonation_,cadence_,integrity_,
+		                                      record_file_path_,device_type_,client_id_,play_time_,monday_,
+											feature_,create_time_)
+		VALUES(#{id},#{userId},#{sysMusicScoreId},#{behaviorId},#{scoreData},#{score},#{intonation},#{cadence},#{integrity},
+		       #{recordFilePath},#{deviceType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{clientId},#{playTime},#{monday},
+		       #{feature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, NOW())
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -81,6 +87,9 @@
 		<if test="playTime != null">
 			play_time_ = #{playTime},
 		</if>
+		<if test="monday != null">
+			monday_ = #{monday},
+		</if>
 	</set> WHERE id_ = #{id}
 	</update>
 
@@ -89,13 +98,216 @@
 		DELETE FROM sys_music_compare_record WHERE id_ = #{id}
 	</delete>
 
+	<sql id="queryCondition">
+		<where>
+			<if test="userId!=null">
+				AND smcr.user_id_=#{userId}
+			</if>
+			<if test="startTime!=null and endTime!=null">
+				AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
+			</if>
+		</where>
+	</sql>
+
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="SysMusicCompareRecord" parameterType="map">
-		SELECT * FROM sys_music_compare_record ORDER BY id_ <include refid="global.limit"/>
+		SELECT
+			smcr.id_, smcr.user_id_, smcr.sys_music_score_id_, smcr.score_, smcr.intonation_, smcr.cadence_,
+		       smcr.integrity_, smcr.record_file_path_, smcr.client_id_, smcr.device_type_, smcr.play_time_,
+		       smcr.monday_, smcr.create_time_,
+			sms.name_ sys_music_score_name_
+		FROM sys_music_compare_record smcr
+		LEFT JOIN sys_music_score sms on smcr.sys_music_score_id_ = sms.id_
+		<include refid="queryCondition"></include>
+		ORDER BY id_ DESC
+		<include refid="global.limit"/>
 	</select>
 
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
-		SELECT COUNT(*) FROM sys_music_compare_record
+		SELECT COUNT(*) FROM sys_music_compare_record smcr
+		<include refid="queryCondition"></include>
+	</select>
+
+    <select id="getUserTrainStat" resultType="com.ym.mec.biz.dal.dto.MusicCompareRankingDto">
+		SELECT
+			smcr.user_id_ userId,
+			su.avatar_ avatar,
+		    su.username_ studentName,
+			COUNT(smcr.id_) trainNum,
+			COUNT(DISTINCT DAY(smcr.create_time_)) trainDays,
+			SUM(smcr.play_time_) trainTime
+		FROM sys_music_compare_record smcr
+				 LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+		WHERE EXISTS (SELECT user_id_ FROM student WHERE user_id_=smcr.user_id_)
+		AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
+		GROUP BY smcr.user_id_
+	</select>
+
+	<select id="getUserTrainOverView" resultType="com.ym.mec.biz.dal.dto.StudentTrainOverviewDto">
+		SELECT
+			COUNT(smcr.id_) trainNum,
+			COUNT(DISTINCT DAY(smcr.create_time_)) trainDays,
+			SUM(smcr.play_time_) trainTime
+		FROM sys_music_compare_record smcr
+		WHERE smcr.user_id_=#{userId}
+		      AND EXISTS (SELECT user_id_ FROM student WHERE user_id_=smcr.user_id_)
+	</select>
+
+	<select id="getUserTrainChartData" resultType="com.ym.mec.biz.dal.dto.StudentTrainChartDto">
+		SELECT
+			DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') trainDate,
+			COUNT(smcr.id_) trainNum,
+			SUM(smcr.play_time_) trainTime
+		FROM sys_music_compare_record smcr
+		WHERE smcr.user_id_=#{userId}
+		  AND EXISTS (SELECT user_id_ FROM student WHERE user_id_=smcr.user_id_)
+		  AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
+		GROUP BY DATE_FORMAT(smcr.create_time_, '%Y-%m-%d')
+		ORDER BY trainDate;
+	</select>
+
+	<sql id="queryMusicGroupStudentTrainDataConditon">
+		<where>
+			sr.music_group_status_='NORMAL' AND stu.user_id_ IS NOT NULL
+			<if test="startTime!=null and endTime!=null">
+				AND DATE_FORMAT( smcr.create_time_, '%Y-%m-%d' ) BETWEEN #{startTime} AND #{endTime}
+			</if>
+			<if test="musicGroupId!=null">
+				AND sr.music_group_id_ = #{musicGroupId}
+			</if>
+			<if test="search!=null">
+				AND (su.username_ LIKE CONCAT('%', #{search}, '%'))
+			</if>
+		</where>
+	</sql>
+
+	<select id="queryMusicGroupStudentTrainData" resultType="com.ym.mec.biz.dal.dto.MusicCompareRankingDto">
+		SELECT
+			smcr.user_id_ userId,
+			su.avatar_ avatar,
+			su.username_ studentName,
+			COUNT( smcr.id_ ) trainNum,
+			COUNT( DISTINCT DAY ( smcr.create_time_ )) trainDays,
+			SUM( smcr.play_time_ ) trainTime,
+			CASE WHEN stu.member_rank_setting_id_ IS NULL THEN 0 ELSE 1 END vipUser
+		FROM
+			sys_music_compare_record smcr
+				LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+				LEFT JOIN student stu ON stu.user_id_ = smcr.user_id_
+				LEFT JOIN student_registration sr ON sr.user_id_=smcr.user_id_
+		<include refid="queryMusicGroupStudentTrainDataConditon"></include>
+		GROUP BY smcr.user_id_
+		<if test="sortField!=null and sortField!=''">
+			<if test="sortField == 'TRAINDAYS'">
+				ORDER BY trainDays
+			</if>
+			<if test="sortField == 'TRAINTIME'">
+				ORDER BY trainTime
+			</if>
+			<if test="sortField == 'TRAINNUM'">
+				ORDER BY trainNum
+			</if>
+		</if>
+		<include refid="global.limit"></include>
+	</select>
+
+	<select id="countMusicGroupStudentTrainData" resultType="int">
+		SELECT
+			COUNT(DISTINCT smcr.user_id_)
+		FROM
+			sys_music_compare_record smcr
+		LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+		LEFT JOIN student stu ON stu.user_id_ = smcr.user_id_
+		LEFT JOIN student_registration sr ON sr.user_id_=smcr.user_id_
+		<include refid="queryMusicGroupStudentTrainDataConditon"></include>
+	</select>
+
+	<select id="queryStudentTrainData" resultType="com.ym.mec.biz.dal.dto.EduOrganStudentListDto">
+		SELECT
+			user_id_ studentId,
+			COUNT(DISTINCT behavior_id_) cloudStudyUseNum,
+			SUM(play_time_) cloudStudyUseTime
+		FROM
+			sys_music_compare_record
+		GROUP BY
+			user_id_
+	</select>
+
+	<select id="getOrganNewCloudStudyNum" resultType="int">
+		SELECT
+			COUNT( DISTINCT user_id_ )
+		FROM
+			(
+				SELECT
+					smcr.user_id_
+				FROM
+					sys_music_compare_record smcr
+						LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+				WHERE
+					su.del_flag_ = 0
+					AND su.organ_id_ = #{organId}
+				GROUP BY
+					user_id_
+				HAVING
+						COUNT(
+								DISTINCT DATE( smcr.create_time_ ))= 1
+				   AND MAX(
+							   DATE( smcr.create_time_ ))= CURDATE()) t
+	</select>
+
+	<select id="getOrgansTotalNewCloudStudyNum" resultType="int">
+		SELECT
+			COUNT( DISTINCT user_id_ )
+		FROM
+			(
+				SELECT
+					smcr.user_id_
+				FROM
+					sys_music_compare_record smcr
+						LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+				WHERE
+					su.del_flag_ = 0
+					<if test="organIds!=null and organIds.size()>0">
+						AND su.organ_id_ IN
+						<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+							#{organId}
+						</foreach>
+					</if>
+				GROUP BY
+					user_id_
+				HAVING
+						COUNT(DISTINCT DATE( smcr.create_time_ ))= 1
+				   AND MAX(DATE( smcr.create_time_ ))= CURDATE()) t
+	</select>
+
+	<select id="getOrgansNewCloudStudyNum" resultType="map">
+		SELECT
+			organ_id_ 'key',
+			COUNT( DISTINCT user_id_ ) 'value'
+		FROM
+			(
+				SELECT
+					su.organ_id_,
+					smcr.user_id_
+				FROM
+					sys_music_compare_record smcr
+						LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+				WHERE
+					su.del_flag_ = 0
+					<if test="organIds!=null and organIds.size()>0">
+						AND su.organ_id_ IN
+						<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+							#{organId}
+						</foreach>
+					</if>
+				GROUP BY
+					user_id_
+				HAVING
+						COUNT(
+								DISTINCT DATE( smcr.create_time_ ))= 1
+				   AND MAX(
+							   DATE( smcr.create_time_ ))= CURDATE()) t
+		GROUP BY t.organ_id_
 	</select>
 </mapper>

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

@@ -173,7 +173,7 @@
     <select id="querySubjectIds" resultMap="com.ym.mec.biz.dal.dao.SubjectDao.Subject">
 		SELECT s.* FROM sys_music_score_accompaniment sesa
 		LEFT JOIN `subject` s ON s.id_ = sesa.subject_id_
-		WHERE sesa.del_flag_ = 0
+		WHERE sesa.del_flag_ = 0 AND sesa.subject_id_ IS NOT NULL
 		GROUP BY sesa.subject_id_
 	</select>
 
@@ -196,7 +196,7 @@
 				AND sesc.parent_id_ = #{parentId}
 			</if>
 			<if test="subjectId != null">
-				AND sesa.subject_id_ = #{subjectId}
+				AND (sesa.subject_id_ = #{subjectId} OR sesa.subject_id_ IS NULL)
 			</if>
 			<if test="isShowFingering != null">
 				AND sesa.is_show_fingering_ = #{isShowFingering}

+ 31 - 4
mec-biz/src/main/resources/config/mybatis/SysSuggestionMapper.xml

@@ -15,6 +15,7 @@
         <result column="username_" property="username"/>
         <result column="create_time_" property="createTime"/>
         <result column="client_type_" property="clientType"/>
+        <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -30,8 +31,8 @@
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysSuggestion" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
-        INSERT INTO sys_suggestion (id_,mobile_no_,title_,content_,user_id_,create_time_,client_type_)
-        VALUES(#{id},#{mobileNo},#{title},#{content},#{userId},now(),#{clientType})
+        INSERT INTO sys_suggestion (id_,mobile_no_,title_,content_,user_id_,create_time_,client_type_,type_)
+        VALUES(#{id},#{mobileNo},#{title},#{content},#{userId},now(),#{clientType},#{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -53,6 +54,9 @@
             <if test="mobileNo != null">
                 mobile_no_ = #{mobileNo},
             </if>
+            <if test="type != null">
+                type_ = #{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>
@@ -62,16 +66,39 @@
 		DELETE FROM sys_suggestion WHERE id_ = #{id} 
 	</delete>
 
+    <sql id="queryCondition">
+        <where>
+            <if test="type!=null">
+                AND ss.type_ = #{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+            <if test="clientType!=null">
+                AND ss.client_type_ = #{clientType}
+            </if>
+            <if test="startTime!=null and startTime!=''">
+                AND DATE_FORMAT(ss.create_time_,'%Y-%m-%d') &gt;= #{startTime}
+            </if>
+            <if test="endTime!=null and endTime!=''">
+                AND DATE_FORMAT(ss.create_time_,'%Y-%m-%d') &lt;= #{endTime}
+            </if>
+            <if test="search!=null and search!=''">
+                AND (su.real_name_ LIKE CONCAT('%', #{search}, '%') OR su.username_ LIKE CONCAT('%', #{search}, '%') OR ss.user_id_=#{search} OR su.phone_=#{search})
+            </if>
+        </where>
+    </sql>
+
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="SysSuggestion" parameterType="map">
-        SELECT ss.*,CASE WHEN su.real_name_ IS NULL THEN su.username_ ELSE su.real_name_ END username_ FROM sys_suggestion ss
+        SELECT ss.*,CASE WHEN ss.client_type_='STUDENT' THEN su.username_ ELSE su.real_name_ END username_ FROM sys_suggestion ss
         LEFT JOIN sys_user su ON su.id_ = ss.user_id_
+        <include refid="queryCondition" />
         ORDER BY ss.id_ DESC
         <include refid="global.limit"/>
     </select>
 
     <!-- 查询当前表的总记录数 -->
     <select id="queryCount" resultType="int">
-		SELECT COUNT(*) FROM sys_suggestion
+		SELECT COUNT(ss.id_) FROM sys_suggestion ss
+        LEFT JOIN sys_user su ON su.id_ = ss.user_id_
+        <include refid="queryCondition" />
 	</select>
 </mapper>

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

@@ -1363,4 +1363,35 @@
     <select id="queryAllIds" resultType="java.lang.Integer">
         SELECT id_ FROM sys_user
     </select>
+
+    <sql id="queryTeacherMusicIdsCondition">
+        <where>
+            cs.del_flag_=0 AND csts.group_type_='MUSIC' AND mg.del_flag_=0 AND mg.status_='PROGRESS'
+            <if test="teacherId!=null">
+                AND csts.user_id_=#{teacherId}
+            </if>
+            <if test="search!=null and search!=''">
+                AND mg.name_ LIKE CONCAT('%', #{search}, '%')
+            </if>
+        </where>
+    </sql>
+
+    <select id="queryTeacherMusicIds" resultType="string">
+        SELECT csts.music_group_id_
+        FROM course_schedule_teacher_salary csts
+             LEFT JOIN course_schedule cs ON csts.course_schedule_id_=cs.id_
+             LEFT JOIN music_group mg ON csts.music_group_id_=mg.id_
+        <include refid="queryTeacherMusicIdsCondition"></include>
+        GROUP BY csts.music_group_id_
+        ORDER BY mg.create_time_ DESC, mg.id_
+        <include refid="global.limit"></include>
+    </select>
+
+    <select id="countTeacherMusics" resultType="int">
+        SELECT COUNT(DISTINCT csts.music_group_id_)
+        FROM course_schedule_teacher_salary csts
+        LEFT JOIN course_schedule cs ON csts.course_schedule_id_=cs.id_
+        LEFT JOIN music_group mg ON csts.music_group_id_=mg.id_
+        <include refid="queryTeacherMusicIdsCondition"></include>
+    </select>
 </mapper>

+ 10 - 0
mec-client-api/src/main/java/com/ym/mec/oa/entity/OAUser.java

@@ -15,6 +15,8 @@ public class OAUser {
 
     private String sex;
 
+    private Integer deptId;
+
     private List<Integer> deptIds;
 
     private List<Integer> postIds;
@@ -92,4 +94,12 @@ public class OAUser {
     public void setSex(String sex) {
         this.sex = sex;
     }
+
+    public Integer getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Integer deptId) {
+        this.deptId = deptId;
+    }
 }

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

@@ -215,4 +215,8 @@ public interface TaskRemoteService {
 	//会员到期后清空会员信息
 	@GetMapping("task/cleanStudentMember")
     void cleanStudentMember();
+
+	/** 清理学员云教练连续使用天数 */
+	@GetMapping("task/cleanStudentCloudStudySequenceDays")
+	void cleanStudentCloudStudySequenceDays();
 }

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

@@ -267,4 +267,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void cleanStudentMember() {
 		logger.error("学员会员到期状态更新");
 	}
+
+	@Override
+	public void cleanStudentCloudStudySequenceDays() {
+		logger.error("清理学员云教练连续使用天数失败");
+	}
 }

+ 54 - 0
mec-student/src/main/java/com/ym/mec/student/controller/CloudStudyController.java

@@ -0,0 +1,54 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+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.Map;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+@Api("云教练")
+@RestController
+@RequestMapping("cloudStudy")
+public class CloudStudyController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation("云教练排行榜")
+    @GetMapping("rankingList")
+    public HttpResponseResult rankingList(String startDate, String endDate){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        return succeed(sysMusicCompareRecordService.rankingList(sysUser.getId(), startDate, endDate));
+    }
+
+    @ApiOperation("学员训练数据统计")
+    @GetMapping("studentTrainData")
+    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        queryInfo.setUserId(sysUser.getId());
+        return succeed(sysMusicCompareRecordService.studentTrainData(queryInfo));
+    }
+
+}

+ 21 - 3
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -45,6 +45,7 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PayStatus;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
 import com.ym.mec.biz.service.MusicGroupService;
 import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
@@ -181,7 +182,8 @@ public class MusicGroupController extends BaseController {
         	//判断是否所有类型都购买完
 			if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
 				if ((typeList.contains(OrderDetailTypeEnum.MUSICAL) || typeList.contains(OrderDetailTypeEnum.ACCESSORIES))
-						&& (typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER) || typeList.contains(OrderDetailTypeEnum.COURSE)
+						&& typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER)
+						&& (typeList.contains(OrderDetailTypeEnum.COURSE)
 								|| typeList.contains(OrderDetailTypeEnum.HIGH_ONLINE_COURSE) || typeList.contains(OrderDetailTypeEnum.SINGLE)
 								|| typeList.contains(OrderDetailTypeEnum.MIX) || typeList.contains(OrderDetailTypeEnum.HIGH)
 								|| typeList.contains(OrderDetailTypeEnum.VIP) || typeList.contains(OrderDetailTypeEnum.DEMO)
@@ -251,6 +253,14 @@ public class MusicGroupController extends BaseController {
             List<StudentPaymentOrder> list = studentPaymentOrderService.queryByCondition(GroupType.MUSIC, calender.getMusicGroupId(), userId, DealStatusEnum.ING,
                     OrderTypeEnum.RENEW);
             if (list.size() > 0) {
+            	StudentPaymentOrder applyOrder = list.get(list.size() - 1);
+            	// 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+                if(payStatus == PayStatus.SUCCESSED){
+            		throw new BizException("订单已支付成功,请勿重复支付");
+            	}else if(payStatus == PayStatus.PAYING){
+            		throw new BizException("订单还在交易中,请稍后重试");
+            	}
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }
         }
@@ -335,8 +345,16 @@ public class MusicGroupController extends BaseController {
             return failed("您已支付成功,请勿重复支付");
         }*/
         //判断用户是否已存在订单
-        StudentPaymentOrder ApplyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
-        if (ApplyOrder != null) {
+        StudentPaymentOrder applyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
+        
+        if (applyOrder != null) {
+        	// 查询订单状态
+            PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+            if(payStatus == PayStatus.SUCCESSED){
+        		throw new BizException("订单已支付成功,请勿重复支付");
+        	}else if(payStatus == PayStatus.PAYING){
+        		throw new BizException("订单还在交易中,请稍后重试");
+        	}
             return failed(HttpStatus.CONTINUE, "您有待支付的订单");
         }
         Map payMap = musicGroupService.pay(registerPayDto);

+ 11 - 0
mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.entity.StudentRepair;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PayStatus;
 import com.ym.mec.biz.dal.page.GoodsCategoryQueryInfo;
 import com.ym.mec.biz.dal.page.GoodsQueryInfo;
 import com.ym.mec.biz.dal.page.GoodsSellQueryInfo;
@@ -17,8 +18,10 @@ 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 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.*;
@@ -58,6 +61,14 @@ public class RepairController extends BaseController {
             List<StudentPaymentOrder> list = studentPaymentOrderService.queryByCondition(GroupType.GOODS_SELL, null, studentGoodsSell.getUserId(), DealStatusEnum.ING,
                     OrderTypeEnum.GOODS_SELL);
             if (list.size() > 0) {
+            	StudentPaymentOrder applyOrder = list.get(list.size() - 1);
+            	// 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+                if(payStatus == PayStatus.SUCCESSED){
+            		throw new BizException("订单已支付成功,请勿重复支付");
+            	}else if(payStatus == PayStatus.PAYING){
+            		throw new BizException("订单还在交易中,请稍后重试");
+            	}
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }
         }

+ 16 - 0
mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java

@@ -7,15 +7,20 @@ import com.ym.mec.biz.dal.dto.ReplacementInstrumentActivityStatDto;
 import com.ym.mec.biz.dal.dto.ReplacementPayDto;
 import com.ym.mec.biz.dal.entity.ReplacementInstrumentActivity;
 import com.ym.mec.biz.dal.entity.ReplacementInstrumentCooperation;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.enums.PayStatus;
 import com.ym.mec.biz.service.ReplacementInstrumentActivityService;
 import com.ym.mec.biz.service.ReplacementInstrumentCooperationService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
@@ -33,6 +38,8 @@ public class ReplacementInstrumentActivityController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private ReplacementInstrumentCooperationService replacementInstrumentCooperationService;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
 
     @ApiOperation(value = "新增调查问卷")
     @PostMapping("/insert")
@@ -162,6 +169,15 @@ public class ReplacementInstrumentActivityController extends BaseController {
         }
         //判断用户是否已存在订单
         if (replacementInstrumentActivity.getPayStatus().equals(1) && !replacementPayDto.getRePay()) {
+        	
+        	StudentPaymentOrder applyOrder = studentPaymentOrderService.getUserReplacementIngOrder(replacementInstrumentActivity.getUserId(), replacementInstrumentActivity.getId());
+        	// 查询订单状态
+            PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+            if(payStatus == PayStatus.SUCCESSED){
+        		throw new BizException("订单已支付成功,请勿重复支付");
+        	}else if(payStatus == PayStatus.PAYING){
+        		throw new BizException("订单还在交易中,请稍后重试");
+        	}
             return failed(HttpStatus.CONTINUE, "您有待支付的订单");
         }
         Map payMap = replacementInstrumentActivityService.pay(replacementPayDto);

+ 32 - 15
mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java

@@ -1,29 +1,35 @@
 package com.ym.mec.student.controller;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+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 com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
 import com.ym.mec.biz.dal.dto.SporadicPayDto;
 import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.PayStatus;
 import com.ym.mec.biz.service.MusicGroupService;
 import com.ym.mec.biz.service.SporadicChargeInfoService;
 import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-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.math.BigDecimal;
-import java.util.HashMap;
-import java.util.Map;
 
 @RequestMapping("sporadicChargeInfo")
 @Api(tags = "零星收费")
@@ -37,6 +43,8 @@ public class SporadicChargeInfoController extends BaseController {
     @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
     @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+    @Autowired
     private MusicGroupService musicGroupService;
 
     @ApiOperation(value = "单查询")
@@ -65,8 +73,17 @@ public class SporadicChargeInfoController extends BaseController {
             sporadicPayDto.setUserId(sysUser.getId());
         }
         if (sporadicPayDto.getIsRepeatPay() == false) {
-            Integer ingOrder = studentPaymentOrderService.findOrderByGroupType(sporadicPayDto.getUserId(), sporadicPayDto.getSporadicId(), "SPORADIC", DealStatusEnum.ING);
-            if (ingOrder != null && ingOrder > 0) {
+        	List<StudentPaymentOrder> studentPaymentOrderList = studentPaymentOrderDao.findPaymentOrderByGroupType(sporadicPayDto.getUserId(), sporadicPayDto.getSporadicId(), "SPORADIC", DealStatusEnum.ING);
+            if (studentPaymentOrderList != null && studentPaymentOrderList.size() > 0) {
+            	StudentPaymentOrder applyOrder = studentPaymentOrderList.get(studentPaymentOrderList.size() - 1);
+            	// 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+                if(payStatus == PayStatus.SUCCESSED){
+            		throw new BizException("订单已支付成功,请勿重复支付");
+            	}else if(payStatus == PayStatus.PAYING){
+            		throw new BizException("订单还在交易中,请稍后重试");
+            	}
+                
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }
         }

+ 5 - 4
mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java

@@ -1,13 +1,11 @@
 package com.ym.mec.student.controller;
 
+import com.ym.mec.biz.dal.enums.SuggestionType;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -121,6 +119,9 @@ public class StudentManageController extends BaseController {
         }
     	sysSuggestion.setClientType("STUDENT");
         sysSuggestion.setUserId(sysUser.getId().longValue());
+        if(StringUtils.isEmpty(sysSuggestion.getMobileNo())){
+            sysSuggestion.setMobileNo(sysUser.getPhone());
+        }
         suggestionService.insert(sysSuggestion);
         return succeed();
     }

+ 12 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentVipGroupController.java

@@ -9,15 +9,19 @@ import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PayStatus;
 import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
 import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.biz.service.SubjectService;
 import com.ym.mec.biz.service.VipGroupCategoryService;
 import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.exception.BizException;
 import com.yonge.log.model.AuditLogAnnotation;
+
 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.*;
@@ -110,6 +114,14 @@ public class StudentVipGroupController extends BaseController {
                             DealStatusEnum.ING,
                             OrderTypeEnum.SMALL_CLASS_TO_BUY);
             if (list.size() > 0) {
+            	StudentPaymentOrder applyOrder = list.get(list.size() - 1);
+            	// 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+                if(payStatus == PayStatus.SUCCESSED){
+            		throw new BizException("订单已支付成功,请勿重复支付");
+            	}else if(payStatus == PayStatus.PAYING){
+            		throw new BizException("订单还在交易中,请稍后重试");
+            	}
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }
         }

+ 17 - 0
mec-student/src/main/java/com/ym/mec/student/controller/SubjectChangeController.java

@@ -1,15 +1,21 @@
 package com.ym.mec.student.controller;
 
 import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SubjectChange;
+import com.ym.mec.biz.dal.enums.PayStatus;
 import com.ym.mec.biz.dal.enums.SubjectChangeStatusEnum;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.biz.service.SubjectChangeService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -30,6 +36,8 @@ public class SubjectChangeController extends BaseController {
     private SubjectChangeService subjectChangeService;
     @Autowired
     private SubjectChangeDao subjectChangeDao;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
 
 
     @ApiOperation(value = "获取更换详情")
@@ -51,6 +59,15 @@ public class SubjectChangeController extends BaseController {
     public HttpResponseResult<Map> payChange(Integer id, BigDecimal amount, Boolean isUseBalancePayment, Boolean isRepay) throws Exception {
         SubjectChange subjectChange = subjectChangeDao.get(id);
         if (!isRepay && subjectChange.getStatus().equals(SubjectChangeStatusEnum.ING)) {
+        	
+            StudentPaymentOrder applyOrder = studentPaymentOrderService.get(subjectChange.getOrderId().longValue());
+        	// 查询订单状态
+            PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+            if(payStatus == PayStatus.SUCCESSED){
+        		throw new BizException("订单已支付成功,请勿重复支付");
+        	}else if(payStatus == PayStatus.PAYING){
+        		throw new BizException("订单还在交易中,请稍后重试");
+        	}
             return failed(HttpStatus.CONTINUE, "您有待支付的订单");
         }
         Map payMap = subjectChangeService.payChange(id, amount, isUseBalancePayment, isRepay);

+ 48 - 0
mec-student/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java

@@ -0,0 +1,48 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+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;
+
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/13 0013
+ */
+@Api(tags = "云教练记录")
+@RequestMapping("sysMusicRecord")
+@RestController
+public class SysMusicCompareRecordController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation(value = "添加记录")
+    @PostMapping("add")
+    public HttpResponseResult add(SysMusicCompareRecord record){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请登录");
+        }
+        if(Objects.isNull(record.getFeature())){
+            return failed("请设置功能点");
+        }
+        record.setUserId(sysUser.getId());
+        record.setClientId("student");
+        return succeed(sysMusicCompareRecordService.insert(record));
+    }
+
+}

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

@@ -0,0 +1,19 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CleanStudentCloudStudySequenceDays extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.cleanStudentCloudStudySequenceDays();
+	}
+}

+ 46 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/CloudStudyController.java

@@ -0,0 +1,46 @@
+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.MusicCompareRankingDto;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+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.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+@Api("云教练")
+@RestController
+@RequestMapping("cloudStudy")
+public class CloudStudyController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation("查询乐团学员训练数据")
+    @GetMapping("queryMusicGroupStudentTrainData")
+    public HttpResponseResult<PageInfo<MusicCompareRankingDto>> queryMusicGroupStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+        return succeed(sysMusicCompareRecordService.queryMusicGroupStudentTrainData(queryInfo));
+    }
+
+    @ApiOperation("学员训练数据")
+    @GetMapping("queryStudentTrainData")
+    public HttpResponseResult<PageInfo<SysMusicCompareRecord>> queryStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+        return succeed(sysMusicCompareRecordService.queryStudentTrainData(queryInfo));
+    }
+
+}

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

@@ -49,6 +49,12 @@ public class SoundController extends BaseController {
         return soundService.measureCompare(musicXmlInfoList, record);
     }
 
+    @ApiOperation(value = "获取在线人数")
+    @GetMapping("getOnlineUserNum")
+    public HttpResponseResult getOnlineUserNum(){
+        return succeed(WebSocketHandler.WS_CLIENTS.size());
+    }
+
     @RequestMapping("sendToUser")
     public HttpResponseResult sendToUser(String phone, String message) throws IOException {
         if(!WebSocketHandler.WS_CLIENTS.containsKey(phone)){

+ 48 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMusicCompareRecordController.java

@@ -0,0 +1,48 @@
+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.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+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;
+
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/13 0013
+ */
+@Api(tags = "云教练记录")
+@RequestMapping("sysMusicRecord")
+@RestController
+public class SysMusicCompareRecordController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation(value = "添加记录")
+    @PostMapping("add")
+    public HttpResponseResult add(SysMusicCompareRecord record){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请登录");
+        }
+        if(Objects.isNull(record.getFeature())){
+            return failed("请设置功能点");
+        }
+        record.setUserId(sysUser.getId());
+        record.setClientId("teacher");
+        return succeed(sysMusicCompareRecordService.insert(record));
+    }
+
+}

+ 12 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.PageInfoReg;
 import com.ym.mec.biz.dal.dto.RegisterDto;
+import com.ym.mec.biz.dal.dto.TeacherMusicStudentOverViewDto;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -219,4 +220,15 @@ public class TeacherController extends BaseController {
         }
         return succeed(studentRegistrationService.getRegisterOrPreList(queryInfo));
     }
+
+    @ApiOperation(value = "查询教师关联的乐团预览信息")
+    @GetMapping("/queryTeacherMusicStudentOverView")
+    public HttpResponseResult<PageInfo<TeacherMusicStudentOverViewDto>> queryTeacherMusicStudentOverView(TeacherServeQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(teacherService.queryTeacherMusicStudentOverView(queryInfo));
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.teacher.controller;
 
+import com.ym.mec.biz.dal.enums.SuggestionType;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -30,6 +31,8 @@ import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.UploadReturnBean;
 import com.ym.mec.util.upload.UploadUtil;
 
+import java.util.Objects;
+
 @Api(tags = "教师管理")
 @RestController
 public class TeacherManageController extends BaseController {
@@ -79,6 +82,9 @@ public class TeacherManageController extends BaseController {
         }
         sysSuggestion.setUserId(sysUser.getId().longValue());
     	sysSuggestion.setClientType("TEACHER");
+        if(StringUtils.isEmpty(sysSuggestion.getMobileNo())){
+            sysSuggestion.setMobileNo(sysUser.getPhone());
+        }
         suggestionService.insert(sysSuggestion);
         return succeed();
     }

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

@@ -37,7 +37,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/uploadFile", "/eduContracts/queryProduceContract", "/activity/doubleEleven2020Statis", "/replacementInstrument/queryPage",
                         "/replacementInstrumentActivity/queryReplacementsStat", "/eduStudentRegistration/queryPreApplyList",
                         "/eduSubject/findSubSubjects", "/eduFinancialExpenditure/batchAdd", "/eduSendNotice/*",
-                        "/oaContracts/*").permitAll().anyRequest().authenticated().and().httpBasic();
+                        "/oaContracts/*", "/eduStudent/organStudentOverView").permitAll().anyRequest().authenticated().and().httpBasic();
     }
 
     @Override

+ 1 - 0
mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java

@@ -139,6 +139,7 @@ public class EmployeeController extends BaseController {
             sysUser.setRoles(employeeDao.queryUserRole(sysUser.getId()));
             sysUser.setContactAddress(employee.getContactAddress());
             sysUser.setPostalCode(employee.getPostalCode());
+            sysUser.setDeptId(employee.getDeptId());
             sysUser.setDeptIds(employee.getDeptIds());
             sysUser.setPostIds(employee.getPostIds());
             sysUser.setBankCard(employee.getBankCard());

+ 9 - 1
mec-web/src/main/java/com/ym/mec/web/controller/OrganizationController.java

@@ -7,9 +7,12 @@ import com.ym.mec.biz.dal.page.OrganizationQueryInfo;
 import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -42,7 +45,12 @@ public class OrganizationController extends BaseController {
     @GetMapping("/queryEmployeeOrgan")
     @PreAuthorize("@pcs.hasPermissions('organization/queryEmployeeOrgan')")
     public Object queryEmployeeOrgan() throws Exception {
-        return succeed(organizationService.queryEmployeeOrgan());
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if(sysUser == null){
+			throw new BizException("获取用户信息失败");
+		}
+		Integer userId = sysUser.getId();
+        return succeed(organizationService.queryEmployeeOrgan(userId));
     }
 
     @ApiOperation(value = "获取员工所在分部列表(管理员查看所有的分部)")

+ 28 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SoundCompareController.java

@@ -0,0 +1,28 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.handler.WebSocketHandler;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.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;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/10 0010
+ */
+@Api(tags = "音频服务")
+@RequestMapping("soundCompare")
+@RestController
+public class SoundCompareController extends BaseController {
+
+    @ApiOperation(value = "获取在线人数")
+    @GetMapping("getOnlineUserNum")
+    public HttpResponseResult getOnlineUserNum(){
+        return succeed(WebSocketHandler.WS_CLIENTS.size());
+    }
+
+}

+ 51 - 6
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -3,9 +3,9 @@ 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.ActivityCourseDetailDto;
-import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
@@ -19,15 +19,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
 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.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Api(tags = "学生管理")
 @RestController
@@ -48,6 +47,8 @@ public class StudentManageController extends BaseController {
     private EmployeeDao employeeDao;
     @Autowired
     private StudentService studentService;
+    @Autowired
+    private OrganizationService organizationService;
 
     private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
 
@@ -414,4 +415,48 @@ public class StudentManageController extends BaseController {
         }
         return succeed(false);
     }
+
+    @ApiOperation(value = "云教练学员数据预览")
+    @GetMapping("/getCloudStudyStudentOverView")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/getCloudStudyStudentOverView')")
+    public HttpResponseResult<CloudStudyStudentDataDto> getCloudStudyStudentOverView(String organIds) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        List<Integer> organIdsList = new ArrayList<>();
+        if(StringUtils.isNotBlank(organIds)){
+            organIdsList = Arrays.stream(organIds.split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else{
+            List<Organization> organizations = organizationService.queryEmployeeOrgan(sysUser.getId());
+            if(CollectionUtils.isEmpty(organizations)){
+                return succeed();
+            }
+            organIdsList = organizations.stream().map(Organization::getId).collect(Collectors.toList());
+        }
+        return succeed(studentService.getCloudStudyStudentOverView(organIdsList));
+    }
+
+    @ApiOperation(value = "分部云教练学员数据预览")
+    @GetMapping("/organStudentOverView")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/organStudentOverView')")
+    public HttpResponseResult<List<EduOrganStudentDataDto>> organStudentOverView() throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        List<Organization> organizations = organizationService.queryEmployeeOrgan(sysUser.getId());
+        if(CollectionUtils.isEmpty(organizations)){
+            return succeed(Collections.emptyList());
+        }
+        List<Integer> organIds = organizations.stream().map(Organization::getId).collect(Collectors.toList());
+        return succeed(studentService.organStudentOverView(organIds));
+    }
+
+    @ApiOperation(value = "云教练学员数据")
+    @GetMapping("/organStudentData")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/organStudentData')")
+    public HttpResponseResult<StatDto> organStudentData(StudentQueryInfo queryInfo){
+        return succeed(studentService.organStudentData(queryInfo));
+    }
 }

+ 37 - 10
mec-web/src/main/java/com/ym/mec/web/controller/SysSuggestionController.java

@@ -1,36 +1,63 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.biz.dal.entity.ChargeType;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.SysSuggestion;
-import com.ym.mec.biz.service.ChargeTypeService;
+import com.ym.mec.biz.dal.page.SysSuggestionQueryInfo;
 import com.ym.mec.biz.service.SysSuggestionService;
 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 io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-@RequestMapping("sysSuggestion")
 @Api(tags = "意见反馈")
 @RestController
 public class SysSuggestionController extends BaseController {
 
     @Autowired
     private SysSuggestionService sysSuggestionService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
 
     @ApiOperation(value = "新增")
-    @RequestMapping("/add")
+    @RequestMapping("sysSuggestion/add")
     @PreAuthorize("@pcs.hasPermissions('sysSuggestion/add')")
     public Object add(SysSuggestion sysSuggestion) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        sysSuggestion.setUserId(sysUser.getId().longValue());
+        sysSuggestion.setClientType("TEACHER");
+        if(StringUtils.isEmpty(sysSuggestion.getMobileNo())){
+            sysSuggestion.setMobileNo(sysUser.getPhone());
+        }
+        sysSuggestionService.insert(sysSuggestion);
+        return succeed();
+    }
+
+    @ApiOperation(value = "新增")
+    @RequestMapping("suggestion/add")
+    public Object suggestionAdd(SysSuggestion sysSuggestion) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        sysSuggestion.setUserId(sysUser.getId().longValue());
+        sysSuggestion.setClientType("EDUCATION");
+        if(StringUtils.isEmpty(sysSuggestion.getMobileNo())){
+            sysSuggestion.setMobileNo(sysUser.getPhone());
+        }
         sysSuggestionService.insert(sysSuggestion);
         return succeed();
     }
 
     @ApiOperation(value = "删除")
-    @RequestMapping("/del")
+    @RequestMapping("sysSuggestion/del")
     @PreAuthorize("@pcs.hasPermissions('sysSuggestion/del')")
     public Object del(Long id) {
         sysSuggestionService.delete(id);
@@ -38,9 +65,9 @@ public class SysSuggestionController extends BaseController {
     }
 
     @ApiOperation(value = "分页查询")
-    @RequestMapping("/queryPage")
+    @RequestMapping("sysSuggestion/queryPage")
     @PreAuthorize("@pcs.hasPermissions('sysSuggestion/queryPage')")
-    public Object queryPage(QueryInfo queryInfo) {
+    public Object queryPage(SysSuggestionQueryInfo queryInfo) {
         return succeed(sysSuggestionService.queryPage(queryInfo));
     }
 

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

@@ -485,4 +485,10 @@ public class TaskController extends BaseController {
 	public void cleanStudentMember() {
 		studentServeService.cleanStudentMember();
 	}
+
+	@ApiOperation("清理学员云教练连续使用天数")
+	@GetMapping(value = "/cleanStudentCloudStudySequenceDays")
+	public void cleanStudentCloudStudySequenceDays(){
+		studentService.cleanStudentCloudStudySequenceDays();
+	}
 }

+ 27 - 8
mec-web/src/main/java/com/ym/mec/web/controller/education/EduOrganizationController.java

@@ -1,17 +1,23 @@
 package com.ym.mec.web.controller.education;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.service.CooperationOrganService;
 import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
+import com.ym.mec.common.exception.BizException;
 
 @RequestMapping("eduOrganization")
 @Api(tags = "分部服务")
@@ -22,11 +28,24 @@ public class EduOrganizationController extends BaseController {
     private OrganizationService organizationService;
     @Autowired
     private CooperationOrganService cooperationOrganService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "获取员工所在分部列表")
+    @GetMapping("/queryAllOrgan")
+    public Object queryAllOrgan() throws Exception {
+        return succeed(organizationService.queryEmployeeOrgan(null));
+    }
 
     @ApiOperation(value = "获取员工所在分部列表")
     @GetMapping("/queryEmployeeOrgan")
     public Object queryEmployeeOrgan() throws Exception {
-        return succeed(organizationService.queryEmployeeOrgan());
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if(sysUser == null){
+			throw new BizException("获取用户信息失败");
+		}
+		Integer userId = sysUser.getId();
+        return succeed(organizationService.queryEmployeeOrgan(userId));
     }
 
     @ApiOperation(value = "根据分部id获取合作单位(学校)列表")

+ 66 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentController.java

@@ -0,0 +1,66 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
+import com.ym.mec.biz.dal.dto.StatDto;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.page.StudentQueryInfo;
+import com.ym.mec.biz.service.OrganizationService;
+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 io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/17 0017
+ */
+@RequestMapping("eduStudent")
+@Api(tags = "学生信息服务")
+@RestController
+public class EduStudentController extends BaseController {
+
+    @Autowired
+    private StudentService studentService;
+    @Autowired
+    private OrganizationService organizationService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "云教练学员数据")
+    @GetMapping("/organStudentData")
+    public HttpResponseResult<StatDto> organStudentData(StudentQueryInfo queryInfo){
+        return succeed(studentService.organStudentData(queryInfo));
+    }
+
+    @ApiOperation(value = "分部云教练学员数据预览")
+    @GetMapping("/organStudentOverView")
+    public HttpResponseResult<List<EduOrganStudentDataDto>> organStudentOverView() throws Exception {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if(sysUser == null){
+			throw new BizException("获取用户信息失败");
+		}
+		Integer userId = sysUser.getId();
+        List<Organization> organizations = organizationService.queryEmployeeOrgan(userId);
+        if(CollectionUtils.isEmpty(organizations)){
+            return succeed(Collections.emptyList());
+        }
+        List<Integer> organIds = organizations.stream().map(Organization::getId).collect(Collectors.toList());
+        return succeed(studentService.organStudentOverView(organIds));
+    }
+
+}

+ 48 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/SysMusicCompareRecordController.java

@@ -0,0 +1,48 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+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;
+
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/13 0013
+ */
+@Api(tags = "云教练记录")
+@RequestMapping("sysMusicRecord")
+@RestController
+public class SysMusicCompareRecordController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation(value = "添加记录")
+    @PostMapping("add")
+    public HttpResponseResult add(SysMusicCompareRecord record){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请登录");
+        }
+        if(Objects.isNull(record.getFeature())){
+            return failed("请设置功能点");
+        }
+        record.setUserId(sysUser.getId());
+        record.setClientId("education");
+        return succeed(sysMusicCompareRecordService.insert(record));
+    }
+
+}