فهرست منبع

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

 Conflicts:
	mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
	mec-web/src/main/java/com/ym/mec/web/controller/ContractsController.java
zouxuan 4 سال پیش
والد
کامیت
28915dab1b
100فایلهای تغییر یافته به همراه4563 افزوده شده و 1336 حذف شده
  1. 1 1
      .gitignore
  2. 2 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/ResourceServerConfig.java
  3. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  4. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  5. 14 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupTeacherMapperDao.java
  6. 38 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  7. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  8. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  9. 28 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java
  10. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java
  11. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java
  12. 14 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupNoticeDao.java
  13. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImUserFriendDao.java
  14. 102 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  15. 0 42
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexDao.java
  16. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDetailDao.java
  17. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderStudentDetailDao.java
  18. 9 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentRouteOrderDao.java
  19. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPreRegistrationDao.java
  20. 24 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  21. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  22. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloseMusicGroupDto.java
  23. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/DelRegisterDto.java
  24. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/FeeFlagNumDto.java
  25. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupMemberDto.java
  26. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupNoticeDto.java
  27. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImUserFriendDto.java
  28. 35 7
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexBaseDto.java
  29. 0 55
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexBaseMonthDto.java
  30. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderDto.java
  31. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  32. 91 8
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  33. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPreRegistrationDto.java
  34. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroup.java
  35. 123 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java
  36. 102 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java
  37. 91 86
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupNotice.java
  38. 101 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImUserFriend.java
  39. 129 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/IndexBaseMonthData.java
  40. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  41. 20 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderStudentDetail.java
  42. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupStudentClassAdjust.java
  43. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  44. 157 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPreRegistration.java
  45. 68 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java
  46. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  47. 5 8
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MusicGroupStatusEnum.java
  48. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeInfoQueryInfo.java
  49. 0 26
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GroupNoticeQueryInfo.java
  50. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ImGroupNoticeQueryInfo.java
  51. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentPaymentOrderQueryInfo.java
  52. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentPreRegistrationQueryInfo.java
  53. 13 13
      mec-biz/src/main/java/com/ym/mec/biz/event/listener/CourseEventListener.java
  54. 8 7
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  55. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java
  56. 1 7
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  57. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java
  58. 62 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java
  59. 12 2
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupNoticeService.java
  60. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  61. 83 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImUserFriendService.java
  62. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/IndexBaseMonthDataService.java
  63. 0 17
      mec-biz/src/main/java/com/ym/mec/biz/service/IndexService.java
  64. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java
  65. 49 13
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  66. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPreRegistrationService.java
  67. 25 2
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  68. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  69. 234 200
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  70. 125 35
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  71. 30 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  72. 65 67
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  73. 6 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  74. 1 35
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  75. 19 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java
  76. 4 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java
  77. 86 25
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  78. 216 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java
  79. 36 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupNoticeServiceImpl.java
  80. 122 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  81. 310 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java
  82. 274 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  83. 0 113
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexServiceImpl.java
  84. 0 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  85. 114 50
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  86. 480 227
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  87. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  88. 10 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OnlineMusicGroupServiceImpl.java
  89. 4 20
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  90. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  91. 11 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java
  92. 52 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPreRegistrationServiceImpl.java
  93. 118 80
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  94. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  95. 10 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  96. 123 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  97. 35 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java
  98. 44 41
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  99. 7 6
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  100. 23 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml

+ 1 - 1
.gitignore

@@ -7,6 +7,6 @@ target
 /p2p-biz/test-output
 bin
 /manage-center/src/main/resources/config/properties/generatorConfig.xml
-/p2p-utils/.gitignore
+.gitignore
 .idea
 *.iml

+ 2 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/ResourceServerConfig.java

@@ -26,7 +26,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 	@Override
 	public void configure(HttpSecurity http) throws Exception {
 		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers("/task/**","/user/updatePassword","/user/noAuth/queryUserByPhone").hasIpAddress("0.0.0.0/0").anyRequest().authenticated().and().httpBasic();
+				.authorizeRequests().antMatchers("/task/**", "/user/updatePassword", "/user/noAuth/queryUserByPhone", "/user/queryUserByPhone", "/user/add", "/user/queryUserById/*").hasIpAddress("0.0.0.0/0")
+				.anyRequest().authenticated().and().httpBasic();
 	}
 
 	@Override

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

@@ -791,7 +791,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      *
      * @return
      */
-    Integer getMusicGroupHighClassNumBySubject(@Param("musicGroupId") String musicGroupId, @Param("subjectIds") String subjectIds, @Param("type") ClassGroupTypeEnum type);
+    Integer getMusicGroupHighClassNumBySubject(@Param("musicGroupId") String musicGroupId, @Param("type") ClassGroupTypeEnum type);
 
     /**
      * count班级数量

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

@@ -13,6 +13,7 @@ import org.apache.ibatis.annotations.Param;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStudentMapper> {
 
@@ -447,4 +448,12 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
      * @return
      */
     Boolean hasStudent(@Param("masterClassGroupId") Integer masterClassGroupId, @Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * 获取班级关联的学员列表
+     * @param classGroupId
+     * @return
+     */
+    Set<Integer> queryStudentIdsByClassGroupId(@Param("classGroupId") Integer classGroupId,@Param("musicGroupId") String musicGroupId,
+                                               @Param("groupType") GroupType groupType);
 }

+ 14 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupTeacherMapperDao.java

@@ -8,6 +8,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 public interface ClassGroupTeacherMapperDao extends BaseDAO<Long, ClassGroupTeacherMapper> {
 
@@ -64,7 +65,7 @@ public interface ClassGroupTeacherMapperDao extends BaseDAO<Long, ClassGroupTeac
      */
     List<ClassGroupTeacherMapper> findByMusicGroup(String musicGroupId);
 
-    List<ClassGroupTeacherMapper> findAllByMusicGroup(String musicGroupId);
+    List<ClassGroupTeacherMapper> findAllByMusicGroup(@Param("musicGroupId") String musicGroupId, @Param("groupType") GroupType groupType, @Param("teacherRole") String teacherRole);
 
     List<ClassGroupTeacherMapper> findByClassGroup(Integer classGroupId);
 
@@ -136,5 +137,16 @@ public interface ClassGroupTeacherMapperDao extends BaseDAO<Long, ClassGroupTeac
      * @param classGroupIds
      * @param newTeacherId
      */
-    void batchUpdateTeacherByClassId(@Param("classGroupIds") List<Integer> classGroupIds, @Param("oldTeacherId") Integer oldTeacherId, @Param("newTeacherId") Integer newTeacherId);
+    void batchUpdateTeacherByClassId(@Param("classGroupIds") List<Integer> classGroupIds,
+                                     @Param("oldTeacherId") Integer oldTeacherId,
+                                     @Param("newTeacherId") Integer newTeacherId);
+
+    /**
+     * 获取班级和课程上关联的老师列表
+     * @param classGroupId
+     * @return
+     */
+    Set<Integer> queryTeacherIdsByClassGroupId(@Param("classGroupId") Integer classGroupId,
+                                               @Param("musicGroupId") String musicGroupId,
+                                               @Param("groupType") GroupType groupType);
 }

+ 38 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -9,6 +9,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -841,12 +842,12 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<CourseSchedule> findCourseScheduleWithDate(@Param("startDate") String startDate, @Param("endDate") String endDate);
 
     /**
-     * @describe 统计指定时间段内已结算的课程组类型数量
-     * @author Joburgess
-     * @date 2020/12/29 0029
      * @param startDate:
      * @param endDate:
      * @return int
+     * @describe 统计指定时间段内已结算的课程组类型数量
+     * @author Joburgess
+     * @date 2020/12/29 0029
      */
     int countIsSalaryGroupTypes(@Param("startDate") String startDate, @Param("endDate") String endDate);
 
@@ -1678,6 +1679,15 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<Map<String, Integer>> querySubCourseNumMap(@Param("classGroupId") Integer classGroupId);
 
     /**
+     * 获取班级剩余的课程类型和课程总时长
+     *
+     * @param classGroupId
+     * @return
+     * @author zouxuan
+     */
+    List<Map<String, BigDecimal>> querySubCourseTimeMap(@Param("classGroupId") Integer classGroupId);
+
+    /**
      * 获取所选班级最大剩余课时
      *
      * @param classGroupIds
@@ -1731,4 +1741,29 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @author zouxuan
      */
     int countStudentNoStartCourse(Map<String, Object> params);
+
+    /**
+     * 根据班级编号和课程编号获取课程列表
+     *
+     * @param classGroupId
+     * @param allLockCourseIds
+     * @return
+     */
+    List<CourseSchedule> findCoursesByClassGroupIdAndCourseIds(@Param("classGroupId") Long classGroupId, @Param("allLockCourseIds") List<Long> allLockCourseIds);
+
+    /**
+     * 获取班级总剩余时长
+     *
+     * @param masterClassGroupId
+     * @return
+     */
+    Integer queryTotalCourseTimes(Integer masterClassGroupId);
+
+
+    /**
+     * 获取进行中课程数量
+     *
+     * @return
+     */
+    Integer getUnderwayCourseNum(@Param("musicGroupId") String musicGroupId, @Param("groupType") GroupType groupType, @Param("status") CourseStatusEnum status);
 }

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

@@ -400,7 +400,9 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @date 2020/12/2 0002
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleStudentPaymentDto>
      */
-    List<CourseScheduleStudentPaymentDto> findNeedUpdateActualPriceStudentCourses();
+    List<CourseScheduleStudentPaymentDto> findNeedUpdateActualPriceStudentCourses(@Param("groupIds") List<String> groupIds,
+                                                                                  @Param("userIds") List<Integer> userIds,
+                                                                                  @Param("groupType") GroupType groupType);
 
     /**
      * 根据课程编号和,学员编号获取列表信息

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

@@ -489,7 +489,7 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @param classGroupId
 	 * @return
 	 */
-    List<Integer> queryTeacherByTeaching(@Param("classGroupId") Integer classGroupId);
+    List<Integer> queryTeacherByTeaching(@Param("classGroupId") Integer classGroupId,@Param("teacherRole") String teacherRole);
 
 	/**
 	 * 根据助教主教获取教师列表

+ 28 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java

@@ -166,4 +166,32 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
      * @param employeeLevelDtos
      */
     void employeeLevel(@Param("employeeLevelDtos") List<EmployeeLevelDto> employeeLevelDtos);
+
+    /**
+     * @param roleIds:  角色编号列表
+     * @param organIds: 部门编号列表
+     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
+     * @describe 根据角色和用户查找用户(包含离职和冻结的)
+     */
+    List<SimpleUserDto> findAllByRole(@Param("roleIds") String roleIds,
+                                   @Param("organIds") String organIds);
+
+    /**
+     * 获取离职员工所在的乐团列表
+     * @param levelUserId
+     * @return
+     */
+    List<String> queryMusicGroupIdByUserId(Integer levelUserId);
+    /**
+     * 获取离职员工所在的乐团列表
+     * @param levelUserId
+     * @return
+     */
+    List<String> queryPracticeGroupIdByUserId(Integer levelUserId);
+    /**
+     * 获取离职员工所在的乐团列表
+     * @param levelUserId
+     * @return
+     */
+    List<String> queryVipGroupIdByUserId(Integer levelUserId);
 }

+ 31 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java

@@ -0,0 +1,31 @@
+package com.ym.mec.biz.dal.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface ImGroupDao extends BaseDAO<Long, ImGroup> {
+
+	ImGroup getLocked(Long imGroupId);
+
+	/**
+	 * 查询用户所在的群列表
+	 * @param userId
+	 * @param search
+	 * @return
+	 */
+	List<ImGroup> queryByUserId(@Param("userId") Integer userId, @Param("search") String search);
+
+	/**
+	 * 查询群成员列表
+	 * @param imGroupId
+	 * @return
+	 */
+	List<ImGroupMemberDto> queryMemberById(Long imGroupId);
+
+	ImGroupMemberDto queryMember(@Param("imGroupId") Long imGroupId, @Param("userId") Integer userId);
+}

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java

@@ -0,0 +1,21 @@
+package com.ym.mec.biz.dal.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.biz.dal.entity.ImGroupMember;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface ImGroupMemberDao extends BaseDAO<Long, ImGroupMember> {
+
+	int deleteByImGroupId(Long imGroupId);
+
+	int batchDelete(List<ImGroupMember> imGroupMemberList);
+
+	List<ImGroupMember> queryByImGroupIdAndUserId(@Param("imGroupIdList") String imGroupIdList, @Param("userIdList") String userIdList);
+	
+	int batchUpdate(List<ImGroupMember> imGroupMemberList);
+	
+	int batchInsert(List<ImGroupMember> imGroupMemberList);
+}

+ 14 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupNoticeDao.java

@@ -1,14 +1,22 @@
 package com.ym.mec.biz.dal.dao;
 
+import java.util.List;
+import java.util.Map;
+
+import com.ym.mec.biz.dal.dto.ImGroupNoticeDto;
 import com.ym.mec.biz.dal.entity.ImGroupNotice;
 import com.ym.mec.common.dal.BaseDAO;
 
 public interface ImGroupNoticeDao extends BaseDAO<Long, ImGroupNotice> {
 
-
-    /**
-     * 获取最新一条群公告
-     * @return
-     */
-    ImGroupNotice getNewNotice(Long groupId);
+	/**
+	 * 查询最新的群公告
+	 * @param imGroupId
+	 * @return
+	 */
+	ImGroupNoticeDto queryLatestNotice(Long imGroupId);
+	
+	List<ImGroupNoticeDto> queryForPage(Map<String, Object> params);
+	
+	int deleteByImGroupId(Long imGroupId);
 }

+ 31 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImUserFriendDao.java

@@ -0,0 +1,31 @@
+package com.ym.mec.biz.dal.dao;
+
+import java.util.List;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import org.apache.ibatis.annotations.Param;
+import com.ym.mec.biz.dal.dto.ImUserFriendDto;
+import com.ym.mec.biz.dal.entity.ImUserFriend;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface ImUserFriendDao extends BaseDAO<Long, ImUserFriend> {
+
+	ImUserFriend query(@Param("userId") Integer userId, @Param("friendId") Integer friendId);
+
+	/**
+	 * 根据条件查询指定用户的好友列表
+	 * @param userId 指定用户的编号
+	 * @param search 搜索条件
+	 * @return
+	 */
+	List<ImUserFriendDto> queryFriendListByUserId(@Param("userId") Integer userId, @Param("search") String search);
+
+	ImUserFriendDto queryFriendDetail(@Param("userId") Integer userId, @Param("friendUserId") Integer friendUserId);
+
+	/**
+	 * 清除通讯录
+	 * @param teacherId
+	 */
+    void deleteByUserId(Integer teacherId);
+
+	void insertByBasicUser(@Param("basicUserDto") BasicUserDto basicUserDto, @Param("teacherId") Integer teacherId);
+}

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

@@ -0,0 +1,102 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.IndexDataType;
+import com.ym.mec.biz.dal.enums.JobNatureEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+import org.apache.poi.ss.formula.functions.Index;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData> {
+
+    int batchInsert(@Param("datas") List<IndexBaseMonthData> datas);
+
+    int batchInsertWithDataType(@Param("datas") List<IndexBaseMonthData> datas,
+                                @Param("dataType")IndexDataType dataType);
+
+    int deleteWithMonthAndType(@Param("months") Collection months,
+                               @Param("dataType")IndexDataType dataType);
+
+    /**
+     * @describe 获取首页统计数据
+     * @author Joburgess
+     * @date 2021/1/8 0008
+     * @param organIds:
+     * @param dataTypes:
+     * @param startMonth:
+     * @param endMonth:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
+     */
+	List<IndexBaseMonthData> getIndexBaseData(@Param("organIds") Set<Integer> organIds,
+                                              @Param("dataTypes") Set<String> dataTypes,
+                                              @Param("startMonth") String startMonth,
+                                              @Param("endMonth") String endMonth);
+
+    /**
+     * @describe 统计系统中指定时间段的学员注册数据
+     * @author Joburgess
+     * @date 2021/1/7 0007
+     * @return java.util.List<com.ym.mec.biz.dal.dto.IndexBaseMonthDto>
+     */
+    List<IndexBaseMonthData> getStudentSignUpData(@Param("month") String month);
+
+    /**
+     * @describe 统计作业布置数据
+     * @author Joburgess
+     * @date 2021/1/7 0007
+     * @return java.util.List<com.ym.mec.biz.dal.dto.IndexBaseMonthDto>
+     */
+    List<IndexBaseMonthData> getHomeworkData(@Param("month") String month,
+                                             @Param("type") String type);
+
+    /**
+     * @describe 统计合作单位数据
+     * @author Joburgess
+     * @date 2021/1/11 0011
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
+     */
+    List<IndexBaseMonthData> getSchoolData(@Param("month") String month);
+
+    /**
+     * @describe 统计乐团数据
+     * @author Joburgess
+     * @date 2021/1/11 0011
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
+     */
+    List<IndexBaseMonthData> getMusicData(@Param("month") String month);
+
+    /**
+     * @describe 统计乐团学员数据
+     * @author Joburgess
+     * @date 2021/1/11 0011
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
+     */
+    List<IndexBaseMonthData> getMusicStudentData(@Param("month") String month,
+                                                 @Param("type") String type);
+
+    List<IndexBaseMonthData> getMusicGroupPreRegistrationStudentData(@Param("month") String month);
+
+    List<IndexBaseMonthData> getMusicGroupStudentFromPreData(@Param("month") String month,
+                                                             @Param("paymentStatus") PaymentStatusEnum paymentStatus);
+
+    List<Integer> getMusicGroupStudentIdFromPre(@Param("month") String month,
+                                                @Param("paymentStatus") PaymentStatusEnum paymentStatus);
+
+    List<IndexBaseMonthData> getStudentConversionData(@Param("month") String month,
+                                                      @Param("studentIds") List<Integer> studentIds);
+
+    List<IndexBaseMonthData> getOtherStudentData(@Param("month") String month);
+
+    List<IndexBaseMonthData> getTeacherData(@Param("month") String month,
+                                            @Param("jobNature") JobNatureEnum jobNature,
+                                            @Param("isDemission") Boolean isDemission);
+
+    List<IndexBaseMonthData> getGroupCourseData(@Param("month") String month,
+                                                @Param("groupType")GroupType groupType);
+}

+ 0 - 42
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexDao.java

@@ -1,42 +0,0 @@
-package com.ym.mec.biz.dal.dao;
-
-import com.ym.mec.biz.dal.dto.IndexBaseMonthDto;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * @Author Joburgess
- * @Date 2021/1/7 0007
- **/
-public interface IndexDao {
-
-    /**
-     * @describe 统计系统中指定时间段的学员注册数据
-     * @author Joburgess
-     * @date 2021/1/7 0007
-     * @param organIds:
-     * @param startMonth:
-     * @param endMonth:
-     * @return java.util.List<com.ym.mec.biz.dal.dto.IndexBaseMonthDto>
-     */
-    List<IndexBaseMonthDto> getStudentSignUpData(@Param("organIds") Set<Integer> organIds,
-                                                 @Param("startMonth") String startMonth,
-                                                 @Param("endMonth") String endMonth);
-
-    /**
-     * @describe 统计作业布置数据
-     * @author Joburgess
-     * @date 2021/1/7 0007
-     * @param organIds:
-     * @param startMonth:
-     * @param endMonth:
-     * @return java.util.List<com.ym.mec.biz.dal.dto.IndexBaseMonthDto>
-     */
-    List<IndexBaseMonthDto> getHomeworkDate(@Param("organIds") Set<Integer> organIds,
-                                                  @Param("startMonth") String startMonth,
-                                                  @Param("endMonth") String endMonth,
-                                                  @Param("type") String type);
-
-}

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

@@ -115,12 +115,12 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 	void batchDel(String musicGroupPaymentCalenderIds);
 
 	/**
-	 * 删除未缴费的明细
+	 * 查询学生在指定乐团中未交费的记录
 	 *
 	 * @param userId
 	 * @param musicGroupId
 	 */
-	void deleteByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
+	List<MusicGroupPaymentCalenderDetail> queryNotPaymentStudentByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
 
 	/**
 	 * 根据缴费记录删除缴费详情

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

@@ -24,4 +24,11 @@ public interface MusicGroupPaymentCalenderStudentDetailDao extends BaseDAO<Integ
      * @param batchNo
      */
     void delByBatchNo(String batchNo);
+
+    /**
+     * 获取跨团合班学员缴费详情
+     * @param batchNo
+     * @param userId
+     */
+    List<MusicGroupPaymentCalenderStudentDetail>  findByBatchNoAndUserId(@Param("batchNo") String batchNo, @Param("userId") Integer userId);
 }

+ 9 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentRouteOrderDao.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 
+import com.ym.mec.biz.dal.dto.FeeFlagNumDto;
 import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
 import com.ym.mec.biz.dal.dto.StudentPaymentRouteOrderDto;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
@@ -57,16 +58,18 @@ public interface StudentPaymentRouteOrderDao extends BaseDAO<Long, StudentPaymen
 
     /**
      * 插入外部订单
+     *
      * @return
      */
     int insertOrder(StudentPaymentOrder order);
-    
+
     int queryAuditCount(Map<String, Object> params);
-    
+
     List<StudentPaymentRouteOrder> queryAuditPage(Map<String, Object> params);
 
     /**
      * 是否有重复到订单号
+     *
      * @param transNos
      * @return
      */
@@ -74,6 +77,7 @@ public interface StudentPaymentRouteOrderDao extends BaseDAO<Long, StudentPaymen
 
     /**
      * 获取审核通过的学校缴费金额
+     *
      * @param calenderId
      * @return
      */
@@ -81,8 +85,11 @@ public interface StudentPaymentRouteOrderDao extends BaseDAO<Long, StudentPaymen
 
     /**
      * 更换订单号获取
+     *
      * @param orderNo
      * @return
      */
     StudentPaymentRouteOrder getByOrderNo(String orderNo);
+
+    FeeFlagNumDto getCountFeeFlagNum(@Param("orderNo") String orderNo);
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPreRegistrationDao.java

@@ -0,0 +1,21 @@
+package com.ym.mec.biz.dal.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.biz.dal.dto.StudentPreRegistrationDto;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface StudentPreRegistrationDao extends BaseDAO<Long, StudentPreRegistration> {
+
+	StudentPreRegistration queryByMusicGroupIdAndUserId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
+
+	StudentPreRegistration queryByMusicGroupIdAndPhone(@Param("phone") String phone, @Param("musicGroupId") String musicGroupId);
+	
+	List<StudentPreRegistration> queryByMusicGroupId(String musicGroupId);
+	
+	List<StudentPreRegistrationDto> queryListForPage(Map<String,Object> params);
+}

+ 24 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -1,9 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Subject;
@@ -423,4 +421,27 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return
      */
     List<StudentRegistration> queryByUserIdsAndMusicGroupId(@Param("studentIds") String studentIds, @Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 批量删除注册信息
+     * @param ids
+     * @return
+     */
+    int batchDelete(@Param("ids") List<Long> ids);
+
+    /**
+     * 获取学员声部名称
+     * @param musicGroupId
+     * @param studentId
+     * @return
+     */
+    String getStudentSubjectName(@Param("musicGroupId") String musicGroupId, @Param("studentId") Integer studentId);
+
+    /**
+     * 获取学员声部名称
+     * @param musicGroupId
+     * @param studentIds
+     * @return
+     */
+    List<Map<Integer,String>> getStudentSubjectNameByStuIds(@Param("musicGroupId") String musicGroupId, @Param("studentIds") Collection<Integer> studentIds);
 }

+ 7 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java

@@ -59,6 +59,10 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
 
     List<Map<Integer, String>> queryNameByIdList(@Param("userIds") List<Integer> userIds);
 
+    List<Map<Integer, String>> queryUserNameByIdList(@Param("userIds") List<Integer> userIds);
+
+    List<Map<Integer, String>> querySubjectNameByIdList(@Param("userIds") List<Integer> userIds);
+
     /**
      * 根据用户编号列表获取手机号
      *
@@ -344,7 +348,7 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      * @param studentId
      * @return
      */
-    Set<Integer> findMusicTeacherIds(Integer studentId);
+    Set<Integer> findMusicTeacherIds(@Param("studentId") Integer studentId);
 
     /**
      * 获取和学员相关的VIP老师列表
@@ -490,4 +494,6 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      * @return
      */
     String queryTeacherNameByTeacherIds(@Param("teachingTeacherIds") String teachingTeacherIds);
+
+    List<Integer> queryAllIds();
 }

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloseMusicGroupDto.java

@@ -0,0 +1,32 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+public class CloseMusicGroupDto {
+
+    @ApiModelProperty(value = "乐团id", required = true)
+    private String musicGroupId;
+
+
+    @ApiModelProperty(value = "用户退的金额", required = true)
+    private Map<Integer, BigDecimal> userReBack;
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Map<Integer, BigDecimal> getUserReBack() {
+        return userReBack;
+    }
+
+    public void setUserReBack(Map<Integer, BigDecimal> userReBack) {
+        this.userReBack = userReBack;
+    }
+}

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/DelRegisterDto.java

@@ -0,0 +1,30 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class DelRegisterDto {
+
+    @ApiModelProperty(value = "乐团id", required = true)
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "用户ids", required = true)
+    private List<Integer> userIds;
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public List<Integer> getUserIds() {
+        return userIds;
+    }
+
+    public void setUserIds(List<Integer> userIds) {
+        this.userIds = userIds;
+    }
+}

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/FeeFlagNumDto.java

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.dal.dto;
+
+public class FeeFlagNumDto {
+    private Integer totalNum;
+    private Integer yesNum;
+
+    public Integer getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(Integer totalNum) {
+        this.totalNum = totalNum;
+    }
+
+    public Integer getYesNum() {
+        return yesNum;
+    }
+
+    public void setYesNum(Integer yesNum) {
+        this.yesNum = yesNum;
+    }
+}

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupMemberDto.java

@@ -0,0 +1,17 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.ImGroupMember;
+
+public class ImGroupMemberDto extends ImGroupMember {
+
+	private SysUser user = new SysUser();
+
+	public SysUser getUser() {
+		return user;
+	}
+
+	public void setUser(SysUser user) {
+		this.user = user;
+	}
+}

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupNoticeDto.java

@@ -0,0 +1,17 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.ImGroupNotice;
+
+public class ImGroupNoticeDto extends ImGroupNotice {
+
+	private SysUser user = new SysUser();
+
+	public SysUser getUser() {
+		return user;
+	}
+
+	public void setUser(SysUser user) {
+		this.user = user;
+	}
+}

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImUserFriendDto.java

@@ -0,0 +1,18 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.ImUserFriend;
+
+public class ImUserFriendDto extends ImUserFriend {
+
+	private SysUser friend = new SysUser();
+
+	public SysUser getFriend() {
+		return friend;
+	}
+
+	public void setFriend(SysUser friend) {
+		this.friend = friend;
+	}
+
+}

+ 35 - 7
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexBaseDto.java

@@ -1,9 +1,14 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
+import com.ym.mec.biz.dal.enums.IndexDataType;
 import com.ym.mec.common.constant.CommonConstants;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Comparator;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -12,11 +17,13 @@ import java.util.List;
  */
 public class IndexBaseDto {
 
+    private IndexDataType dataType;
+
     private String title;
 
     private BigDecimal percent;
 
-    private List<IndexBaseMonthDto> indexMonthData;
+    private List<IndexBaseMonthData> indexMonthData;
 
     public IndexBaseDto() {
     }
@@ -25,12 +32,25 @@ public class IndexBaseDto {
         this.title = title;
     }
 
-    public IndexBaseDto(String title, BigDecimal percent, List<IndexBaseMonthDto> indexMonthData) {
+    public IndexBaseDto(IndexDataType dataType, String title) {
+        this.dataType = dataType;
+        this.title = title;
+    }
+
+    public IndexBaseDto(String title, BigDecimal percent, List<IndexBaseMonthData> indexMonthData) {
         this.title = title;
         this.percent = percent;
         this.indexMonthData = indexMonthData;
     }
 
+    public IndexDataType getDataType() {
+        return dataType;
+    }
+
+    public void setDataType(IndexDataType dataType) {
+        this.dataType = dataType;
+    }
+
     public String getTitle() {
         return title;
     }
@@ -47,16 +67,24 @@ public class IndexBaseDto {
         this.percent = percent;
     }
 
-    public List<IndexBaseMonthDto> getIndexMonthData() {
+    public List<IndexBaseMonthData> getIndexMonthData() {
         return indexMonthData;
     }
 
-    public void setIndexMonthData(List<IndexBaseMonthDto> indexMonthData) {
+    public void setIndexMonthData(List<IndexBaseMonthData> indexMonthData, Date currentMonth) {
         this.indexMonthData = indexMonthData;
         if(!CollectionUtils.isEmpty(indexMonthData)){
-            BigDecimal total = indexMonthData.stream().map(IndexBaseMonthDto::getTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
-            BigDecimal activateNum = indexMonthData.stream().map(IndexBaseMonthDto::getActivateNum).reduce(BigDecimal.ZERO, BigDecimal::add);
-            this.percent = activateNum.divide(total, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN);
+            BigDecimal total = indexMonthData.stream().map(IndexBaseMonthData::getTotalNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+            if(IndexDataType.ACTIVATION_RATE.equals(dataType)||IndexDataType.HOMEWORK_CREATE_RATE.equals(dataType)||IndexDataType.HOMEWORK_SUBMIT_RATE.equals(dataType)||IndexDataType.HOMEWORK_COMMENT_RATE.equals(dataType)){
+                if(total.compareTo(BigDecimal.ZERO)==0){
+                    this.percent = BigDecimal.ZERO;
+                }else{
+                    BigDecimal activateNum = indexMonthData.stream().map(IndexBaseMonthData::getActivateNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    this.percent = activateNum.divide(total, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN);
+                }
+            }else{
+                this.percent = indexMonthData.stream().filter(i->currentMonth.compareTo(i.getMonth())==0).max(Comparator.comparing(IndexBaseMonthData::getMonth)).get().getPercent();
+            }
         }
     }
 }

+ 0 - 55
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexBaseMonthDto.java

@@ -1,55 +0,0 @@
-package com.ym.mec.biz.dal.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-
-import java.math.BigDecimal;
-
-/**
- * @Author Joburgess
- * @Date 2021/1/7 0007
- */
-public class IndexBaseMonthDto {
-
-    private String title;
-
-    //总数
-    private BigDecimal total;
-
-    //有效数量
-    private BigDecimal activateNum;
-
-    //最终结果
-    private BigDecimal percent;
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public BigDecimal getTotal() {
-        return total;
-    }
-
-    public void setTotal(BigDecimal total) {
-        this.total = total;
-    }
-
-    public BigDecimal getActivateNum() {
-        return activateNum;
-    }
-
-    public void setActivateNum(BigDecimal activateNum) {
-        this.activateNum = activateNum;
-    }
-
-    public BigDecimal getPercent() {
-        return percent;
-    }
-
-    public void setPercent(BigDecimal percent) {
-        this.percent = percent;
-    }
-}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderDto.java

@@ -202,10 +202,20 @@ public class MusicGroupPaymentCalenderDto {
 
 		private Date deadlinePaymentDate;
 
+		private BigDecimal paymentAmount;
+
 		private Date paymentValidStartDate;
 
 		private Date paymentValidEndDate;
 
+		public BigDecimal getPaymentAmount() {
+			return paymentAmount;
+		}
+
+		public void setPaymentAmount(BigDecimal paymentAmount) {
+			this.paymentAmount = paymentAmount;
+		}
+
 		public java.util.Date getStartPaymentDate() {
 			return startPaymentDate;
 		}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java

@@ -80,6 +80,8 @@ public class StudentManageListDto {
     private String subjectIdList;
 
     private Integer isNewUser;
+    
+    private boolean isSignedContract;
 
     public Integer getIsNewUser() {
         return isNewUser;
@@ -304,4 +306,12 @@ public class StudentManageListDto {
 	public void setSubjectIdList(String subjectIdList) {
 		this.subjectIdList = subjectIdList;
 	}
+
+	public boolean getIsSignedContract() {
+		return isSignedContract;
+	}
+
+	public void setIsSignedContract(boolean isSignedContract) {
+		this.isSignedContract = isSignedContract;
+	}
 }

+ 91 - 8
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java

@@ -14,24 +14,41 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     //零星费用类型
     private String sporadicType;
 
-    private BigDecimal courseFee;
+    //课程费用(废弃)
+    private BigDecimal courseFee = BigDecimal.ZERO;
 
-    private BigDecimal highOnlineCourseFee;
+    //新生专享(废弃)
+    private BigDecimal highOnlineCourseFee = BigDecimal.ZERO;
 
     //乐器费用
-    private BigDecimal musicalFee;
+    private BigDecimal musicalFee = BigDecimal.ZERO;
 
-    //租赁费用
-    private BigDecimal leaseFee;
+    //押金费用
+    private BigDecimal leaseFee = BigDecimal.ZERO;
 
     //教辅费用
-    private BigDecimal teachingFee;
+    private BigDecimal teachingFee = BigDecimal.ZERO;
 
     //维修费用
-    private BigDecimal repairFee;
+    private BigDecimal repairFee = BigDecimal.ZERO;
 
     //手续费
-    private BigDecimal transferFee;
+    private BigDecimal transferFee = BigDecimal.ZERO;
+
+    //乐团课程费用
+    private BigDecimal musicGroupCourseFee = BigDecimal.ZERO;
+    //网络基础训练课程费用
+    private BigDecimal highCourseFee = BigDecimal.ZERO;
+    //VIP课程费用
+    private BigDecimal vipCourseFee = BigDecimal.ZERO;
+    //网管课程费用
+    private BigDecimal practiceCourseFee = BigDecimal.ZERO;
+    //乐理课程费用
+    private BigDecimal theoryCourseFee = BigDecimal.ZERO;
+    //考级费用
+    private BigDecimal degreeFee = BigDecimal.ZERO;
+    //其它费用
+    private BigDecimal otherFee = BigDecimal.ZERO;
 
     private String organName;
     private String schoolName;
@@ -53,6 +70,8 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     //分润余额
     private BigDecimal routeBalance;
 
+    private String feeFlag;
+
     public BigDecimal getSporadicAmount() {
         return sporadicAmount;
     }
@@ -204,4 +223,68 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     public void setRepairFee(BigDecimal repairFee) {
         this.repairFee = repairFee;
     }
+
+    public BigDecimal getMusicGroupCourseFee() {
+        return musicGroupCourseFee;
+    }
+
+    public void setMusicGroupCourseFee(BigDecimal musicGroupCourseFee) {
+        this.musicGroupCourseFee = musicGroupCourseFee;
+    }
+
+    public BigDecimal getHighCourseFee() {
+        return highCourseFee;
+    }
+
+    public void setHighCourseFee(BigDecimal highCourseFee) {
+        this.highCourseFee = highCourseFee;
+    }
+
+    public BigDecimal getVipCourseFee() {
+        return vipCourseFee;
+    }
+
+    public void setVipCourseFee(BigDecimal vipCourseFee) {
+        this.vipCourseFee = vipCourseFee;
+    }
+
+    public BigDecimal getPracticeCourseFee() {
+        return practiceCourseFee;
+    }
+
+    public void setPracticeCourseFee(BigDecimal practiceCourseFee) {
+        this.practiceCourseFee = practiceCourseFee;
+    }
+
+    public BigDecimal getTheoryCourseFee() {
+        return theoryCourseFee;
+    }
+
+    public void setTheoryCourseFee(BigDecimal theoryCourseFee) {
+        this.theoryCourseFee = theoryCourseFee;
+    }
+
+    public BigDecimal getDegreeFee() {
+        return degreeFee;
+    }
+
+    public void setDegreeFee(BigDecimal degreeFee) {
+        this.degreeFee = degreeFee;
+    }
+
+    public BigDecimal getOtherFee() {
+        return otherFee;
+    }
+
+    public void setOtherFee(BigDecimal otherFee) {
+        this.otherFee = otherFee;
+    }
+
+    public String getFeeFlag() {
+        return feeFlag;
+    }
+
+    public void setFeeFlag(String feeFlag) {
+        this.feeFlag = feeFlag;
+    }
 }

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPreRegistrationDto.java

@@ -0,0 +1,36 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+
+public class StudentPreRegistrationDto extends StudentPreRegistration {
+	
+	private boolean isRegistered;
+	
+	private String subjectFirstName;
+	
+	private String subjectSecondName;
+
+	public boolean getIsRegistered() {
+		return isRegistered;
+	}
+
+	public void setIsRegistered(boolean isRegistered) {
+		this.isRegistered = isRegistered;
+	}
+
+	public String getSubjectFirstName() {
+		return subjectFirstName;
+	}
+
+	public void setSubjectFirstName(String subjectFirstName) {
+		this.subjectFirstName = subjectFirstName;
+	}
+
+	public String getSubjectSecondName() {
+		return subjectSecondName;
+	}
+
+	public void setSubjectSecondName(String subjectSecondName) {
+		this.subjectSecondName = subjectSecondName;
+	}
+}

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

@@ -51,6 +51,10 @@ public class ClassGroup {
 	@ApiModelProperty(value = "乐团名称", required = true)
 	private String musicGroupName;
 
+	/** 分部 */
+	@ApiModelProperty(value = "分部", required = true)
+	private String organName;
+
 	/** 子班级名称列表 */
 	@ApiModelProperty(value = "子班班级名称")
 	private String classNames;
@@ -96,6 +100,14 @@ public class ClassGroup {
 	
 	private List<CourseSchedule> courseScheduleList = new ArrayList<CourseSchedule>();
 
+	public String getOrganName() {
+		return organName;
+	}
+
+	public void setOrganName(String organName) {
+		this.organName = organName;
+	}
+
 	public String getViewGroupName() {
 		return viewGroupName;
 	}

+ 123 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java

@@ -0,0 +1,123 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(im_group):
+ */
+public class ImGroup {
+
+	/**  */
+	private Long id;
+	
+	/** 群名称 */
+	private String name;
+	
+	/** 群介绍 */
+	private String introduce;
+	
+	/** 群成员数 */
+	private Integer memberNum;
+	
+	/** 群备注 */
+	private String memo;
+	
+	/** 群标签 */
+	private String tags;
+	
+	private String img;
+	
+	private String type;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setName(String name){
+		this.name = name;
+	}
+	
+	public String getName(){
+		return this.name;
+	}
+			
+	public void setIntroduce(String introduce){
+		this.introduce = introduce;
+	}
+	
+	public String getIntroduce(){
+		return this.introduce;
+	}
+			
+	public void setMemberNum(Integer memberNum){
+		this.memberNum = memberNum;
+	}
+	
+	public Integer getMemberNum(){
+		return this.memberNum;
+	}
+			
+	public void setMemo(String memo){
+		this.memo = memo;
+	}
+	
+	public String getMemo(){
+		return this.memo;
+	}
+			
+	public void setTags(String tags){
+		this.tags = tags;
+	}
+	
+	public String getTags(){
+		return this.tags;
+	}
+			
+	public String getImg() {
+		return img;
+	}
+
+	public void setImg(String img) {
+		this.img = img;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 102 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java

@@ -0,0 +1,102 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(im_group_member):
+ */
+public class ImGroupMember {
+
+	/**  */
+	private Long id;
+	
+	/**  */
+	private Long imGroupId;
+	
+	/**  */
+	private Integer userId;
+	
+	private String nickname;
+	
+	/** 是否是管理员 */
+	private boolean isAdmin;
+	
+	/** 群角色 */
+	private String roleType;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setImGroupId(Long imGroupId){
+		this.imGroupId = imGroupId;
+	}
+	
+	public Long getImGroupId(){
+		return this.imGroupId;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public String getNickname() {
+		return nickname;
+	}
+
+	public void setNickname(String nickname) {
+		this.nickname = nickname;
+	}
+
+	public void setIsAdmin(boolean isAdmin){
+		this.isAdmin = isAdmin;
+	}
+	
+	public boolean getIsAdmin(){
+		return this.isAdmin;
+	}
+
+	public String getRoleType() {
+		return roleType;
+	}
+
+	public void setRoleType(String roleType) {
+		this.roleType = roleType;
+	}
+
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 91 - 86
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupNotice.java

@@ -1,120 +1,125 @@
 package com.ym.mec.biz.dal.entity;
 
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-
-import java.util.Date;
+import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
  * 对应数据库表(im_group_notice):
  */
 public class ImGroupNotice {
-	private Long id;
 
+	/**  */
+	private Long id;
+	
+	/**  */
 	private Long imGroupId;
-
-	private Long operatorId;
-
+	
+	/** 标题 */
 	private String title;
-
+	
+	/** 内容 */
 	private String content;
-
-	private String realName;
-
-	private String avatar;
-
-	private Integer isTop;
-
-	private Date createTime;
-
-	private Date updateTime;
-
-	private Integer delFlag = 0;
-
-	public String getRealName() {
-		return realName;
+	
+	/** 是否置顶 */
+	private boolean isTop;
+	
+	/** 是否发送给新人 */
+	private boolean isSentToNewMember;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+	
+	/**  */
+	private boolean delFlag;
+	
+	/** 操作人 */
+	private Long operatorId;
+	
+	public void setId(Long id){
+		this.id = id;
 	}
-
-	public void setRealName(String realName) {
-		this.realName = realName;
+	
+	public Long getId(){
+		return this.id;
 	}
-
-	public String getAvatar() {
-		return avatar;
+			
+	public void setImGroupId(Long imGroupId){
+		this.imGroupId = imGroupId;
 	}
-
-	public void setAvatar(String avatar) {
-		this.avatar = avatar;
+	
+	public Long getImGroupId(){
+		return this.imGroupId;
 	}
-
-	public Long getOperatorId() {
-		return operatorId;
+			
+	public void setTitle(String title){
+		this.title = title;
 	}
-
-	public void setOperatorId(Long operatorId) {
-		this.operatorId = operatorId;
+	
+	public String getTitle(){
+		return this.title;
 	}
-
-	public Long getId() {
-		return id;
+			
+	public void setContent(String content){
+		this.content = content;
 	}
-
-	public void setId(Long id) {
-		this.id = id;
+	
+	public String getContent(){
+		return this.content;
 	}
-
-	public Long getImGroupId() {
-		return imGroupId;
+			
+	public void setIsTop(boolean isTop){
+		this.isTop = isTop;
 	}
-
-	public void setImGroupId(Long imGroupId) {
-		this.imGroupId = imGroupId;
+	
+	public boolean isIsTop(){
+		return this.isTop;
 	}
-
-	public String getTitle() {
-		return title;
+			
+	public void setIsSentToNewMember(boolean isSentToNewMember){
+		this.isSentToNewMember = isSentToNewMember;
 	}
-
-	public void setTitle(String title) {
-		this.title = title;
+	
+	public boolean isIsSentToNewMember(){
+		return this.isSentToNewMember;
 	}
-
-	public String getContent() {
-		return content;
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
 	}
-
-	public void setContent(String content) {
-		this.content = content;
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
 	}
-
-	public Date getCreateTime() {
-		return createTime;
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
 	}
-
-	public void setCreateTime(Date createTime) {
-		this.createTime = createTime;
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
 	}
-
-	public Date getUpdateTime() {
-		return updateTime;
+			
+	public void setDelFlag(boolean delFlag){
+		this.delFlag = delFlag;
 	}
-
-	public void setUpdateTime(Date updateTime) {
-		this.updateTime = updateTime;
+	
+	public boolean isDelFlag(){
+		return this.delFlag;
 	}
-
-	public Integer getIsTop() {
-		return isTop;
+			
+	public void setOperatorId(Long operatorId){
+		this.operatorId = operatorId;
 	}
-
-	public void setIsTop(Integer isTop) {
-		this.isTop = isTop;
+	
+	public Long getOperatorId(){
+		return this.operatorId;
 	}
-
-	public Integer getDelFlag() {
-		return delFlag;
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
 	}
 
-	public void setDelFlag(Integer delFlag) {
-		this.delFlag = delFlag;
-	}
 }

+ 101 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImUserFriend.java

@@ -0,0 +1,101 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(im_user_friend):
+ */
+public class ImUserFriend {
+
+	/**  */
+	private Long id;
+
+	/** 用户编号 */
+	private Integer userId;
+
+	/** 好友编号 */
+	private Integer friendId;
+
+	/** 好友昵称 */
+	private String friendNickname;
+	
+	private String memo;
+	
+	private String tags;
+
+	/**  */
+	private java.util.Date createTime;
+
+	/**  */
+	private java.util.Date updateTime;
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getId() {
+		return this.id;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getUserId() {
+		return this.userId;
+	}
+
+	public void setFriendId(Integer friendId) {
+		this.friendId = friendId;
+	}
+
+	public Integer getFriendId() {
+		return this.friendId;
+	}
+
+	public void setFriendNickname(String friendNickname) {
+		this.friendNickname = friendNickname;
+	}
+
+	public String getFriendNickname() {
+		return this.friendNickname;
+	}
+
+	public String getMemo() {
+		return memo;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public String getTags() {
+		return tags;
+	}
+
+	public void setTags(String tags) {
+		this.tags = tags;
+	}
+
+	public java.util.Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(java.util.Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public java.util.Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(java.util.Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 129 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/IndexBaseMonthData.java

@@ -0,0 +1,129 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.enums.IndexDataType;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 对应数据库表(index_base_month_data):
+ */
+public class IndexBaseMonthData {
+
+	/**  */
+	private Long id;
+	
+	/**  */
+	private java.util.Date month;
+
+	private String title;
+	
+	/** 分部编号 */
+	private Integer organId;
+	
+	/** 总数量 */
+	private BigDecimal totalNum;
+	
+	/** 有效数量 */
+	private BigDecimal activateNum;
+	
+	/** 最终结果 */
+	private BigDecimal percent;
+
+	private IndexDataType dataType;
+
+	private Date createTime;
+
+	private Date updateTime;
+
+	public IndexBaseMonthData() {
+	}
+
+	public IndexBaseMonthData(Date month, Integer organId) {
+		this.month = month;
+		this.organId = organId;
+		this.totalNum = BigDecimal.ZERO;
+		this.activateNum = BigDecimal.ZERO;
+		this.percent = BigDecimal.ZERO;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Date getMonth() {
+		return month;
+	}
+
+	public void setMonth(Date month) {
+		this.month = month;
+	}
+
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
+	public BigDecimal getTotalNum() {
+		return totalNum;
+	}
+
+	public void setTotalNum(BigDecimal totalNum) {
+		this.totalNum = totalNum;
+	}
+
+	public BigDecimal getActivateNum() {
+		return activateNum;
+	}
+
+	public void setActivateNum(BigDecimal activateNum) {
+		this.activateNum = activateNum;
+	}
+
+	public BigDecimal getPercent() {
+		return percent;
+	}
+
+	public void setPercent(BigDecimal percent) {
+		this.percent = percent;
+	}
+
+	public IndexDataType getDataType() {
+		return dataType;
+	}
+
+	public void setDataType(IndexDataType dataType) {
+		this.dataType = dataType;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+}

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

@@ -46,6 +46,9 @@ public class MusicGroup {
 	/** 报名截止日期 */
 	@ApiModelProperty(value = "报名截止日期",required = false)
 	private java.util.Date applyExpireDate;
+
+	@ApiModelProperty(value = "预报名截止日期",required = false)
+	private java.util.Date preApplyExpireDate;
 	
 	/** 团长 */
 	@ApiModelProperty(value = "运营主管",required = false)
@@ -359,6 +362,14 @@ public class MusicGroup {
 		return this.applyExpireDate;
 	}
 			
+	public java.util.Date getPreApplyExpireDate() {
+		return preApplyExpireDate;
+	}
+
+	public void setPreApplyExpireDate(java.util.Date preApplyExpireDate) {
+		this.preApplyExpireDate = preApplyExpireDate;
+	}
+
 	public void setTeamTeacherId(Integer teamTeacherId){
 		this.teamTeacherId = teamTeacherId;
 	}

+ 20 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderStudentDetail.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import java.math.BigDecimal;
 import java.util.Objects;
 
 /**
@@ -24,12 +25,15 @@ public class MusicGroupPaymentCalenderStudentDetail {
 	
 	/** 现价 */
 	private java.math.BigDecimal courseCurrentPrice;
+
+	/** 学员需要扣减的课程余额 */
+	private java.math.BigDecimal cutAmount = BigDecimal.ZERO;
 	
 	/** 课程类型 */
 	private String courseType;
 	
 	/** 课程时长 */
-	private Long courseTime;
+	private Integer courseTime;
 	
 	/** 班级编号 */
 	private Integer classGroupId;
@@ -42,7 +46,15 @@ public class MusicGroupPaymentCalenderStudentDetail {
 	
 	/**  */
 	private java.util.Date updateTime;
-	
+
+	public BigDecimal getCutAmount() {
+		return cutAmount;
+	}
+
+	public void setCutAmount(BigDecimal cutAmount) {
+		this.cutAmount = cutAmount;
+	}
+
 	public void setId(Integer id){
 		this.id = id;
 	}
@@ -99,11 +111,11 @@ public class MusicGroupPaymentCalenderStudentDetail {
 		return this.courseType;
 	}
 
-	public Long getCourseTime() {
+	public Integer getCourseTime() {
 		return courseTime;
 	}
 
-	public void setCourseTime(Long courseTime) {
+	public void setCourseTime(Integer courseTime) {
 		this.courseTime = courseTime;
 	}
 
@@ -143,6 +155,7 @@ public class MusicGroupPaymentCalenderStudentDetail {
 	public String toString() {
 		return "MusicGroupPaymentCalenderStudentDetail{" +
 				"userId=" + userId +
+				", courseOriginalPrice=" + courseOriginalPrice +
 				", courseCurrentPrice=" + courseCurrentPrice +
 				", courseType='" + courseType + '\'' +
 				", classGroupId=" + classGroupId +
@@ -155,13 +168,14 @@ public class MusicGroupPaymentCalenderStudentDetail {
 		if (o == null || getClass() != o.getClass()) return false;
 		MusicGroupPaymentCalenderStudentDetail that = (MusicGroupPaymentCalenderStudentDetail) o;
 		return userId.equals(that.userId) &&
-				courseCurrentPrice.equals(that.courseCurrentPrice) &&
+				courseOriginalPrice.doubleValue()==(that.courseOriginalPrice.doubleValue()) &&
+				courseCurrentPrice.doubleValue()==(that.courseCurrentPrice.doubleValue()) &&
 				courseType.equals(that.courseType) &&
 				classGroupId.equals(that.classGroupId);
 	}
 
 	@Override
 	public int hashCode() {
-		return Objects.hash(userId, courseCurrentPrice, courseType, classGroupId);
+		return Objects.hash(userId, courseOriginalPrice.doubleValue(), courseCurrentPrice.doubleValue(), courseType, classGroupId);
 	}
 }

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupStudentClassAdjust.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.dal.entity;
 
 import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -28,6 +30,9 @@ public class MusicGroupStudentClassAdjust {
 	@ApiModelProperty(value = "班级可排课时长", required = false)
 	private String classCourseMinute;
 
+	@ApiModelProperty(value = "主班剩余总时长", required = false)
+	private Integer masterClassCourseTimes;
+
 	@ApiModelProperty(value = "老师选择的每种类型的排课时长", required = false)
 	private String defaultCourseTypeMinute;
 
@@ -51,10 +56,29 @@ public class MusicGroupStudentClassAdjust {
 	@ApiModelProperty(value = "主班编号", required = false)
 	private Integer masterClassGroupId;
 
+	@ApiModelProperty(value = "主班剩余价值", required = false)
+	private BigDecimal masterTotalPrice;
+
 	private Date createTime;
 
 	private Date updateTime;
 
+	public BigDecimal getMasterTotalPrice() {
+		return masterTotalPrice;
+	}
+
+	public void setMasterTotalPrice(BigDecimal masterTotalPrice) {
+		this.masterTotalPrice = masterTotalPrice;
+	}
+
+	public Integer getMasterClassCourseTimes() {
+		return masterClassCourseTimes;
+	}
+
+	public void setMasterClassCourseTimes(Integer masterClassCourseTimes) {
+		this.masterClassCourseTimes = masterClassCourseTimes;
+	}
+
 	public Integer getMasterClassGroupId() {
 		return masterClassGroupId;
 	}

+ 0 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java

@@ -44,8 +44,6 @@ public class Student extends SysUser {
 	public Student(Integer userId, String subjectIdList) {
 		this.userId = userId;
 		this.subjectIdList = subjectIdList;
-		this.operatingTag = 1;
-		this.serviceTag = 1;
 	}
 
 	public Boolean getIsNewUser() {

+ 157 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPreRegistration.java

@@ -0,0 +1,157 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(student_pre_registration):
+ */
+public class StudentPreRegistration {
+
+	/**  */
+	private Long id;
+	
+	private String musicGroupId;
+	
+	/** 用户编号 */
+	private Integer userId;
+	
+	/** 联系方式 */
+	private String phone;
+	
+	/** 学生姓名 */
+	private String userName;
+	
+	/** 性别 */
+	private boolean gender;
+	
+	/** 年级 */
+	private String currentGrade;
+	
+	/** 班级 */
+	private String currentClass;
+	
+	/** 第一专业 */
+	private Integer subjectFirst;
+	
+	/** 第二专业 */
+	private Integer subjectSecond;
+	
+	/** 是否允许调剂 */
+	private boolean isAllowAdjust;
+	
+	/** 乐器提供方式 */
+	private String kitPurchaseMethod;
+	
+	/** 创建时间 */
+	private java.util.Date createTime;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public String getMusicGroupId() {
+		return musicGroupId;
+	}
+
+	public void setMusicGroupId(String musicGroupId) {
+		this.musicGroupId = musicGroupId;
+	}
+
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setPhone(String phone){
+		this.phone = phone;
+	}
+	
+	public String getPhone(){
+		return this.phone;
+	}
+			
+	public void setUserName(String userName){
+		this.userName = userName;
+	}
+	
+	public String getUserName(){
+		return this.userName;
+	}
+			
+	public void setGender(boolean gender){
+		this.gender = gender;
+	}
+	
+	public boolean isGender(){
+		return this.gender;
+	}
+			
+	public void setCurrentGrade(String currentGrade){
+		this.currentGrade = currentGrade;
+	}
+	
+	public String getCurrentGrade(){
+		return this.currentGrade;
+	}
+			
+	public void setCurrentClass(String currentClass){
+		this.currentClass = currentClass;
+	}
+	
+	public String getCurrentClass(){
+		return this.currentClass;
+	}
+			
+	public void setSubjectFirst(Integer subjectFirst){
+		this.subjectFirst = subjectFirst;
+	}
+	
+	public Integer getSubjectFirst(){
+		return this.subjectFirst;
+	}
+			
+	public void setSubjectSecond(Integer subjectSecond){
+		this.subjectSecond = subjectSecond;
+	}
+	
+	public Integer getSubjectSecond(){
+		return this.subjectSecond;
+	}
+			
+	public void setIsAllowAdjust(boolean isAllowAdjust){
+		this.isAllowAdjust = isAllowAdjust;
+	}
+	
+	public boolean getIsAllowAdjust(){
+		return this.isAllowAdjust;
+	}
+			
+	public void setKitPurchaseMethod(String kitPurchaseMethod){
+		this.kitPurchaseMethod = kitPurchaseMethod;
+	}
+	
+	public String getKitPurchaseMethod(){
+		return this.kitPurchaseMethod;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

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

@@ -0,0 +1,68 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/1/8 0008
+ **/
+public enum IndexDataType implements BaseEnum<String, IndexDataType> {
+    SCHOOL("SCHOOL","合作单位"),
+    MUSIC_GROUP_NUM("MUSIC_GROUP_NUM","乐团数量"),
+    MUSIC_GROUP_STUDENT("MUSIC_GROUP_STUDENT","乐团学员"),
+    OTHER_STUDENT("OTHER_STUDENT","其他学员"),
+
+    ACTIVATION_RATE("ACTIVATION_RATE","激活率"),
+    HOMEWORK_CREATE_RATE("HOMEWORK_CREATE_RATE","作业布置率"),
+    HOMEWORK_SUBMIT_RATE("HOMEWORK_SUBMIT_RATE","作业提交率"),
+    HOMEWORK_COMMENT_RATE("HOMEWORK_COMMENT_RATE","作业点评率"),
+
+    SHOULD_INCOME_MONEY("SHOULD_INCOME_MONEY","应收金额"),
+    ANTICIPATED_INCOME_MONEY("ANTICIPATED_INCOME_MONEY","预收金额"),
+    SHOULD_EXPEND_MONEY("SHOULD_EXPEND_MONEY","预付金额"),
+    ANTICIPATED_EXPEND_MONEY("ANTICIPATED_EXPEND_MONEY","应付金额"),
+    REVENUE_MONEY("REVENUE_MONEY","营收金额"),
+
+    TEACHER_NUM("TEACHER_NUM","老师总数"),
+    FULL_TIME_NUM("FULL_TIME_NUM","全职人数"),
+    PART_TIME_NUM("PART_TIME_NUM","兼职人数"),
+    DIMISSION_NUM("DIMISSION_NUM","离职人数"),
+
+    NEWLY_STUDENT_NUM("NEWLY_STUDENT_NUM","新增学员"),
+    QUIT_MUSIC_GROUP_STUDENT_NUM("QUIT_MUSIC_GROUP_STUDENT_NUM","退团学员"),
+    STUDENT_CONVERSION("STUDENT_CONVERSION","学员转化"),
+    STUDENT_CONVERSION_PRE_STUDENT_NUM("STUDENT_CONVERSION_PRE_STUDENT_NUM","预报名人数"),
+    STUDENT_CONVERSION_STUDENT_NUM("STUDENT_CONVERSION_STUDENT_NUM","报名人数"),
+    STUDENT_CONVERSION_PAYMENT_STUDENT_NUM("STUDENT_CONVERSION_PAYMENT_STUDENT_NUM","学员转化"),
+    STUDENT_CONVERSION_VIP_PRACTICE_STUDENT_NUM("STUDENT_CONVERSION_VIP_PRACTICE_STUDENT_NUM","VIP/网管课购买"),
+
+    MUSIC_GROUP_COURSE("MUSIC_GROUP_COURSE","乐团课"),
+    VIP_GROUP_COURSE("VIP_GROUP_COURSE","VIP课"),
+    PRACTICE_GROUP_COURSE("PRACTICE_GROUP_COURSE","网管课");
+
+    private String code;
+
+    private String msg;
+
+    IndexDataType(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

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

@@ -161,7 +161,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SMS_PAYMENT_DETAIL("SMS_PAYMENT_DETAIL","缴费项目缴费详情提醒"),
     SMS_PAYMENT_CREATE("SMS_PAYMENT_CREATE","缴费项目创建提醒"),
     SMS_GOODS_REPERTORY_WARN("SMS_GOODS_REPERTORY_WARN","商品库存预警"),
-    SMS_REPAIR_SEND_COMPLETED("SMS_REPAIR_SEND_COMPLETED","乐器维修完成邮寄");
+    SMS_REPAIR_SEND_COMPLETED("SMS_REPAIR_SEND_COMPLETED","乐器维修完成邮寄"),
+    SMS_MUSIC_GROUP_PARENT_MEETING_NOTICE("SMS_MUSIC_GROUP_PARENT_MEETING_NOTICE","乐团家长会通知");
 
 
 

+ 5 - 8
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MusicGroupStatusEnum.java

@@ -3,22 +3,19 @@ package com.ym.mec.biz.dal.enums;
 import com.ym.mec.common.enums.BaseEnum;
 
 public enum MusicGroupStatusEnum implements BaseEnum<String, MusicGroupStatusEnum> {
-	DRAFT("DRAFT", "草稿"), FEE_AUDIT("FEE_AUDIT","费用审核中"), AUDIT("AUDIT", "审核中"),
-	AUDIT_FAILED("AUDIT_FAILED", "审核失败"), APPLY("APPLY", "报名中"),
-	PAY("PAY", "缴费中"), PREPARE("PREPARE", "筹备中"),
-	PROGRESS("PROGRESS", "进行中"), CANCELED("CANCELED", "取消"), PAUSE("PAUSE", "暂停");
+	DRAFT("草稿"), AUDIT("审核中"), AUDIT_FAILED("审核失败"), PRE_APPLY("预报名"), PRE_BUILD_FEE("创建缴费"),
+	FEE_AUDIT("费用审核中"), APPLY("报名中"), PAY("缴费中"), PREPARE("筹备中"), PROGRESS(
+			"进行中"), CANCELED("取消"), PAUSE("暂停"), CLOSE("关闭");
 
-	private String code;
 	private String msg;
 
-	MusicGroupStatusEnum(String code, String msg) {
-		this.code = code;
+	MusicGroupStatusEnum(String msg) {
 		this.msg = msg;
 	}
 
 	@Override
 	public String getCode() {
-		return this.code;
+		return this.name();
 	}
 
 	public String getMsg() {

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeInfoQueryInfo.java

@@ -25,6 +25,9 @@ public class EmployeeInfoQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "职位", required = false)
 	private JobTypeEnum position;
 
+	@ApiModelProperty(value = "意向城市", required = false)
+	private String intentionCity;
+
 	@ApiModelProperty(value = "状态", required = false)
 	private StaffStatusEnum status;
 	
@@ -105,4 +108,12 @@ public class EmployeeInfoQueryInfo extends QueryInfo {
 	public void setOperator(String operator) {
 		this.operator = operator;
 	}
+
+	public String getIntentionCity() {
+		return intentionCity;
+	}
+
+	public void setIntentionCity(String intentionCity) {
+		this.intentionCity = intentionCity;
+	}
 }

+ 0 - 26
mec-biz/src/main/java/com/ym/mec/biz/dal/page/GroupNoticeQueryInfo.java

@@ -1,26 +0,0 @@
-package com.ym.mec.biz.dal.page;
-
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.common.page.QueryInfo;
-
-public class GroupNoticeQueryInfo extends QueryInfo {
-    private Long groupId;
-
-    private YesOrNoEnum isTop;
-
-    public Long getGroupId() {
-        return groupId;
-    }
-
-    public void setGroupId(Long groupId) {
-        this.groupId = groupId;
-    }
-
-    public YesOrNoEnum getIsTop() {
-        return isTop;
-    }
-
-    public void setIsTop(YesOrNoEnum isTop) {
-        this.isTop = isTop;
-    }
-}

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ImGroupNoticeQueryInfo.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class ImGroupNoticeQueryInfo extends QueryInfo {
+    private Long groupId;
+
+    public Long getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(Long groupId) {
+        this.groupId = groupId;
+    }
+
+}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentPaymentOrderQueryInfo.java

@@ -61,6 +61,10 @@ public class StudentPaymentOrderQueryInfo extends QueryInfo {
 
     private List<Integer> userIds;
 
+    //不包含淘气
+    @ApiModelProperty(value = "传时不包含淘气",required = false)
+    private Integer noneTqType;//TQ 1-不包含淘气
+
     private boolean isExport = false;
 
     public boolean getIsExport() {
@@ -214,4 +218,12 @@ public class StudentPaymentOrderQueryInfo extends QueryInfo {
     public void setLessBalancePaymentAmount(BigDecimal lessBalancePaymentAmount) {
         this.lessBalancePaymentAmount = lessBalancePaymentAmount;
     }
+
+    public Integer getNoneTqType() {
+        return noneTqType;
+    }
+
+    public void setNoneTqType(Integer noneTqType) {
+        this.noneTqType = noneTqType;
+    }
 }

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

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.dal.page;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class StudentPreRegistrationQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "乐团编号",required = false)
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "是否允许调剂",required = false)
+    private String isAllowAdjust;
+
+    @ApiModelProperty(value = "专业编号",required = false)
+    private Integer subjectId;
+
+    @ApiModelProperty(value = "用户名或手机号",required = false)
+    private String name;
+
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getIsAllowAdjust() {
+        return isAllowAdjust;
+    }
+
+    public void setIsAllowAdjust(String isAllowAdjust) {
+        this.isAllowAdjust = isAllowAdjust;
+    }
+
+}

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

@@ -42,21 +42,21 @@ public class CourseEventListener {
     @Async
     @EventListener
     public void courseStatusChangeMonitor(CourseStatusChangeEvent courseStatusChangeEvent){
-        if(redisCache.getRedisTemplate().opsForValue().size(KEY)>0){
-            logger.info("课程状态变更(未执行,任务执行中):{}", courseStatusChangeEvent.getCourseIds());
-            return;
-        }
-
-        Boolean success = redisCache.getRedisTemplate().opsForValue().setIfAbsent(KEY, Thread.currentThread().getId(), 1, TimeUnit.HOURS);
-        if(!success){
-            logger.info("课程状态变更(未执行,任务执行中):{}", courseStatusChangeEvent.getCourseIds());
-            return;
-        }
-
-        logger.info("课程状态变更(执行开始):{}", courseStatusChangeEvent.getCourseIds());
+//        if(redisCache.getRedisTemplate().opsForValue().size(KEY)>0){
+//            logger.info("课程状态变更(未执行,任务执行中):{}", courseStatusChangeEvent.getCourseIds());
+//            return;
+//        }
+//
+//        Boolean success = redisCache.getRedisTemplate().opsForValue().setIfAbsent(KEY, Thread.currentThread().getId(), 1, TimeUnit.HOURS);
+//        if(!success){
+//            logger.info("课程状态变更(未执行,任务执行中):{}", courseStatusChangeEvent.getCourseIds());
+//            return;
+//        }
+//
+//        logger.info("课程状态变更(执行开始):{}", courseStatusChangeEvent.getCourseIds());
 
         try{
-            courseScheduleStudentPaymentService.updateCourseActualPrice();
+            courseScheduleStudentPaymentService.updateCourseActualPrice(null, null, null);
         } finally {
             redisCache.delete(KEY);
         }

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

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
 import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.page.PageInfo;
@@ -381,9 +382,10 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * 添加IM群组
      * @param classGroup
      * @param userIds
+     * @param teacherIdList
      * @return
      */
-    Boolean addImGroup(ClassGroup classGroup,List<Integer> userIds);
+    Boolean addImGroup(ClassGroup classGroup,List<Integer> userIds, List<Integer> teacherIdList);
 
     /**
      * 检测是否设置课酬
@@ -487,7 +489,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param mergeClassSplitClassAffirmDto
      * @return
      */
-    String mergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) throws InvocationTargetException, IllegalAccessException, Exception;
+    HttpResponseResult mergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) throws InvocationTargetException, IllegalAccessException, Exception;
 
     /**
      * 进行中乐团-修改-班级详情-学员班级调整-合并结果确认-获取新班级的可排课时长
@@ -501,10 +503,9 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * 获取基础技能班/线上基础技能班数量和容许最大数量
      * @param musicGroupId
      * @param type
-     * @param subjectIds
      * @return
      */
-    HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId,ClassGroupTypeEnum type,String subjectIds);
+    HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId,ClassGroupTypeEnum type);
 
     /**
      * 进行中乐团-修改-班级详情-班级合并-获取学员需要补交的费用以及需要退还的课程余额
@@ -513,7 +514,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param studentIds
      * @return
      */
-    List<MusicGroupPaymentCalenderStudentDetail> queryStudentPaymentCalenders(Integer masterClassGroupId,List<Map<Integer, String>> classGroupStudents,List<Integer> studentIds);
+    List<MusicGroupPaymentCalenderStudentDetail> queryStudentPaymentCalenders(Integer masterClassGroupId,String classGroupStudents,List<Integer> studentIds);
 
     /**
      * 获取主班课程类型剩余价值
@@ -534,7 +535,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param mergeClassSplitClassAffirmDto
      * @return
      */
-    void spanGroupMergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto);
+    HttpResponseResult spanGroupMergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto);
 
     /**
      * 跨团合班缴费项目审核通过后
@@ -543,5 +544,5 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param courseIds
      * @param classGroupStudents
      */
-    void spanGroupClassAdjustPass(Integer masterClassGroupId,List<Integer> studentIds,List<Long> courseIds,List<Map<Integer, String>> classGroupStudents);
+    void spanGroupClassAdjustPass(Integer masterClassGroupId,List<Integer> studentIds,List<Long> courseIds,List<Map> classGroupStudents,List<Long> allLockCourseIds,String batchNo,BigDecimal masterTotalPrice);
 }

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

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.common.service.BaseService;
 
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Set;
 
@@ -89,4 +90,13 @@ public interface ClassGroupStudentMapperService extends BaseService<Long, ClassG
      */
     void updateClassGroupStudents(Long classGroupId, Set<Integer> studentIds);
 
+    /**
+     * @describe 更新班级学员
+     * @date 2020.11.04
+     * @param classGroupId:
+     * @param studentIds:
+     * @return void
+     */
+    void updateClassGroupStudents1(Long classGroupId, List<Integer> studentIds, List<Long> allLockCourseIds, String batchNo, BigDecimal masterTotalPrice);
+
 }

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

@@ -1,17 +1,11 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
-import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.common.service.BaseService;
-import org.snaker.engine.access.Page;
-
 import java.util.List;
 import java.util.Map;
 
@@ -125,6 +119,6 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	 * @date 2020/12/2 0002
 	 * @return void
 	 */
-	void updateCourseActualPrice();
+	void updateCourseActualPrice(List<String> groupIds, List<Integer> userIds, GroupType groupType);
 
 }

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

@@ -83,4 +83,14 @@ public interface EmployeeService extends BaseService<Integer, Employee> {
      * @param employeeLevelDtos
      */
     void level(List<EmployeeLevelDto> employeeLevelDtos);
+
+    /**
+     * @describe 根据角色和部门获取用户(包含冻结和离职的)
+     * @author Joburgess
+     * @date 2020/3/12
+     * @param roleIds: 角色编号列表
+     * @param organIds: 用户编号列表
+     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
+     */
+    List<SimpleUserDto> findAllByRole(String roleIds,String organIds);
 }

+ 62 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java

@@ -0,0 +1,62 @@
+package com.ym.mec.biz.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.ym.mec.biz.dal.entity.ImGroupMember;
+import com.ym.mec.common.service.BaseService;
+
+public interface ImGroupMemberService extends BaseService<Long, ImGroupMember> {
+
+	/**
+	 * 加入群组
+	 * @param imGroupId 群编号
+	 * @param userId 用户编号
+	 * @param roleType 角色类型
+	 * @param isAdmin 是否是管理员
+	 * @return
+	 */
+	boolean join(Long imGroupId, Integer userId, String roleType, boolean isAdmin);
+
+	/**
+	 * 批量加入群组
+	 * @param imGroupId 群组编号
+	 * @param userRoleMap key-用户编号  value-角色类型
+	 * @return
+	 */
+	boolean join(Long imGroupId, Map<Integer, String> userRoleMap);
+
+	/**
+	 * 指定用户退出群组
+	 * @param imGroupId 群组编号
+	 * @param userId 指定的用户编号
+	 * @return
+	 */
+	boolean quit(Long imGroupId, Integer userId);
+
+	/**
+	 * 退出指定群组
+	 * @param imGroupIdList 群组编号列表
+	 * @param userId 用户编号
+	 * @return
+	 */
+	boolean quit(List<Long> imGroupIdList, Integer userId);
+
+	/**
+	 * 用户批量退出群组
+	 * @param imGroupId 群组编号
+	 * @param userIdList 学生编号
+	 * @return
+	 */
+	boolean quit(Long imGroupId, List<Integer> userIdList);
+
+	/**
+	 * 修改角色类型
+	 * @param imGroupId 群组编号
+	 * @param userId 用户编号
+	 * @param roleType 角色类型
+	 * @return
+	 */
+	boolean updateRoleType(Long imGroupId, Integer userId, String roleType);
+
+}

+ 12 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupNoticeService.java

@@ -1,9 +1,19 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.ImGroupNoticeDto;
 import com.ym.mec.biz.dal.entity.ImGroupNotice;
+import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface ImGroupNoticeService extends BaseService<Long, ImGroupNotice> {
+	
+	PageInfo<ImGroupNoticeDto> queryPage(ImGroupNoticeQueryInfo queryInfo);
 
-    ImGroupNotice getNewNotice(Long groupId);
-}
+	/**
+	 * 查询最新的群公告
+	 * @param imGroupId
+	 * @return
+	 */
+	ImGroupNoticeDto queryLatestNotice(Long imGroupId);
+}

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.service;
+
+import java.util.List;
+
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.common.service.BaseService;
+
+public interface ImGroupService extends BaseService<Long, ImGroup> {
+
+	/**
+	 * 创建群组
+	 * @param id 群编号
+	 * @param userId 创建人编号
+	 * @param name 群名称
+	 * @param introduce 群介绍
+	 * @param memo 群备注
+	 * @param tags 群标签
+	 * @param img 群图像
+	 * @param type 群类型
+	 * @return
+	 */
+	boolean create(Long id, Integer userId, String name, String introduce, String memo, String tags, String img, String type);
+
+	/**
+	 * 解散群组
+	 * @param imGroupId
+	 * @return
+	 */
+	boolean cancel(Long imGroupId);
+
+	/**
+	 * 查询用户所在的群列表
+	 * @param userId
+	 * @param search
+	 * @return
+	 */
+	List<ImGroup> queryByUserId(Integer userId, String search);
+
+	/**
+	 * 查询群成员列表
+	 * @param imGroupId
+	 * @return
+	 */
+	List<ImGroupMemberDto> queryMemberById(Long imGroupId);
+
+	/**
+	 * 查询指定用户在群众的信息
+	 * @param imGroupId 群编号
+	 * @param userId 指定的用户编号
+	 * @return
+	 */
+	ImGroupMemberDto queryMember(Long imGroupId, Integer userId);
+}

+ 83 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImUserFriendService.java

@@ -0,0 +1,83 @@
+package com.ym.mec.biz.service;
+
+import java.util.List;
+import java.util.Set;
+
+import com.ym.mec.biz.dal.dto.ImUserFriendDto;
+import com.ym.mec.biz.dal.entity.ImUserFriend;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.common.service.BaseService;
+
+public interface ImUserFriendService extends BaseService<Long, ImUserFriend> {
+
+	/**
+	 * 添加好友
+	 * @param userId 用户编号
+	 * @param friendUserId 好友编号
+	 * @param nickname 昵称
+	 * @param memo 备注
+	 * @return
+	 */
+	boolean addFriend(Integer userId, Integer friendUserId, String nickname, String memo);
+
+	/**
+	 * 删除好友
+	 * @param userId 用户编号
+	 * @param friendUserId 好友编号
+	 * @return
+	 */
+	boolean deleteFriend(Integer userId, Integer friendUserId);
+
+	/**
+	 * 修改好友昵称
+	 * @param userId 用户编号
+	 * @param friendUserId 好友编号
+	 * @param nickname 昵称
+	 * @return
+	 */
+	boolean updateFriendNickname(Integer userId, Integer friendUserId, String nickname);
+
+	/**
+	 * 根据条件查询指定用户的好友列表
+	 * @param userId 指定用户的编号
+	 * @param search 搜索条件
+	 * @return
+	 */
+	List<ImUserFriendDto> queryFriendListByUserId(Integer userId, String search);
+
+	/**
+	 * 查询当前用户的好友详情
+	 * @param userId 当前用户编号
+	 * @param friendUserId 好友编号
+	 * @return
+	 */
+	ImUserFriendDto queryFriendDetail(Integer userId, Integer friendUserId);
+
+	/**
+	 * 用户通讯录新增
+	 * @param imUserFriends
+	 */
+    void batchInsert(List<ImUserFriend> imUserFriends);
+
+	/**
+	 * 刷新班级通讯录
+	 * @param courseScheduleId
+	 * @author zouxuan
+	 */
+	void refreshCourseImUserFriend(Long courseScheduleId);
+
+	/**
+	 * 刷新班级通讯录
+	 * @param classGroupId
+	 * @author zouxuan
+	 */
+	void refreshClassImUserFriend(Integer classGroupId);
+
+	/**
+	 * 刷新课程组通讯录
+	 * @param musicGroupId
+	 * @param groupType
+	 * @author zouxuan
+	 */
+	void refreshGroupImUserFriend(String musicGroupId,GroupType groupType);
+}

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/IndexBaseMonthDataService.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.ym.mec.biz.dal.dto.IndexBaseDto;
+import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
+import com.ym.mec.common.service.BaseService;
+
+public interface IndexBaseMonthDataService extends BaseService<Long, IndexBaseMonthData> {
+
+    List<IndexBaseDto> getIndexBaseData(String dataType, String organIds, Integer year);
+
+    Map<String, List<IndexBaseDto>> indexBaseDataTask(String month);
+
+}

+ 0 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/IndexService.java

@@ -1,17 +0,0 @@
-package com.ym.mec.biz.service;
-
-import com.ym.mec.biz.dal.dto.IndexBaseDto;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @Author Joburgess
- * @Date 2021/1/7 0007
- **/
-public interface IndexService {
-
-    Map<String, List<IndexBaseDto>> getIndexBaseData(Set<String> dataType, String organIds, String startMonth, String endMonth);
-
-}

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

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDto;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentClassAdjust;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.page.MusicGroupPaymentCalenderQueryInfo;
 import com.ym.mec.common.page.PageInfo;
@@ -116,7 +117,7 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	 * @author zouxuan
 	 * @param batchNo
 	 */
-	public void autoClassGroupAdjust(String batchNo);
+	public void autoClassGroupAdjust(MusicGroupStudentClassAdjust musicGroupStudentClassAdjust);
 
 	/**
 	 * @describe 审核拒绝

+ 49 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -7,16 +7,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
-import com.ym.mec.biz.dal.dto.MusicCardDto;
-import com.ym.mec.biz.dal.dto.RegisterPayDto;
-import com.ym.mec.biz.dal.dto.SporadicPayDto;
-import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
-import com.ym.mec.biz.dal.dto.UpdateExpectedNumDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ApprovalStatus;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
 import com.ym.mec.common.entity.ImGroupMember;
@@ -30,6 +25,31 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 * @Author superzou
 	 */
 	String createGroup(SubFeeSettingDto subFeeSettingDto) throws Exception;
+	
+	/**
+	 * 预报名
+	 * @param studentPreRegistration
+	 * @return
+	 */
+	boolean preRegister(StudentPreRegistration studentPreRegistration);
+	
+	/**
+	 * 结束预报名
+	 * @param musicGroupId
+	 * @param isCheckStudentNum
+	 * @return
+	 */
+	boolean finishPreApply(String musicGroupId,boolean isCheckStudentNum);
+
+	/**
+	 * 发送家长会通知
+	 * @param userId
+	 * @param musicGroupId
+	 * @param meetingDate
+	 * @param address
+	 * @return
+	 */
+	boolean sendParentMeetingNotice(Integer userId, String musicGroupId, Date meetingDate, String address);
 
 	/**
 	 * 零星缴费
@@ -77,7 +97,7 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 * @param musicGroupId 乐团编号
 	 */
 	boolean cancelMusicGroup(String musicGroupId);
-	
+
 	/**
 	 * 删除乐团
 	 * @param musicGroupId 乐团编号
@@ -114,13 +134,21 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	boolean extensionApplyExpireDate(String musicGroupId, Date expireDate);
 
 	/**
+	 * 延长预报名时间
+	 * @param musicGroupId 乐团编号
+	 * @param expireDate 预报名的截止日期
+	 * @return
+	 */
+	boolean extensionPreApplyExpireDate(String musicGroupId, Date expireDate);
+
+	/**
 	 * 申请退团
 	 * @param musicGroupId 乐团编号
 	 * @param reason
 	 * @return
 	 */
 	boolean applyQuitMusicGroup(String musicGroupId, String reason);
-	
+
 	/**
 	 * 取消退团
 	 * @param userId
@@ -290,7 +318,7 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	void musicGroupAuditFailed(String musicGroupId, String memo) throws Exception;
 
 	/**
-	 * 审核通过(审核中 -> 报名
+	 * 审核通过(审核中 -> 报名)
 	 * @param musicGroupId
 	 */
 	void musicGroupAuditSuccess(String musicGroupId) throws Exception;
@@ -320,9 +348,17 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 
 	/**
 	 * 给乐团添加报名学生
-	 * @param musicGroupId
-	 * @param registerIds
-	 * @return
+	 * @param musicGroupId 乐团id
+	 * @param registerIds 学员注册id
+	 * @return 添加学员记录
 	 */
 	List<StudentRegistration> addMusicGroupRegs(String musicGroupId,List<Long> registerIds);
+
+
+	/**
+	 * 关闭乐团
+	 * @param closeMusicGroupDto 乐团关闭信息
+	 * @return 关闭结果
+	 */
+	Boolean closeMusicGroup(CloseMusicGroupDto closeMusicGroupDto);
 }

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

@@ -0,0 +1,12 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.StudentPreRegistrationDto;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.service.BaseService;
+
+public interface StudentPreRegistrationService extends BaseService<Long, StudentPreRegistration> {
+	
+	public PageInfo<StudentPreRegistrationDto> queryListForPage(QueryInfo queryInfo);
+}

+ 25 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -141,10 +141,9 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @param studentIds 学员列表
      * @param oldMusicGroupId 原乐团
      * @param newMusicGroupId 主乐团
-     * @param masterTotalPrice 主乐团剩余课程价值
      * @return
      */
-    void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,BigDecimal masterTotalPrice);
+    void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect);
 
     /**
      * 获取班级学生
@@ -328,4 +327,28 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      */
     List<StudentMusicGroupDto> queryStudentMusicGroupInfo(Integer userId);
 
+
+    /**
+     * 删除学生报名
+     * @param id
+     * @return
+     */
+    Boolean delReg(Long id);
+
+
+    /**
+     * 批量删除报名的学生
+     * @param userIds
+     * @return
+     */
+    Boolean batchDelRegs(String musicGroupId,List<Integer> userIds);
+
+
+    /**
+     * 获取乐团学员剩余课程金额
+     * @param musicGroupId
+     * @return
+     */
+    List<StudentRegistration> getMusicGroupStuReBack(String musicGroupId);
+
 }

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

@@ -73,6 +73,14 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
     List<BasicUserDto> queryGroupStudents(Integer id, String search);
 
     /**
+     * 获取教师通讯录
+     * @param id
+     * @param search
+     * @return
+     */
+    List<ImUserFriendDto> queryGroupStudents1(Integer id, String search);
+
+    /**
      * 获取教师通讯录学员列表
      * @param id
      * @param search
@@ -194,4 +202,10 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
      * @return
      */
     List<TeacherDefaultSalaryDto> queryTeacherDefaultSalary(String organIdList);
+
+    /**
+     * 获取所有教师编号列表
+     * @return
+     */
+    List<Integer> queryAllIds();
 }

+ 234 - 200
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -7,6 +7,7 @@ import static com.ym.mec.biz.dal.enums.GroupType.COMM;
 import static com.ym.mec.biz.dal.enums.GroupType.MUSIC;
 import static com.ym.mec.biz.dal.enums.GroupType.PRACTICE;
 import static com.ym.mec.biz.dal.enums.GroupType.VIP;
+import static com.ym.mec.biz.dal.enums.MusicGroupStatusEnum.PROGRESS;
 
 import java.math.BigDecimal;
 import java.time.Duration;
@@ -32,6 +33,9 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.util.collection.ListUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -72,7 +76,6 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateConvertor;
 import com.ym.mec.util.date.DateUtil;
@@ -131,14 +134,17 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private StudentRegistrationService studentRegistrationService;
     @Autowired
-    private ImFeignService imFeignService;
+    private ImGroupMemberService imGroupMemberService;
+    @Autowired
+    private ImGroupService imGroupService;
+    @Autowired
+    private ImUserFriendService imUserFriendService;
     @Autowired
     private CourseScheduleService courseScheduleService;
     @Autowired
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
     @Autowired
     private StudentApplyRefundsDao studentApplyRefundsDao;
-
     @Autowired
     private RedisCache<String, Object> redisCache;
     @Autowired
@@ -215,11 +221,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         //基础技能班和线上基础技能班,可分班原则为声部人数/6向上取整
         if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) || classGroup.getType().equals(ClassGroupTypeEnum.HIGH)) {
-            String subjectIds = classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) ? classGroup.getMemo() : classGroup.getSubjectIdList();
-            HighClassGroupNumDto highClassGroupNumDto = getSubjectMaxHighClassGroupNum(classGroup.getMusicGroupId(), classGroup.getType(), subjectIds);
+            HighClassGroupNumDto highClassGroupNumDto = getSubjectMaxHighClassGroupNum(classGroup.getMusicGroupId(), classGroup.getType());
             if (highClassGroupNumDto.getNowHighClassGroupNum() >= highClassGroupNumDto.getMaxHighClassGroupNum()) {
                 String errMsg = classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) ? "线上基础技能班" : "基础技能班";
-                throw new BizException("此乐团所选声部," + errMsg + "数量不能大于" + highClassGroupNumDto.getMaxHighClassGroupNum());
+                throw new BizException("此乐团," + errMsg + "数量不能大于" + highClassGroupNumDto.getMaxHighClassGroupNum());
             }
         }
 
@@ -239,6 +244,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         insert(classGroup);
 
         //设置班级上的老师
+        List<Integer> teacherIdList = new ArrayList<>();
         List<ClassGroupTeacherMapper> teacherMapperList = classGroup.getTeacherMapperList();
         for (ClassGroupTeacherMapper tm : teacherMapperList) {
             tm.setClassGroupId(classGroup.getId());
@@ -246,6 +252,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             tm.setGroupType(classGroup.getGroupType());
             tm.setCreateTime(date);
             tm.setUpdateTime(date);
+            teacherIdList.add(tm.getUserId());
         }
 
         if (teacherMapperList.size() > 0) {
@@ -279,7 +286,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         // 加入IM群组
         if (userIdList.size() > 0) {
-            addImGroup(classGroup, userIdList);
+            addImGroup(classGroup, userIdList, teacherIdList);
         }
         return true;
     }
@@ -361,7 +368,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentList);
 
         //加入IM群组
-        addImGroup(classGroup, userIdList);
+        addImGroup(classGroup, userIdList, null);
         return classGroup;
     }
 
@@ -427,7 +434,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         classGroupRelationService.classGroupRelationsInsert(classGroupRelationList);
 
         //加入IM群组
-        addImGroup(classGroup, userIdList);
+        addImGroup(classGroup, userIdList, null);
 
         return classGroup;
     }
@@ -476,7 +483,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 for (ClassGroup classGroup : classGroups) {
                     imGroupModelList.add(new ImGroupModel(classGroup.getId().toString(), null, classGroup.getName()));
                 }
-                imFeignService.groupBatchDismiss(imGroupModelList);
+                //imFeignService.groupBatchDismiss(imGroupModelList);
             }
 
             List<CourseSchedule> courseScheduleList = new ArrayList<>();
@@ -575,7 +582,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
 
             // 加入Im群组
-            batchAddImGroup(classGroupImGroupList);
+            //batchAddImGroup(classGroupImGroupList);
             classGroupTeacherMapperService.classGroupTeachersInsert(classGroupTeacherMapperList);
             // 检测新排课冲突
             courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
@@ -1087,8 +1094,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
 
         //5、加入班级群组
-        ImGroupMember[] imGroupMembers = new ImGroupMember[]{new ImGroupMember(userId.toString())};
-        imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+        imGroupMemberService.join(classGroup.getId().longValue(), userId, null, false);
 
         return classGroup;
     }
@@ -1234,8 +1240,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
 
             // 5、加入班级群组
-            ImGroupMember[] imGroupMembers = new ImGroupMember[]{new ImGroupMember(studentId.toString())};
-            imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+            imGroupMemberService.join(classGroup.getId().longValue(), studentId, null, false);
 
         }
 
@@ -1257,6 +1262,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 }
             }
             courseScheduleStudentPaymentService.batchInsert(courseScheduleStudentPayments);
+            studentDao.updateStudentServiceTag(studentId,null,YesOrNoEnum.YES.getCode());
         }
 
         return true;
@@ -1296,7 +1302,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //删除班级
         classGroupDao.delete(classGroupId);
         //删除im群组
-        imFeignService.groupQuit(new ImGroupModel(classGroupId.toString(), null, null));
+        imGroupService.cancel(classGroupId.longValue());
     }
 
     @Override
@@ -1318,7 +1324,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //删除合奏班
         classGroupDao.delete(classGroupId);
         //删除im群组
-        imFeignService.groupQuit(new ImGroupModel(classGroupId.toString(), null, null));
+        imGroupService.cancel(classGroupId.longValue());
     }
 
     @Override
@@ -1765,12 +1771,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             throw new BizException("主教与助教存在冲突");
         }
 
+        List<Integer> teacherIds = new ArrayList<>();
         Integer teacherId = null;
         for (ClassGroupTeacherMapper groupTeacherMapper : classGroupTeacherMapperList) {
             groupTeacherMapper.setGroupType(classGroup.getGroupType());
             groupTeacherMapper.setClassGroupId(classGroup.getId());
             groupTeacherMapper.setMusicGroupId(classGroup4MixDtos.get(0).getMusicGroupId());
-            userIds.add(groupTeacherMapper.getUserId());
+            teacherIds.add(groupTeacherMapper.getUserId());
             if (groupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP)) {
                 teacherId = groupTeacherMapper.getUserId();
             }
@@ -1787,7 +1794,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
 
         //创建IM群组
-        addImGroup(classGroup, userIds);
+        addImGroup(classGroup, userIds, teacherIds);
 
 
         Map<String, Integer> courseTypeMinutesMap = musicGroupPaymentCalenderCourseSettingsService.getMusicCourseSettingsWithStudents(musicGroupId, studentIdList);
@@ -1911,6 +1918,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //学生结算表
         if (courseScheduleList.size() > 0) {
             courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIdList);
+            studentDao.updateStudentServiceTag(null, studentIdList, YesOrNoEnum.YES.getCode());
         }
         return classGroup;
     }
@@ -2094,10 +2102,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<ClassGroupTeacherMapper> classGroupTeacherMapperList = classGroup4MixDto.getClassGroupTeacherMapperList();
 
         MusicGroupStudentClassAdjust classAdjust = musicGroupStudentClassAdjustDao.get(classGroup4MixDto.getMusicGroupStudentClassAdjustId());
-        //获取默认的排课时长
-//        String courseDefaultMinutes = sysConfigDao.findConfigValue("music_course_default_minutes");
-        JSONObject jsonObject = JSON.parseObject(classAdjust.getDefaultCourseTypeMinute());
-        long classCourseDuration = Integer.parseInt(jsonObject.get(classGroup4MixDto.getCourseType().getCode()).toString());
         ClassGroup classGroup = classGroup4MixDto.getClassGroup();
         if (classGroup == null) {
             //建班
@@ -2125,16 +2129,17 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
             classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMapperList);
 
+            List<Integer> teacherIds = new ArrayList<>();
             for (ClassGroupTeacherMapper groupTeacherMapper : classGroupTeacherMapperList) {
                 groupTeacherMapper.setGroupType(classGroup.getGroupType());
                 groupTeacherMapper.setClassGroupId(classGroup.getId());
                 groupTeacherMapper.setMusicGroupId(classGroup4MixDto.getMusicGroupId());
-                userIds.add(groupTeacherMapper.getUserId());
+                teacherIds.add(groupTeacherMapper.getUserId());
             }
             //3、将老师加入关联关系
             classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
             //创建IM群组
-            addImGroup(classGroup, userIds);
+            addImGroup(classGroup, userIds, teacherIds);
         }
         //排课
         List<CourseSchedule> courseScheduleList = new ArrayList<>();
@@ -2145,15 +2150,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             //冲突校验
             courseScheduleList = autoAdjust(classGroup4MixDto, courseScheduleList, classAdjust);
 
-            List<Integer> allTeacherIds = classGroupTeacherMapperList.stream()
-                    .map(ClassGroupTeacherMapper::getUserId)
-                    .collect(Collectors.toList());
-
-            //所有教师列表
-            List<Teacher> teachers = teacherDao.findByTeacherIds(allTeacherIds);
-            Map<Integer, Teacher> teacherMap = teachers.stream()
-                    .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
-
             courseScheduleDao.batchAddCourseSchedules(courseScheduleList);
 
             //计算每节课的课酬
@@ -2206,26 +2202,25 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
 
         List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupId);
-        if (byClassGroup != null && byClassGroup.size() > 0) {
-            ClassGroupTeacherMapper groupTeacherMapper = byClassGroup.stream().filter(classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole() == TeachTypeEnum.BISHOP).findFirst().get();
-            if (groupTeacherMapper != null) {
-                ImGroupMember[] imGroupMembers = {new ImGroupMember(groupTeacherMapper.getUserId().toString())};
-                imFeignService.groupQuit(new ImGroupModel(classGroupId.toString(), imGroupMembers, classGroup.getName()));
-            }
-        }
-
         List<ClassGroupTeacherMapper> newTeacherMapperList = classGroup4MixDtos.get(0).getClassGroupTeacherMapperList();
-        if (newTeacherMapperList.size() > 0) {
-            //获取之前的班级老师
-            Set<Integer> groupTeacher = classGroupDao.findGroupTeacher(classGroupId);
-            groupTeacher.forEach(e -> {
-                ImGroupMember[] imGroupMembers = {new ImGroupMember(e.toString())};
-                imFeignService.groupQuit(new ImGroupModel(classGroupId.toString(), imGroupMembers, classGroup.getName()));
-            });
-            newTeacherMapperList.forEach(e -> {
-                ImGroupMember[] imGroupMembers = {new ImGroupMember(e.getUserId().toString())};
-                imFeignService.groupJoin(new ImGroupModel(classGroupId.toString(), imGroupMembers, classGroup.getName()));
-            });
+        MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
+        if(musicGroup.getStatus() == PROGRESS){
+            if (byClassGroup != null && byClassGroup.size() > 0) {
+                ClassGroupTeacherMapper groupTeacherMapper = byClassGroup.stream().filter(classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole() == TeachTypeEnum.BISHOP).findFirst().get();
+                if (groupTeacherMapper != null) {
+                    imGroupMemberService.quit(classGroupId.longValue(), groupTeacherMapper.getUserId());
+                }
+            }
+            if (newTeacherMapperList.size() > 0) {
+                //获取之前的班级老师
+                Set<Integer> groupTeacher = classGroupDao.findGroupTeacher(classGroupId);
+                groupTeacher.forEach(e -> {
+                    imGroupMemberService.quit(classGroupId.longValue(), e);
+                });
+                newTeacherMapperList.forEach(e -> {
+                    imGroupMemberService.join(classGroupId.longValue(), e.getUserId(), "指导老师", false);
+                });
+            }
         }
         if (Objects.nonNull(classGroup4MixDtos.get(0).getCourseAddType()) && classGroup4MixDtos.get(0).getCourseAddType().equals("onlyUpdateTeacher")) {
             List<Integer> classGroupIds = new ArrayList<>();
@@ -2249,8 +2244,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         classGroupService.updateTotalClassTimes(classGroup.getId(), courseTimes);
 
-        MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
-
         Integer schoolId = teachMode.equals(TeachModeEnum.ONLINE) ? null : musicGroup.getSchoolId();
 
         List<Subject> subjectList = subjectService.findBySubjectByIdList(classGroup.getSubjectIdList());
@@ -2279,11 +2272,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 .map(ClassGroupTeacherMapper::getUserId)
                 .collect(Collectors.toList());
 
-        //所有教师列表
-        List<Teacher> teachers = teacherDao.findByTeacherIds(allTeacherIds);
-        Map<Integer, Teacher> teacherMap = teachers.stream()
-                .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
-
         Set<String> newTeacher = newClassGroupTeacherMapperList.stream().map(
                 classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole().getCode() + classGroupTeacherMapper.getUserId()
         ).collect(Collectors.toSet());
@@ -2320,7 +2308,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
             Integer totalMinutes = courseTypeMinutesMap.get(classGroup4MixDto.getCourseType().getCode());
             long totalCourseDuration = 0;
-//            classGroup4MixDto.setCourseTimes(totalMinutes/(int)courseDuration);
 
             if (classGroup4MixDto.getCourseTimes() <= 0) {
                 throw new BizException("{}课程类型剩余课程时长不足", classGroup4MixDto.getCourseType().getMsg());
@@ -2406,12 +2393,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
         }
 
-        //排课处理
-//        if (classGroup.getType().equals(ClassGroupTypeEnum.SNAP)) {
-//            courseScheduleService.checkSnapCourseShchedules(courseScheduleList);
-//        } else {
         courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
-//        }
 
         //老师结算表
         if (courseScheduleTeacherSalaryList.size() > 0) {
@@ -2424,7 +2406,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             //学生结算表
             courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIds);
         }
-
+        if(musicGroup.getStatus() == PROGRESS){
+            imUserFriendService.refreshClassImUserFriend(classGroupId);
+        }
         return classGroup;
     }
 
@@ -2495,11 +2479,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
 
         Integer teacherId = null;
+        List<Integer> teacherIds = new ArrayList<>();
         for (ClassGroupTeacherMapper groupTeacherMapper : classGroupTeacherMapperList) {
             groupTeacherMapper.setGroupType(classGroup.getGroupType());
             groupTeacherMapper.setClassGroupId(classGroup.getId());
             groupTeacherMapper.setMusicGroupId(classGroup4MixDtos.get(0).getMusicGroupId());
-            userIds.add(groupTeacherMapper.getUserId());
+            teacherIds.add(groupTeacherMapper.getUserId());
             if (groupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP)) {
                 teacherId = groupTeacherMapper.getUserId();
             }
@@ -2516,7 +2501,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
 
         //创建IM群组
-        addImGroup(classGroup, userIds);
+        addImGroup(classGroup, userIds, teacherIds);
 
         Map<String, Integer> courseTypeMinutesMap = musicGroupPaymentCalenderCourseSettingsService.getMusicCourseSettingsWithStudents(musicGroupId, studentIdList);
 
@@ -2635,6 +2620,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //学生结算表
         if (!CollectionUtils.isEmpty(studentIdList)) {
             courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIdList);
+            studentDao.updateStudentServiceTag(null, studentIdList, YesOrNoEnum.YES.getCode());
         }
         return classGroup;
     }
@@ -2938,6 +2924,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null));
             Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countExpendNumByClassGroupId(classGroupSet));
+
             for (ClassGroupTeachersDto classGroup : dataList) {
                 List<ClassGroupTeacherMapper> classGroupTeacherMappers = new ArrayList<>();
                 for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
@@ -2966,25 +2953,27 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public Boolean addImGroup(ClassGroup classGroup, List<Integer> userIds) {
+    public Boolean addImGroup(ClassGroup classGroup, List<Integer> userIds, List<Integer> teacherIdList) {
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
-        List<Integer> userIdList = new ArrayList<>();
-        userIdList.add(musicGroup.getEducationalTeacherId());
-        userIdList.add(musicGroup.getTeamTeacherId());
-        userIdList.add(musicGroup.getOperatorUserId());
-        userIdList.add(musicGroup.getDirectorUserId());
-        if (userIds != null) {
-            userIdList.addAll(userIds);
-        }
 
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-        for (Integer userId : userIdList) {
+        Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
+        userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
+        userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
+        userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
+        for (Integer userId : userIds) {
             if (userId == null) continue;
-            imGroupMemberList.add(new ImGroupMember(userId.toString()));
-        }
-        //创建IM群组
-        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-        imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+            
+            userRoleMap.put(userId, "");
+        }
+        
+        if(teacherIdList != null && teacherIdList.size() > 0){
+        	for(Integer teacherId : teacherIdList){
+        		userRoleMap.put(teacherId, "指导老师");
+        	}
+        }
+        
+        imGroupService.create(classGroup.getId().longValue(), null, classGroup.getName(), musicGroup.getName(), musicGroup.getName(), musicGroup.getName(), null, "MUSIC");
+        imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
         return true;
     }
 
@@ -3022,7 +3011,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             ImGroupModel imGroupModel = new ImGroupModel(classGroupImGroupDto.getClassGroup().getId().toString(), imGroupMembers, classGroupImGroupDto.getClassGroup().getName());
             imGroupModelList.add(imGroupModel);
         }
-        imFeignService.groupBatchCreate(imGroupModelList);
+        //imFeignService.groupBatchCreate(imGroupModelList);
         return true;
     }
 
@@ -3342,9 +3331,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 settingsDetail.setCourseTotalNum(subNum.intValue());
                 settingsDetail.setCourseType(CourseScheduleType.valueOf(courseType));
                 settingsDetail.setUnitPrice(unitPrice);
-//                settingsDetail.setCourseTotalMinuties(Integer.parseInt(jsonObject.get(courseType).toString()) * subNum.intValue());
-//                settingsDetail.setCourseCurrentPrice(unitPrice.multiply(new BigDecimal(settingsDetail.getCourseTotalMinuties())));
-//                settingsDetail.setCourseOriginalPrice(settingsDetail.getCourseCurrentPrice());
                 courseMap.put(courseType, settingsDetail);
             }
             resultMap.put(classGroupId, courseMap);
@@ -3357,7 +3343,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public String mergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
+    public HttpResponseResult mergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
         List<Integer> classGroupIds = mergeClassSplitClassAffirmDto.getClassGroupIds();
         if (classGroupIds == null || classGroupIds.size() == 0) {
             throw new BizException("参数校验失败");
@@ -3441,6 +3427,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         musicGroupStudentClassAdjustDao.insert(musicGroupStudentClassAdjust);
         //如果需要审核,校验参数配置
         checkMergeClassSplitClassAffirmParam(mergeClassSplitClassAffirmDto);
+        HttpResponseResult httpResponseResult = new HttpResponseResult();
+        httpResponseResult.setStatus(true);
+        httpResponseResult.setCode(200);
         //如果缴费项目不需要审核,那么生成班级以及课表
         if (status == null || status != AUDITING) {
             //每种课程类型单独进行排课
@@ -3458,6 +3447,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 for (Map<Integer, String> classGroupStudent : classGroupStudents) {
                     Set<Integer> integers = classGroupStudent.keySet();
                     for (Integer integer : integers) {
+                        List<Integer> collect = Arrays.asList(classGroupStudent.get(integer).split(",")).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList());
+                        //学员退出群聊
+                        imGroupMemberService.quit(integer.longValue(),collect);
                         classGroupStudentMapperDao.deleteByClassGroupIdAndStudents(integer, classGroupStudent.get(integer));
                     }
                 }
@@ -3471,14 +3463,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 //删除教师课酬
                 courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(delCourseIds);
             }
-            return "学员班级调整完成";
+            imUserFriendService.refreshGroupImUserFriend(musicGroup.getId(),MUSIC);
+            httpResponseResult.setMsg("学员班级调整完成");
         } else {
             //冻结班级
             classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
             //冻结所选班级的课程
             courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1);
-            return "学员班级调整申请已提交,缴费项目审核中";
+            httpResponseResult.setMsg("学员班级调整申请已提交,缴费项目审核中");
         }
+        return httpResponseResult;
     }
 
     public void checkMergeClassSplitClassAffirmParam(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
@@ -3494,7 +3488,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (noRepeatTeacherIds.size() != classGroupTeacherMapperList.size()) {
             throw new BizException("主教与助教存在冲突");
         }
-        //所选班级不能有未开始的临时合并课程
         List<Integer> classGroupIds = mergeClassSplitClassAffirmDto.getClassGroupIds();
         if (classGroupIds == null || classGroupIds.size() == 0) {
             throw new BizException("请填写班级信息");
@@ -3542,9 +3535,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     public Map<String, Long> findClassCourseMinuteMap(List<Integer> classGroupIds, Map<String, Long> classCourseMinuteMap) {
         Map<String, Long> resultMap = new HashMap<>();
-        //获取默认的排课时长
-//        String courseDefaultMinutes = sysConfigDao.findConfigValue("music_course_default_minutes");
-//        JSONObject jsonObject = JSON.parseObject(courseDefaultMinutes);
         //获取所选班级最大剩余课时
         Map<String, Long> map = MapUtil.convertIntegerMap(courseScheduleDao.findClassMaxCourseNumMap(classGroupIds));
         Set<String> courseTypes = map.keySet();
@@ -3556,27 +3546,38 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId, ClassGroupTypeEnum type, String subjectIds) {
+    public HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId, ClassGroupTypeEnum type) {
         //基础技能班和线上基础技能班,可分班原则为声部人数/6向上取整
-        String[] subjectIdArr = subjectIds.split(",");
-        List<String> subjectIdList = Arrays.asList(subjectIdArr);
-        if (subjectIdList.contains("14") || subjectIdList.contains("15")) {
-            subjectIds += ",14,15";
+        List<StudentRegistration> musicGroupStudents = studentRegistrationDao.findMusicGroupStudent(musicGroupId, null);
+        Map<Integer, List<StudentRegistration>> regMap = musicGroupStudents.stream().collect(Collectors.groupingBy(StudentRegistration::getActualSubjectId));
+        int maxClassGroupNum = 0;
+        int otherSubjectRegNum = 0;
+        for (Map.Entry<Integer, List<StudentRegistration>> regEntry : regMap.entrySet()) {
+            //上低音号、长号 合并计算
+            if (regEntry.getKey().equals(14) || regEntry.getKey().equals(15)) {
+                otherSubjectRegNum += regEntry.getValue().size();
+                continue;
+            }
+            int classNum = regEntry.getValue().size() / 6;
+            classNum += (regEntry.getValue().size() % 6) > 0 ? 1 : 0;
+            maxClassGroupNum += classNum;
         }
+        maxClassGroupNum += otherSubjectRegNum / 6;
+        maxClassGroupNum += (otherSubjectRegNum % 6) > 0 ? 1 : 0;
+
         HighClassGroupNumDto highClassGroupNumDto = new HighClassGroupNumDto();
-        int nowClassGroupNum = classGroupDao.getMusicGroupHighClassNumBySubject(musicGroupId, subjectIds, type);
-        int subjectStudentNum = studentRegistrationDao.getMusicGroupSubjectStudentNum(musicGroupId, subjectIds);
-        int maxClassGroupNum = subjectStudentNum / 6;
-        maxClassGroupNum += (subjectStudentNum % 6) > 0 ? 1 : 0;
+        int nowClassGroupNum = classGroupDao.getMusicGroupHighClassNumBySubject(musicGroupId, type);
+
         highClassGroupNumDto.setNowHighClassGroupNum(nowClassGroupNum);
         highClassGroupNumDto.setMaxHighClassGroupNum(maxClassGroupNum);
         return highClassGroupNumDto;
     }
 
     @Override
-    public List<MusicGroupPaymentCalenderStudentDetail> queryStudentPaymentCalenders(Integer masterClassGroupId,List<Map<Integer, String>> classGroupStudents,List<Integer> studentIds) {
-        //获取主班剩余时长
-        Map<String, Long> masterMap = MapUtil.convertIntegerMap(courseScheduleDao.querySubCourseNumMap(masterClassGroupId));
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public List<MusicGroupPaymentCalenderStudentDetail> queryStudentPaymentCalenders(Integer masterClassGroupId,String classGroupStudentMap,List<Integer> studentIds) {
+        //获取主班剩余课程时长
+        Map<String, BigDecimal> masterMap = MapUtil.convertIntegerMap(courseScheduleDao.querySubCourseTimeMap(masterClassGroupId));
         if(masterMap.size() <= 0){
             throw new BizException("所选主班没有剩余课程,请重新选择");
         }
@@ -3586,13 +3587,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         Map<Integer, Integer> studentCLassMap = new HashMap<>();
         List<Map<Integer, BigDecimal>> surplusCourseFeeMapList = new ArrayList<>();
-        for (Map<Integer, String> classGroupStudent : classGroupStudents) {
-            for (Integer integer : classGroupStudent.keySet()) {
+        List<Map<String,String>> classGroupStudents = (List<Map<String,String>>)JSON.parse(classGroupStudentMap);
+        for (Map<String, String> classGroupStudent : classGroupStudents) {
+            for (String integer : classGroupStudent.keySet()) {
                 //获取学员剩余课程费用
-                surplusCourseFeeMapList.addAll(studentRegistrationDao.querySurplusCourseFeeByClassGroupId(integer,classGroupStudent.get(integer)));
+                surplusCourseFeeMapList.addAll(studentRegistrationDao.querySurplusCourseFeeByClassGroupId(Integer.parseInt(integer),classGroupStudent.get(integer)));
                 String[] s = classGroupStudent.get(integer).split(",");
                 for (String s1 : s) {
-                    studentCLassMap.put(Integer.parseInt(s1),integer);
+                    studentCLassMap.put(Integer.parseInt(s1),Integer.parseInt(integer));
                 }
             }
         }
@@ -3611,13 +3613,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             if (unitPrice == null) {
                 throw new BizException("分部默认课程类型单价不存在,请设置");
             }
-            Long courseTime = masterMap.get(s);
+            BigDecimal courseTime = masterMap.get(s);
             //获取主班剩余课程价值,按分部默认单价计算
-            if(courseTime == 0l){
-                masterTotalPriceMap.put(s,BigDecimal.ZERO);
-            }
             //总价四舍五入取整
-            BigDecimal totalPrice = unitPrice.multiply(new BigDecimal(courseTime)).setScale(0, BigDecimal.ROUND_HALF_UP);
+            BigDecimal totalPrice = unitPrice.multiply(courseTime).setScale(0, BigDecimal.ROUND_HALF_UP);
             masterTotalPriceMap.put(s,totalPrice);
             //课程余额转移
             for (Integer studentId : studentCLassMap.keySet()) {
@@ -3633,17 +3632,19 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 }else {
                     //如果剩余课程余额大于等于总价值,那么补交0元
                     if(bigDecimal.doubleValue() >= totalPrice.doubleValue()){
+                        calenderDto.setCutAmount(totalPrice);
                         calenderDto.setCourseCurrentPrice(BigDecimal.ZERO);
                         calenderDto.setCourseOriginalPrice(BigDecimal.ZERO);
                     }else {
                         calenderDto.setCourseCurrentPrice(totalPrice.subtract(bigDecimal));
+                        calenderDto.setCutAmount(bigDecimal);
                         calenderDto.setCourseOriginalPrice(totalPrice.subtract(bigDecimal));
                     }
                     //剩余课程余额减去主班对应课程类型总的课程价值,负数就是需要补交的金额
 //                    bigDecimal = bigDecimal.subtract(totalPrice);
                     surplusCourseFeeMap.put(studentId,bigDecimal.subtract(totalPrice));
                 }
-                calenderDto.setCourseTime(courseTime);
+                calenderDto.setCourseTime(courseTime.intValue());
                 calenderDto.setCourseType(s);
 
                 calenderDto.setPhone(phoneMaps.get(studentId));
@@ -3659,7 +3660,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     public BigDecimal getMasterTotalPrice(Integer masterClassGroupId) {
         //获取主班剩余时长
-        Map<String, Long> masterMap = MapUtil.convertIntegerMap(courseScheduleDao.querySubCourseNumMap(masterClassGroupId));
+        Map<String, BigDecimal> masterMap = MapUtil.convertIntegerMap(courseScheduleDao.querySubCourseTimeMap(masterClassGroupId));
         if(masterMap.size() <= 0){
             throw new BizException("所选主班没有剩余课程,请重新选择");
         }
@@ -3674,10 +3675,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             if (unitPrice == null) {
                 throw new BizException("分部默认课程类型单价不存在,请设置");
             }
-            Long courseTime = masterMap.get(s);
+            BigDecimal courseTime = masterMap.get(s);
             //获取主班剩余课程价值,按分部默认单价计算
             //总价四舍五入取整
-            BigDecimal totalPrice = unitPrice.multiply(new BigDecimal(courseTime)).setScale(0, BigDecimal.ROUND_HALF_UP);
+            BigDecimal totalPrice = unitPrice.multiply(courseTime).setScale(0, BigDecimal.ROUND_HALF_UP);
             masterTotalPrice = masterTotalPrice.add(totalPrice);
         }
         return masterTotalPrice;
@@ -3690,15 +3691,15 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void spanGroupMergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
+    public HttpResponseResult spanGroupMergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         //缴费项目
-        List<MusicGroupPaymentCalenderDto> paymentCalenderDtos = mergeClassSplitClassAffirmDto.getMusicGroupPaymentCalenderDtos();
+        MusicGroupPaymentCalenderDto paymentCalenderDto = mergeClassSplitClassAffirmDto.getMusicGroupPaymentCalenderDtos().get(0);
         //主班
         Integer masterClassGroupId = mergeClassSplitClassAffirmDto.getMasterClassGroupId();
         //学员列表
         List<Integer> studentIds = mergeClassSplitClassAffirmDto.getStudentIds();
-        //主班是否包含所选学员学员
+        //主班是否包含所选学员列表
         Boolean hasStudent = classGroupStudentMapperDao.hasStudent(masterClassGroupId,studentIds);
         if(hasStudent){
             throw new BizException("操作失败: 主班包含部分已选学员");
@@ -3709,99 +3710,132 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<Map<Integer, String>> classGroupStudents = mergeClassSplitClassAffirmDto.getClassGroupStudents();
         //获取默认的学员缴费详情
         List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails = queryStudentPaymentCalenders(masterClassGroupId,
-                classGroupStudents,
+                JSON.toJSONString(mergeClassSplitClassAffirmDto.getClassGroupStudents()),
                 studentIds);
         //创建缴费项目
         MusicGroup musicGroup = musicGroupDao.findByClassGroupId(masterClassGroupId);
-        MusicGroupPaymentCalender.PaymentCalenderStatusEnum status = null;
-        StringBuffer batchNos = new StringBuffer();
-        List<String> batchNoList = new ArrayList<>();
-        if (paymentCalenderDtos != null && paymentCalenderDtos.size() > 0) {
-            BigDecimal masterTotalPrice = getMasterTotalPrice(masterClassGroupId);
-            //是否有需要审核的缴费项目
-            for (MusicGroupPaymentCalenderDto calenderDto : paymentCalenderDtos) {
-                //将学员加入新乐团、扣除原乐团剩余课程余额、补充到现有乐团
-                studentRegistrationService.insertStudent(calenderDto.getStudentIds(),calenderDto.getMusicGroupId(),musicGroup.getId(),masterTotalPrice);
-                calenderDto.setMusicGroupId(musicGroup.getId());
-                List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = calenderDto.getMusicGroupPaymentCalenderStudentDetails();
-                boolean containsAll = musicGroupPaymentCalenderStudentDetails.containsAll(calenderStudentDetails);
-                if(!containsAll){
-                    calenderDto.setStatus(AUDITING);
-                }else {
-                    calenderDto.setStatus(NO);
-                }
-                calenderDto.setPaymentType(SPAN_GROUP_CLASS_ADJUST);
-                //生成缴费项目
-                calenderDto.setMasterTotalPrice(masterTotalPrice);
-                musicGroupPaymentCalenderService.create(calenderDto);
-                if (batchNos.length() > 0) {
-                    batchNos.append(",");
-                }
-                batchNoList.add(calenderDto.getBatchNo());
-                batchNos.append(calenderDto.getBatchNo());
-                if (status == null || status != AUDITING) {
-                    if(!containsAll){
-                        status = AUDITING;
-                    }
-                }
-            }
-            //记录申请信息
-            MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = new MusicGroupStudentClassAdjust();
-            musicGroupStudentClassAdjust.setMasterClassGroupId(masterClassGroupId);
-            musicGroupStudentClassAdjust.setBatchNo(batchNos.toString());
-            musicGroupStudentClassAdjust.setMusicGroupId(musicGroup.getId());
-            musicGroupStudentClassAdjust.setOperatorId(sysUser.getId());
-            musicGroupStudentClassAdjust.setClassGroupIds(JSON.toJSONString(classGroupIds));
-            musicGroupStudentClassAdjust.setStudentIds(JSON.toJSONString(studentIds));
-            if (classGroupStudents != null && classGroupStudents.size() > 0) {
-                musicGroupStudentClassAdjust.setClassGroupStudents(JSON.toJSONString(mergeClassSplitClassAffirmDto.getClassGroupStudents()));
-            }
-            //获取需要删除的学员关联的课程
-            List<Long> courseIds = courseScheduleDao.queryStudentNotStartByClassIdsAndStudentIds(classGroupIds, studentIds);
-            musicGroupStudentClassAdjust.setSubLockCourseIds(JSON.toJSONString(courseIds));
-            //获取关联的学员缴费信息
-            List<Long> studentPaymentIds = courseScheduleStudentPaymentDao.queryStudentNotStartByClassIdsAndStudentIds(classGroupIds, studentIds);
-            musicGroupStudentClassAdjust.setStudentPaymentIds(JSON.toJSONString(studentPaymentIds));
-            //获取需要冻结的课程
-            classGroupIds.add(masterClassGroupId);
-            List<Long> allLockCourseIds = courseScheduleDao.queryStudentNotStartByClassIdsAndStudentIds(classGroupIds, null);
-            musicGroupStudentClassAdjust.setAllLockCourseIds(JSON.toJSONString(allLockCourseIds));
-            musicGroupStudentClassAdjustDao.insert(musicGroupStudentClassAdjust);
-            //没有需要审核的缴费项目
-            if (status == null) {
-                spanGroupClassAdjustPass(masterClassGroupId,studentIds,courseIds,classGroupStudents);
-            }else {
+        BigDecimal masterTotalPrice = getMasterTotalPrice(masterClassGroupId);
+        //是否有需要审核的缴费项目
+        List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = paymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails();
+
+        paymentCalenderDto.setMusicGroupId(musicGroup.getId());
+        boolean containsAll = musicGroupPaymentCalenderStudentDetails.containsAll(calenderStudentDetails);
+        if(!containsAll){
+            paymentCalenderDto.setStatus(AUDITING);
+        }else {
+            paymentCalenderDto.setStatus(NO);
+        }
+
+        //将学员加入新乐团、扣除原乐团剩余课程余额、补充到现有乐团
+        Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = calenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
+        for (Map<Integer, String> classGroupStudent : classGroupStudents) {
+            Integer classGroupId = classGroupStudent.keySet().iterator().next();
+            studentRegistrationService.insertStudent(classGroupStudent.get(classGroupId),musicGroupDao.findByClassGroupId(classGroupId).getId(),musicGroup.getId(),collect);
+        }
+        paymentCalenderDto.setPayUserType(MusicGroupPaymentCalender.PayUserType.STUDENT);
+        paymentCalenderDto.setPaymentType(SPAN_GROUP_CLASS_ADJUST);
+        //生成缴费项目
+        paymentCalenderDto.setMasterTotalPrice(masterTotalPrice);
+        paymentCalenderDto.setIsGiveMusicNetwork(false);
+        paymentCalenderDto.setStudentIds(StringUtils.join(studentIds,","));
+        musicGroupPaymentCalenderService.create(paymentCalenderDto);
+        //记录申请信息
+        MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = new MusicGroupStudentClassAdjust();
+        musicGroupStudentClassAdjust.setMasterClassGroupId(masterClassGroupId);
+        musicGroupStudentClassAdjust.setBatchNo(paymentCalenderDto.getBatchNo());
+        musicGroupStudentClassAdjust.setMusicGroupId(musicGroup.getId());
+        musicGroupStudentClassAdjust.setOperatorId(sysUser.getId());
+        musicGroupStudentClassAdjust.setClassGroupIds(JSON.toJSONString(classGroupIds));
+        musicGroupStudentClassAdjust.setStudentIds(JSON.toJSONString(studentIds));
+        musicGroupStudentClassAdjust.setMasterTotalPrice(masterTotalPrice);
+        musicGroupStudentClassAdjust.setMasterClassCourseTimes(courseScheduleDao.queryTotalCourseTimes(masterClassGroupId));
+        if (classGroupStudents != null && classGroupStudents.size() > 0) {
+            musicGroupStudentClassAdjust.setClassGroupStudents(JSON.toJSONString(mergeClassSplitClassAffirmDto.getClassGroupStudents()));
+        }
+        //获取需要删除的学员关联的课程
+        List<Long> courseIds = courseScheduleDao.queryStudentNotStartByClassIdsAndStudentIds(classGroupIds, studentIds);
+        musicGroupStudentClassAdjust.setSubLockCourseIds(JSON.toJSONString(courseIds));
+        //获取关联的学员缴费信息
+        List<Long> studentPaymentIds = courseScheduleStudentPaymentDao.queryStudentNotStartByClassIdsAndStudentIds(classGroupIds, studentIds);
+        musicGroupStudentClassAdjust.setStudentPaymentIds(JSON.toJSONString(studentPaymentIds));
+        //获取需要冻结的课程
+        classGroupIds.add(masterClassGroupId);
+        //所选班级列表,是否包含已冻结的班级
+        List<ClassGroup> lockClassGroupIds = classGroupDao.findByClassGroupIds(classGroupIds, 1);
+        if (lockClassGroupIds != null && lockClassGroupIds.size() > 0) {
+            throw new BizException("所选班级包含审核中的学员班级调整申请");
+        }
+        //所选班级不能有未开始的临时合并课程
+        int courseNum = courseScheduleDao.findNoStartMasterCourseNum(classGroupIds);
+        if (courseNum > 0) {
+            throw new BizException("所选班级不能有未开始的临时合并课程");
+        }
+        List<Long> allLockCourseIds = courseScheduleDao.queryStudentNotStartByClassIdsAndStudentIds(classGroupIds, null);
+        musicGroupStudentClassAdjust.setAllLockCourseIds(JSON.toJSONString(allLockCourseIds));
+        musicGroupStudentClassAdjustDao.insert(musicGroupStudentClassAdjust);
+        HttpResponseResult httpResponseResult = new HttpResponseResult();
+        httpResponseResult.setCode(200);
+        httpResponseResult.setStatus(true);
+        //没有需要审核的缴费项目
+        if (paymentCalenderDto.getStatus() != AUDITING) {
+            List<Map> classGroupStudents1 = JSON.parseArray(musicGroupStudentClassAdjust.getClassGroupStudents(),Map.class);
+            spanGroupClassAdjustPass(masterClassGroupId,studentIds,courseIds,classGroupStudents1,allLockCourseIds,paymentCalenderDto.getBatchNo(),masterTotalPrice);
+            httpResponseResult.setMsg("操作成功:学员班级调整完成");
+        }else {
 //                冻结班级
-                classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
+            classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
 //                冻结所选班级的课程
-                courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1);
-            }
+            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1);
+            httpResponseResult.setMsg("操作成功:学员班级调整申请已提交,缴费项目审核中");
         }
+        return httpResponseResult;
     }
 
-    public void spanGroupClassAdjustPass(Integer masterClassGroupId,List<Integer> studentIds,List<Long> courseIds,List<Map<Integer, String>> classGroupStudents){
-        //将学员加进班级未开始的课程,以及班级关联、加群
-        classGroupStudentMapperService.updateClassGroupStudents(masterClassGroupId.longValue(),new HashSet<>(studentIds));
-        //删除学员课程
-        courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, studentIds);
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void spanGroupClassAdjustPass(Integer masterClassGroupId,
+                                         List<Integer> studentIds,
+                                         List<Long> courseIds,
+                                         List<Map> classGroupStudents,
+                                         List<Long> allLockCourseIds,
+                                         String batchNo,BigDecimal masterTotalPrice){
         //删除班级关联的学员
+        List<Integer> classGroupIds = new ArrayList<>();
         if (classGroupStudents != null && classGroupStudents.size() > 0) {
             for (Map<Integer, String> classGroupStudent : classGroupStudents) {
                 Set<Integer> integers = classGroupStudent.keySet();
                 for (Integer integer : integers) {
+                    List<Integer> collect = Arrays.asList(classGroupStudent.get(integer).split(",")).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList());
+                    //学员退出群聊
+                    imGroupMemberService.quit(integer.longValue(),collect);
+                    classGroupIds.add(integer);
                     classGroupStudentMapperDao.deleteByClassGroupIdAndStudents(integer, classGroupStudent.get(integer));
                 }
             }
         }
-        //获取没有学员的课程
-        List<Long> delCourseIds = courseScheduleDao.findNoStudentCourseIds(courseIds);
-        if (delCourseIds != null && delCourseIds.size() > 0) {
-            //删除课程
-            courseScheduleDao.deleteCourseSchedulesByClassGroupIds(delCourseIds);
-            //删除教师考勤
-            teacherAttendanceDao.batchDeleteByCourseSchedules(delCourseIds);
-            //删除教师课酬
-            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(delCourseIds);
+
+        //将学员加进班级未开始的课程,以及班级关联、加群
+        classGroupStudentMapperService.updateClassGroupStudents1(masterClassGroupId.longValue(),studentIds,allLockCourseIds,batchNo,masterTotalPrice);
+        //删除学员课程
+        if(courseIds.size() > 0){
+            courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, studentIds);
+        }
+        //解冻课程
+        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds,0);
+        //解冻班级
+        classGroupIds.add(masterClassGroupId);
+        classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds,0);
+        if(courseIds.size() > 0){
+            //获取没有学员的课程
+            List<Long> delCourseIds = courseScheduleDao.findNoStudentCourseIds(courseIds);
+            if (delCourseIds != null && delCourseIds.size() > 0) {
+                //删除课程
+                courseScheduleDao.deleteCourseSchedulesByClassGroupIds(delCourseIds);
+                //删除教师考勤
+                teacherAttendanceDao.batchDeleteByCourseSchedules(delCourseIds);
+                //删除教师课酬
+                courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(delCourseIds);
+            }
         }
     }
 }

+ 125 - 35
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -5,6 +5,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -13,9 +14,7 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
@@ -23,22 +22,38 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.OrganizationCourseUnitPriceSettingsDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
-import com.ym.mec.biz.service.ClassGroupRelationService;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupStudentMapperService;
-import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.TeacherDefaultMusicGroupSalaryService;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.ClassGroupRelation;
+import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
+import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.im.ImFeignService;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 
 @Service
@@ -58,7 +73,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private ClassGroupRelationService classGroupRelationService;
     @Autowired
-    private ImFeignService imFeignService;
+    private ImGroupMemberService imGroupMemberService;
     @Autowired
     private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
     @Autowired
@@ -72,6 +87,8 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
+    private OrganizationCourseUnitPriceSettingsDao organizationCourseUnitPriceSettingsDao;
+    @Autowired
     private ClassGroupDao classGroupDao;
     @Autowired
     private MusicGroupDao musicGroupDao;
@@ -79,6 +96,9 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
+    @Autowired
+    private ImUserFriendService imUserFriendService;
+
     private static String holidayUrl = "http://tool.bitefu.net/jiari/?d=";
 
     @Override
@@ -164,9 +184,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         }
 
         //5、学生退出班级群组
-        ImGroupMember[] imGroupMembers = {new ImGroupMember(userId.toString())};
-        // 退出群组
-        imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+        imGroupMemberService.quit(classGroup.getId().longValue(), userId);
         return true;
     }
 
@@ -237,7 +255,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
         //1、班级关系添加
         List<ClassGroupStudentMapper> classGroupStudentMappers = new ArrayList<>();
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
+        Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
 
         ClassGroupRelation classGroupRelation = classGroupRelationService.findClassGroupRelation(classGroupId);
 
@@ -264,7 +282,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 studentRegistration.setClassGroupId(classGroupId);
                 studentRegistrationService.update(studentRegistration);
             }
-            imGroupMemberList.add(new ImGroupMember(userId.toString()));
+            userRoleMap.put(userId, "");
         }
         if (classGroupStudentMappers.size() > 0) {
             classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMappers);
@@ -340,8 +358,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         }
 
         //5、添加进IM群组
-        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-        imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+        imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
 
         return true;
     }
@@ -396,10 +413,10 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
             oldStudentIds = classGroupStudents.stream().map(ClassGroupStudentMapper::getUserId).collect(Collectors.toSet());
             oldNormalStudentIds = classGroupStudents.stream().filter(s -> ClassGroupStudentStatusEnum.NORMAL.equals(s.getStatus())).map(ClassGroupStudentMapper::getUserId).collect(Collectors.toSet());
         }
-
+        MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
         //线上基础技能班,原始分班人数不能小于3人大于6人
         if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)) {
-            MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
+
             if (studentIds.size() < 3 && musicGroup.getStatus().equals(MusicGroupStatusEnum.PREPARE)) {
                 throw new BizException("线上基础技能班人数不能少于3人");
             }
@@ -509,24 +526,97 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
         if (!CollectionUtils.isEmpty(removeStudentIds)) {
             courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, new ArrayList<>(removeStudentIds));
-            List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-            for (Integer addStudentId : addStudentIds) {
-                imGroupMemberList.add(new ImGroupMember(addStudentId.toString()));
+            if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){
+                //5、学生退出班级群组
+                imGroupMemberService.quit(classGroup.getId().longValue(), new ArrayList<Integer>(addStudentIds));
             }
-            //5、学生退出班级群组
-            ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-            imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
         }
 
         if (!CollectionUtils.isEmpty(addStudentIds)) {
             courseScheduleStudentPaymentService.createForMusicGroup(classGroup.getMusicGroupId(), classGroupNotStartCourse, new ArrayList<>(addStudentIds));
-            List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-            for (Integer addStudentId : addStudentIds) {
-                imGroupMemberList.add(new ImGroupMember(addStudentId.toString()));
+            if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){
+                Map<Integer,String> userRoleMap = new HashMap<>();
+                for (Integer addStudentId : addStudentIds) {
+                    userRoleMap.put(addStudentId, "");
+                }
+                //5、添加进IM群组
+                imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
             }
-            //5、添加进IM群组
-            ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-            imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
         }
+        if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){
+            imUserFriendService.refreshClassImUserFriend(classGroup.getId());
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateClassGroupStudents1(Long classGroupId, List<Integer> studentIds,List<Long> allLockCourseIds,String batchNo,BigDecimal masterTotalPrice) {
+        ClassGroup classGroup = classGroupDao.lockClassGroup(classGroupId.intValue());
+        if (Objects.isNull(classGroup)) {
+            throw new BizException("班级信息错误");
+        }
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+        //获取冻结的课程列表
+        List<CourseSchedule> classGroupNotStartCourse = courseScheduleDao.findCoursesByClassGroupIdAndCourseIds(classGroupId,allLockCourseIds);
+
+        Date now = new Date();
+        List<ClassGroupStudentMapper> classGroupStudentMappers = new ArrayList<>();
+
+        BigDecimal divide = masterTotalPrice.divide(new BigDecimal(classGroupNotStartCourse.size()), 2, BigDecimal.ROUND_HALF_UP);
+        BigDecimal decimal = divide.multiply(new BigDecimal(classGroupNotStartCourse.size()));
+
+        //生成班级关联
+        for (Integer studentId : studentIds) {
+            ClassGroupStudentMapper classGroupStudent = classGroupStudentMapperDao.findClassGroupStudent(classGroupId.intValue(), studentId);
+            if(classGroupStudent != null){
+                classGroupStudent.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+                classGroupStudentMapperDao.update(classGroupStudent);
+            }else {
+                ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+                classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
+                classGroupStudentMapper.setClassGroupId(classGroupId.intValue());
+                classGroupStudentMapper.setUserId(studentId);
+                classGroupStudentMapper.setCreateTime(now);
+                classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+                classGroupStudentMapper.setGroupType(GroupType.MUSIC);
+                classGroupStudentMappers.add(classGroupStudentMapper);
+            }
+            //生成课程关联
+            for (int i = 0; i < classGroupNotStartCourse.size(); i++) {
+                CourseSchedule courseSchedule = classGroupNotStartCourse.get(i);
+                CourseScheduleStudentPayment cssp = new CourseScheduleStudentPayment();
+                cssp.setGroupType(courseSchedule.getGroupType());
+                cssp.setMusicGroupId(courseSchedule.getMusicGroupId());
+                cssp.setCourseScheduleId(courseSchedule.getId());
+                cssp.setClassGroupId(courseSchedule.getClassGroupId());
+                cssp.setBatchNo(batchNo);
+                cssp.setUserId(studentId);
+                if(i == 0){
+                    cssp.setOriginalPrice(divide.add(masterTotalPrice.subtract(decimal)));
+                    cssp.setExpectPrice(divide.add(masterTotalPrice.subtract(decimal)));
+                }else {
+                    cssp.setOriginalPrice(divide);
+                    cssp.setExpectPrice(divide);
+                }
+                cssp.setActualPrice(BigDecimal.ZERO);
+                courseScheduleStudentPayments.add(cssp);
+            }
+        }
+        if (classGroupStudentMappers.size() > 0) {
+            classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMappers);
+        }
+        if (courseScheduleStudentPayments.size() > 0) {
+            courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+        }
+        //修改班级人数
+        classGroupService.updateClassStudentNum(classGroupId.intValue(), classGroup.getStudentNum() + studentIds.size());
+
+        //添加进IM群组
+        Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
+        for (Integer studentId : studentIds) {
+        	userRoleMap.put(studentId, null);
+        }
+        imGroupMemberService.join(classGroupId.longValue(), userRoleMap);
+        imUserFriendService.refreshClassImUserFriend(classGroupId.intValue());
     }
 }

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

@@ -15,6 +15,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -41,7 +42,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private SysConfigDao sysConfigDao;
     @Autowired
-    private ImFeignService imFeignService;
+    private ImGroupMemberService imGroupMemberService;
     @Autowired
     private ClassGroupService classGroupService;
     @Autowired
@@ -66,32 +67,36 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
         String classGroupIds = classGroupTeacherMapperList.stream().map(classGroupTeacherMapper -> classGroupTeacherMapper.getClassGroupId().toString()).collect(Collectors.joining(","));
         //老师加入群组
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
+        List<Integer> userIdList = new ArrayList<>();
         List<ClassGroup> classGroups = classGroupService.findClassGroupByIds(classGroupIds);
 
         List<ClassGroupTeacherMapper> oldClassGroupTeacherMapper = classGroupTeacherMapperDao.getClassGroupTeacherMapper(classGroupTeacherMapperList, GroupType.MUSIC);
 
         for (ClassGroup classGroup : classGroups) {
-            imGroupMemberList.clear();
+            userIdList.clear();
             //原设置的老师删除群组
             for (ClassGroupTeacherMapper classGroupTeacherMapper : oldClassGroupTeacherMapper) {
                 if (!classGroup.getId().equals(classGroupTeacherMapper.getClassGroupId())) continue;
-                imGroupMemberList.add(new ImGroupMember(classGroupTeacherMapper.getUserId().toString()));
+                userIdList.add(classGroupTeacherMapper.getUserId());
             }
-            if (imGroupMemberList.size() > 0) {
-                ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-                imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+            if (userIdList.size() > 0) {
+                imGroupMemberService.quit(classGroup.getId().longValue(), userIdList);
             }
             // 新设置的老师加入群组
-            imGroupMemberList.clear();
+            userIdList.clear();
             for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
                 if (!classGroup.getId().equals(classGroupTeacherMapper.getClassGroupId())) continue;
                 classGroupTeacherMapper.setMusicGroupId(classGroup.getMusicGroupId());
                 classGroupTeacherMapper.setGroupType(classGroup.getGroupType());
-                imGroupMemberList.add(new ImGroupMember(classGroupTeacherMapper.getUserId().toString()));
+                userIdList.add(classGroupTeacherMapper.getUserId());
+            }
+            if (userIdList.size() > 0) {
+            	Map<Integer, String> userRoleMap = new HashMap<Integer, String>();
+            	for(Integer userId : userIdList){
+            		userRoleMap.put(userId, "指导老师");
+            	}
+                imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
             }
-            ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-            imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
         }
         classGroupTeacherMapperDao.delMusicGroupTeacherMapper(classGroupTeacherMapperList);
 
@@ -103,7 +108,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     public int classGroupTeachersInsert(List<ClassGroupTeacherMapper> classGroupTeacherMapperList, boolean checkCourser) {
         String classGroupIds = classGroupTeacherMapperList.stream().map(classGroupTeacherMapper -> classGroupTeacherMapper.getClassGroupId().toString()).collect(Collectors.joining(","));
         //老师加入群组
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
+        List<Integer> userIdList = new ArrayList<Integer>();
         List<ClassGroup> classGroups = classGroupService.findClassGroupByIds(classGroupIds);
 
         List<ClassGroupTeacherMapper> oldClassGroupTeacherMapper = classGroupTeacherMapperDao.getClassGroupTeacherMapper(classGroupTeacherMapperList, GroupType.MUSIC);
@@ -111,28 +116,32 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         Set<String> oldTeacher = new HashSet<>();
         Set<String> newTeacher = new HashSet<>();
         for (ClassGroup classGroup : classGroups) {
-            imGroupMemberList.clear();
+        	userIdList.clear();
             //原设置的老师删除群组
             for (ClassGroupTeacherMapper classGroupTeacherMapper : oldClassGroupTeacherMapper) {
                 if (!classGroup.getId().equals(classGroupTeacherMapper.getClassGroupId())) continue;
-                imGroupMemberList.add(new ImGroupMember(classGroupTeacherMapper.getUserId().toString()));
+                userIdList.add(classGroupTeacherMapper.getUserId());
                 oldTeacher.add(classGroupTeacherMapper.getClassGroupId() + classGroupTeacherMapper.getTeacherRole().getCode() + classGroupTeacherMapper.getUserId());
             }
-            if (imGroupMemberList.size() > 0) {
-                ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-                imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+            if (userIdList.size() > 0) {
+                imGroupMemberService.quit(classGroup.getId().longValue(), userIdList);
             }
             // 新设置的老师加入群组
-            imGroupMemberList.clear();
+            userIdList.clear();
             for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
                 if (!classGroup.getId().equals(classGroupTeacherMapper.getClassGroupId())) continue;
                 classGroupTeacherMapper.setMusicGroupId(classGroup.getMusicGroupId());
                 classGroupTeacherMapper.setGroupType(classGroup.getGroupType());
-                imGroupMemberList.add(new ImGroupMember(classGroupTeacherMapper.getUserId().toString()));
+                userIdList.add(classGroupTeacherMapper.getUserId());
                 newTeacher.add(classGroupTeacherMapper.getClassGroupId() + classGroupTeacherMapper.getTeacherRole().getCode() + classGroupTeacherMapper.getUserId());
             }
-            ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-            imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+            if (userIdList.size() > 0) {
+            	Map<Integer, String> userRoleMap = new HashMap<Integer, String>();
+            	for(Integer userId : userIdList){
+            		userRoleMap.put(userId, "指导老师");
+            	}
+                imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
+            }
         }
         classGroupTeacherMapperDao.delMusicGroupTeacherMapper(classGroupTeacherMapperList);
 

+ 65 - 67
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -225,7 +225,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     @Autowired
     private SchoolDao schoolDao;
     @Autowired
-	private ImFeignService imFeignService;
+	private ImGroupMemberService imGroupMemberService;
+    @Autowired
+	private ImUserFriendService imUserFriendService;
     @Autowired
     private CourseHomeworkService courseHomeworkService;
     @Autowired
@@ -834,7 +836,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         List<CourseSchedule> courseSchedules = createCourseScheduleDto.getCourseSchedules();
 
         if(!CollectionUtils.isEmpty(courseSchedules)){
-			List<ClassGroupTeacherMapper> byMusicGroup = classGroupTeacherMapperDao.findAllByMusicGroup(createCourseScheduleDto.getMusicGroupID());
+			List<ClassGroupTeacherMapper> byMusicGroup = classGroupTeacherMapperDao.findAllByMusicGroup(createCourseScheduleDto.getMusicGroupID(),courseSchedules.get(0).getGroupType(),null);
 			Map<Integer, List<ClassGroupTeacherMapper>> teacherByClassGroup = byMusicGroup.stream().collect(Collectors.groupingBy(ClassGroupTeacherMapper::getClassGroupId));
 
 			Map<Integer, List<CourseSchedule>> classGroupCourseSchedules = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassGroupId));
@@ -3405,6 +3407,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 		courseEventSource.courseStatusChange(new HashSet<>(courseScheduleIds));
 
+		imUserFriendService.refreshCourseImUserFriend(courseScheduleId);
 		// 推送
 		try {
 			Set<Integer> teacherIds = newCourseSchedules.stream().map(e -> e.getActualTeacherId()).collect(Collectors.toSet());
@@ -3953,12 +3956,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             }
         }
 
-        if (updateList.size() > 0) {
+		if (updateList.size() > 0) {
             courseScheduleDao.batchUpdate(updateList);
         }
 
-		courseEventSource.courseStatusChange(null);
-
         // 更新班级已上课次
         if (classGroupIds.size() > 0) {
             classGroupService.batchIncreaseClassTimes(classGroupIds);
@@ -4002,6 +4003,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     }
 
     @Override
+	@Transactional(rollbackFor = Exception.class)
 	public boolean updateCourseScheduleToUnderway() {
     	Date date = new Date();
     	List<CourseSchedule> list = courseScheduleDao.queryUnderwayWithNoUpdateStatus();
@@ -4016,7 +4018,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
         if (updateList.size() > 0) {
             courseScheduleDao.batchUpdate(updateList);
-        }
+		}
 		return true;
 	}
 
@@ -4612,6 +4614,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		courseScheduleComplaintsDao.delByCourseScheduleIds(courseScheduleIds);
 		//清除考勤申述
 		teacherAttendanceDao.clearAttendanceComplaints(courseScheduleIds);
+		//添加通讯录
+		imUserFriendService.refreshCourseImUserFriend(courseScheduleId);
 		//保存修改记录
 		saveModifyLog(modifyLogs,courseIds);
 
@@ -4648,19 +4652,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(!CollectionUtils.isEmpty(courseIds1)){
 			modifyLogs = getModifyLogs(courseIds1, courseSchedules, user.getId(), date);
 		}
-
 		PracticeGroup practiceGroup = practiceGroupDao.get(Long.valueOf(practiceGroupId));
 
 		ClassGroup classGroup = classGroupDao.findByMusicGroupAndType(practiceGroupId, PRACTICE.getCode());
+		//教务老师变更
         if(Objects.nonNull(educationalTeacherId)&&!educationalTeacherId.equals(practiceGroup.getEducationalTeacherId())){
-			if(Objects.nonNull(practiceGroup.getEducationalTeacherId())){
-				ImGroupMember[] imGroupMembers = new ImGroupMember[]{new ImGroupMember(practiceGroup.getEducationalTeacherId().toString())};
-				imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
-			}
-
 			practiceGroup.setEducationalTeacherId(educationalTeacherId);
-			ImGroupMember[] newImGroupMemberList = new ImGroupMember[]{new ImGroupMember(practiceGroup.getEducationalTeacherId().toString())};
-			imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), newImGroupMemberList,classGroup.getName()));
 		}
 		if(Objects.nonNull(subjectId)&&!subjectId.equals(practiceGroup.getSubjectId())){
 			Subject subject = subjectDao.get(subjectId);
@@ -4675,61 +4672,62 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			classGroupDao.update(classGroup);
 			courseScheduleDao.updateCourseNameByGroup(practiceGroupId, PRACTICE,groupName);
 		}
-		practiceGroup.setUserId(teacherId);
-		practiceGroupDao.update(practiceGroup);
-        classGroupTeacherMapperService.updateTeacher(practiceGroupId,teacherId, PRACTICE.getCode());
-        classGroupTeacherSalaryDao.updateTeacher(practiceGroupId,teacherId, PRACTICE.getCode());
-//        practiceGroupDao.updateUserId(practiceGroupId,teacherId);
-        if(courseSchedules == null || courseSchedules.size() == 0){
-            return;
-        }
-
-        Map<Integer, String> teacherIdMap = new HashMap<>(10);
-        teacherIdMap.put(teacherId,teacherId.toString());
+		if(!teacherId.equals(practiceGroup.getUserId())){
+			practiceGroup.setUserId(teacherId);
+			classGroupTeacherMapperService.updateTeacher(practiceGroupId,teacherId, PRACTICE.getCode());
+			classGroupTeacherSalaryDao.updateTeacher(practiceGroupId,teacherId, PRACTICE.getCode());
+			if(courseSchedules == null || courseSchedules.size() == 0){
+				return;
+			}
+			Map<Integer, String> teacherIdMap = new HashMap<>(10);
+			teacherIdMap.put(teacherId,teacherId.toString());
 
-        courseSchedules.forEach(e->{
-            teacherIdMap.put(e.getActualTeacherId(),e.getActualTeacherId().toString());
-            e.setUpdateTime(date);
-            e.setActualTeacherId(teacherId);
-        });
-        checkNewCourseSchedules(courseSchedules,false,false);
-        courseScheduleDao.batchUpdate(courseSchedules);
-        Set<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toSet());
-		if(practiceGroup.getType() != TRIAL){
-			if(CHARGE == practiceGroup.getType()){
-				List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaries = teacherDefaultPracticeGroupSalaryDao.queryByUserId(teacherId);
-				if(teacherDefaultPracticeGroupSalaries == null || teacherDefaultPracticeGroupSalaries.size() == 0){
-					throw new BizException("请设置老师默认课酬");
-				}
-				courseScheduleTeacherSalaryDao.batchUpdateTeacher(courseScheduleIds,teacherId);
-			}else{
-				List<CourseSchedule> groupNotStartCourses = courseScheduleDao.findGroupNotStartCourses(practiceGroupId, PRACTICE);
-				if(!CollectionUtils.isEmpty(groupNotStartCourses)){
-					SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
-					BigDecimal teacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
-					List<Long> courseIds = groupNotStartCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList());
-					List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseIds);
-					for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
-						courseScheduleTeacherSalary.setUserId(teacherId);
-						courseScheduleTeacherSalary.setExpectSalary(teacherSalary);
+			courseSchedules.forEach(e->{
+				teacherIdMap.put(e.getActualTeacherId(),e.getActualTeacherId().toString());
+				e.setUpdateTime(date);
+				e.setActualTeacherId(teacherId);
+			});
+			checkNewCourseSchedules(courseSchedules,false,false);
+			courseScheduleDao.batchUpdate(courseSchedules);
+			Set<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toSet());
+			if(practiceGroup.getType() != TRIAL){
+				if(CHARGE == practiceGroup.getType()){
+					List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaries = teacherDefaultPracticeGroupSalaryDao.queryByUserId(teacherId);
+					if(teacherDefaultPracticeGroupSalaries == null || teacherDefaultPracticeGroupSalaries.size() == 0){
+						throw new BizException("请设置老师默认课酬");
+					}
+					courseScheduleTeacherSalaryDao.batchUpdateTeacher(courseScheduleIds,teacherId);
+				}else{
+					List<CourseSchedule> groupNotStartCourses = courseScheduleDao.findGroupNotStartCourses(practiceGroupId, PRACTICE);
+					if(!CollectionUtils.isEmpty(groupNotStartCourses)){
+						SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+						BigDecimal teacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+						List<Long> courseIds = groupNotStartCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+						List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseIds);
+						for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+							courseScheduleTeacherSalary.setUserId(teacherId);
+							courseScheduleTeacherSalary.setExpectSalary(teacherSalary);
+						}
+						courseScheduleTeacherSalaryDao.batchUpdate(courseScheduleTeacherSalaries);
 					}
-					courseScheduleTeacherSalaryDao.batchUpdate(courseScheduleTeacherSalaries);
 				}
 			}
+			teacherAttendanceDao.batchUpdateTeacher(courseScheduleIds,teacherId);
+			//删除申述
+			courseScheduleComplaintsDao.delByCourseScheduleIds(courseScheduleIds);
+			//清除考勤申述
+			teacherAttendanceDao.clearAttendanceComplaints(courseScheduleIds);
+			//保存修改记录
+			if(!CollectionUtils.isEmpty(modifyLogs))
+				saveModifyLog(modifyLogs,courseIds1);
+
+			if (teacherIdMap != null && teacherIdMap.size() > 0) {
+				sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT,
+						teacherIdMap, null, 0, "7","TEACHER");
+			}
 		}
-        teacherAttendanceDao.batchUpdateTeacher(courseScheduleIds,teacherId);
-		//删除申述
-		courseScheduleComplaintsDao.delByCourseScheduleIds(courseScheduleIds);
-		//清除考勤申述
-		teacherAttendanceDao.clearAttendanceComplaints(courseScheduleIds);
-		//保存修改记录
-		if(!CollectionUtils.isEmpty(modifyLogs))
-			saveModifyLog(modifyLogs,courseIds1);
-
-        if (teacherIdMap != null && teacherIdMap.size() > 0) {
-            sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT,
-                    teacherIdMap, null, 0, "7","TEACHER");
-        }
+		practiceGroupDao.update(practiceGroup);
+		imUserFriendService.refreshGroupImUserFriend(practiceGroup.getId().toString(), PRACTICE);
     }
 
     @Override
@@ -4987,7 +4985,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		//获取助教老师列表
 		if(courseSchedules.size() > 0){
 			courseSchedules.forEach(e->{
-				e.setTeachingTeacherIdList(courseScheduleTeacherSalaryDao.queryTeacherByTeaching(e.getClassGroupId()));
+				e.setTeachingTeacherIdList(courseScheduleTeacherSalaryDao.queryTeacherByTeaching(e.getClassGroupId(),"TEACHING"));
 				e.setActualTeacherId(targetTeacherId);
 			});
 			this.courseAdjust(courseSchedules);
@@ -5036,8 +5034,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			ImGroupMember[] oldImGroupMembers = {new ImGroupMember(oldTeacherId.toString())};
 			ImGroupMember[] imGroupMembers = {new ImGroupMember(newTeacherId.toString())};
 			for (ClassGroup classGroup:classGroupList) {
-				imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), oldImGroupMembers, classGroup.getName()));
-				imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+				imGroupMemberService.quit(classGroup.getId().longValue(), oldTeacherId);
+				imGroupMemberService.join(classGroup.getId().longValue(), newTeacherId, "指导老师", false);
 			}
 		}
 	}

+ 6 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -691,8 +691,9 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void updateCourseActualPrice() {
-		List<CourseScheduleStudentPaymentDto> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findNeedUpdateActualPriceStudentCourses();
+	public void updateCourseActualPrice(List<String> groupIds, List<Integer> userIds, GroupType groupType) {
+		studentDao.lockUser(1);
+		List<CourseScheduleStudentPaymentDto> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findNeedUpdateActualPriceStudentCourses(groupIds, userIds, groupType);
 		if(CollectionUtils.isEmpty(courseScheduleStudentPayments)){
 			return;
 		}
@@ -713,6 +714,9 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 			for (CourseScheduleStudentPaymentDto notStartCourse : notStartCourses) {
 				BigDecimal actualPrice = Objects.isNull(notStartCourse.getActualPrice())?BigDecimal.ZERO:notStartCourse.getActualPrice();
 				BigDecimal deductAmount = studentRegistrationService.updateUserSurplusCourseFee(notStartCourse.getUserId(), notStartCourse.getMusicGroupId(), (notStartCourse.getExpectPrice().subtract(actualPrice)).negate(), StringUtils.join("课程结束,扣除课程费用:", notStartCourse.getCourseScheduleId()), null);
+				if(actualPrice.compareTo(actualPrice.add(deductAmount.abs()))==0){
+					continue;
+				}
 				notStartCourse.setActualPrice(actualPrice.add(deductAmount.abs()));
 				needUpdates.add(notStartCourse);
 			}

+ 1 - 35
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -333,23 +333,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<Teacher> teachers = teacherDao.findByTeacherIds(new ArrayList<>(teacherIds));
         Map<Integer, Teacher> idTeacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, t -> t, (t1, t2) -> t1));
 
-        for (TeacherVipSalaryDto ts : teacherSalaryList) {
-            try {
-                //按照活动重新计算课酬
-                VipGroup vipGroup = vipGroupService.get(Long.valueOf(ts.getMusicGroupId()));
-                Map<String, BigDecimal> teachModeSalaryMap = vipGroupService.countVipGroupCoursePredictFee(vipGroup, ts.getUserId(), ts.getCourseScheduleId());
-                if(TeachModeEnum.ONLINE.equals(ts.getTeachMode())&&teachModeSalaryMap.containsKey("onlineTeacherSalary")){
-                    ts.setExpectSalary(teachModeSalaryMap.get("onlineTeacherSalary"));
-                }else if(TeachModeEnum.OFFLINE.equals(ts.getTeachMode())&&teachModeSalaryMap.containsKey("offlineTeacherSalary")){
-                    ts.setExpectSalary(teachModeSalaryMap.get("offlineTeacherSalary"));
-                }
-            } catch (NumberFormatException e) {
-                LOGGER.error("课酬计算错误:",ts.getCourseScheduleId(), e.getCause());
-                ts.setExpectSalary(BigDecimal.ZERO);
-            }
-            courseScheduleTeacherSalaryDao.update(ts);
-        }
-
         //获取教师未结算课程记录
         List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findSomeDayAgoTeacherCourseSalaryNoSettlement(startDate,endDate);
         if (CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)) {
@@ -559,17 +542,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             Teacher teacher = idTeacherMap.get(courseScheduleTeacherSalary.getUserId());
 
             if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
-                //根据课程类型获取对应的默认课酬设置列表
-                List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
-                if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
-                    LOGGER.error("存在未指定结算方式的课程类型[{}]", courseScheduleTeacherSalary.getId());
-                }
-
-                //根据教师编号将对应结算方式下的默认课酬设置分组
-                Map<Integer, TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesGroupByTeacherId = teacherDefaultMusicGroupSalariesWithCourseType.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getUserId, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
-
-                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
-
                 Long normalStudentNum = courseNormalStudentsMap.get(courseSchedule.getId());
                 if(Objects.isNull(normalStudentNum)){
                     normalStudentNum = Long.valueOf(0);
@@ -577,13 +549,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 if(normalStudentNum>5){
                     normalStudentNum=Long.valueOf(5);
                 }
-                if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)&& org.apache.commons.lang3.StringUtils.isNoneBlank(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson())){
-                    JSONObject salaryRuleJsonObject = JSONObject.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson());
-                    teacherSalary = salaryRuleJsonObject.getBigDecimal(normalStudentNum.toString());
-                }
-                if(Objects.isNull(teacherSalary)){
-                    teacherSalary = BigDecimal.ZERO;
-                }
+
                 List<String> deductReasons = new ArrayList<>();
 
                 BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getId());

+ 19 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java

@@ -23,6 +23,7 @@ import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -78,7 +79,11 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
     @Autowired
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
     @Autowired
-    private ImFeignService imFeignService;
+    private ImGroupService imGroupService;
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+    @Autowired
+    private ImUserFriendService imUserFriendService;
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
     @Autowired
@@ -251,6 +256,11 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
         }
         courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
         teacherAttendanceDao.batchInsert(teacherAttendances);
+        //创建群聊
+        imGroupService.create(classGroup.getId().longValue(), null, classGroup.getName(), courseGroup.getName(), courseGroup.getName(), courseGroup.getName(), null, "COMM");
+        Map<Integer,String> userRoleMap = new HashMap(1);
+        userRoleMap.put(courseGroup.getTeacherId(),"指导老师");
+        imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
         return BaseController.succeed();
     }
 
@@ -739,14 +749,14 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
 
             return BaseController.failed(HttpStatus.FOUND, errMessage);
         }
-
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-        imGroupMemberList.add(new ImGroupMember(coursesGroup.getTeacherId().toString()));
-        imGroupMemberList.add(new ImGroupMember(order.getUserId().toString()));
-        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-        // 创建群组
-        imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
-
+        
+        Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
+        userRoleMap.put(coursesGroup.getTeacherId(), "");
+        userRoleMap.put(order.getUserId(), "");
+        
+        imGroupService.create(classGroup.getId().longValue(), coursesGroup.getTeacherId(), classGroup.getName(), classGroup.getName(), classGroup.getName(), classGroup.getName(), null, "COMM");
+        imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
+        imUserFriendService.refreshClassImUserFriend(classGroup.getId());
         return BaseController.succeed();
     }
 

+ 4 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java

@@ -82,6 +82,8 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
     @Autowired
     private ImFeignService imFeignService;
     @Autowired
+    private ImUserFriendService imUserFriendService;
+    @Autowired
     private TeacherFreeTimeDao teacherFreeTimeDao;
     @Autowired
     private CourseScheduleService courseScheduleService;
@@ -616,13 +618,7 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         }
 
         studentDao.updateStudentServiceTag(practiceGroup.getStudentId(),null,YesOrNoEnum.YES.getCode());
-
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-        imGroupMemberList.add(new ImGroupMember(practiceGroup.getUserId().toString()));
-        imGroupMemberList.add(new ImGroupMember(practiceGroup.getStudentId().toString()));
-        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-        // 创建群组
-        imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+        imUserFriendService.refreshGroupImUserFriend(practiceGroup.getId().toString(),GroupType.PRACTICE);
     }
 
     @Override
@@ -1161,17 +1157,7 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         }
 
         studentDao.updateStudentServiceTag(practiceGroupBuyParams.getStudentId(),null,YesOrNoEnum.YES.getCode());
-
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-        if(Objects.nonNull(practiceGroupBuyParams.getEducationalTeacherId())){
-            imGroupMemberList.add(new ImGroupMember(practiceGroupBuyParams.getEducationalTeacherId().toString()));
-        }
-        imGroupMemberList.add(new ImGroupMember(practiceGroupBuyParams.getUserId().toString()));
-        imGroupMemberList.add(new ImGroupMember(practiceGroupBuyParams.getStudentId().toString()));
-        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-        // 创建群组
-        imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
-
+        imUserFriendService.refreshGroupImUserFriend(practiceGroupBuyParams.getId().toString(),GroupType.PRACTICE);
         return BaseController.succeed();
     }
 

+ 86 - 25
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -1,5 +1,20 @@
 package com.ym.mec.biz.service.impl;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.service.ImUserFriendService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.YesOrNoEnum;
@@ -10,13 +25,13 @@ import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.EmployeeDto;
 import com.ym.mec.biz.dal.dto.EmployeeLevelDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.enums.EmployeeOperateEnum;
 import com.ym.mec.biz.dal.enums.ParamEnum;
 import com.ym.mec.biz.dal.page.EmployeeQueryInfo;
 import com.ym.mec.biz.service.EmployeeService;
+import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
@@ -27,14 +42,6 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.collection.MapUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-import java.util.stream.Collectors;
 
 @Service
 public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  implements EmployeeService {
@@ -44,6 +51,8 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	@Autowired
 	private ImFeignService imFeignService;
 	@Autowired
+	private ImGroupMemberService imGroupMemberService;
+	@Autowired
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
 	private TeacherDao teacherDao;
@@ -51,6 +60,8 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	private SysUserCashAccountDao sysUserCashAccountDao;
 	@Autowired
 	private ClassGroupDao classGroupDao;
+	@Autowired
+	private ImUserFriendService imUserFriendService;
 
 	@Override
 	public BaseDAO<Integer, Employee> getDAO() {
@@ -220,7 +231,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	@Transactional(rollbackFor = Exception.class)
 	public void level(List<EmployeeLevelDto> employeeLevelDtos) {
 		Integer levelUserId = employeeLevelDtos.get(0).getLevelUserId();
-		List<ImGroupModel> imGroupModels = new ArrayList<>();
+		List<ImGroupModel> educationGroupModels = new ArrayList<>();
+		List<ImGroupModel> teamGroupModels = new ArrayList<>();
+		List<ImGroupModel> directorGroupModels = new ArrayList<>();
 		//获取用户需要加入的群组列表
 		Map<String, List<EmployeeLevelDto>> collect = employeeLevelDtos.stream().collect(Collectors.groupingBy(e -> e.getRoleName()));
 		Set<String> roleNames = collect.keySet();
@@ -237,42 +250,64 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 					switch (roleName){
 						case "education":
 							//教务老师所需加入的群组
-							imGroupModels.addAll(classGroupDao.queryEducationGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
+							educationGroupModels.addAll(classGroupDao.queryEducationGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 							break;
 						case "teamTeacher":
 							//运营主管所需加入的群组
-							imGroupModels.addAll(classGroupDao.queryTeamTeacherGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
+							teamGroupModels.addAll(classGroupDao.queryTeamTeacherGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 							break;
 						case "director":
 							//乐队指导所需加入的群组
-							imGroupModels.addAll(classGroupDao.queryDirectorGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
+							directorGroupModels.addAll(classGroupDao.queryDirectorGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 							break;
 					}
 				}
 			}
 		}
-		if(imGroupModels.size() > 0){
+		if(educationGroupModels.size() > 0){
+			//❤️用户加群
+			for (ImGroupModel imGroupModel : educationGroupModels) {
+				Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
+				
+				List<ImGroupMember> memberList = imGroupModel.getMemberList();
+				for(ImGroupMember member : memberList){
+					userRoleMap.put(Integer.parseInt(member.getId()), "乐团主管");
+				}
+				imGroupMemberService.join(Long.parseLong(imGroupModel.getId()), userRoleMap);
+			}
+		}
+		if(teamGroupModels.size() > 0){
+			//❤️用户加群
+			for (ImGroupModel imGroupModel : teamGroupModels) {
+				Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
+				
+				List<ImGroupMember> memberList = imGroupModel.getMemberList();
+				for(ImGroupMember member : memberList){
+					userRoleMap.put(Integer.parseInt(member.getId()), "运营主管");
+				}
+				imGroupMemberService.join(Long.parseLong(imGroupModel.getId()), userRoleMap);
+			}
+		}
+		if(directorGroupModels.size() > 0){
 			//❤️用户加群
-			for (ImGroupModel imGroupModel : imGroupModels) {
+			for (ImGroupModel imGroupModel : directorGroupModels) {
+				Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
+				
 				List<ImGroupMember> memberList = imGroupModel.getMemberList();
-				if(memberList != null && memberList.size() > 0){
-					ImGroupMember[] imGroupMembers = new ImGroupMember[memberList.size()];
-					imGroupModel.setMembers(memberList.toArray(imGroupMembers));
+				for(ImGroupMember member : memberList){
+					userRoleMap.put(Integer.parseInt(member.getId()), "乐队指导");
 				}
+				imGroupMemberService.join(Long.parseLong(imGroupModel.getId()), userRoleMap);
 			}
-		imFeignService.groupBatchJoin(imGroupModels);
 		}
 		//原有员工退群
 		List<ImGroupModel> groupModels = classGroupDao.queryTeacherQuitGroups(levelUserId);
 		if(groupModels.size() > 0){
+			List<Long> imGroupIdList = new ArrayList<Long>();
 			for (ImGroupModel imGroupModel : groupModels) {
-				List<ImGroupMember> memberList = imGroupModel.getMemberList();
-				if(memberList != null && memberList.size() > 0){
-					ImGroupMember[] imGroupMembers = new ImGroupMember[memberList.size()];
-					imGroupModel.setMembers(memberList.toArray(imGroupMembers));
-				}
+				imGroupIdList.add(Long.parseLong(imGroupModel.getId()));
 			}
-			imFeignService.groupBatchQuit(groupModels);
+			imGroupMemberService.quit(imGroupIdList, levelUserId);
 		}
 		//更换教务老师等数据
 		employeeDao.employeeLevel(employeeLevelDtos);
@@ -280,5 +315,31 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 		employeeDao.updateUserDemissionDate(levelUserId);
 		//冻结用户
 		employeeDao.updateUserLock(levelUserId,1);
+		//获取用户担任教务老师的所有乐团列表
+		List<String> musicGroupIds = employeeDao.queryMusicGroupIdByUserId(levelUserId);
+		if(musicGroupIds.size() > 0){
+			for (String musicGroupId : musicGroupIds) {
+				imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);
+			}
+		}
+		//获取用户担任教务老师的所有网管课列表
+		List<String> practiceGroupIds = employeeDao.queryPracticeGroupIdByUserId(levelUserId);
+		if(practiceGroupIds.size() > 0){
+			for (String musicGroupId : practiceGroupIds) {
+				imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.PRACTICE);
+			}
+		}
+		//获取用户担任教务老师的所有VIP课列表
+		List<String> vipGroupIds = employeeDao.queryVipGroupIdByUserId(levelUserId);
+		if(vipGroupIds.size() > 0){
+			for (String musicGroupId : vipGroupIds) {
+				imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.VIP);
+			}
+		}
+	}
+
+	@Override
+	public List<SimpleUserDto> findAllByRole(String roleIds, String organIds) {
+		return employeeDao.findAllByRole(roleIds,organIds);
 	}
 }

+ 216 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java

@@ -0,0 +1,216 @@
+package com.ym.mec.biz.service.impl;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.ImGroupDao;
+import com.ym.mec.biz.dal.dao.ImGroupMemberDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.entity.ImGroupMember;
+import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.im.ImFeignService;
+import com.ym.mec.im.entity.GroupMember;
+import com.ym.mec.im.entity.GroupModel;
+import com.ym.mec.util.collection.MapUtil;
+
+@Service
+public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMember> implements ImGroupMemberService {
+
+	@Autowired
+	private ImGroupMemberDao imGroupMemberDao;
+
+	@Autowired
+	private ImGroupDao imGroupDao;
+
+	@Autowired
+	private TeacherDao teacherDao;
+
+	@Autowired
+	private ImFeignService imFeignService;
+	
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@Override
+	public BaseDAO<Long, ImGroupMember> getDAO() {
+		return imGroupMemberDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean join(Long imGroupId, Integer userId, String roleType, boolean isAdmin) {
+		ImGroup imGroup = imGroupDao.getLocked(imGroupId);
+		if (imGroup == null) {
+			throw new BizException("加入群组失败:群组[{}]不存在", imGroupId);
+		}
+		//检查用户是否已存在
+		List<ImGroupMember> imGroupMemberList = imGroupMemberDao.queryByImGroupIdAndUserId(imGroupId.toString(), userId.toString());
+		if(imGroupMemberList != null && imGroupMemberList.size() > 0){
+			return true;
+		}
+		
+		SysUser user = sysUserFeignService.queryUserById(userId);
+		
+		ImGroupMember imGroupMember = new ImGroupMember();
+		Date date = new Date();
+
+		imGroupMember.setCreateTime(date);
+		imGroupMember.setImGroupId(imGroupId);
+		imGroupMember.setIsAdmin(isAdmin);
+		imGroupMember.setRoleType(roleType);
+		imGroupMember.setUpdateTime(date);
+		imGroupMember.setUserId(userId);
+		imGroupMember.setNickname(StringUtils.isBlank(user.getUsername()) ? user.getRealName() : user.getUsername());
+
+		imGroupMemberDao.insert(imGroupMember);
+
+		imGroup.setMemberNum(imGroup.getMemberNum() + 1);
+		imGroup.setUpdateTime(date);
+		imGroupDao.update(imGroup);
+
+		String groupId = imGroup.getId().toString();
+
+		GroupMember groupMember = new GroupMember(userId.toString(), groupId);
+		imFeignService.groupJoin(new GroupModel(groupId, new GroupMember[] { groupMember }, imGroup.getName()));
+
+		return true;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean join(Long imGroupId, Map<Integer, String> userRoleMap) {
+		ImGroup imGroup = imGroupDao.getLocked(imGroupId);
+		if (imGroup == null) {
+			throw new BizException("加入群组失败:群组[{}]不存在", imGroupId);
+		}
+		//检查用户是否已存在
+		List<Integer> existUserIdList = imGroupMemberDao.queryByImGroupIdAndUserId(imGroupId.toString(), userRoleMap.keySet().stream().filter(Objects::nonNull).map(Objects::toString)
+		.collect(Collectors.joining(","))).stream().map(e -> e.getUserId()).collect(Collectors.toList());
+
+		Date date = new Date();
+		List<ImGroupMember> imGroupMemberList = new ArrayList<ImGroupMember>();
+		List<GroupMember> groupMemberList = new ArrayList<GroupMember>();
+
+		String groupId = imGroup.getId().toString();
+		Map<Integer, String> nameIdMap= MapUtil.convertIntegerMap(teacherDao.queryUserNameByIdList(new ArrayList<>(userRoleMap.keySet())));
+		for (Entry<Integer, String> entry : userRoleMap.entrySet()) {
+			
+			if(existUserIdList.contains(entry.getKey())||Objects.isNull(entry.getKey())){
+				continue;
+			}
+
+			ImGroupMember imGroupMember = new ImGroupMember();
+			imGroupMember.setCreateTime(date);
+			imGroupMember.setImGroupId(imGroupId);
+			imGroupMember.setIsAdmin(false);
+			imGroupMember.setRoleType(entry.getValue());
+			imGroupMember.setUpdateTime(date);
+			imGroupMember.setUserId(entry.getKey());
+			imGroupMember.setNickname(nameIdMap.get(imGroupMember.getUserId()));
+
+			imGroupMemberList.add(imGroupMember);
+			groupMemberList.add(new GroupMember(imGroupMember.getUserId().toString(), groupId));
+		}
+
+		if (imGroupMemberList.size() > 0) {
+			imGroupMemberDao.batchInsert(imGroupMemberList);
+
+			imGroup.setMemberNum(imGroup.getMemberNum() + imGroupMemberList.size());
+			imGroup.setUpdateTime(date);
+			imGroupDao.update(imGroup);
+
+			imFeignService.groupJoin(new GroupModel(groupId, groupMemberList.stream().toArray(GroupMember[]::new), imGroup.getName()));
+		}
+
+		return true;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean quit(Long imGroupId, Integer userId) {
+		List<Integer> userIdList = new ArrayList<Integer>();
+		userIdList.add(userId);
+
+		return quit(imGroupId, userIdList);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean quit(List<Long> imGroupIdList, Integer userId) {
+		for (Long imGroupId : imGroupIdList) {
+			quit(imGroupId, userId);
+		}
+		return true;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean quit(Long imGroupId, List<Integer> userIdList) {
+
+		ImGroup imGroup = imGroupDao.getLocked(imGroupId);
+		if (imGroup == null) {
+			return true;
+		}
+
+		List<ImGroupMember> imGroupMemberList = imGroupMemberDao.queryByImGroupIdAndUserId(imGroupId.toString(), userIdList.stream().map(Objects::toString)
+				.collect(Collectors.joining(",")));
+
+		if (imGroupMemberList == null || imGroupMemberList.size() == 0) {
+			return true;
+		}
+
+		imGroupMemberDao.batchDelete(imGroupMemberList);
+
+		imGroup.setMemberNum(imGroup.getMemberNum() - userIdList.size());
+		imGroup.setUpdateTime(new Date());
+		imGroupDao.update(imGroup);
+
+		String groupId = imGroup.getId().toString();
+
+		List<GroupMember> groupMemberList = new ArrayList<GroupMember>();
+		for (Integer userId : userIdList) {
+			groupMemberList.add(new GroupMember(userId.toString(), groupId));
+		}
+		imFeignService.groupQuit(new GroupModel(groupId, groupMemberList.stream().toArray(GroupMember[]::new), imGroup.getName()));
+
+		return true;
+	}
+
+	@Override
+	public boolean updateRoleType(Long imGroupId, Integer userId, String roleType) {
+		List<Integer> userIdList = new ArrayList<Integer>();
+		userIdList.add(userId);
+		List<ImGroupMember> imGroupMemberList = imGroupMemberDao.queryByImGroupIdAndUserId(imGroupId.toString(), userIdList.stream().map(Objects::toString)
+				.collect(Collectors.joining(",")));
+
+		if (imGroupMemberList == null || imGroupMemberList.size() == 0) {
+			throw new BizException("更新失败:找不到用户信息");
+		}
+
+		Date date = new Date();
+		for (ImGroupMember imGroupMember : imGroupMemberList) {
+			imGroupMember.setRoleType(roleType);
+			imGroupMember.setUpdateTime(date);
+		}
+		imGroupMemberDao.batchUpdate(imGroupMemberList);
+
+		return true;
+	}
+
+}

+ 36 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupNoticeServiceImpl.java

@@ -1,16 +1,26 @@
 package com.ym.mec.biz.service.impl;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
 import com.ym.mec.biz.dal.dao.ImGroupNoticeDao;
+import com.ym.mec.biz.dal.dto.ImGroupNoticeDto;
 import com.ym.mec.biz.dal.entity.ImGroupNotice;
+import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
 import com.ym.mec.biz.service.ImGroupNoticeService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
+import com.ym.mec.util.collection.MapUtil;
 
 @Service
 public class ImGroupNoticeServiceImpl extends BaseServiceImpl<Long, ImGroupNotice>  implements ImGroupNoticeService {
-
+	
 	@Autowired
 	private ImGroupNoticeDao imGroupNoticeDao;
 
@@ -20,7 +30,28 @@ public class ImGroupNoticeServiceImpl extends BaseServiceImpl<Long, ImGroupNotic
 	}
 
 	@Override
-	public ImGroupNotice getNewNotice(Long groupId) {
-		return imGroupNoticeDao.getNewNotice(groupId);
+	public PageInfo<ImGroupNoticeDto> queryPage(ImGroupNoticeQueryInfo queryInfo) {
+		PageInfo<ImGroupNoticeDto> pageInfo = new PageInfo<ImGroupNoticeDto>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+		
+		List<ImGroupNoticeDto> dataList = null;
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = imGroupNoticeDao.queryForPage(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<ImGroupNoticeDto>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	public ImGroupNoticeDto queryLatestNotice(Long imGroupId) {
+		return imGroupNoticeDao.queryLatestNotice(imGroupId);
 	}
+	
 }

+ 122 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -0,0 +1,122 @@
+package com.ym.mec.biz.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.ym.mec.biz.dal.dao.ImGroupDao;
+import com.ym.mec.biz.dal.dao.ImGroupMemberDao;
+import com.ym.mec.biz.dal.dao.ImGroupNoticeDao;
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.im.ImFeignService;
+import com.ym.mec.im.entity.GroupMember;
+import com.ym.mec.im.entity.GroupModel;
+
+@Service
+public class ImGroupServiceImpl extends BaseServiceImpl<Long, ImGroup> implements ImGroupService {
+
+	@Autowired
+	private ImGroupDao imGroupDao;
+
+	@Autowired
+	private ImGroupMemberDao imGroupMemberDao;
+
+	@Autowired
+	private ImGroupNoticeDao imGroupNoticeDao;
+
+	@Autowired
+	private ImGroupMemberService imGroupMemberService;
+
+	@Autowired
+	private ImFeignService imFeignService;
+
+	@Override
+	public BaseDAO<Long, ImGroup> getDAO() {
+		return imGroupDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean create(Long id, Integer userId, String name, String introduce, String memo, String tags, String img, String type) {
+		ImGroup imGroup = imGroupDao.get(id);
+		if (imGroup != null) {
+			return true;
+		}
+
+		imGroup = new ImGroup();
+
+		Date date = new Date();
+
+		imGroup.setId(id);
+		imGroup.setCreateTime(date);
+		imGroup.setIntroduce(introduce);
+		
+		if(userId != null){
+			imGroup.setMemberNum(1);
+		}else{
+			imGroup.setMemberNum(0);
+		}
+		imGroup.setMemo(memo);
+		imGroup.setName(name);
+		imGroup.setTags(tags);
+		imGroup.setImg(img);
+		imGroup.setType(type);
+		imGroup.setUpdateTime(date);
+		imGroupDao.insert(imGroup);
+
+		String groupId = imGroup.getId().toString();
+		
+		if(userId != null){
+			imGroupMemberService.join(imGroup.getId(), userId, null, true);
+
+			GroupMember groupMember = new GroupMember(userId.toString(), groupId);
+
+			imFeignService.groupCreate(new GroupModel(groupId, new GroupMember[] { groupMember }, name));
+		}else{
+			imFeignService.groupCreate(new GroupModel(groupId, null, name));
+		}
+
+		return true;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean cancel(Long imGroupId) {
+
+		// 删除群成员
+		imGroupMemberDao.deleteByImGroupId(imGroupId);
+		// 删除群公告
+		imGroupNoticeDao.deleteByImGroupId(imGroupId);
+		// 删除群信息
+		imGroupDao.delete(imGroupId);
+
+		String groupId = imGroupId.toString();
+		imFeignService.groupDismiss(new GroupModel(groupId, null));
+
+		return true;
+	}
+
+	@Override
+	public List<ImGroup> queryByUserId(Integer userId, String search) {
+		return imGroupDao.queryByUserId(userId, search);
+	}
+
+	@Override
+	public List<ImGroupMemberDto> queryMemberById(Long imGroupId) {
+		return imGroupDao.queryMemberById(imGroupId);
+	}
+
+	@Override
+	public ImGroupMemberDto queryMember(Long imGroupId, Integer userId) {
+		return imGroupDao.queryMember(imGroupId, userId);
+	}
+
+}

+ 310 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java

@@ -0,0 +1,310 @@
+package com.ym.mec.biz.service.impl;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.service.TeacherService;
+import com.ym.mec.util.collection.MapUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.biz.dal.dto.ImUserFriendDto;
+import com.ym.mec.biz.service.ImUserFriendService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+
+import static com.ym.mec.biz.dal.enums.GroupType.*;
+
+@Service
+public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend> implements ImUserFriendService {
+
+	@Autowired
+	private ImUserFriendDao imUserFriendDao;
+	@Autowired
+	private TeacherService teacherService;
+	@Autowired
+	private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
+	@Autowired
+	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+	@Autowired
+	private MusicGroupDao musicGroupDao;
+	@Autowired
+	private VipGroupDao vipGroupDao;
+	@Autowired
+	private PracticeGroupDao practiceGroupDao;
+	@Autowired
+	private TeacherDao teacherDao;
+	@Autowired
+	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private StudentRegistrationDao studentRegistrationDao;
+	@Autowired
+	private ClassGroupDao classGroupDao;
+	@Autowired
+	private RedisTemplate<String,String> redisTemplate;
+
+	@Override
+	public BaseDAO<Long, ImUserFriend> getDAO() {
+		return imUserFriendDao;
+	}
+
+	@Override
+	public boolean addFriend(Integer userId, Integer friendUserId, String nickname, String memo) {
+		// 检查是否已经是好友
+		ImUserFriend userFriend = imUserFriendDao.query(userId, friendUserId);
+		if (userFriend != null) {
+			throw new BizException("好友已存在");
+		}
+
+		Date date = new Date();
+
+		userFriend = new ImUserFriend();
+		userFriend.setFriendId(friendUserId);
+		userFriend.setUserId(friendUserId);
+		userFriend.setFriendNickname(nickname);
+		userFriend.setMemo(memo);
+		userFriend.setCreateTime(date);
+		userFriend.setUpdateTime(date);
+		imUserFriendDao.insert(userFriend);
+
+		return true;
+	}
+
+	@Override
+	public boolean deleteFriend(Integer userId, Integer friendUserId) {
+		ImUserFriend userFriend = imUserFriendDao.query(userId, friendUserId);
+		if (userFriend == null) {
+			throw new BizException("好友不存在");
+		}
+		imUserFriendDao.delete(userFriend.getId());
+		return true;
+	}
+
+	@Override
+	public boolean updateFriendNickname(Integer userId, Integer friendUserId, String nickname) {
+		ImUserFriend userFriend = imUserFriendDao.query(userId, friendUserId);
+		if (userFriend == null) {
+			throw new BizException("好友不存在");
+		}
+		Date date = new Date();
+		userFriend.setFriendNickname(nickname);
+		userFriend.setUpdateTime(date);
+		imUserFriendDao.update(userFriend);
+
+		return true;
+	}
+
+	@Override
+	public List<ImUserFriendDto> queryFriendListByUserId(Integer userId, String search) {
+		String syncImUserFriendKey = "syncImUserFriend:" + userId;
+		if(redisTemplate.hasKey(syncImUserFriendKey)){
+			return imUserFriendDao.queryFriendListByUserId(userId, search);
+		}else {
+			return teacherService.queryGroupStudents1(userId,null);
+		}
+	}
+
+	@Override
+	public ImUserFriendDto queryFriendDetail(Integer userId, Integer friendUserId) {
+		return imUserFriendDao.queryFriendDetail(userId, friendUserId);
+	}
+
+	@Override
+	public void batchInsert(List<ImUserFriend> imUserFriends) {
+		for (ImUserFriend imUserFriend : imUserFriends) {
+			if(imUserFriend.getUserId() == imUserFriend.getFriendId()){
+				continue;
+			}
+			// 检查是否已经是好友
+			ImUserFriend userFriend = imUserFriendDao.query(imUserFriend.getUserId(), imUserFriend.getFriendId());
+			if (userFriend != null) {
+				continue;
+			}
+			imUserFriendDao.insert(imUserFriend);
+		}
+	}
+
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void refreshCourseImUserFriend(Long courseId) {
+		CourseSchedule courseSchedule = courseScheduleDao.get(courseId);
+		//获取班级关联的老师列表
+		Set<Integer> teacherIds = classGroupTeacherMapperDao.queryTeacherIdsByClassGroupId(courseSchedule.getClassGroupId(),null,null);
+		//获取班级关联的学员列表
+		Set<Integer> studentIds = classGroupStudentMapperDao.queryStudentIdsByClassGroupId(courseSchedule.getClassGroupId(),null,null);
+		ClassGroup classGroup = classGroupDao.get(courseSchedule.getClassGroupId());
+		GroupType groupType = classGroup.getGroupType();
+		List<ImUserFriend> imUserFriends = saveImUserFriends(studentIds, teacherIds, groupType, classGroup.getMusicGroupId());
+		if(imUserFriends.size() > 0){
+			batchInsert(imUserFriends);
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void refreshClassImUserFriend(Integer classGroupId) {
+		//获取班级关联的老师列表
+		Set<Integer> teacherIds = classGroupTeacherMapperDao.queryTeacherIdsByClassGroupId(classGroupId,null,null);
+		//获取班级关联的学员列表
+		Set<Integer> studentIds = classGroupStudentMapperDao.queryStudentIdsByClassGroupId(classGroupId,null,null);
+		ClassGroup classGroup = classGroupDao.get(classGroupId);
+		GroupType groupType = classGroup.getGroupType();
+		List<ImUserFriend> imUserFriends = saveImUserFriends(studentIds, teacherIds, groupType, classGroup.getMusicGroupId());
+		if(imUserFriends.size() > 0){
+			batchInsert(imUserFriends);
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void refreshGroupImUserFriend(String musicGroupId,GroupType groupType) {
+		List<ClassGroup> classGroups = classGroupDao.queryClassGroups(musicGroupId, groupType.getCode());
+		List<ImUserFriend> imUserFriends = new ArrayList<>();
+		classGroups.forEach(e->{
+			//获取班级关联的老师列表
+			Set<Integer> teacherIds = classGroupTeacherMapperDao.queryTeacherIdsByClassGroupId(e.getId(),null,null);
+			//获取班级关联的学员列表
+			Set<Integer> studentIds = classGroupStudentMapperDao.queryStudentIdsByClassGroupId(e.getId(),null,null);
+			imUserFriends.addAll(saveImUserFriends(studentIds,teacherIds,groupType,musicGroupId));
+		});
+		if(imUserFriends.size() > 0){
+			batchInsert(imUserFriends);
+		}
+	}
+
+	public List<ImUserFriend> saveImUserFriends(Set<Integer> studentIds,Set<Integer> teacherIds,GroupType groupType,String musicGroupId){
+		List<ImUserFriend> imUserFriends = new ArrayList<>();
+		Set<Integer> educationIds = new HashSet<>();
+		MusicGroup musicGroup = new MusicGroup();
+		//获取当前学员声部
+		Map<Integer,String> studentSubjectName = new HashMap<>();
+		Map<Integer, String> teacherSubjectNameMap = new HashMap<>();
+		if(teacherIds.size() > 0){
+			teacherSubjectNameMap = MapUtil.convertIntegerMap(teacherDao.querySubjectNameByIdList(new ArrayList<>(teacherIds)));
+		}
+		if(groupType == MUSIC){
+			//学员关联乐团管理人员通讯录
+			musicGroup = musicGroupDao.get(musicGroupId);
+			educationIds.add(musicGroup.getDirectorUserId());
+			educationIds.add(musicGroup.getEducationalTeacherId());
+			educationIds.add(musicGroup.getTeamTeacherId());
+			if(studentIds.size() > 0){
+				studentSubjectName = MapUtil.convertMybatisMap(studentRegistrationDao.getStudentSubjectNameByStuIds(musicGroup.getId(),studentIds));
+			}
+		}else if(groupType == VIP){
+			VipGroup vipGroup = vipGroupDao.get(Long.parseLong(musicGroupId));
+			educationIds.add(vipGroup.getEducationalTeacherId());
+		}else if(groupType == PRACTICE){
+			PracticeGroup practiceGroup = practiceGroupDao.get(Long.parseLong(musicGroupId));
+			educationIds.add(practiceGroup.getEducationalTeacherId());
+		}
+		studentIds.removeAll(Collections.singleton(null));
+		teacherIds.removeAll(Collections.singleton(null));
+		educationIds.removeAll(Collections.singleton(null));
+		Map<Integer, String> usernameMap = new HashMap<>();
+		if(studentIds.size() > 0){
+			usernameMap = MapUtil.convertMybatisMap(teacherDao.queryUserNameByIdList(new ArrayList<>(studentIds)));
+		}
+		Map<Integer, String> teacherRealNameMap = new HashMap<>();
+		if(teacherIds.size() > 0){
+			teacherRealNameMap = MapUtil.convertMybatisMap(teacherDao.queryUserNameByIdList(new ArrayList<>(teacherIds)));
+		}
+		Map<Integer, String> educationRealNameMap = new HashMap<>();
+		if(educationIds.size() > 0){
+			educationRealNameMap = MapUtil.convertMybatisMap(teacherDao.queryUserNameByIdList(new ArrayList<>(educationIds)));
+		}
+		//老师关联教务、学员
+		for (Integer teacherId : teacherIds) {
+			//老师关联学员
+			for (Integer studentId : studentIds) {
+				if(teacherId == studentId){
+					continue;
+				}
+				//学员、教务关联的老师
+				ImUserFriend imUserFriend = new ImUserFriend();
+				imUserFriend.setUserId(teacherId);
+				imUserFriend.setFriendId(studentId);
+				imUserFriend.setFriendNickname(usernameMap.get(studentId));
+				imUserFriend.setMemo(musicGroup.getName());
+				imUserFriend.setTags(studentSubjectName.get(studentId));
+				imUserFriends.add(imUserFriend);
+			}
+			//老师关联教务
+			for (Integer educationId : educationIds) {
+				if(teacherId == educationId){
+					continue;
+				}
+				ImUserFriend imUserFriend = new ImUserFriend();
+				imUserFriend.setUserId(teacherId);
+				imUserFriend.setFriendId(educationId);
+				imUserFriend.setFriendNickname(educationRealNameMap.get(educationId));
+				imUserFriends.add(imUserFriend);
+			}
+		}
+		//教务关联的老师、学员
+		for (Integer educationId : educationIds) {
+			//教务关联学员
+			for (Integer studentId : studentIds) {
+				if(educationId == studentId){
+					continue;
+				}
+				ImUserFriend imUserFriend = new ImUserFriend();
+				imUserFriend.setUserId(educationId);
+				imUserFriend.setFriendId(studentId);
+				imUserFriend.setFriendNickname(usernameMap.get(studentId));
+				imUserFriend.setMemo(musicGroup.getName());
+				imUserFriend.setTags(studentSubjectName.get(studentId));
+				imUserFriends.add(imUserFriend);
+			}
+			//教务关联老师
+			for (Integer teacher : teacherIds) {
+				if(educationId == teacher){
+					continue;
+				}
+				ImUserFriend imUserFriend = new ImUserFriend();
+				imUserFriend.setUserId(educationId);
+				imUserFriend.setFriendId(teacher);
+				imUserFriend.setFriendNickname(teacherRealNameMap.get(teacher));
+				imUserFriend.setMemo(musicGroup.getName());
+				imUserFriend.setTags(teacherSubjectNameMap.get(teacher));
+				imUserFriends.add(imUserFriend);
+			}
+		}
+		//学员关联的老师、教务
+		for (Integer studentId : studentIds) {
+			//学员关联的老师
+			for (Integer teacher : teacherIds) {
+				if(teacher == studentId){
+					continue;
+				}
+				ImUserFriend imUserFriend = new ImUserFriend();
+				imUserFriend.setUserId(studentId);
+				imUserFriend.setFriendId(teacher);
+				imUserFriend.setFriendNickname(teacherRealNameMap.get(teacher));
+				imUserFriend.setMemo(musicGroup.getName());
+				imUserFriend.setTags(teacherSubjectNameMap.get(teacher));
+				imUserFriends.add(imUserFriend);
+			}
+			//学员关联的教务
+			for (Integer education : educationIds) {
+				if(education == studentId){
+					continue;
+				}
+				ImUserFriend imUserFriend = new ImUserFriend();
+				imUserFriend.setUserId(studentId);
+				imUserFriend.setFriendId(education);
+				imUserFriend.setFriendNickname(educationRealNameMap.get(education));
+				imUserFriends.add(imUserFriend);
+			}
+		}
+		return imUserFriends;
+	}
+}

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

@@ -0,0 +1,274 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dto.IndexBaseDto;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.IndexDataType;
+import com.ym.mec.biz.dal.enums.JobNatureEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
+import com.ym.mec.biz.service.IndexBaseMonthDataService;
+import com.ym.mec.biz.dal.dao.IndexBaseMonthDataDao;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBaseMonthData> implements IndexBaseMonthDataService {
+	
+	@Autowired
+	private IndexBaseMonthDataDao indexBaseMonthDataDao;
+	@Autowired
+	private OrganizationDao organizationDao;
+
+	private static ThreadLocal<Set<Integer>> organIds = new ThreadLocal<Set<Integer>>(){
+		@Override
+		protected Set<Integer> initialValue() {
+			return new HashSet<>();
+		}
+	};
+
+	@Override
+	public BaseDAO<Long, IndexBaseMonthData> getDAO() {
+		return indexBaseMonthDataDao;
+	}
+
+	@Override
+	public List<IndexBaseDto> getIndexBaseData(String dataTypesStr, String organIdsStr, Integer year) {
+		List<IndexBaseDto> result = new ArrayList<>();
+
+		DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM");
+		LocalDate nowDate = LocalDate.now();
+		nowDate = nowDate.withDayOfMonth(1);
+		Date currentMonth = Date.from(nowDate.atStartOfDay(DateUtil.zoneId).toInstant());
+
+		LocalDate startDate = LocalDate.now();
+		if(Objects.nonNull(year)){
+			startDate = startDate.withYear(year);
+		}
+		startDate = startDate.withMonth(1);
+		startDate = startDate.withDayOfMonth(1);
+
+		LocalDate endDate = startDate.withMonth(12);
+
+		Set<Integer> organIds = null;
+		if(StringUtils.isNotBlank(organIdsStr)){
+			organIds = Arrays.stream(organIdsStr.split(",")).map(Integer::new).collect(Collectors.toSet());
+		}
+		Set<String> dataTypes = null;
+		if(StringUtils.isNotBlank(dataTypesStr)){
+			dataTypes = Arrays.stream(dataTypesStr.split(",")).collect(Collectors.toSet());
+		}
+
+		List<IndexBaseMonthData> indexBaseDatas = indexBaseMonthDataDao.getIndexBaseData(organIds, dataTypes, df.format(startDate), df.format(endDate));
+		if(Objects.isNull(indexBaseDatas)){
+			indexBaseDatas = new ArrayList<>();
+		}
+
+		Map<IndexDataType, List<IndexBaseMonthData>> typeDateMap = indexBaseDatas.stream().collect(Collectors.groupingBy(IndexBaseMonthData::getDataType));
+		for (Map.Entry<IndexDataType, List<IndexBaseMonthData>> typeDateMapEntry : typeDateMap.entrySet()) {
+			Set<String> hasMonths = typeDateMapEntry.getValue().stream().map(d -> DateUtil.dateToString(d.getMonth(), "yyyy-MM-dd")).collect(Collectors.toSet());
+			LocalDate currentMonthDate = startDate;
+			while (currentMonthDate.compareTo(endDate)<=0){
+				if(hasMonths.contains(currentMonthDate.toString())){
+					currentMonthDate = currentMonthDate.plusMonths(1);
+					continue;
+				}
+				IndexBaseMonthData indexBaseMonthData = new IndexBaseMonthData();
+				indexBaseMonthData.setMonth(Date.from(currentMonthDate.atStartOfDay(DateUtil.zoneId).toInstant()));
+				indexBaseMonthData.setTotalNum(BigDecimal.ZERO);
+				indexBaseMonthData.setActivateNum(BigDecimal.ZERO);
+				indexBaseMonthData.setPercent(BigDecimal.ZERO);
+				indexBaseMonthData.setDataType(typeDateMapEntry.getKey());
+				typeDateMapEntry.getValue().add(indexBaseMonthData);
+				currentMonthDate = currentMonthDate.plusMonths(1);
+			}
+			typeDateMapEntry.getValue().sort(Comparator.comparing(IndexBaseMonthData::getMonth));
+			if(IndexDataType.ACTIVATION_RATE.equals(typeDateMapEntry.getKey())||IndexDataType.HOMEWORK_CREATE_RATE.equals(typeDateMapEntry.getKey())
+					||IndexDataType.HOMEWORK_SUBMIT_RATE.equals(typeDateMapEntry.getKey())||IndexDataType.HOMEWORK_SUBMIT_RATE.equals(typeDateMapEntry.getKey())
+					||IndexDataType.STUDENT_CONVERSION.equals(typeDateMapEntry.getKey())){
+				for (IndexBaseMonthData indexBaseMonthData : typeDateMapEntry.getValue()) {
+					if(indexBaseMonthData.getTotalNum().compareTo(BigDecimal.ZERO)==0){
+						indexBaseMonthData.setPercent(BigDecimal.ZERO);
+						continue;
+					}
+					indexBaseMonthData.setPercent(indexBaseMonthData.getActivateNum().divide(indexBaseMonthData.getTotalNum(), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN));
+				}
+			}
+			IndexBaseDto indexBaseData = new IndexBaseDto(typeDateMapEntry.getKey(),typeDateMapEntry.getKey().getMsg());
+			indexBaseData.setIndexMonthData(typeDateMapEntry.getValue(), currentMonth);
+			result.add(indexBaseData);
+		}
+		countStudentConvertData(result, currentMonth);
+		return result;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Map<String, List<IndexBaseDto>> indexBaseDataTask(String month) {
+		Map<String, List<IndexBaseDto>> result = new HashMap<>();
+
+		DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM");
+		LocalDate nowDate = LocalDate.now();
+
+		List<Organization> allOrgans = organizationDao.findAllOrgans();
+		if(CollectionUtils.isEmpty(this.organIds.get())){
+			this.organIds.get().clear();
+			this.organIds.get().addAll(allOrgans.stream().map(Organization::getId).collect(Collectors.toSet()));
+		}
+
+		if(StringUtils.isBlank(month)){
+			month = df.format(nowDate);
+		}
+
+		//运营数据
+		saveData(indexBaseMonthDataDao.getSchoolData(month), month, IndexDataType.SCHOOL);
+		saveData(indexBaseMonthDataDao.getMusicData(month), month, IndexDataType.MUSIC_GROUP_NUM);
+		saveData(indexBaseMonthDataDao.getMusicStudentData(month, null), month, IndexDataType.MUSIC_GROUP_STUDENT);
+		saveData(indexBaseMonthDataDao.getOtherStudentData(month), month, IndexDataType.OTHER_STUDENT);
+
+		//业务数据
+		saveData(indexBaseMonthDataDao.getStudentSignUpData(month), month, IndexDataType.ACTIVATION_RATE);
+		saveData(indexBaseMonthDataDao.getHomeworkData(month, null), month, IndexDataType.HOMEWORK_CREATE_RATE);
+		saveData(indexBaseMonthDataDao.getHomeworkData(month, "submit"), month, IndexDataType.HOMEWORK_SUBMIT_RATE);
+		saveData(indexBaseMonthDataDao.getHomeworkData(month, "comment"), month, IndexDataType.HOMEWORK_COMMENT_RATE);
+
+		//经营数据
+		saveData(null, month, IndexDataType.SHOULD_INCOME_MONEY);
+		saveData(null, month, IndexDataType.ANTICIPATED_INCOME_MONEY);
+		saveData(null, month, IndexDataType.SHOULD_EXPEND_MONEY);
+		saveData(null, month, IndexDataType.ANTICIPATED_EXPEND_MONEY);
+		saveData(null, month, IndexDataType.REVENUE_MONEY);
+
+		//人事数据
+		saveData(indexBaseMonthDataDao.getTeacherData(month, null, null), month, IndexDataType.TEACHER_NUM);
+		saveData(indexBaseMonthDataDao.getTeacherData(month, JobNatureEnum.FULL_TIME, null), month, IndexDataType.FULL_TIME_NUM);
+		saveData(indexBaseMonthDataDao.getTeacherData(month, JobNatureEnum.PART_TIME, null), month, IndexDataType.PART_TIME_NUM);
+		saveData(indexBaseMonthDataDao.getTeacherData(month, null, true), month, IndexDataType.DIMISSION_NUM);
+
+		//学员变动
+		saveData(indexBaseMonthDataDao.getMusicStudentData(month, "ALL"), month, IndexDataType.NEWLY_STUDENT_NUM);
+		saveData(indexBaseMonthDataDao.getMusicStudentData(month, "QUIT"), month, IndexDataType.QUIT_MUSIC_GROUP_STUDENT_NUM);
+		saveData(indexBaseMonthDataDao.getMusicGroupPreRegistrationStudentData(month), month, IndexDataType.STUDENT_CONVERSION_PRE_STUDENT_NUM);
+		saveData(indexBaseMonthDataDao.getMusicGroupStudentFromPreData(month, null), month, IndexDataType.STUDENT_CONVERSION_STUDENT_NUM);
+		saveData(indexBaseMonthDataDao.getMusicGroupStudentFromPreData(month, PaymentStatusEnum.YES), month, IndexDataType.STUDENT_CONVERSION_PAYMENT_STUDENT_NUM);
+		List<Integer> studentIds = indexBaseMonthDataDao.getMusicGroupStudentIdFromPre(month, PaymentStatusEnum.YES);
+		List<IndexBaseMonthData> convertStudentNum = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(studentIds)){
+			convertStudentNum = indexBaseMonthDataDao.getStudentConversionData(month, studentIds);
+		}
+		saveData(convertStudentNum, month, IndexDataType.STUDENT_CONVERSION_VIP_PRACTICE_STUDENT_NUM);
+
+		//课程数据
+		saveData(indexBaseMonthDataDao.getGroupCourseData(month, GroupType.MUSIC), month, IndexDataType.MUSIC_GROUP_COURSE);
+		saveData(indexBaseMonthDataDao.getGroupCourseData(month, GroupType.VIP), month, IndexDataType.VIP_GROUP_COURSE);
+		saveData(indexBaseMonthDataDao.getGroupCourseData(month, GroupType.PRACTICE), month, IndexDataType.PRACTICE_GROUP_COURSE);
+
+		return result;
+	}
+
+	private void countStudentConvertData(List<IndexBaseDto> result, Date currentMonth){
+		List<IndexBaseMonthData> convertData = new ArrayList<>();
+
+		Map<IndexDataType, IndexBaseDto> typeDataMap = result.stream().collect(Collectors.toMap(IndexBaseDto::getDataType, i -> i, (i1, i2) -> i1));
+		List<IndexBaseMonthData> preStudentNum = typeDataMap.get(IndexDataType.STUDENT_CONVERSION_PRE_STUDENT_NUM).getIndexMonthData();
+
+		IndexBaseMonthData preStudentNumData = new IndexBaseMonthData();
+		preStudentNumData.setMonth(currentMonth);
+		preStudentNumData.setDataType(IndexDataType.STUDENT_CONVERSION_PRE_STUDENT_NUM);
+		preStudentNumData.setTitle(IndexDataType.STUDENT_CONVERSION_PRE_STUDENT_NUM.getMsg());
+		preStudentNumData.setTotalNum(preStudentNum.stream().map(IndexBaseMonthData::getTotalNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+		preStudentNumData.setActivateNum(preStudentNum.stream().map(IndexBaseMonthData::getActivateNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+
+		List<IndexBaseMonthData> studentNum = typeDataMap.get(IndexDataType.STUDENT_CONVERSION_STUDENT_NUM).getIndexMonthData();
+
+		IndexBaseMonthData studentNumData = new IndexBaseMonthData();
+		studentNumData.setMonth(currentMonth);
+		studentNumData.setDataType(IndexDataType.STUDENT_CONVERSION_STUDENT_NUM);
+		studentNumData.setTitle(IndexDataType.STUDENT_CONVERSION_STUDENT_NUM.getMsg());
+		studentNumData.setTotalNum(studentNum.stream().map(IndexBaseMonthData::getTotalNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+		studentNumData.setActivateNum(studentNum.stream().map(IndexBaseMonthData::getActivateNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+
+		List<IndexBaseMonthData> paymentStudentNum = typeDataMap.get(IndexDataType.STUDENT_CONVERSION_PAYMENT_STUDENT_NUM).getIndexMonthData();
+
+		IndexBaseMonthData paymentStudentNumData = new IndexBaseMonthData();
+		paymentStudentNumData.setMonth(currentMonth);
+		paymentStudentNumData.setDataType(IndexDataType.STUDENT_CONVERSION_PAYMENT_STUDENT_NUM);
+		paymentStudentNumData.setTitle(IndexDataType.STUDENT_CONVERSION_PAYMENT_STUDENT_NUM.getMsg());
+		paymentStudentNumData.setTotalNum(paymentStudentNum.stream().map(IndexBaseMonthData::getTotalNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+		paymentStudentNumData.setActivateNum(paymentStudentNum.stream().map(IndexBaseMonthData::getActivateNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+
+		List<IndexBaseMonthData> convertStudentNum = typeDataMap.get(IndexDataType.STUDENT_CONVERSION_VIP_PRACTICE_STUDENT_NUM).getIndexMonthData();
+
+		IndexBaseMonthData convertStudentNumData = new IndexBaseMonthData();
+		convertStudentNumData.setMonth(currentMonth);
+		convertStudentNumData.setDataType(IndexDataType.STUDENT_CONVERSION_VIP_PRACTICE_STUDENT_NUM);
+		convertStudentNumData.setTitle(IndexDataType.STUDENT_CONVERSION_VIP_PRACTICE_STUDENT_NUM.getMsg());
+		convertStudentNumData.setTotalNum(convertStudentNum.stream().map(IndexBaseMonthData::getTotalNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+		convertStudentNumData.setActivateNum(convertStudentNum.stream().map(IndexBaseMonthData::getActivateNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+
+		if(preStudentNumData.getActivateNum().compareTo(BigDecimal.ZERO)==0){
+			studentNumData.setPercent(BigDecimal.ZERO);
+			paymentStudentNumData.setPercent(BigDecimal.ZERO);
+			convertStudentNumData.setPercent(BigDecimal.ZERO);
+		}else{
+			studentNumData.setPercent(studentNumData.getActivateNum().divide(preStudentNumData.getActivateNum()).multiply(new BigDecimal(100)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN));
+			if(studentNumData.getActivateNum().compareTo(BigDecimal.ZERO)==0){
+				paymentStudentNumData.setPercent(BigDecimal.ZERO);
+				convertStudentNumData.setPercent(BigDecimal.ZERO);
+			}else{
+				paymentStudentNumData.setPercent(paymentStudentNumData.getActivateNum().divide(studentNumData.getActivateNum()).multiply(new BigDecimal(100)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN));
+				if(paymentStudentNumData.getActivateNum().compareTo(BigDecimal.ZERO)==0){
+					convertStudentNumData.setPercent(BigDecimal.ZERO);
+				}else{
+					convertStudentNumData.setPercent(convertStudentNumData.getActivateNum().divide(paymentStudentNumData.getActivateNum()).multiply(new BigDecimal(100)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN));
+				}
+			}
+		}
+
+		convertData.add(preStudentNumData);
+		convertData.add(studentNumData);
+		convertData.add(paymentStudentNumData);
+		convertData.add(convertStudentNumData);
+		IndexBaseDto indexBaseData = new IndexBaseDto(IndexDataType.STUDENT_CONVERSION, IndexDataType.STUDENT_CONVERSION.getMsg());
+		indexBaseData.setIndexMonthData(convertData, currentMonth);
+		indexBaseData.setPercent(convertStudentNumData.getPercent());
+		result.add(indexBaseData);
+	}
+
+	/**
+	 * @describe 处理并保存每月数据
+	 * @author Joburgess
+	 * @date 2021/1/11 0011
+	 * @return void
+	 */
+	private void saveData(List<IndexBaseMonthData> dataList, String startMonth, IndexDataType indexDataType){
+		startMonth = startMonth+"-01";
+		Date date = DateUtil.stringToDate(startMonth, "yyyy-MM-dd");
+		if(Objects.isNull(dataList)){
+			dataList = new ArrayList<>();
+		}
+		Set<Integer> hasOrganIds = dataList.stream().map(IndexBaseMonthData::getOrganId).collect(Collectors.toSet());
+		for (Integer organId : this.organIds.get()) {
+			if(hasOrganIds.contains(organId)){
+				continue;
+			}
+			dataList.add(new IndexBaseMonthData(date, organId));
+		}
+		indexBaseMonthDataDao.deleteWithMonthAndType(Arrays.asList(startMonth), indexDataType);
+		indexBaseMonthDataDao.batchInsertWithDataType(dataList, indexDataType);
+	}
+}

+ 0 - 113
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexServiceImpl.java

@@ -1,113 +0,0 @@
-package com.ym.mec.biz.service.impl;
-
-import com.sun.org.apache.xerces.internal.xs.StringList;
-import com.ym.mec.biz.dal.dao.IndexDao;
-import com.ym.mec.biz.dal.dto.IndexBaseDto;
-import com.ym.mec.biz.dal.dto.IndexBaseMonthDto;
-import com.ym.mec.biz.service.IndexService;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @Author Joburgess
- * @Date 2021/1/7 0007
- */
-@Service
-public class IndexServiceImpl implements IndexService {
-    
-    @Autowired
-    private IndexDao indexDao;
-
-    @Override
-    public Map<String, List<IndexBaseDto>> getIndexBaseData(Set<String> dataTypes, String organIdsStr, String startMonth, String endMonth) {
-        Map<String, List<IndexBaseDto>> result = new HashMap<>();
-
-        if(StringUtils.isBlank(startMonth)){
-            LocalDateTime nowDateTime = LocalDateTime.now();
-            startMonth = nowDateTime.getYear() + "-01";
-            endMonth = null;
-        }
-        Set<Integer> organIds = null;
-        if(StringUtils.isNotBlank(organIdsStr)){
-            organIds = Arrays.stream(organIdsStr.split(",")).map(Integer::new).collect(Collectors.toSet());
-        }
-
-        if(dataTypes.contains("ALL") || dataTypes.contains("OPERATION_DATA")){
-            //运营数据
-            List<IndexBaseDto> operationData = new LinkedList<>();
-            operationData.add(new IndexBaseDto("合作单位"));
-            operationData.add(new IndexBaseDto("乐团数量"));
-            operationData.add(new IndexBaseDto("乐团学员"));
-            operationData.add(new IndexBaseDto("其他学员"));
-            result.put("OPERATION_DATA", operationData);
-        }
-
-        if(dataTypes.contains("ALL") || dataTypes.contains("BUSINESS_DATA")){
-            //业务数据
-            List<IndexBaseDto> businessData = new LinkedList<>();
-            businessData.add(getUserSignUpDate(new IndexBaseDto("激活率"), organIds, startMonth, endMonth));
-            businessData.add(getHomeworkDate(new IndexBaseDto("作业布置率"), organIds, startMonth, endMonth, "assign"));
-            businessData.add(getHomeworkDate(new IndexBaseDto("作业提交率"), organIds, startMonth, endMonth, "submit"));
-            businessData.add(getHomeworkDate(new IndexBaseDto("作业点评率"), organIds, startMonth, endMonth, "comment"));
-            result.put("BUSINESS_DATA", businessData);
-        }
-
-        if(dataTypes.contains("ALL") || dataTypes.contains("FINANCE_DATA")){
-            //财务数据
-            List<IndexBaseDto> financeData = new LinkedList<>();
-            financeData.add(new IndexBaseDto("应收金额"));
-            financeData.add(new IndexBaseDto("预收金额"));
-            financeData.add(new IndexBaseDto("预付金额"));
-            financeData.add(new IndexBaseDto("应付金额"));
-            financeData.add(new IndexBaseDto("营收金额"));
-            result.put("FINANCE_DATA", financeData);
-        }
-
-        if(dataTypes.contains("ALL") || dataTypes.contains("PERSONNEL_DATA")){
-            //人事数据
-            List<IndexBaseDto> personnelData = new LinkedList<>();
-            personnelData.add(new IndexBaseDto("老师总数"));
-            personnelData.add(new IndexBaseDto("全职人数"));
-            personnelData.add(new IndexBaseDto("兼职人数"));
-            personnelData.add(new IndexBaseDto("离职人数"));
-            result.put("PERSONNEL_DATA", personnelData);
-        }
-
-        if(dataTypes.contains("ALL") || dataTypes.contains("STUDENT_VARIATION")){
-            //学员变动
-            List<IndexBaseDto> studentVariation = new LinkedList<>();
-            studentVariation.add(new IndexBaseDto("新增学员"));
-            studentVariation.add(new IndexBaseDto("退团学员"));
-            studentVariation.add(new IndexBaseDto("学员转化"));
-            result.put("STUDENT_VARIATION", studentVariation);
-        }
-
-        if(dataTypes.contains("ALL") || dataTypes.contains("COURSE_DATA")){
-            //本月课程
-            List<IndexBaseDto> courseData = new LinkedList<>();
-            courseData.add(new IndexBaseDto("乐团课"));
-            courseData.add(new IndexBaseDto("VIP课"));
-            courseData.add(new IndexBaseDto("网管课"));
-            result.put("COURSE_DATA", courseData);
-        }
-
-        return result;
-    }
-
-    private IndexBaseDto getUserSignUpDate(IndexBaseDto indexBaseData, Set<Integer> organIds, String startMonth, String endMonth){
-        indexBaseData.setIndexMonthData(indexDao.getStudentSignUpData(organIds, startMonth, endMonth));
-        return indexBaseData;
-    }
-
-    private IndexBaseDto getHomeworkDate(IndexBaseDto indexBaseData, Set<Integer> organIds, String startMonth, String endMonth, String type){
-        indexBaseData.setIndexMonthData(indexDao.getHomeworkDate(organIds, startMonth, endMonth, type));
-        return indexBaseData;
-    }
-}

+ 0 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -377,9 +377,6 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 	@Transactional(rollbackFor = Exception.class)
 	public void batchAdd(MusicGroupPaymentCalender musicGroupPaymentCalender,List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails) {
 		Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = musicGroupPaymentCalenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
-		//生成music_group_payment_calender_detail
-//		List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<MusicGroupPaymentStudentCourseDetail>();
-//		MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
 		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
 		Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
 		for (Integer studentId : collect.keySet()) {
@@ -401,22 +398,9 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 			musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
 			musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
 			musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
-//			Long musicGroupPaymentCalenderDetailId = musicGroupPaymentCalenderDetail.getId();
-//			for (MusicGroupPaymentCalenderStudentDetail calenderStudentDetail : calenderStudentDetails) {
-//				//创建学生课排课分钟数
-//				musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-//				musicGroupPaymentStudentCourseDetail.setCourseType(CourseSchedule.CourseScheduleType.valueOf(calenderStudentDetail.getCourseType()));
-//				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
-//				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetailId);
-//				musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(0);
-//				musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(calenderStudentDetail.getCourseTime().intValue());
-//				musicGroupPaymentStudentCourseDetail.setUserId(studentId);
-//				musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
-//			}
 		}
 		musicGroupPaymentCalender.setExpectNum(collect.keySet().size());
 		musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
-//		musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
 		//给学员推送缴费通知
 		if(musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN){
 			musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalenderId,musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()),collect.keySet());

+ 114 - 50
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -4,7 +4,11 @@ import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.SC
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.STUDENT;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.AUDITING;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.REJECT;
-import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.*;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.ADD_COURSE;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.ADD_STUDENT;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_RENEW;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.SPAN_GROUP_CLASS_ADJUST;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -20,9 +24,8 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.service.*;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,20 +37,53 @@ import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupOrganizationCourseSettingsDao;
+import com.ym.mec.biz.dal.dao.MusicGroupOrganizationCourseSettingsDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderStudentDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentClassAdjustDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.OrganizationCourseUnitPriceSettingsDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
+import com.ym.mec.biz.dal.dto.CalenderPushDto;
+import com.ym.mec.biz.dal.dto.ClassGroup4MixDto;
+import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDetailDto;
+import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto;
+import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDto;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDto.MusicGroupPaymentDateRange;
+import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
+import com.ym.mec.biz.dal.entity.MusicGroupOrganizationCourseSettings;
+import com.ym.mec.biz.dal.entity.MusicGroupOrganizationCourseSettingsDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentClassAdjust;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.OrganizationCourseUnitPriceSettings;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.page.MusicGroupPaymentCalenderQueryInfo;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.MusicGroupPaymentCalenderDetailService;
-import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -113,6 +149,10 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
+	private ImGroupMemberService imGroupMemberService;
+	@Autowired
+	private ImUserFriendService imUserFriendService;
+	@Autowired
 	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 	@Autowired
 	private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
@@ -138,8 +178,18 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
 		List<MusicGroupPaymentDateRange> musicGroupPaymentDateRangeList = musicGroupPaymentCalenderDto.getMusicGroupPaymentDateRangeList();
 
-		if ((paymentType == PaymentType.ADD_COURSE) && musicGroupPaymentDateRangeList.size() > 1) {
-			throw new BizException("[临时加课]不支持多周期缴费");
+		if ((paymentType == PaymentType.ADD_COURSE)) {
+			if(musicGroupPaymentDateRangeList.size() > 1){
+				throw new BizException("[临时加课]不支持多周期缴费");
+			}
+		}
+		
+		if ((paymentType == PaymentType.ADD_STUDENT)) {
+			Integer userId = Integer.parseInt(musicGroupPaymentCalenderDto.getStudentIds());
+			List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = musicGroupPaymentCalenderDetailDao.queryNotPaymentStudentByUserIdAndMusicGroupId(userId, musicGroupId);
+			if(musicGroupPaymentCalenderDetailList != null && musicGroupPaymentCalenderDetailList.size() > 0){
+				throw new BizException("创建缴费失败:已存在缴费项目");
+			}
 		}
 
 		MusicGroup musicGroup = musicGroupDao.getLocked(musicGroupId);
@@ -147,6 +197,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		if (musicGroup == null) {
 			throw new BizException("乐团查询失败,请检查参数");
 		}
+		
+		if (musicGroup.getStatus() != MusicGroupStatusEnum.PROGRESS && musicGroup.getStatus() != MusicGroupStatusEnum.PRE_BUILD_FEE) {
+			throw new BizException("创建失败:乐团当前状态不能创建缴费");
+		}
+		
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {
 			throw new BizException("请登录");
@@ -230,6 +285,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 						}
 					}
 				}
+			}else if(paymentType == SPAN_GROUP_CLASS_ADJUST){
+				status = musicGroupPaymentCalenderDto.getStatus();
 			}
 		}
 
@@ -395,17 +452,14 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
 		// 如果是报名,需要修改乐团状态
 		if (paymentType == MUSIC_APPLY) {
-			if (musicGroup.getStatus() != MusicGroupStatusEnum.DRAFT) {
-				throw new BizException("创建失败:缴费项目类型不匹配");
-			}
 			if (status != AUDITING) {
-				musicGroup.setStatus(MusicGroupStatusEnum.AUDIT);
+				musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
 				// 记录操作日志
-				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(草稿 -> 基础信息审核中)", sysUser.getId(), ""));
+				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(创建缴费 -> 报名中)", sysUser.getId(), ""));
 			} else {
 				musicGroup.setStatus(MusicGroupStatusEnum.FEE_AUDIT);
 				// 记录操作日志
-				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(草稿 -> 费用审核中)", sysUser.getId(), ""));
+				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(创建缴费 -> 费用审核中)", sysUser.getId(), ""));
 			}
 			musicGroup.setUpdateTime(date);
 			musicGroupDao.update(musicGroup);
@@ -428,6 +482,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			Organization organization = organizationDao.get(musicGroup.getOrganId());
 			sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()),
 					MessageTypeEnum.BACKSTAGE_PAYMENT_CALENDER_AUDIT, "", organization.getName(), musicGroup.getName());
+		}else {
+			imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);
 		}
 		return batchNo;
 	}
@@ -552,11 +608,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			}else if(paymentType == SPAN_GROUP_CLASS_ADJUST){
 				MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
 				//获取默认的学员缴费详情
-				List<Map<Integer,String>> classGroupStudents = (List<Map<Integer,String>>)JSON.parse(adjust.getClassGroupStudents());
 				List<Integer> studentIds = JSON.parseArray(adjust.getStudentIds(), Integer.class);
 				List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails = classGroupService.queryStudentPaymentCalenders(adjust.getMasterClassGroupId(),
-						classGroupStudents,studentIds);
+						adjust.getClassGroupStudents(),studentIds);
 				List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails();
+
 				boolean containsAll = musicGroupPaymentCalenderStudentDetails.containsAll(calenderStudentDetails);
 				if(!containsAll){
 					status = AUDITING;
@@ -597,6 +653,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 					musicGroupPaymentCalenderCourseSettingsList.size());
 
 			BigDecimal totalPaymentAmount = new BigDecimal(0);
+			if(musicGroupPaymentCalenderDto.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
+				totalPaymentAmount = musicGroupPaymentDateRange.getPaymentAmount();
+			}
 			for (MusicGroupPaymentCalenderCourseSettings pccs : musicGroupPaymentCalenderCourseSettingsList) {
 
 				MusicGroupPaymentCalenderCourseSettings tempPccs = new MusicGroupPaymentCalenderCourseSettings();
@@ -715,17 +774,14 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
 		// 如果是报名,需要修改乐团状态
 		if (paymentType == MUSIC_APPLY) {
-			if (musicGroup.getStatus() != MusicGroupStatusEnum.DRAFT) {
-				throw new BizException("创建失败:缴费项目类型不匹配");
-			}
 			if (status != AUDITING) {
-				musicGroup.setStatus(MusicGroupStatusEnum.AUDIT);
+				musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
 				// 记录操作日志
-				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(草稿 -> 基础信息审核中)", sysUser.getId(), ""));
+				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(创建缴费 -> 报名中)", sysUser.getId(), ""));
 			} else {
 				musicGroup.setStatus(MusicGroupStatusEnum.FEE_AUDIT);
 				// 记录操作日志
-				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(草稿 -> 费用审核中)", sysUser.getId(), ""));
+				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(创建缴费 -> 费用审核中)", sysUser.getId(), ""));
 			}
 			musicGroup.setUpdateTime(date);
 			musicGroupDao.update(musicGroup);
@@ -749,16 +805,22 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 					MessageTypeEnum.BACKSTAGE_PAYMENT_CALENDER_AUDIT, "", organization.getName(), musicGroup.getName());
 		}else {
 			if(paymentType == ADD_STUDENT){
-				//如果是合班缴费
-				autoClassGroupAdjust(batchNo);
+				MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
+				if(musicGroupStudentClassAdjust != null){
+					//如果是合班缴费
+					autoClassGroupAdjust(musicGroupStudentClassAdjust);
+				}else {
+					imUserFriendService.refreshGroupImUserFriend(musicGroupId,GroupType.MUSIC);
+				}
 			}else if(paymentType == SPAN_GROUP_CLASS_ADJUST){
 				//删除和解冻班级,课程信息
 				MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
-				List<Map<Integer,String>> classGroupStudents = (List<Map<Integer,String>>)JSON.parse(adjust.getClassGroupStudents());
+				List<Map> classGroupStudents = JSON.parseArray(adjust.getClassGroupStudents(),Map.class);
 				List<Integer> studentIds = JSON.parseArray(adjust.getStudentIds(), Integer.class);
 				List<Long> courseIds = JSON.parseArray(adjust.getSubLockCourseIds(), Long.class);
+				List<Long> allLockCourseIds = JSON.parseArray(adjust.getAllLockCourseIds(), Long.class);
 				classGroupService.spanGroupClassAdjustPass(adjust.getMasterClassGroupId()
-						,studentIds,courseIds,classGroupStudents);
+						,studentIds,courseIds,classGroupStudents,allLockCourseIds,batchNo,adjust.getMasterTotalPrice());
 			}
 		}
 		return batchNo;
@@ -933,9 +995,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		calenderAuditDetailDto.setAuditDto(auditDto);
 		//获取收费标准
 		calenderAuditDetailDto.setMusicGroupPaymentCalenderCourseSettings(musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettingsByBatchNo(batchNo));
-		//获取学员列表
-//		calenderAuditDetailDto.setBasicUserDtos(musicGroupPaymentCalenderDetailDao.querySimpleUserDto(batchNo,auditDto.getMusicGroupId()));
-//		calenderAuditDetailDto.setStudentNum(calenderAuditDetailDto.getSimpleUserDto().size());
 		//获取缴费周期
 		List<MusicGroupPaymentCalender> groupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
 		calenderAuditDetailDto.setMusicGroupPaymentCalenders(groupPaymentCalenders);
@@ -947,11 +1006,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	//审核通过后自动排课
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void autoClassGroupAdjust(String batchNo){
-		MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
-		if(musicGroupStudentClassAdjust == null){
-			return;
-		}
+	public void autoClassGroupAdjust(MusicGroupStudentClassAdjust musicGroupStudentClassAdjust){
 		List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(musicGroupStudentClassAdjust.getBatchNo());
 		for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
 			if(musicGroupPaymentCalender.getStatus() == AUDITING || musicGroupPaymentCalender.getStatus() == REJECT){
@@ -992,6 +1047,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			for (Map<Integer, String> classGroupStudent : maps) {
 				Set<Integer> integers = classGroupStudent.keySet();
 				for (Integer integer : integers) {
+					List<Integer> collect = Arrays.asList(classGroupStudent.get(integer).split(",")).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList());
+					//学员退出群聊
+					imGroupMemberService.quit(integer.longValue(),collect);
 					classGroupStudentMapperDao.deleteByClassGroupIdAndStudents(integer,classGroupStudent.get(integer));
 				}
 			}
@@ -1006,6 +1064,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			//删除教师课酬
 			courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(delCourseIds);
 		}
+		imUserFriendService.refreshGroupImUserFriend(musicGroupPaymentCalenders.get(0).getMusicGroupId(),GroupType.MUSIC);
 	}
 
 	@Override
@@ -1043,7 +1102,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			int count = musicGroupPaymentCalenderDao.countAuditReject(calender.getMusicGroupId(),calender.getId());
 			if(count == 0){
 				MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
-				musicGroup.setStatus(MusicGroupStatusEnum.AUDIT);
+				musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
 				musicGroup.setUpdateTime(date);
 				musicGroupDao.update(musicGroup);
 				SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -1051,10 +1110,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 					throw new BizException("请重新登录");
 				}
 				//记录操作日志
-				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目通过(草稿 -> 审核中)", sysUser.getId(), ""));
-				Set<Integer> roleIds = new HashSet<>(1);
-				roleIds.add(SysUserRole.SECTION_MANAGER);
-				sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_CREATE_MUSIC_GROUP_APPLY, "", sysUser.getUsername());
+				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目通过(费用审核中 -> 报名中)", sysUser.getId(), ""));
 			}
 		} else if (calender.getPaymentType() == ADD_STUDENT) {
 			// 学生加到班级
@@ -1063,16 +1119,24 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				classGroupService.addStudentToClassGroupAndCourseArranging(Integer.parseInt(calender.getStudentIds()), classGroupIdStr, batchNo,
 						musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettingsByBatchNo(batchNo));
 			}
-			//如果是合班缴费
-			autoClassGroupAdjust(batchNo);
+			MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
+			if(musicGroupStudentClassAdjust != null){
+				//如果是合班缴费
+				autoClassGroupAdjust(musicGroupStudentClassAdjust);
+			}else {
+				imUserFriendService.refreshGroupImUserFriend(calender.getMusicGroupId(),GroupType.MUSIC);
+			}
 		}else if(calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
 			//删除和解冻班级,课程信息
 			MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
-			List<Map<Integer,String>> classGroupStudents = (List<Map<Integer,String>>)JSON.parse(adjust.getClassGroupStudents());
+			List<Map> classGroupStudents = JSON.parseArray(adjust.getClassGroupStudents(),Map.class);
 			List<Integer> studentIds = JSON.parseArray(adjust.getStudentIds(), Integer.class);
 			List<Long> courseIds = JSON.parseArray(adjust.getSubLockCourseIds(), Long.class);
+			List<Long> allLockCourseIds = JSON.parseArray(adjust.getAllLockCourseIds(), Long.class);
+			//如果是跨团班级合并,添加学员
+			musicGroupPaymentCalenderDetailService.batchAdd(calender,musicGroupPaymentCalenderStudentDetailDao.findByBatchNo(batchNo));
 			classGroupService.spanGroupClassAdjustPass(adjust.getMasterClassGroupId()
-					,studentIds,courseIds,classGroupStudents);
+					,studentIds,courseIds,classGroupStudents,allLockCourseIds,batchNo,adjust.getMasterTotalPrice());
 		}
 		musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
 	}
@@ -1098,11 +1162,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		//如果是报名,并且所有的报名都审核通过,需要修改乐团状态
 		if (calender.getPaymentType() == MUSIC_APPLY) {
 			MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
-			musicGroup.setStatus(MusicGroupStatusEnum.AUDIT_FAILED);
+			musicGroup.setStatus(MusicGroupStatusEnum.PRE_BUILD_FEE);
 			musicGroup.setUpdateTime(date);
 			musicGroupDao.update(musicGroup);
 			//记录操作日志
-			musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目失败(费用审核中 -> 草稿)", sysUser.getId(), ""));
+			musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目失败(费用审核中 -> 审核拒绝)", sysUser.getId(), ""));
 		}
 		musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
 	}
@@ -1156,7 +1220,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 					continue;
 				}
 				//如果乐团还在审核中
-				if(musicGroup.getStatus() == MusicGroupStatusEnum.DRAFT || musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT|| musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT_FAILED){
+				if(musicGroup.getStatus() == MusicGroupStatusEnum.DRAFT || musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT|| musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT_FAILED || musicGroup.getStatus() == MusicGroupStatusEnum.CLOSE){
 					continue;
 				}
 				// “未开始”更新至“进行中”
@@ -1235,7 +1299,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 		if(musicGroup != null){
 			if(musicGroup.getStatus() == MusicGroupStatusEnum.FEE_AUDIT){
-				musicGroup.setStatus(MusicGroupStatusEnum.DRAFT);
+				musicGroup.setStatus(MusicGroupStatusEnum.PRE_BUILD_FEE);
 				musicGroup.setUpdateTime(new Date());
 				musicGroupDao.update(musicGroup);
 			}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 480 - 227
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java


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

@@ -148,6 +148,11 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
         boolean flag = false;
         for (int i = 10; i >= 1; i--) {
             MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, subjectId);
+            if(musicOneSubjectClassPlan == null){
+                MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+                Subject subject = subjectService.get(subjectId);
+                throw new BizException("操作失败:{}乐团缺少{}声部",musicGroup.getName(),subject.getName());
+            }
             int applyNum = musicOneSubjectClassPlan.getApplyStudentNum() == null ? 0 : musicOneSubjectClassPlan.getApplyStudentNum();
             musicOneSubjectClassPlan.setApplyStudentNum(applyNum + num);
             musicOneSubjectClassPlan.setUpdateTime(new Date());

+ 10 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OnlineMusicGroupServiceImpl.java

@@ -18,6 +18,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.date.DateUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -76,7 +77,9 @@ public class OnlineMusicGroupServiceImpl implements OnlineMusicGroupService {
     @Autowired
     private PracticeGroupService practiceGroupService;
     @Autowired
-    private ImFeignService imFeignService;
+    private ImGroupService imGroupService;
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
     @Autowired
     private SysMessageService sysMessageService;
 
@@ -286,15 +289,13 @@ public class OnlineMusicGroupServiceImpl implements OnlineMusicGroupService {
 
         studentDao.updateStudentServiceTag(onlineMusicGroupCourseInfo.getStudentId(),null,YesOrNoEnum.YES.getCode());
 
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-        if(Objects.nonNull(musicGroup.getEducationalTeacherId())){
-            imGroupMemberList.add(new ImGroupMember(musicGroup.getEducationalTeacherId().toString()));
-        }
-        imGroupMemberList.add(new ImGroupMember(onlineMusicGroupCourseInfo.getStudentId().toString()));
-        imGroupMemberList.add(new ImGroupMember(onlineMusicGroupCourseInfo.getTeacherId().toString()));
-        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
+        Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
+        userRoleMap.put(onlineMusicGroupCourseInfo.getStudentId(), null);
+        userRoleMap.put(onlineMusicGroupCourseInfo.getTeacherId(), "指导老师");
+        
         // 创建群组
-        imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+        imGroupService.create(classGroup.getId().longValue(), musicGroup.getEducationalTeacherId(), classGroup.getName(), classGroup.getName(), classGroup.getName(), classGroup.getName(), null, "MUSIC");
+        imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
 
         List<String> courseTimes = courses.stream().map(c -> DateUtil.dateToString(c.getStartClassTime(), "yyyy-MM-dd HH:mm")).collect(Collectors.toList());
 

+ 4 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -97,6 +97,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     @Autowired
     private ImFeignService imFeignService;
     @Autowired
+    private ImUserFriendService imUserFriendService;
+    @Autowired
     private TeacherFreeTimeDao teacherFreeTimeDao;
     @Autowired
     private CourseScheduleService courseScheduleService;
@@ -2125,16 +2127,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
         studentDao.updateStudentServiceTag(practiceGroup.getStudentId(), null, YesOrNoEnum.YES.getCode());
 
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-        if (Objects.nonNull(practiceGroup.getEducationalTeacherId())) {
-            imGroupMemberList.add(new ImGroupMember(practiceGroup.getEducationalTeacherId().toString()));
-        }
-        imGroupMemberList.add(new ImGroupMember(practiceGroup.getUserId().toString()));
-        imGroupMemberList.add(new ImGroupMember(practiceGroup.getStudentId().toString()));
-        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-        // 创建群组
-        imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
-
+        imUserFriendService.refreshGroupImUserFriend(practiceGroup.getId().toString(), GroupType.PRACTICE);
         result.put("teacherName", teacher.getRealName());
         result.put("enableApply", applyTimes < 1 ? 1 : 0);
         result.put("status", "SUCCESS");
@@ -3313,16 +3306,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         }
 
         studentDao.updateStudentServiceTag(practiceGroup.getStudentId(), null, YesOrNoEnum.YES.getCode());
-
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-        if (Objects.nonNull(practiceGroup.getEducationalTeacherId())) {
-            imGroupMemberList.add(new ImGroupMember(practiceGroup.getEducationalTeacherId().toString()));
-        }
-        imGroupMemberList.add(new ImGroupMember(practiceGroup.getUserId().toString()));
-        imGroupMemberList.add(new ImGroupMember(practiceGroup.getStudentId().toString()));
-        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-        // 创建群组
-        imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+        imUserFriendService.refreshGroupImUserFriend(practiceGroup.getId().toString(),GroupType.PRACTICE);
     }
 
     @Override

+ 5 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -233,7 +233,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             sysUserCashAccountService.updateBalance(order.getUserId(), order.getActualAmount(),
                     PlatformCashAccountDetailTypeEnum.REFUNDS, memo + ",订单号:" + order.getOrderNo());
 
-            if (order.getPaymentChannel().equals("ADAPAY")
+            if (StringUtils.isNotBlank(order.getPaymentChannel())
+                    && order.getPaymentChannel().equals("ADAPAY")
                     && !rpMap.containsKey("simulation")) {
                 confirmOrder(order);
             }
@@ -257,7 +258,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 
         callOrderCallBack(order);
 
-        if (status.equals(DealStatusEnum.SUCCESS) && order.getPaymentChannel().equals("ADAPAY")
+        if (status.equals(DealStatusEnum.SUCCESS)
+                && StringUtils.isNotBlank(order.getPaymentChannel())
+                && order.getPaymentChannel().equals("ADAPAY")
                 && !rpMap.containsKey("simulation")) {
             confirmOrder(order);
         }

+ 11 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java

@@ -198,7 +198,9 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
         if (auditStatus == AuditStatusEnum.PASS) {
             StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
             studentPaymentOrder.setActualAmount(studentPaymentRouteOrder.getRouteAmount());
-            studentPaymentOrder.setMusicGroupId(studentPaymentRouteOrder.getSchoolId() + "");
+            if(studentPaymentRouteOrder.getSchoolId() != null) {
+                studentPaymentOrder.setMusicGroupId(studentPaymentRouteOrder.getSchoolId() + "");
+            }
             studentPaymentOrder.setType(OrderTypeEnum.OUTORDER);
             studentPaymentOrder.setMerNos(studentPaymentRouteOrder.getMerNo());
             studentPaymentOrder.setOrderNo(studentPaymentRouteOrder.getOrderNo());
@@ -377,10 +379,10 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
             if (collect == null || collect.size() == 0) {
                 continue;
             }
-            List<String> list = studentPaymentRouteOrderDao.countByTransNo(collect);
-            if (list != null && list.size() > 0) {
-                throw new BizException("导入数据错误  重复的交易流水号:{}", list.get(0));
-            }
+//            List<String> list = studentPaymentRouteOrderDao.countByTransNo(collect);
+//            if (list != null && list.size() > 0) {
+//                throw new BizException("导入数据错误  重复的交易流水号:{}", list.get(0));
+//            }
             Date nowDate = new Date();
 
             List<Object> calenderIds = sheet.stream().map(m -> m.get("缴费单号")).collect(Collectors.toList());
@@ -537,10 +539,10 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
             }
         }
         if (studentPaymentRouteOrders.size() > 0) {
-            Map<String, List<StudentPaymentRouteOrder>> stringListMap = studentPaymentRouteOrders.stream().collect(Collectors.groupingBy(StudentPaymentRouteOrder::getTransNo));
-            if (stringListMap.size() != studentPaymentRouteOrders.size()) {
-                throw new BizException("导入失败:请勿录入重复的交易流水号");
-            }
+//            Map<String, List<StudentPaymentRouteOrder>> stringListMap = studentPaymentRouteOrders.stream().collect(Collectors.groupingBy(StudentPaymentRouteOrder::getTransNo));
+//            if (stringListMap.size() != studentPaymentRouteOrders.size()) {
+//                throw new BizException("导入失败:请勿录入重复的交易流水号");
+//            }
             studentPaymentRouteOrderDao.batchAdd(studentPaymentRouteOrders);
         } else {
             throw new BizException(sb.length() > 0 ? sb.toString() : "导入失败:没有可以录入的数据");

+ 52 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPreRegistrationServiceImpl.java

@@ -0,0 +1,52 @@
+package com.ym.mec.biz.service.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.biz.dal.dao.StudentPreRegistrationDao;
+import com.ym.mec.biz.dal.dto.StudentPreRegistrationDto;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.biz.service.StudentPreRegistrationService;
+import com.ym.mec.common.dal.BaseDAO;
+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;
+
+@Service
+public class StudentPreRegistrationServiceImpl extends BaseServiceImpl<Long, StudentPreRegistration>  implements StudentPreRegistrationService {
+	
+	@Autowired
+	private StudentPreRegistrationDao studentPreRegistrationDao;
+
+	@Override
+	public BaseDAO<Long, StudentPreRegistration> getDAO() {
+		return studentPreRegistrationDao;
+	}
+
+	@Override
+	public PageInfo<StudentPreRegistrationDto> queryListForPage(QueryInfo queryInfo) {
+		PageInfo<StudentPreRegistrationDto> pageInfo = new PageInfo<StudentPreRegistrationDto>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+		
+		List<StudentPreRegistrationDto> dataList = null;
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = studentPreRegistrationDao.queryListForPage(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<StudentPreRegistrationDto>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+	
+}

+ 118 - 80
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -1,5 +1,9 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
+import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
+import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
+
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -16,13 +20,13 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
-import com.ym.mec.auth.api.enums.CertificateTypeEnum;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
@@ -30,6 +34,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
+import com.ym.mec.auth.api.enums.CertificateTypeEnum;
 import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import com.ym.mec.biz.dal.dao.GoodsDao;
 import com.ym.mec.biz.dal.dao.MusicGroupDao;
@@ -65,6 +70,7 @@ import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
@@ -97,6 +103,7 @@ import com.ym.mec.biz.service.ClassGroupStudentMapperService;
 import com.ym.mec.biz.service.ContractService;
 import com.ym.mec.biz.service.CourseScheduleService;
 import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
 import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
 import com.ym.mec.biz.service.SellOrderService;
@@ -109,8 +116,6 @@ import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.biz.service.SysUserCashAccountDetailService;
 import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.common.entity.ImGroupMember;
-import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.exception.BizException;
@@ -122,10 +127,6 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 
-import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
-import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
-import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
-
 @Service
 public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, StudentRegistration> implements StudentRegistrationService {
 
@@ -164,6 +165,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Autowired
     private ImFeignService imFeignService;
     @Autowired
+    private ImGroupMemberService imGroupMemberService;
+    @Autowired
     private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
     @Autowired
     private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
@@ -318,7 +321,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
 
         StudentRegistration hasReg = getByPhoneAndMusicGroupId(studentRegistration.getMusicGroupId(), studentRegistration.getParentsPhone());
-        if (hasReg != null) {
+        if (hasReg != null && hasReg.getMusicGroupStatus() != StudentMusicGroupStatusEnum.QUIT) {
             throw new BizException("该乐团您已报名");
         }
 
@@ -348,18 +351,24 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         studentRegistration.setUpdateTime(date);
         studentRegistration.setUserId(sysUser.getId());
         studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.APPLY);
-        studentRegistrationDao.insert(studentRegistration);
+        if(hasReg != null){
+            studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
+            studentRegistration.setId(hasReg.getId());
+            studentRegistrationDao.update(studentRegistration);
+        }else {
+            studentRegistrationDao.insert(studentRegistration);
+        }
 
         // 增加报名学生数
         musicGroupSubjectPlanService.addApplyStudentNum(studentRegistration.getMusicGroupId(), studentRegistration.getSubjectId(), 1);
         // 报名成功后,发送短信
         // String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + studentRegistration.getMusicGroupId();
         String serverPhone = sysConfigDao.findConfigValue(SysConfigService.SERVER_PHONE);
-        Subject subject = subjectDao.get(studentRegistration.getActualSubjectId());
+        Subject subject = subjectDao.get(studentRegistration.getSubjectId());
         // MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
 
         Map<Integer, String> map = new HashMap<>(1);
-        map.put(studentRegistration.getUserId(), studentRegistration.getParentsPhone());
+        map.put(sysUser.getId(), studentRegistration.getParentsPhone());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_APPLY_MESSAGE, map, null, 0, "", "",
                 studentRegistration.getParentsName(), subject.getName(), serverPhone);
 
@@ -741,14 +750,16 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_ADD_STUDENT, "", musicGroup.getName(), studentRegistration.getName());
             //增加报名学生数
             musicGroupSubjectPlanService.addApplyStudentNum(musicGroupId, studentRegistration.getSubjectId(), 1);
-            //添加班级关联
-            addStudents(studentAddDto, userId);
-            //保存乐团学生费用表
-            if (studentAddDto.getCourseFee() == null) {
-                MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, studentRegistration.getActualSubjectId());
-                studentAddDto.setCourseFee(musicOneSubjectClassPlan.getFee());
-            }
-//            Date nextPaymentDate = musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, null, null);
+            //汇总金额
+
+            MusicGroupStudentFee musicGroupStudentFee = new MusicGroupStudentFee(musicGroupId,
+                    userId, studentRegistration.getSubjectId(), studentAddDto.getCourseFee(),
+                    null, studentAddDto.getTemporaryCourseFee(), null);
+
+            /*if (musicGroup.getFeeType() != null && musicGroup.getFeeType() != MusicGroupPaymentCalender.FeeType.OFFLINE && musicGroupStudentFee.getTemporaryCourseFee().doubleValue() * 100 == 0) {
+                musicGroupStudentFee.setRemainNetworkClassTimes(musicGroupStudentFee.getRemainNetworkClassTimes() + 1);
+            }*/
+            musicGroupStudentFeeDao.insert(musicGroupStudentFee);
 
             StudentPaymentOrder waitPayOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.WAIT_PAY);
 
@@ -771,42 +782,18 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             List<StudentPaymentOrderDetail> studentPaymentOrderDetails = studentAddDto.getStudentPaymentOrderDetails();
             if (studentPaymentOrderDetails == null) {
                 studentPaymentOrderDetails = new ArrayList<>();
-            } else {
-                studentPaymentOrderDetails.forEach(e -> {
-                    if (e.getPrice() == null) {
-                        throw new BizException("请补全订单信息");
-                    }
-                });
             }
-            StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
-            studentPaymentOrderDetail.setPrice(studentAddDto.getTemporaryCourseFee() == null ? BigDecimal.ZERO : studentAddDto.getTemporaryCourseFee());
-            studentPaymentOrderDetail.setType(OrderDetailTypeEnum.COURSE);
-            studentPaymentOrderDetails.add(studentPaymentOrderDetail);
             //汇总金额
 
             BigDecimal reduce = studentPaymentOrderDetails.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-            MusicGroupStudentFee.PaymentStatus paymentStatus = MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
             if (reduce.compareTo(BigDecimal.ZERO) == 0) {
-                paymentStatus = PAID_COMPLETED;
                 studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
-                studentRegistration.setPaymentStatus(YES);
-                studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
                 studentPaymentOrder.setActualAmount(reduce);
                 studentPaymentOrder.setPayTime(date);
             }
-            MusicGroupStudentFee musicGroupStudentFee = new MusicGroupStudentFee(musicGroupId,
-                    userId, studentRegistration.getSubjectId(), studentAddDto.getCourseFee(),
-                    null, studentAddDto.getTemporaryCourseFee(), paymentStatus);
-
-            /*if (musicGroup.getFeeType() != null && musicGroup.getFeeType() != MusicGroupPaymentCalender.FeeType.OFFLINE && musicGroupStudentFee.getTemporaryCourseFee().doubleValue() * 100 == 0) {
-                musicGroupStudentFee.setRemainNetworkClassTimes(musicGroupStudentFee.getRemainNetworkClassTimes() + 1);
-            }*/
-            musicGroupStudentFeeDao.insert(musicGroupStudentFee);
-//            musicGroupStudentFeeDao.insert(new MusicGroupStudentFee(musicGroupId,
-//                    userId, studentRegistration.getSubjectId(), studentAddDto.getCourseFee(),
-//                    nextPaymentDate, studentAddDto.getTemporaryCourseFee(), paymentStatus));
-            musicGroupStudentFeeDao.updateCalender(userId, musicGroupId);
             studentPaymentOrder.setExpectAmount(reduce);
+            studentPaymentOrderService.insert(studentPaymentOrder);
+            
             //当前学员是否以前存在过当前乐团
             if (phoneAndMusicGroupId != null) {
                 studentRegistration.setId(phoneAndMusicGroupId.getId());
@@ -815,46 +802,41 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 studentRegistrationDao.insertBasic(studentRegistration);
             }
             studentRegistrationDao.updateCurrentClass(studentRegistration);
-            studentPaymentOrderService.insert(studentPaymentOrder);
-            studentPaymentOrderDetails.forEach(e -> {
-                e.setPaymentOrderId(studentPaymentOrder.getId());
-            });
-            studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetails);
-            if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
-                Map<Integer, String> receivers = new HashMap<>(1);
-                receivers.put(studentRegistration.getUserId(), studentRegistration.getParentsPhone());
-                if (reduce.compareTo(BigDecimal.ZERO) == 0) {
-                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_MUSIC_GROUP_ADD_STUDENT_FREE,
-                            receivers, null, 0, null, "", studentRegistration.getParentsName(), studentRegistration.getName(), musicGroup.getName());
-                } else {
-                    String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + musicGroupId;
-                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_MUSIC_GROUP_ADD_STUDENT, receivers, null, 0, null, "", studentRegistration.getParentsName(), studentRegistration.getName(), musicGroup.getName(), HttpUtil.getSortUrl(studentApplyUrl));
-                }
-            }
+
             return userId;
         }
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,BigDecimal masterTotalPrice){
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect){
         SysUser sysUser1 = sysUserFeignService.queryUserInfo();
         //获取旧乐团学员注册信息
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.queryByUserIdsAndMusicGroupId(studentIds,oldMusicGroupId);
         List<StudentCourseFeeDetail> studentCourseFeeDetails = new ArrayList<>();
         BigDecimal amount = BigDecimal.ZERO;
         for (StudentRegistration studentRegistration : studentRegistrations) {
+            List<MusicGroupPaymentCalenderStudentDetail> details = collect.get(studentRegistration.getUserId());
+            BigDecimal masterTotalPrice = details.stream().map(e->e.getCutAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
+            if(masterTotalPrice.doubleValue() > studentRegistration.getSurplusCourseFee().doubleValue()){
+                throw new BizException("用户信息发生变动,请重新提交");
+            }
+            if(oldMusicGroupId == newMusicGroupId){
+                continue;
+            }
+            courseScheduleStudentPaymentService.updateCourseActualPrice(Arrays.asList(oldMusicGroupId),null, GroupType.MUSIC);
             //记录课程余额消费日志
             if(studentRegistration.getSurplusCourseFee().doubleValue() > 0d && masterTotalPrice.doubleValue() > 0d){
                 StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
                 if(studentRegistration.getSurplusCourseFee().doubleValue() > masterTotalPrice.doubleValue()){
+                    amount = masterTotalPrice;
                     studentCourseFeeDetail.setAmount(masterTotalPrice.negate());
                     studentCourseFeeDetail.setSurplusCourseFee(studentRegistration.getSurplusCourseFee().subtract(masterTotalPrice));
                 }else {
+                    amount = studentRegistration.getSurplusCourseFee();
                     studentCourseFeeDetail.setAmount(studentRegistration.getSurplusCourseFee().negate());
                     studentCourseFeeDetail.setSurplusCourseFee(BigDecimal.ZERO);
                 }
-                amount = studentCourseFeeDetail.getAmount();
                 studentCourseFeeDetail.setStudentRegistrationId(studentRegistration.getId());
                 studentRegistration.setSurplusCourseFee(studentCourseFeeDetail.getSurplusCourseFee());
                 studentCourseFeeDetail.setMemo("跨团合班消费");
@@ -867,35 +849,41 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             StudentRegistration registration = studentRegistrationDao.getByPhoneAndMusicGroupId(newMusicGroupId, studentRegistration.getParentsPhone());
             if (registration != null) {
                 //修改剩余课程余额
+                Date date = new Date();
+                registration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
+                registration.setCreateTime(date);
+                registration.setUpdateTime(date);
                 registration.setSurplusCourseFee(registration.getSurplusCourseFee().add(amount));
                 studentRegistrationDao.update(registration);
             }else {
                 //生成学员乐团注册表
+                studentRegistration.setOrganId(musicGroupDao.get(newMusicGroupId).getOrganId());
                 studentRegistration.setSurplusCourseFee(amount);
                 studentRegistration.setMusicGroupId(newMusicGroupId);
-                studentRegistrationDao.insertBasic(studentRegistration);
+                studentRegistrationDao.insert(studentRegistration);
                 registration = studentRegistration;
+
+                //增加报名学生数
+                musicGroupSubjectPlanService.addApplyStudentNum(newMusicGroupId, studentRegistration.getActualSubjectId(), 1);
+                //新增Fee表
+                MusicGroupStudentFee musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(studentRegistration.getUserId(),newMusicGroupId);
+                if(musicGroupStudentFee == null){
+                    musicGroupStudentFee = new MusicGroupStudentFee(newMusicGroupId,
+                            studentRegistration.getUserId(), studentRegistration.getSubjectId(),BigDecimal.ZERO,
+                            null, studentRegistration.getTemporaryCourseFee(), studentRegistration.getPaymentStatus()==YES?PAID_COMPLETED:NON_PAYMENT);
+                    musicGroupStudentFeeDao.insert(musicGroupStudentFee);
+                }
             }
             //主班新增余额日志
-            if(studentRegistration.getSurplusCourseFee().doubleValue() > 0d && masterTotalPrice.doubleValue() > 0d){
+            if(amount.doubleValue() != 0d && masterTotalPrice.doubleValue() > 0d){
                 StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
                 studentCourseFeeDetail.setAmount(amount);
-                studentCourseFeeDetail.setSurplusCourseFee(registration.getSurplusCourseFee().add(amount));
-                studentCourseFeeDetail.setStudentRegistrationId(studentRegistration.getId());
+                studentCourseFeeDetail.setSurplusCourseFee(registration.getSurplusCourseFee());
+                studentCourseFeeDetail.setStudentRegistrationId(registration.getId());
                 studentCourseFeeDetail.setMemo("跨团合班费用转移");
                 studentCourseFeeDetail.setOperator(sysUser1.getId());
                 studentCourseFeeDetails.add(studentCourseFeeDetail);
             }
-            //增加报名学生数
-            musicGroupSubjectPlanService.addApplyStudentNum(newMusicGroupId, studentRegistration.getSubjectId(), 1);
-            //新增Fee表
-            MusicGroupStudentFee musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(studentRegistration.getUserId(),oldMusicGroupId);
-            if(musicGroupStudentFee == null){
-                musicGroupStudentFee = new MusicGroupStudentFee(newMusicGroupId,
-                        studentRegistration.getUserId(), studentRegistration.getSubjectId(),BigDecimal.ZERO,
-                        null, studentRegistration.getTemporaryCourseFee(), studentRegistration.getPaymentStatus()==YES?PAID_COMPLETED:NON_PAYMENT);
-                musicGroupStudentFeeDao.insert(musicGroupStudentFee);
-            }
         }
         if(studentCourseFeeDetails.size() > 0){
             studentCourseFeeDetailDao.batchInsert(studentCourseFeeDetails);
@@ -919,8 +907,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             classGroupStudentMapper.setGroupType(GroupType.MUSIC);
             classGroupStudentMapperDao.insert(classGroupStudentMapper);
         }
-        ImGroupMember[] imGroupMembers = {new ImGroupMember(userId.toString())};
-        imFeignService.groupJoin(new ImGroupModel(classGroupId.toString(), imGroupMembers, classGroup.getName()));
+        imGroupMemberService.join(classGroupId.longValue(), userId, null, false);
         //2、班级人数调整
 //        classGroupDao.updateClassStudentNum(classGroupId.longValue(), 1);
         //3、学生加入新班级未开始课程
@@ -1590,4 +1577,55 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 	public List<StudentMusicGroupDto> queryStudentMusicGroupInfo(Integer userId) {
 		return studentRegistrationDao.queryStudentMusicGroupInfo(userId);
 	}
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delReg(Long id) {
+        StudentRegistration studentRegistration = studentRegistrationDao.get(id);
+        MusicGroupSubjectPlan subjectPlan = musicGroupSubjectPlanDao.findSubjectPlan(studentRegistration.getMusicGroupId(), studentRegistration.getSubjectId());
+        int delNum = studentRegistrationDao.delete(id);
+        subjectPlan.setApplyStudentNum(subjectPlan.getApplyStudentNum() - 1);
+        int updateNum = musicGroupSubjectPlanDao.update(subjectPlan);
+        if (delNum <= 0 || updateNum <= 0) {
+            throw new BizException("删除失败,请重试");
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean batchDelRegs(String musicGroupId, List<Integer> userIds) {
+        List<StudentRegistration> registrations = studentRegistrationDao.findStudentListByUserIdList(musicGroupId, userIds);
+        for (StudentRegistration registration : registrations) {
+            if(registration.getPaymentStatus().equals(PaymentStatusEnum.OPEN)||registration.getPaymentStatus().equals(PaymentStatusEnum.YES)){
+                throw new BizException(registration.getName()+"("+registration.getPaymentStatus().getDesc()+"),不能删除");
+            }
+        }
+        if (registrations.size() <= 0) {
+            throw new BizException("删除的学员不存在,请核查");
+        }
+        Map<Integer, List<StudentRegistration>> regMap = registrations.stream().collect(Collectors.groupingBy(StudentRegistration::getSubjectId));
+        //更新声部信息
+        for (Map.Entry<Integer, List<StudentRegistration>> regEntry : regMap.entrySet()) {
+            MusicGroupSubjectPlan subjectPlan = musicGroupSubjectPlanDao.findSubjectPlan(musicGroupId, regEntry.getKey());
+            subjectPlan.setApplyStudentNum(subjectPlan.getApplyStudentNum() - regEntry.getValue().size());
+            int updateNum = musicGroupSubjectPlanDao.update(subjectPlan);
+            if (updateNum <= 0) {
+                throw new BizException("声部信息更新失败");
+            }
+        }
+        //删除注册信息
+        List<Long> ids = registrations.stream().map(StudentRegistration::getId).collect(Collectors.toList());
+        int delNum = studentRegistrationDao.batchDelete(ids);
+        if (delNum <= 0) {
+            throw new BizException("学员删除失败");
+        }
+        return true;
+    }
+
+    @Override
+    public List<StudentRegistration> getMusicGroupStuReBack(String musicGroupId) {
+        courseScheduleStudentPaymentService.updateCourseActualPrice(Arrays.asList(musicGroupId), null, GroupType.MUSIC);
+        return this.findMusicGroupStudent(musicGroupId,null);
+    }
 }

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

@@ -706,7 +706,7 @@ public class StudentServeServiceImpl implements StudentServeService {
         for (StudentExtracurricularExercisesSituation weekServiceWithStudent : weekServiceWithStudents) {
             List<StudentServeCourseHomeworkDto> studentAllHomeworks = studentHomeworkMap.get(weekServiceWithStudent.getStudentId());
             weekServiceWithStudent.setActualExercisesNum(0);
-            if(!CollectionUtils.isEmpty(studentAllHomeworks)&&weekServiceWithStudent.getServeType().equals("HOMEWORK")){
+            if(!CollectionUtils.isEmpty(studentAllHomeworks)&&weekServiceWithStudent.getServeType().equals("HOMEWORK")&&StringUtils.isNotBlank(weekServiceWithStudent.getCourseIds())){
                 Set<String> courseIds = Arrays.stream(weekServiceWithStudent.getCourseIds().split(",")).collect(Collectors.toSet());
                 List<StudentServeCourseHomeworkDto> studentHomeworks = studentAllHomeworks.stream().filter(s -> courseIds.contains(s.getCourseScheduleId().toString())).collect(Collectors.toList());
                 if(!CollectionUtils.isEmpty(studentHomeworks)){

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

@@ -192,17 +192,17 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 					teacherAttendance.setSignInStatus(YesOrNoEnum.NO);
 				}
 			}else if(date.compareTo(add20Minutes) > 0){
-				if(StringUtils.isEmpty(teacherAttendance.getRemark())&&!teacherSignOutDto.isNotRturnErrorInfo()){
-					//当前为异常签到,请填写原因!
-					result.put("status",2);
-					return result;
-				}
 				//异常签到范围(开始之后  ~  结束之前)
 				teacherAttendance.setSignInStatus(YesOrNoEnum.NO);
 				result.put("signInStatus",1);
 			}else {
 				throw new BizException("签到时间异常");
 			}
+			if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())&&StringUtils.isEmpty(teacherAttendance.getRemark())&&!teacherSignOutDto.isNotRturnErrorInfo()){
+				//当前为异常签到,请填写原因!
+				result.put("status",2);
+				return result;
+			}
 			teacherAttendance.setSignInDeviceNo(teacherSignOutDto.getTeacherAttendanceInfo().getDeviceNum());
 			if(Objects.nonNull(teacherAttendance.getId())){
 				teacherAttendanceDao.update(teacherAttendance);
@@ -250,16 +250,16 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
 				result.put("signOutStatus",0);
 			}else if(date.compareTo(classEndDateAdd60Minutes) > 0 && DateUtil.isSameDay(date, classEndDateTime)){
-				if(StringUtils.isEmpty(teacherAttendance.getSignOutRemark())&&!teacherSignOutDto.isNotRturnErrorInfo()){
-					//当前为异常签退,请填写原因!
-					result.put("status",2);
-					return result;
-				}
 				teacherAttendance.setSignOutStatus(YesOrNoEnum.NO);
 				result.put("signOutStatus",1);
 			}else {
 				throw new BizException("签退时间异常");
 			}
+			if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())&&StringUtils.isEmpty(teacherAttendance.getSignOutRemark())&&!teacherSignOutDto.isNotRturnErrorInfo()){
+				//当前为异常签退,请填写原因!
+				result.put("status",2);
+				return result;
+			}
 			teacherAttendance.setSignOutDeviceNo(teacherSignOutDto.getTeacherAttendanceInfo().getDeviceNum());
 			if(Objects.nonNull(teacherAttendance.getId())){
 				teacherAttendanceDao.update(teacherAttendance);

+ 123 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java

@@ -27,6 +27,7 @@ import com.ym.mec.util.idcard.IdcardValidator;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -52,6 +53,8 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 	@Autowired
 	private MusicGroupDao musicGroupDao;
 	@Autowired
+	private StudentRegistrationDao studentRegistrationDao;
+	@Autowired
 	private DemoGroupDao demoGroupDao;
 	@Autowired
 	private OrganizationDao organizationDao;
@@ -69,6 +72,10 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
 	@Autowired
 	private StudentDao studentDao;
+	@Autowired
+	private ImUserFriendDao imUserFriendDao;
+	@Autowired
+	private RedisTemplate<String,String> redisTemplate;
 
 
 	@Override
@@ -234,6 +241,117 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 		return teachers.stream().distinct().collect(Collectors.toList());
 	}
 
+	@Transactional(rollbackFor = Exception.class)
+	public List<ImUserFriendDto> queryGroupStudents1(Integer teacherId, String search) {
+		Set<BasicUserDto> basicUserDtos = new HashSet<>();
+		//学员关联的通讯录
+		//获取相关课程,班级老师列表
+		Set<Integer> teacherIds = teacherDao.findMusicTeacherIds(teacherId);
+		//获取学员所在乐团列表
+		List<String> musicGroupIds = studentRegistrationDao.queryStudentMusicGroup(teacherId);
+		if (musicGroupIds != null && musicGroupIds.size() > 0) {
+			List<MusicGroup> musicGroups = musicGroupDao.queryListByIds(StringUtils.join(musicGroupIds, ","));
+			musicGroups.forEach(e -> {
+				teacherIds.add(e.getDirectorUserId());
+				teacherIds.add(e.getEducationalTeacherId());
+				teacherIds.add(e.getTeamTeacherId());
+			});
+		}
+		//获取相关vip课老师列表
+		teacherIds.addAll(teacherDao.findVipTeacherIds(teacherId));
+		//获取陪练课老师列表
+		teacherIds.addAll(teacherDao.findPracticeTeacherIds(teacherId));
+		//获取对外课程老师列表
+		teacherIds.addAll(teacherDao.findCloseCourseTeacherIds(teacherId));
+		//获取陪练课课程教务老师
+		teacherIds.addAll(teacherDao.findPracticeEducationalTeacherId(teacherId));
+		//获取VIP课程教务老师
+		teacherIds.addAll(teacherDao.findVipEducationalTeacherId(teacherId));
+		//获取对外课程务老师
+		teacherIds.addAll(teacherDao.findCommEducationalTeacherId(teacherId));
+		//获取关联的指导老师
+		Student student = studentDao.get(teacherId);
+		if (student != null && student.getTeacherId() != null) {
+			teacherIds.add(student.getTeacherId());
+		}
+		if (teacherIds.size() > 0) {
+			basicUserDtos.addAll(teacherDao.queryTeacherBaseInfo(teacherIds, search));
+		}
+
+		//获取关联的学员列表
+		Set<Integer> studentIds = teacherDao.queryCourseClassStudentIds(teacherId);
+		//获取关联的老师列表
+		studentIds.addAll(teacherDao.queryCourseClassTeacherIds(teacherId));
+		//获取关联的乐团的管理老师
+		List<String> musicLeaderIds = teacherDao.queryMusicLeaderIds(teacherId);
+		musicLeaderIds.removeAll(Collections.singleton(null));
+		if(musicLeaderIds.size() > 0){
+			Set<String> leaderIds = new HashSet<>();
+			musicLeaderIds.forEach(e->{
+				leaderIds.addAll(Arrays.asList(e.split(",")));
+			});
+			leaderIds.forEach(e->{
+				studentIds.add(Integer.valueOf(e));
+			});
+		}
+		studentIds.removeAll(Collections.singleton(null));
+		List<ImGroupModel> musicGroups =  musicGroupDao.queryTeacherGroups(teacherId,search);
+
+		if(musicGroups != null && musicGroups.size() > 0){
+			Set<String> musicGroupId = musicGroups.stream().map(ImGroupModel::getId).collect(Collectors.toSet());
+			List<MusicGroup> musicGroupList = musicGroupDao.queryListByIds(StringUtils.join(musicGroupId, ","));
+			Set<Integer> teacherIdSet = new HashSet<>();
+			if(musicGroupList != null && musicGroupList.size() > 0){
+				musicGroupList.forEach(e->{
+					teacherIdSet.add(e.getTeamTeacherId());
+					teacherIdSet.add(e.getEducationalTeacherId());
+					teacherIdSet.add(e.getDirectorUserId());
+				});
+			}
+			teacherIdSet.remove(teacherId);
+			teacherIdSet.removeAll(Collections.singleton(null));
+			if(teacherIdSet.size() > 0){
+				basicUserDtos.addAll(teacherDao.queryMusicGroupStudents(StringUtils.join(teacherIdSet,","), search));
+			}
+		}
+
+		List<BasicUserDto> userDtos = teacherDao.queryGroupStudents(teacherId, search);
+		if(userDtos != null && userDtos.size() > 0){
+			basicUserDtos.addAll(userDtos);
+			Set<String> musicGroupIds1 = userDtos.stream().map(e -> e.getMusicGroupId()).collect(Collectors.toSet());
+			if(musicGroupIds1 != null && musicGroupIds1.size() > 0){
+				Map<String, String> musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds1));
+				userDtos.forEach(e->{
+					e.setMusicGroupName(musicGroupNameMap.get(e.getMusicGroupId()));
+				});
+			}
+		}
+		studentIds.removeAll(userDtos.stream().map(e->e.getUserId()).collect(Collectors.toSet()));
+		studentIds.remove(teacherId);
+		if(studentIds.size() > 0){
+			basicUserDtos.addAll(teacherDao.queryTeacherBaseInfo(studentIds,search));
+		}
+
+		String syncImUserFriendKey = "syncImUserFriend:" + teacherId;
+		if(basicUserDtos.size() > 0){
+			for (BasicUserDto basicUserDto : basicUserDtos) {
+				if(basicUserDto.getUserId().equals(teacherId)){
+					continue;
+				}
+				// 检查是否已经是好友
+				ImUserFriend userFriend = imUserFriendDao.query(teacherId, basicUserDto.getUserId());
+				if (userFriend != null) {
+					continue;
+				}
+				imUserFriendDao.insertByBasicUser(basicUserDto,teacherId);
+			}
+			redisTemplate.opsForValue().setIfAbsent(syncImUserFriendKey,teacherId.toString());
+			return imUserFriendDao.queryFriendListByUserId(teacherId, search);
+		}
+		redisTemplate.opsForValue().setIfAbsent(syncImUserFriendKey,teacherId.toString());
+		return new ArrayList<>();
+	}
+
     @Override
     public List<TeacherBasicDto> findTeachers(String organId) {
 		return teacherDao.findByFlowOrganRangeTeachers(organId);
@@ -562,4 +680,9 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 		return teacherDao.queryTeacherDefaultSalary(organIdList);
 	}
 
+	@Override
+	public List<Integer> queryAllIds() {
+		return teacherDao.queryAllIds();
+	}
+
 }

+ 35 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java

@@ -10,6 +10,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.thirdparty.adapay.ConfigInit;
 import com.ym.mec.thirdparty.adapay.Payment;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,16 +23,9 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.fastjson.JSON;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dao.TenantEntryActivitiesDao;
-import com.ym.mec.biz.dal.dao.TenantPaymentOrderDao;
 import com.ym.mec.biz.dal.dto.PageInfoOrder;
 import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransType;
-import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.dal.entity.TenantEntryActivities;
 import com.ym.mec.biz.dal.entity.TenantEntryActivities.SuitableUser;
-import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
 import com.ym.mec.biz.dal.entity.TenantPaymentOrder.TenantPaymentType;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
@@ -77,6 +73,8 @@ public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantP
 
     @Autowired
     private YqPayFeignService yqPayFeignService;
+    @Autowired
+    private StudentPaymentRouteOrderDao studentPaymentRouteOrderDao;
 
     @Override
     public BaseDAO<Long, TenantPaymentOrder> getDAO() {
@@ -214,6 +212,8 @@ public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantP
             // 更新账户表信息
             sysTenantAccountService.update(userId, tenantEntryActivities.getPurchaseMinutes() + tenantEntryActivities.getGiveMinutes(),
                     tenantPaymentOrder.getOrderNo(), TransType.RECHARGE, "", tenantEntryActivities.getDiscountPrice(), "");
+
+            this.confirmOrder(tenantPaymentOrder);
         } else {
 
         }
@@ -221,6 +221,34 @@ public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantP
         return true;
     }
 
+    private Boolean confirmOrder(TenantPaymentOrder order) {
+        List<StudentPaymentRouteOrder> routeOrders = studentPaymentRouteOrderDao.getRouteOrders(order.getOrderNo());
+        for (StudentPaymentRouteOrder routeOrder : routeOrders) {
+            Map<String, Object> divMember = new HashMap<>();
+            divMember.put("member_id", routeOrder.getMerNo());//分佣账户
+            divMember.put("amount", routeOrder.getRouteAmount().setScale(2, BigDecimal.ROUND_HALF_UP));//分佣金额
+            divMember.put("fee_flag", "Y");
+            if (routeOrder.getMerNo().equals(ConfigInit.merNo)) {
+                divMember.put("member_id", 0);
+            }
+            List<Map<String, Object>> divMembers = new ArrayList<>();
+            divMembers.add(divMember);
+
+            Map<String, Object> confirm = new HashMap<>();
+            confirm.put("payment_id", order.getTransNo());
+            confirm.put("order_no", idGeneratorService.generatorId("payment"));
+            confirm.put("confirm_amt", routeOrder.getRouteAmount());
+            confirm.put("div_members", divMembers);
+            try {
+                Payment.createConfirm(confirm);
+            } catch (Exception e) {
+                continue;
+            }
+        }
+        return true;
+    }
+
+
     @Override
     public void queryOrderStatusFromRemote() {
         try {

+ 44 - 41
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -90,7 +90,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     @Autowired
 	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
     @Autowired
-	private ImFeignService imFeignService;
+	private ImGroupMemberService imGroupMemberService;
+    @Autowired
+	private ImUserFriendService imUserFriendService;
+    
+    @Autowired
+    private ImGroupService imGroupService;
     @Autowired
 	private SubjectDao subjectDao;
     @Autowired
@@ -1400,11 +1405,11 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		List<ClassGroupStudentMapper> classGroupStudents = classGroupStudentMapperDao.findByClassGroup(classGroup.getId());
 
-		List<ImGroupMember> imGroupMemberList = new ArrayList<>();
+		Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
 		if(Objects.nonNull(vipGroupApplyBaseInfoDto.getEducationalTeacherId())){
-            imGroupMemberList.add(new ImGroupMember(vipGroupApplyBaseInfoDto.getEducationalTeacherId().toString()));
+            userRoleMap.put(vipGroupApplyBaseInfoDto.getEducationalTeacherId(),"乐团主管");
         }
-		imGroupMemberList.add(new ImGroupMember(vipGroupApplyBaseInfoDto.getUserId().toString()));
+		userRoleMap.put(vipGroupApplyBaseInfoDto.getUserId(),"指导老师");
 		//生成学生单课缴费信息
 		for (ClassGroupStudentMapper classGroupStudent : classGroupStudents) {
 			courseScheduleStudentPaymentService.createCourseScheduleStudentPaymentForVipGroup(vipGroupId,classGroupStudent.getUserId());
@@ -1415,17 +1420,16 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			} catch (Exception e) {
 				e.printStackTrace();
 			}
-			imGroupMemberList.add(new ImGroupMember(classGroupStudent.getUserId().toString()));
+			userRoleMap.put(classGroupStudent.getUserId(),null);
 			studentDao.updateStudentServiceTag(classGroupStudent.getUserId(), null, YesOrNoEnum.YES.getCode());
 		}
 
 		courseScheduleService.checkNewCourseSchedules(courseSchedules, false,false);
 
 		try {
-			ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-			// 创建群组
-			imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
-
+			imGroupService.create(classGroup.getId().longValue(), null, classGroup.getName(), classGroup.getName(), vipGroupApplyBaseInfoDto.getName(), null, null, GroupType.VIP.getCode());
+			imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
+			imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(),classGroup.getGroupType());
 			//发送推送短信
 			Map<Integer,String> map = new HashMap<>(1);
 			map.put(vipGroupApplyBaseInfoDto.getUserId(),sysUser.getPhone());
@@ -1871,8 +1875,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         classGroupDao.update(classGroup);
 
 		//学员退出班级群
-		ImGroupMember[] imGroupMembers = new ImGroupMember[]{new ImGroupMember(studentId.toString())};
-		imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, null));
+		imGroupMemberService.quit(classGroup.getId().longValue(), studentId);
 	}
 
 	@Override
@@ -2001,12 +2004,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		Integer oldTeacherId=vipGroup.getUserId();
 		if(Objects.nonNull(studentRecoverInfo.getTeacherId())&&!studentRecoverInfo.getTeacherId().equals(vipGroup.getUserId())){
 			vipGroup.setUserId(studentRecoverInfo.getTeacherId());
+			
+			imGroupMemberService.quit(classGroup.getId().longValue(), oldTeacherId);
 
-			ImGroupMember[] imGroupMembers = new ImGroupMember[]{new ImGroupMember(oldTeacherId.toString())};
-			imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
-
-			ImGroupMember[] newImGroupMemberList = new ImGroupMember[]{new ImGroupMember(vipGroup.getUserId().toString())};
-			imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), newImGroupMemberList,classGroup.getName()));
+			imGroupMemberService.join(classGroup.getId().longValue(), vipGroup.getUserId(), "指导老师", false);
 		}
 
 		ClassGroupStudentMapper classStudentMapperByUserIdAndClassGroupId = classGroupStudentMapperDao.query(classGroup.getId(),
@@ -2136,6 +2137,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         classGroup.setTotalClassTimes(courseScheduleDao.countClassGroupCourses(classGroup.getId()));
         classGroupDao.update(classGroup);
 		courseScheduleTeacherSalaryService.updateVipGroupCourseTeacherSalary(vipGroup.getId().intValue(),oldTeacherId);
+		imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(),classGroup.getGroupType());
 	}
 
     @Override
@@ -2326,8 +2328,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				courseScheduleTeacherSalaryService.updateVipGroupCourseTeacherSalary(Integer.parseInt(studentPaymentOrder.getMusicGroupId()), null);
 
 				//学员退出班级群
-				ImGroupMember[] imGroupMembers = new ImGroupMember[]{new ImGroupMember(studentApplyRefunds.getUserId().toString())};
-				imFeignService.groupJoin(new ImGroupModel(studentPaymentOrder.getClassGroupId().toString(), imGroupMembers, null));
+				imGroupMemberService.quit(studentPaymentOrder.getClassGroupId().longValue(), studentApplyRefunds.getUserId());
+
 				break;
 			case REJECT:
 
@@ -2650,14 +2652,14 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(Objects.nonNull(vipGroupApplyBaseInfo.getEducationalTeacherId())&&!vipGroupApplyBaseInfo.getEducationalTeacherId().equals(oldVipGroupInfo.getEducationalTeacherId())){
 			ClassGroup classGroup = classGroupDao.findByMusicGroupAndType(oldVipGroupInfo.getId().toString(), GroupType.VIP.getCode());
 			if(Objects.nonNull(oldVipGroupInfo.getEducationalTeacherId())){
-				ImGroupMember[] imGroupMembers = new ImGroupMember[]{new ImGroupMember(oldVipGroupInfo.getEducationalTeacherId().toString())};
-				imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+				
+				imGroupMemberService.quit(classGroup.getId().longValue(), oldVipGroupInfo.getEducationalTeacherId());
 			}
 
 			oldVipGroupInfo.setEducationalTeacherId(vipGroupApplyBaseInfo.getEducationalTeacherId());
 			isChange=true;
-			ImGroupMember[] newImGroupMemberList = new ImGroupMember[]{new ImGroupMember(oldVipGroupInfo.getEducationalTeacherId().toString())};
-			imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), newImGroupMemberList,classGroup.getName()));
+			
+			imGroupMemberService.join(classGroup.getId().longValue(), oldVipGroupInfo.getEducationalTeacherId(), "乐团主管", false);
 		}
 		if(Objects.nonNull(vipGroupApplyBaseInfo.getOrganId())&&!vipGroupApplyBaseInfo.getOrganId().equals(oldVipGroupInfo.getOrganId())){
 			isChange=true;
@@ -2668,6 +2670,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			oldVipGroupInfo.setUpdateTime(now);
 			vipGroupDao.update(oldVipGroupInfo);
 		}
+		imUserFriendService.refreshGroupImUserFriend(oldVipGroupInfo.getId().toString(),GroupType.VIP);
 	}
 
 	@Override
@@ -2761,7 +2764,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		List<ClassGroupStudentMapper> classGroupStudents = classGroupStudentMapperDao.findByClassGroup(classGroup.getId());
 
-		List<ImGroupMember> imGroupMemberList = new ArrayList<>();
+		Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
 		//生成学生单课缴费信息
 		for (ClassGroupStudentMapper classGroupStudent : classGroupStudents) {
 			SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(classGroupStudent.getUserId());
@@ -2791,16 +2794,14 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			sysUserCashAccountService.updateCourseBalance(classGroupStudent.getUserId(),sysUserCashAccount.getCourseBalance().subtract(surplusCourseTotalPrice),PlatformCashAccountDetailTypeEnum.PAY_FEE,surplusCourseTotalPrice.negate(),"后台加课扣除课程余额");
 
 			courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
-			imGroupMemberList.add(new ImGroupMember(classGroupStudent.getUserId().toString()));
+			userRoleMap.put(classGroupStudent.getUserId(), null);
 		}
 
 		classGroupService.updateClassGroupInfo(classGroup.getId());
 
 //		courseScheduleStudentPaymentService.updateVipGiveCourse(vipGroup.getId());
 
-		ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-		imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(),
-				imGroupMembers, classGroup.getName()));
+		imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
 	}
 
 	@Override
@@ -2848,7 +2849,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		}
 
 		Date now=new Date();
-        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
+        Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
 
 		if(vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING)||vipGroup.getStatus().equals(VipGroupStatusEnum.NOT_START)){
 			List<CourseSchedule> courseSchedules = JSON.parseArray(vipGroup.getCourseSchedulesJson(),CourseSchedule.class);
@@ -2864,7 +2865,11 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 						salaryMap.get("onlineTeacherSalary"),
 						salaryMap.get("offlineTeacherSalary"));
 			}
-            imGroupMemberList.add(new ImGroupMember(vipGroup.getUserId().toString()));
+            userRoleMap.put(vipGroup.getUserId(), "指导老师");
+            
+            if(vipGroup.getEducationalTeacherId() != null){
+                userRoleMap.put(vipGroup.getEducationalTeacherId(), "乐团主管");
+            }
 		}
 
 		List<CourseSchedule> surplusCourses = courseScheduleDao.findByClassGroupAndStatus(classGroup.getId(), CourseStatusEnum.NOT_START.getCode());
@@ -2895,7 +2900,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 					classGroupStudentMappers.add(classGroupStudentMapper);
 				}
 
-				imGroupMemberList.add(new ImGroupMember(studentId.toString()));
+				userRoleMap.put(studentId, null);
 			}
 
 			if(!CollectionUtils.isEmpty(classGroupStudentMappers)){
@@ -2914,9 +2919,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			classGroupDao.update(classGroup);
 
 			try {
-				ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-				// 创建群组
-				imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+				imGroupService.create(classGroup.getId().longValue(), null, classGroup.getName(), classGroup.getName(), vipGroup.getName(), null, null, GroupType.VIP.getCode());
+				imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
+				imUserFriendService.refreshClassImUserFriend(classGroup.getId());
 			} catch (Exception e) {
 				e.printStackTrace();
 			}
@@ -3061,7 +3066,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				classGroupStudentMappers.add(classGroupStudentMapper);
 			}
 
-			imGroupMemberList.add(new ImGroupMember(studentId.toString()));
+			userRoleMap.put(studentId, null);
 
 			if(vipGroup.getOnlineClassesNum()>0){
 				try {
@@ -3097,9 +3102,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
 
 		try {
-			ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-			// 创建群组
-			imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+			imGroupService.create(classGroup.getId().longValue(), null, classGroup.getName(), classGroup.getName(), vipGroup.getName(), null, null, GroupType.VIP.getCode());
+			imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
+
+			imUserFriendService.refreshGroupImUserFriend(vipGroup.getId().toString(),GroupType.VIP);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -3171,12 +3177,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			Set<Long> collect = vipGroupList.stream().map(e -> e.getId()).collect(Collectors.toSet());
 			Set<Integer> classGroupIds = classGroupDao.queryClassGroupIds(collect);
 			//解散群
-			List<ImGroupModel> imGroupModels = new ArrayList<>();
-			ImGroupMember[] imGroupMember = {new ImGroupMember("")};
 			for (Integer classGroupId : classGroupIds) {
-				imGroupModels.add(new ImGroupModel(classGroupId + "", imGroupMember, ""));
+				imGroupService.cancel(classGroupId.longValue());
 			}
-			imFeignService.groupBatchDismiss(imGroupModels);
 		}
 		List<VipGroup> normalVipGroupList = vipGroupDao.queryNormalStatusList();
 		if (!CollectionUtils.isEmpty(normalVipGroupList)){

+ 7 - 6
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -283,6 +283,7 @@
         <result column="id_" property="id"/>
         <result column="music_group_id_" property="musicGroupId"/>
         <result column="music_group_name_" property="musicGroupName"/>
+        <result column="organName" property="organName"/>
         <result column="subject_id_list_" property="subjectIdList"/>
         <result column="memo_" property="memo"/>
         <result column="name_" property="name"/>
@@ -496,9 +497,9 @@
         LEFT JOIN vip_group vg ON vg.id_ = cg.music_group_id_
         LEFT JOIN courses_group csg ON csg.id_ = cg.music_group_id_
         WHERE cgtm.user_id_ != #{userId} AND cg.del_flag_ = 0
-        AND ((vg.educational_teacher_id_ =  #{userId} AND cg.group_type_ = 'VIP')
-        OR (cg.group_type_ = 'MUSIC' AND (mg.team_teacher_id_ = #{userId} OR mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId}))
-        OR (csg.educational_teacher_id_ =  #{userId} AND cg.group_type_ = 'COMM'))
+        AND ((vg.educational_teacher_id_ =  #{userId} AND vg.group_status_ IN (2,6) AND cg.group_type_ = 'VIP')
+        OR (mg.status_ IN ('PROGRESS','PAUSE') AND cg.group_type_ = 'MUSIC' AND (mg.team_teacher_id_ = #{userId} OR mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId}))
+        OR (csg.educational_teacher_id_ =  #{userId} AND csg.status_ = 'NORMAL' AND cg.group_type_ = 'COMM'))
         GROUP BY cg.id_
     </select>
 
@@ -987,7 +988,7 @@
 
     <select id="findClassGroups" resultMap="ClassGroup">
         SELECT * FROM class_group WHERE music_group_id_=#{musicGroupId}
-        AND del_flag_='0' AND group_type_ NOT IN ('PRACTICE','VIP','HIGH')
+        AND del_flag_='0' AND group_type_ = 'MUSIC'
     </select>
 
     <!-- 根据合奏班id获取子班及老师 -->
@@ -1401,7 +1402,6 @@
     <select id="getMusicGroupHighClassNumBySubject" resultType="int">
         SELECT COUNT(*) FROM class_group WHERE music_group_id_=#{musicGroupId}
         AND type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} AND del_flag_ = '0'
-        AND INTE_ARRAY(subject_id_list_,#{subjectIds})
     </select>
 
     <sql id="queryClassGroupPageSql">
@@ -1424,8 +1424,9 @@
         <include refid="queryClassGroupPageSql"/>
     </select>
     <select id="queryClassGroupPage" resultMap="ClassGroupTeachers">
-        SELECT cg.*,mg.name_ music_group_name_ FROM class_group cg
+        SELECT cg.*,mg.name_ music_group_name_,o.name_ organName FROM class_group cg
         LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
+        LEFT JOIN organization o ON o.id_ = mg.organ_id_
         <include refid="queryClassGroupPageSql"/>
         ORDER BY cg.id_ DESC
         <include refid="global.limit"/>

+ 23 - 1
mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml

@@ -583,9 +583,31 @@
 
     <select id="hasStudent" resultType="java.lang.Boolean">
         SELECT COUNT(DISTINCT class_group_id_) FROM class_group_student_mapper
-        WHERE class_group_id_ = #{masterClassGroupId} AND user_id_ IN
+        WHERE class_group_id_ = #{masterClassGroupId} AND status_ != 'QUIT' AND user_id_ IN
         <foreach collection="studentIds" separator="," open="(" close=")" item="item">
             #{item}
         </foreach>
     </select>
+    <select id="queryStudentIdsByClassGroupId" resultType="java.lang.Integer">
+        SELECT DISTINCT user_id_ FROM class_group_student_mapper
+        <include refid="queryStudentIdsByClassGroupIdSql"/>
+        AND status_ != 'QUIT'
+        UNION ALL
+        SELECT DISTINCT user_id_ FROM course_schedule_student_payment csts
+        <include refid="queryStudentIdsByClassGroupIdSql"/>
+    </select>
+
+    <sql id="queryStudentIdsByClassGroupIdSql">
+        <where>
+            <if test="classGroupId != null">
+                AND class_group_id_ = #{classGroupId}
+            </if>
+            <if test="groupType != null">
+                AND group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+            <if test="musicGroupId != null">
+                AND music_group_id_ = #{musicGroupId}
+            </if>
+        </where>
+    </sql>
 </mapper>

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است