Просмотр исходного кода

Merge branch 'master' into online1

yonge 5 лет назад
Родитель
Сommit
7f522631df
100 измененных файлов с 4096 добавлено и 646 удалено
  1. 1 1
      codegen/src/main/java/com/yonge/crud/CodegenApplication.java
  2. 12 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java
  3. 2 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java
  4. 7 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserDao.java
  5. 14 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserService.java
  6. 10 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java
  7. 3 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  8. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  9. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  10. 10 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupTeacherMapperDao.java
  11. 15 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  12. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  13. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesDao.java
  14. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  15. 70 22
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java
  16. 84 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDetailDao.java
  17. 32 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupStudentFeeDao.java
  18. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  19. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java
  20. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  21. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserCashAccountDetailDao.java
  22. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  23. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroup4MixDto.java
  24. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseTeacherSalaryStatisticsDto.java
  25. 68 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OnlineMusicGroupCourseDto.java
  26. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeBuyResultDto.java
  27. 46 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentEduTeacherDto.java
  28. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentExercisesSituationDto.java
  29. 0 10
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  30. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherClassGroupDto.java
  31. 24 13
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroup.java
  32. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  33. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java
  34. 76 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java
  35. 194 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderDetail.java
  36. 30 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupStudentFee.java
  37. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  38. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRepair.java
  39. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherDefaultMusicGroupSalary.java
  40. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ClassGroupStudentStatusEnum.java
  41. 2 8
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ClassGroupTypeEnum.java
  42. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  43. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ClassGroupQueryInfo.java
  44. 66 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicCalenderDetailQueryInfo.java
  45. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicCalenderQueryInfo.java
  46. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQueryInfo.java
  47. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/RepairStudentQueryInfo.java
  48. 0 10
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java
  49. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherSalaryModifyQueryInfo.java
  50. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  51. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java
  52. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupTeacherMapperService.java
  53. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  54. 45 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java
  55. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java
  56. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  57. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupStudentFeeService.java
  58. 38 0
      mec-biz/src/main/java/com/ym/mec/biz/service/OnlineMusicGroupService.java
  59. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java
  60. 9 10
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  61. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  62. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRepairService.java
  63. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  64. 23 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  65. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserCashAccountDetailService.java
  66. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserCashAccountService.java
  67. 422 122
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  68. 101 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  69. 111 53
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  70. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java
  71. 137 100
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  72. 2 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  73. 33 30
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  74. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java
  75. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java
  76. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  77. 189 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  78. 299 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  79. 116 86
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  80. 11 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupStudentFeeServiceImpl.java
  81. 725 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OnlineMusicGroupServiceImpl.java
  82. 48 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  83. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  84. 8 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  85. 41 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  86. 6 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  87. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  88. 10 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  89. 185 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  90. 37 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  91. 24 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountDetailServiceImpl.java
  92. 27 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountServiceImpl.java
  93. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  94. 42 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultMusicGroupSalaryServiceImpl.java
  95. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  96. 7 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  97. 51 12
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  98. 55 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  99. 6 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupTeacherMapperMapper.xml
  100. 68 20
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

+ 1 - 1
codegen/src/main/java/com/yonge/crud/CodegenApplication.java

@@ -28,7 +28,7 @@ public class CodegenApplication {
 		 */
 
 		// "src/generateConfigration.xml"
-		GenerateConfiguration genConfig = toObject("codegen/src/main/resources/generateConfigration.xml", GenerateConfiguration.class);
+		GenerateConfiguration genConfig = toObject("src/main/resources/generateConfigration.xml", GenerateConfiguration.class);
 
 		Configuration config = genConfig.getDbConfiguration();
 

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

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
@@ -119,6 +120,9 @@ public class SysUser implements Serializable{
 	
 	private Integer teacherId;
 
+	@ApiModelProperty(value = "用户角色",required = false)
+	private List<Integer> roles;
+
 	public Integer getServiceTag() {
 		return serviceTag;
 	}
@@ -359,6 +363,14 @@ public class SysUser implements Serializable{
 		this.teacherId = teacherId;
 	}
 
+	public List<Integer> getRoles() {
+		return roles;
+	}
+
+	public void setRoles(List<Integer> roles) {
+		this.roles = roles;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 2 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java

@@ -55,7 +55,8 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 
 		String clientId = request.getParameter(clientIdParameter).toUpperCase();
 
-		SysUserInfo userInfo = sysUserService.queryUserInfoByPhone(principal);
+//		SysUserInfo userInfo = sysUserService.queryUserInfoByPhone(principal);
+		SysUserInfo userInfo = sysUserService.queryUserInfoByPhoneAndClient(principal,clientId);
 		if (userInfo != null && StringUtils.isNotEmpty(isLessee)) {
 			throw new LockedException("用户已存在");
 		}

+ 7 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserDao.java

@@ -26,6 +26,13 @@ public interface SysUserDao extends BaseDAO<Integer, SysUser> {
 	SysUser queryByPhone(String phone);
 
 	/**
+	 * 根据手机号查询对象
+	 * @param phone
+	 * @return
+	 */
+	SysUser queryByPhoneAndClient(@Param("phone") String phone, @Param("client") String client);
+
+	/**
 	 * 修改密码
 	 * @param mobile
 	 * @param password

+ 14 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserService.java

@@ -23,6 +23,13 @@ public interface SysUserService extends BaseService<Integer, SysUser> {
 	SysUser queryByPhone(String phone);
 
 	/**
+	 * 根据手机号查询对象
+	 * @param phone
+	 * @return
+	 */
+	SysUser queryByPhoneAndClient(String phone,String client);
+
+	/**
 	 * 根据用户名获取系统用户详细信息
 	 * @param username
 	 * @return
@@ -37,6 +44,13 @@ public interface SysUserService extends BaseService<Integer, SysUser> {
 	SysUserInfo queryUserInfoByPhone(String phone);
 
 	/**
+	 * 根据手机号获取系统用户详细信息
+	 * @param phone
+	 * @return
+	 */
+	SysUserInfo queryUserInfoByPhoneAndClient(String phone,String client);
+
+	/**
 	 * 删除指定用户
 	 * @param id
 	 * @return

+ 10 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java

@@ -70,6 +70,11 @@ public class SysUserServiceImpl extends BaseServiceImpl<Integer, SysUser> implem
 	}
 
 	@Override
+	public SysUser queryByPhoneAndClient(String phone,String client) {
+		return sysUserDao.queryByPhoneAndClient(phone,client);
+	}
+
+	@Override
 	public SysUserInfo queryUserInfoByUsername(String username) {
 		return getSysUserInfo(queryByUsername(username));
 	}
@@ -79,6 +84,11 @@ public class SysUserServiceImpl extends BaseServiceImpl<Integer, SysUser> implem
 		return getSysUserInfo(queryByPhone(phone));
 	}
 
+	@Override
+	public SysUserInfo queryUserInfoByPhoneAndClient(String phone,String client) {
+		return getSysUserInfo(queryByPhoneAndClient(phone,client));
+	}
+
 	private SysUserInfo getSysUserInfo(SysUser sysUser) {
 		if (sysUser == null) {
 			return null;

+ 3 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -206,4 +206,7 @@
     <select id="getTeacherOrganId" resultType="java.lang.Integer">
         SELECT organ_id_ FROM teacher WHERE id_ = #{userId}
     </select>
+    <select id="queryByPhoneAndClient" resultMap="SysUser">
+        select * from sys_user where (phone_ = #{phone} OR username_ = #{phone}) AND user_type_ LIKE CONCAT('%',#{client},'%') LIMIT 1 FOR UPDATE
+    </select>
 </mapper>

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

@@ -483,7 +483,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @author Joburgess
      * @date 2019/11/4
      */
-    ClassGroup findByCourseSchedule(Integer courseScheduleId);
+    ClassGroup findByCourseSchedule(@Param("courseScheduleId") Integer courseScheduleId, @Param("delFlag") Integer delFlag);
 
     /**
      * @param maxCourseScheduleId: 合奏班编号

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

@@ -95,7 +95,7 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
      * @author Joburgess
      * @date 2019/10/18
      */
-    String[] findStudentNumByClassGroupId(@Param("classGroupId") Long classGroupId);
+    String[] findStudentNumByClassGroupId(@Param("classGroupId") Integer classGroupId);
 
     /**
      * @describe 获取课程上的学员名称集合
@@ -371,4 +371,11 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
                                                     @Param("groupType") GroupType groupType,
                                                     @Param("userId") Integer userId,
                                                     @Param("status") ClassGroupStudentStatusEnum status);
+
+    /**
+     * 获取学员教务老师
+     * @param studentIds
+     * @return
+     */
+    List<StudentEduTeacherDto> getStudentEducationalTeachers(@Param("studentIds") List<Integer> studentIds);
 }

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

@@ -29,6 +29,14 @@ public interface ClassGroupTeacherMapperDao extends BaseDAO<Long, ClassGroupTeac
     List<ClassGroupTeacherMapper> findClassGroupTeachers(@Param("classGroupIds") String classGroupIds);
 
     /**
+     * 查询班级老师
+     *
+     * @param classGroupId
+     * @return
+     */
+    ClassGroupTeacherMapper getClassGroupTeachersRole(@Param("classGroupId") Integer classGroupId, @Param("teacherRole") String teacherRole);
+
+    /**
      * 批量删除班级的老师关联关系
      *
      * @param classGroupTeacherMapperList
@@ -44,7 +52,7 @@ public interface ClassGroupTeacherMapperDao extends BaseDAO<Long, ClassGroupTeac
      * @Date: 2019/10/18
      * @describe 根据班级编号和教师类型获取老师信息
      */
-    ClassGroupTeacherMapper findByClassGroupAndRole(@Param("classGroupId") Long classGroupId,
+    ClassGroupTeacherMapper findByClassGroupAndRole(@Param("classGroupId") Integer classGroupId,
                                                     @Param("teacherRole") TeachTypeEnum teacherRole);
 
     /**
@@ -83,7 +91,7 @@ public interface ClassGroupTeacherMapperDao extends BaseDAO<Long, ClassGroupTeac
      * @param classGroupId
      * @return
      */
-    String queryTeachingNames(Long classGroupId);
+    String queryTeachingNames(Integer classGroupId);
 
     /**
      * @param classGroupIds: 班级编号列表

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

@@ -631,12 +631,13 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                                                           @Param("endTime") Date endTime);
 
     /**
-     * 查询班级未开始的课程
+     * 查询班级上指定状态的课程
      *
      * @param classGroupId
+     * @param status
      * @return
      */
-    List<CourseSchedule> findNoStartCoursesByClassGroupId(@Param("classGroupId") Integer classGroupId);
+    List<CourseSchedule> findCoursesByClassGroupId(@Param("classGroupId") Integer classGroupId,@Param("status") CourseStatusEnum status);
 
     /**
      * @param courseScheduleId: 课程编号
@@ -1280,6 +1281,10 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<CourseSchedule> findUserCourses2(@Param("userId") Integer userId,
                                           @Param("teacherIds") List<Integer> teacherIds);
 
+
+    List<CourseSchedule> findUserCourses3(@Param("studentId") Integer studentId,
+                                          @Param("teacherIds") List<Integer> teacherIds);
+
     /**
      * @param userId:
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
@@ -1415,7 +1420,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param groupType
      * @return
      */
-    List<CourseScheduleRateDto> findCourseRate(@Param("groupId") String groupId, @Param("groupType") String groupType);
+    List<CourseScheduleRateDto> findCourseRate(@Param("groupId") String groupId, @Param("groupType") String groupType, @Param("classGroupId") Integer classGroupId);
 
     /**
      * 获取最后一次已结束的课程
@@ -1424,7 +1429,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param groupType
      * @return
      */
-    CourseSchedule getLastEndCourse(@Param("groupId") String groupId, @Param("groupType") String groupType);
+    CourseSchedule getLastEndCourse(@Param("groupId") String groupId, @Param("groupType") String groupType, @Param("classGroupId") Integer classGroupId);
 
     /**
      * 根据课程组获取课表信息
@@ -1510,4 +1515,10 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     Date getLastTime(@Param("practiceGroupId") Long practiceGroupId, @Param("groupType") String groupType);
+
+    /**
+     * 重置上课学生人数
+     * @param courseScheduleId
+     */
+    void resetStudentNum(@Param("courseScheduleId") List<Long> courseScheduleId);
 }

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

@@ -263,4 +263,13 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return java.util.List<java.util.Map<java.lang.Long,java.math.BigDecimal>>
      */
     List<Map<Long, BigDecimal>> findCoursePayment(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
+    /**
+     * 获取学员指定课程类型的剩余课时数
+     * @param studentId
+     * @param courseScheduleType
+     * @return
+     */
+    int countStudentNotStartCourseNumWithCourseType(@Param("studentId") Integer studentId,
+                                                    @Param("courseScheduleType")CourseSchedule.CourseScheduleType courseScheduleType);
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesDao.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -11,4 +12,15 @@ public interface ExtracurricularExercisesDao extends BaseDAO<Long, Extracurricul
     int countExtraExercises(Map<String, Object> params);
     List<ExtracurricularExercises> findExtraExercises(Map<String, Object> params);
 
+    /**
+     * 查询同一个老师对同一批学员布置相同作业的最新记录
+     * @param teacherId
+     * @param studentIdList
+     * @param content
+     * @return
+     */
+    ExtracurricularExercises findRepeatLastExercises(@Param("teacherId") Integer teacherId,
+                             @Param("studentIdList") String studentIdList,
+                             @Param("content") String content);
+
 }

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

@@ -182,6 +182,14 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     List<MusicGroup> findUserMusicGroups(@Param("userId") Integer userId);
 
     /**
+     * 查询乐团列表
+     * @param params
+     * @return
+     */
+    List<MusicGroup> findMusicGroups(Map<String, Object> params);
+    int countMusicGroups(Map<String, Object> params);
+
+    /**
      * 获取乐团信息
      *
      * @param list

+ 70 - 22
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java

@@ -1,31 +1,79 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
-import com.ym.mec.common.dal.BaseDAO;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import org.apache.ibatis.annotations.Param;
 
-import java.util.List;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.common.dal.BaseDAO;
 
 public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPaymentCalender> {
 
+	/**
+	 * 根据乐团编号删除乐团缴费周期
+	 * @param musicGroupId
+	 */
+	void delByGroupId(String musicGroupId);
+
+	/**
+	 * 根据乐团编号获取乐团缴费日历
+	 * @param musicGroupId
+	 * @return
+	 */
+	List<MusicGroupPaymentCalender> findByMusicGroupId(String musicGroupId);
+
+	/**
+	 * 批量新增乐团缴费周期
+	 * @param calender
+	 * @param musicGroupId
+	 */
+	void batchAdd(@Param("calender") List<Integer> calender, @Param("musicGroupId") String musicGroupId);
+
+	/**
+	 * 批量修改
+	 * @param musicGroupPaymentCalenderList
+	 * @return
+	 */
+	int batchUpdate(List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList);
+
+	/**
+	 * 查询指定状态的记录
+	 * @param status
+	 * @return
+	 */
+	List<MusicGroupPaymentCalender> queryByPaymentStatus(@Param("status") List<PaymentStatusEnum> status);
+	
+	/**
+	 * 获取缴费信息锁
+	 * @param id
+	 * @return
+	 */
+	MusicGroupPaymentCalender getForLock(@Param("id") Long id);
+
+	/**
+	 * 根据指定乐团的缴费日期查询交集
+	 * @param musicGroupId 乐团编号
+	 * @param startPaymentDate 开始缴费日期
+	 * @param deadlinePaymentDate 截止缴费日期
+	 * @return
+	 */
+	int queryIntersectionByPaymentDate(@Param("musicGroupId") String musicGroupId, @Param("startPaymentDate") Date startPaymentDate,
+			@Param("deadlinePaymentDate") Date deadlinePaymentDate);
 
-    /**
-     * 根据乐团编号删除乐团缴费周期
-     * @param musicGroupId
-     */
-    void delByGroupId(String musicGroupId);
-
-    /**
-     * 根据乐团编号获取乐团缴费日历
-     * @param musicGroupId
-     * @return
-     */
-    List<MusicGroupPaymentCalender> findByMusicGroupId(String musicGroupId);
-
-    /**
-     * 批量新增乐团缴费周期
-     * @param calender
-     * @param musicGroupId
-     */
-    void batchAdd(@Param("calender") List<Integer> calender,@Param("musicGroupId") String musicGroupId);
+	/**
+	 * 统计预计缴费人数
+	 * @param collect
+	 * @return
+	 */
+	List<Map<Long, Long>> countExpectNum(@Param("collect") Set<Long> collect);
+	/**
+	 * 统计预计缴费人数
+	 * @param collect
+	 * @return
+	 */
+	List<Map<Long, Long>> countActualNum(@Param("collect") Set<Long> collect);
 }

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

@@ -0,0 +1,84 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicGroupPaymentCalenderDetail> {
+
+	/**
+	 * 批量新增
+	 * @param musicGroupPaymentCalenderDetailList
+	 * @return
+	 */
+	int batchInsert(List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList);
+
+	/**
+	 * 获取列表
+	 * @param ids
+	 * @return
+	 */
+    List<MusicGroupPaymentCalenderDetail> queryListByIds(@Param("ids") String ids);
+
+	/**
+	 * 批量修改
+	 * @param calenderDetails
+	 */
+	void batchUpdate(@Param("calenderDetails") List<MusicGroupPaymentCalenderDetail> calenderDetails);
+
+	/**
+	 * 根据指定的日历编号查询
+	 * @param musicGroupPaymentCalenderId
+	 * @return
+	 */
+	List<MusicGroupPaymentCalenderDetail> queryByCalenderId(Long musicGroupPaymentCalenderId);
+
+	/**
+	 * 根据声部获取乐团下完成缴费的学员
+	 * @param musicGroupId
+	 * @param subjectId
+	 * @return
+	 */
+	List<SimpleUserDto> findMusicGroupStudentWithSubject(@Param("musicGroupId") String musicGroupId,
+														 @Param("subjectId") Integer subjectId);
+
+	/**
+	 * 统计实际收款金额
+	 * @param id
+	 * @return
+	 */
+	BigDecimal sumActualAmount(@Param("id") Long id);
+
+	/**
+	 * 获取学生最后一期续费记录
+	 * @param musicGroupId
+	 * @param userId
+	 * @return
+	 */
+	MusicGroupPaymentCalenderDetail getUserLastCalenderDetail(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
+
+	/**
+	 * 获取可开启缴费的数据集
+	 * @param ids
+	 * @return
+	 */
+	List<MusicGroupPaymentCalenderDetail> queryCanOpenList(@Param("ids") String ids);
+
+	/**
+	 * 当前用户是否有进行中的订单
+	 * @param musicGroupId
+	 * @param userId
+	 * @return
+	 */
+	int queryIntersectionByPaymentDate(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
+
+	/**
+	 * 刷新学员乐团付费状态
+	 */
+	void refreshUserMusicGroupPaymentStatusTask();
+
+}

+ 32 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupStudentFeeDao.java

@@ -1,15 +1,16 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
-import com.ym.mec.common.dal.BaseDAO;
-import org.apache.ibatis.annotations.Param;
-
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
+import com.ym.mec.common.dal.BaseDAO;
 
 public interface MusicGroupStudentFeeDao extends BaseDAO<Long, MusicGroupStudentFee> {
 
@@ -168,4 +169,29 @@ public interface MusicGroupStudentFeeDao extends BaseDAO<Long, MusicGroupStudent
 	 * @param musicGroupId
 	 */
 	void updateCalender(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
+
+	/**
+	 * 修改课程费用
+	 * @param ids
+	 * @param courseFee
+	 */
+    void batchUpdateCourseFee(@Param("ids") String ids, @Param("courseFee") BigDecimal courseFee);
+
+	/**
+	 * 将乐团的学生缴费状态设置为未缴费
+	 * @param calenderDetails
+	 */
+	void setNoPayment(@Param("calenderDetails") List<MusicGroupPaymentCalenderDetail> calenderDetails);
+
+	/**
+	 * 修改为缴费完成
+	 * @param calenderDetails
+	 */
+	void setPaidCompleted(@Param("calenderDetails") List<MusicGroupPaymentCalenderDetail> calenderDetails);
+
+	/**
+	 * 剩余网管课课次加一
+	 * @param musicGroupPaymentCalenderDetailIds
+	 */
+	void remainNetworkClassTimesAdd(@Param("musicGroupPaymentCalenderDetailIds") String musicGroupPaymentCalenderDetailIds);
 }

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

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

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java

@@ -280,4 +280,12 @@ public interface StudentManageDao {
      * @return
      */
     List<Map<Integer,Integer>> querySubjectNames(@Param("userIds") Set<Integer> userIds);
+
+    /**
+     * 乐团修改--学员缴费记录--可新增学员列表
+     * @param musicGroupId
+     * @param musicGroupPaymentCalenderId
+     * @return
+     */
+    List<BasicUserDto> queryCanAddStudent(@Param("musicGroupId") String musicGroupId, @Param("musicGroupPaymentCalenderId") Long musicGroupPaymentCalenderId);
 }

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

@@ -4,6 +4,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.ym.mec.biz.dal.entity.Subject;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.auth.api.entity.SysUser;
@@ -320,4 +321,11 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<String> queryStudentMusicGroup(Integer studentId);
 
     String getSubjectIds(Integer userId);
+
+    /**
+     * 获取乐团下所有学员身上的声部列表
+     * @param musicGroupId
+     * @return
+     */
+    List<Subject> findMusicGroupAllStudentSubjects(@Param("musicGroupId") String musicGroupId);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserCashAccountDetailDao.java

@@ -29,4 +29,12 @@ public interface SysUserCashAccountDetailDao extends BaseDAO<Long, SysUserCashAc
      * @return
      */
     Integer countByTypeAndTime(@Param("currentMonth") String currentMonth,@Param("teacherId")Integer teacherId,@Param("activeId")Integer activeId);
+
+    /**
+     * 流水明细查询-包含账户余额与课程余额
+     * @param params
+     * @return
+     */
+    List<SysUserCashAccountDetail> queryAccountDetail(Map<String, Object> params);
+    int countAccountDetails(Map<String, Object> params);
 }

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

@@ -14,6 +14,8 @@ import java.util.Map;
 import java.util.Set;
 
 public interface TeacherDao extends BaseDAO<Integer, Teacher> {
+	
+	Teacher getLocked(Integer id);
 
     /**
      * 根据证件号查询老师
@@ -123,6 +125,9 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     List<ExtendTeacherBasicDto> findTeaTeachersByOrganAndSubject2(@Param("organId") Integer organId,
                                                                   @Param("subjectId") Integer subjectId);
 
+    List<ExtendTeacherBasicDto> findTeaTeachersByOrganAndSubject3(@Param("organId") Integer organId,
+                                                                  @Param("subjectId") Integer subjectId);
+
     /**
      * @param organIds:   部门编号列表
      * @param subjectIds: 声部编号列表

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

@@ -48,6 +48,12 @@ public class ClassGroup4MixDto {
     @ApiModelProperty(value = "排课方式(new -新增 renew-重排)", required = true)
     private String courseAddType;
 
+    @ApiModelProperty(value = "预计学生人数", required = true)
+    private Integer expectStudentNum;
+
+    @ApiModelProperty(value = "声部id", required = true)
+    private Integer subjectId;
+
     public String getMusicGroupId() {
         return musicGroupId;
     }
@@ -151,4 +157,20 @@ public class ClassGroup4MixDto {
     public void setCourseAddType(String courseAddType) {
         this.courseAddType = courseAddType;
     }
+
+    public Integer getExpectStudentNum() {
+        return expectStudentNum;
+    }
+
+    public void setExpectStudentNum(Integer expectStudentNum) {
+        this.expectStudentNum = expectStudentNum;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
 }

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
 
 import java.math.BigDecimal;
 
@@ -22,6 +23,16 @@ public class CourseTeacherSalaryStatisticsDto {
 
     private BigDecimal totalReduceSalary;
 
+    private TeacherSalaryConfirmStatus confirmStatus;
+
+    public TeacherSalaryConfirmStatus getConfirmStatus() {
+        return confirmStatus;
+    }
+
+    public void setConfirmStatus(TeacherSalaryConfirmStatus confirmStatus) {
+        this.confirmStatus = confirmStatus;
+    }
+
     public String getStatType() {
         return statType;
     }

+ 68 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OnlineMusicGroupCourseDto.java

@@ -0,0 +1,68 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.CourseGenerateDto;
+
+import java.util.Date;
+
+public class OnlineMusicGroupCourseDto extends CourseGenerateDto {
+
+    private String musicGroupId;
+
+    private Integer studentId;
+
+    private Integer subjectId;
+
+    private Integer teacherId;
+
+    private Date firstCourseTime;
+
+    private boolean skipHoliday;
+
+    public boolean isSkipHoliday() {
+        return skipHoliday;
+    }
+
+    public void setSkipHoliday(boolean skipHoliday) {
+        this.skipHoliday = skipHoliday;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Date getFirstCourseTime() {
+        return firstCourseTime;
+    }
+
+    public void setFirstCourseTime(Date firstCourseTime) {
+        this.firstCourseTime = firstCourseTime;
+    }
+}

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

@@ -27,6 +27,8 @@ public class PracticeBuyResultDto {
 
     private String drillTimesJson;
 
+    private String type;
+
     public String getOrderNo() {
         return orderNo;
     }
@@ -90,4 +92,12 @@ public class PracticeBuyResultDto {
     public void setDrillTimesJson(String drillTimesJson) {
         this.drillTimesJson = drillTimesJson;
     }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 }

+ 46 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentEduTeacherDto.java

@@ -0,0 +1,46 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.GroupType;
+
+public class StudentEduTeacherDto {
+
+    private Integer studentId;
+
+    private Integer educationalTeacherId;
+
+    private String educationalTeacherName;
+
+    private String groupType;
+
+    public String getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(String groupType) {
+        this.groupType = groupType;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public Integer getEducationalTeacherId() {
+        return educationalTeacherId;
+    }
+
+    public void setEducationalTeacherId(Integer educationalTeacherId) {
+        this.educationalTeacherId = educationalTeacherId;
+    }
+
+    public String getEducationalTeacherName() {
+        return educationalTeacherName;
+    }
+
+    public void setEducationalTeacherName(String educationalTeacherName) {
+        this.educationalTeacherName = educationalTeacherName;
+    }
+}

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

@@ -18,6 +18,26 @@ public class StudentExercisesSituationDto extends StudentExtracurricularExercise
 
     private Integer existPracticeCourse;
 
+    private Integer educationalTeacherId;
+
+    private String educationalTeacherName;
+
+    public Integer getEducationalTeacherId() {
+        return educationalTeacherId;
+    }
+
+    public void setEducationalTeacherId(Integer educationalTeacherId) {
+        this.educationalTeacherId = educationalTeacherId;
+    }
+
+    public String getEducationalTeacherName() {
+        return educationalTeacherName;
+    }
+
+    public void setEducationalTeacherName(String educationalTeacherName) {
+        this.educationalTeacherName = educationalTeacherName;
+    }
+
     public Integer getExistPracticeCourse() {
         return existPracticeCourse;
     }

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

@@ -47,8 +47,6 @@ public class StudentManageListDto {
     
     private YesOrNoEnum isActive;
 
-    private YesOrNoEnum isMake;
-
     private YesOrNoEnum hasCourse;
 
     @ApiModelProperty(value = "是否有网管课")
@@ -156,14 +154,6 @@ public class StudentManageListDto {
         this.hasPracticeCourse = hasPracticeCourse;
     }
 
-    public YesOrNoEnum getIsMake() {
-        return isMake;
-    }
-
-    public void setIsMake(YesOrNoEnum make) {
-        isMake = make;
-    }
-
     public YesOrNoEnum getHasCourse() {
         return hasCourse;
     }

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherClassGroupDto.java

@@ -13,7 +13,7 @@ import java.util.Date;
 public class TeacherClassGroupDto {
 
     @ApiModelProperty(value = "班级编号")
-    private Long classGroupId;
+    private Integer classGroupId;
 
     @ApiModelProperty(value = "班级名称")
     private String classGroupName;
@@ -197,11 +197,11 @@ public class TeacherClassGroupDto {
         this.subjectIdList = subjectIdList;
     }
 
-    public Long getClassGroupId() {
+    public Integer getClassGroupId() {
         return classGroupId;
     }
 
-    public void setClassGroupId(Long classGroupId) {
+    public void setClassGroupId(Integer classGroupId) {
         this.classGroupId = classGroupId;
     }
 

+ 24 - 13
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroup.java

@@ -1,5 +1,8 @@
 package com.ym.mec.biz.dal.entity;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import io.swagger.annotations.ApiModelProperty;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -23,10 +26,6 @@ public class ClassGroup {
 	private String musicGroupId;
 
 	/**  */
-	@ApiModelProperty(value = "上课模式", required = true)
-	private String teachMode = "OFFLINE";
-
-	/**  */
 	@ApiModelProperty(value = "科目编号(多个,号分割)", required = true)
 	private String subjectIdList;
 
@@ -57,7 +56,7 @@ public class ClassGroup {
 	private String classNames;
 
 	/** 预计招生人数 */
-	@ApiModelProperty(value = "预计招生人数",hidden = true)
+	@ApiModelProperty(value = "预计招生人数", required = true)
 	private Integer expectStudentNum;
 
 	/** 学生数 */
@@ -86,6 +85,10 @@ public class ClassGroup {
 	
 	@ApiModelProperty(value = "班级图标",required = false)
 	private String img;
+	
+	private List<ClassGroupTeacherMapper> teacherMapperList = new ArrayList<ClassGroupTeacherMapper>();
+	
+	private List<CourseSchedule> courseScheduleList = new ArrayList<CourseSchedule>();
 
 	public String getViewGroupName() {
 		return viewGroupName;
@@ -111,14 +114,6 @@ public class ClassGroup {
 		this.groupName = groupName;
 	}
 
-	public String getTeachMode() {
-		return teachMode;
-	}
-
-	public void setTeachMode(String teachMode) {
-		this.teachMode = teachMode;
-	}
-
 	public Integer getCurrentClassTimes() {
 		return currentClassTimes;
 	}
@@ -255,6 +250,22 @@ public class ClassGroup {
 		this.img = img;
 	}
 
+	public List<ClassGroupTeacherMapper> getTeacherMapperList() {
+		return teacherMapperList;
+	}
+
+	public void setTeacherMapperList(List<ClassGroupTeacherMapper> teacherMapperList) {
+		this.teacherMapperList = teacherMapperList;
+	}
+
+	public List<CourseSchedule> getCourseScheduleList() {
+		return courseScheduleList;
+	}
+
+	public void setCourseScheduleList(List<CourseSchedule> courseScheduleList) {
+		this.courseScheduleList = courseScheduleList;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 11 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java

@@ -31,7 +31,7 @@ public class CourseSchedule {
 
 		SINGLE("SINGLE", "单技课"), MIX("MIX", "合奏课"), HIGH("HIGH", "小班课"), VIP("VIP", "vip课"), DEMO("DEMO", "试听课"), COMPREHENSIVE("COMPREHENSIVE", "综合课"), PRACTICE(
 				"PRACTICE", "网管课"), ENLIGHTENMENT("ENLIGHTENMENT", "启蒙课"), TRAINING_SINGLE("TRAINING_SINGLE", "集训单技课"), TRAINING_MIX("TRAINING_MIX", "集训合奏课"), CLASSROOM(
-				"CLASSROOM", "课堂课"),COMM("COMM","对外课程"),TRIAL("TRIAL","试听课");
+				"CLASSROOM", "课堂课"),COMM("COMM","对外课程"),HIGH_ONLINE("HIGH_ONLINE","线上基础技能课"),MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课");
 
 		private String code;
 
@@ -140,6 +140,8 @@ public class CourseSchedule {
 
 	private Integer isLock;
 
+	private Integer organId;
+
 	private YesOrNoEnum isCallNames;
 
 	private String teachingContent;
@@ -158,6 +160,14 @@ public class CourseSchedule {
 
 	private int isSignOut = 3;
 
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
 	public int getIsSignIn() {
 		return isSignIn;
 	}

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

@@ -48,6 +48,9 @@ public class CourseScheduleTeacherSalary {
 	
 	/** 实际薪水 */
 	private java.math.BigDecimal actualSalary;
+
+	/** 课酬结算时计算的课酬 */
+	private java.math.BigDecimal teacherActualSalary;
 	
 	/** 结算时间 */
 	private java.util.Date settlementTime;
@@ -62,6 +65,14 @@ public class CourseScheduleTeacherSalary {
 
 	private String memo;
 
+	public BigDecimal getTeacherActualSalary() {
+		return teacherActualSalary;
+	}
+
+	public void setTeacherActualSalary(BigDecimal teacherActualSalary) {
+		this.teacherActualSalary = teacherActualSalary;
+	}
+
 	public CourseScheduleTeacherSalary() {
 	}
 

+ 76 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java

@@ -1,13 +1,29 @@
 package com.ym.mec.biz.dal.entity;
 
 import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.common.enums.BaseEnum;
+
 /**
  * 对应数据库表(music_group_payment_calender):
  */
 public class MusicGroupPaymentCalender implements Comparable<MusicGroupPaymentCalender> {
 
+	public enum FeeType implements BaseEnum<String, FeeType> {
+		OFFLINE, ONLINE, ALL;
+
+		@Override
+		public String getCode() {
+			return this.name();
+		}
+
+	}
+
 	/**  */
 	private Long id;
 
@@ -23,6 +39,18 @@ public class MusicGroupPaymentCalender implements Comparable<MusicGroupPaymentCa
 	@ApiModelProperty(value = "开始缴费日期", required = false)
 	private java.util.Date startPaymentDate;
 
+	private Date deadlinePaymentDate;
+
+	private PaymentStatusEnum paymentStatus;
+
+	private Integer expectNum;
+
+	private Integer actualNum;
+
+	private String memo;
+	
+	private FeeType type;
+
 	/**  */
 	private java.util.Date createTime;
 
@@ -77,6 +105,54 @@ public class MusicGroupPaymentCalender implements Comparable<MusicGroupPaymentCa
 		return this.updateTime;
 	}
 
+	public Date getDeadlinePaymentDate() {
+		return deadlinePaymentDate;
+	}
+
+	public void setDeadlinePaymentDate(Date deadlinePaymentDate) {
+		this.deadlinePaymentDate = deadlinePaymentDate;
+	}
+
+	public PaymentStatusEnum getPaymentStatus() {
+		return paymentStatus;
+	}
+
+	public void setPaymentStatus(PaymentStatusEnum paymentStatus) {
+		this.paymentStatus = paymentStatus;
+	}
+
+	public Integer getExpectNum() {
+		return expectNum;
+	}
+
+	public void setExpectNum(Integer expectNum) {
+		this.expectNum = expectNum;
+	}
+
+	public Integer getActualNum() {
+		return actualNum;
+	}
+
+	public void setActualNum(Integer actualNum) {
+		this.actualNum = actualNum;
+	}
+
+	public String getMemo() {
+		return memo;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public FeeType getType() {
+		return type;
+	}
+
+	public void setType(FeeType type) {
+		this.type = type;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 194 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderDetail.java

@@ -0,0 +1,194 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+
+import java.util.Date;
+
+/**
+ * 对应数据库表(music_group_payment_calender_detail):
+ */
+public class MusicGroupPaymentCalenderDetail {
+
+	/**  */
+	private Long id;
+	
+	/**  */
+	private Long musicGroupPaymentCalenderId;
+	
+	/**  */
+	private Integer userId;
+	
+	/**  */
+	private java.math.BigDecimal expectAmount;
+	
+	/**  */
+	private java.math.BigDecimal actualAmount;
+	
+	/**  */
+	private PaymentStatus paymentStatus;
+	
+	/**  */
+	private String userStatus;
+
+	/**  */
+	private String musicGroupId;
+
+	/**1是0否  */
+	private Integer open;
+	
+	/**  */
+	private java.util.Date payTime;
+
+	/**  */
+	private java.util.Date startPaymentDate;
+
+	/**  */
+	private java.util.Date deadlinePaymentDate;
+	
+	/**  */
+	private java.util.Date updateTime;
+	
+	/**  */
+	private java.util.Date createTime;
+
+	private SysUser sysUser = new SysUser();
+
+	private StudentRegistration studentRegistration = new StudentRegistration();
+
+	public String getMusicGroupId() {
+		return musicGroupId;
+	}
+
+	public void setMusicGroupId(String musicGroupId) {
+		this.musicGroupId = musicGroupId;
+	}
+
+	public Date getStartPaymentDate() {
+		return startPaymentDate;
+	}
+
+	public void setStartPaymentDate(Date startPaymentDate) {
+		this.startPaymentDate = startPaymentDate;
+	}
+
+	public Date getDeadlinePaymentDate() {
+		return deadlinePaymentDate;
+	}
+
+	public void setDeadlinePaymentDate(Date deadlinePaymentDate) {
+		this.deadlinePaymentDate = deadlinePaymentDate;
+	}
+
+	public Integer getOpen() {
+		return open;
+	}
+
+	public void setOpen(Integer open) {
+		this.open = open;
+	}
+
+	public StudentRegistration getStudentRegistration() {
+		return studentRegistration;
+	}
+
+	public void setStudentRegistration(StudentRegistration studentRegistration) {
+		this.studentRegistration = studentRegistration;
+	}
+
+	public SysUser getSysUser() {
+		return sysUser;
+	}
+
+	public void setSysUser(SysUser sysUser) {
+		this.sysUser = sysUser;
+	}
+
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setMusicGroupPaymentCalenderId(Long musicGroupPaymentCalenderId){
+		this.musicGroupPaymentCalenderId = musicGroupPaymentCalenderId;
+	}
+	
+	public Long getMusicGroupPaymentCalenderId(){
+		return this.musicGroupPaymentCalenderId;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setExpectAmount(java.math.BigDecimal expectAmount){
+		this.expectAmount = expectAmount;
+	}
+	
+	public java.math.BigDecimal getExpectAmount(){
+		return this.expectAmount;
+	}
+			
+	public void setActualAmount(java.math.BigDecimal actualAmount){
+		this.actualAmount = actualAmount;
+	}
+	
+	public java.math.BigDecimal getActualAmount(){
+		return this.actualAmount;
+	}
+			
+	public void setPaymentStatus(PaymentStatus paymentStatus){
+		this.paymentStatus = paymentStatus;
+	}
+	
+	public PaymentStatus getPaymentStatus(){
+		return this.paymentStatus;
+	}
+			
+	public void setUserStatus(String userStatus){
+		this.userStatus = userStatus;
+	}
+	
+	public String getUserStatus(){
+		return this.userStatus;
+	}
+			
+	public void setPayTime(java.util.Date payTime){
+		this.payTime = payTime;
+	}
+	
+	public java.util.Date getPayTime(){
+		return this.payTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	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);
+	}
+
+}

+ 30 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupStudentFee.java

@@ -1,12 +1,10 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.auth.api.entity.SysUser;
 import io.swagger.annotations.ApiModelProperty;
-
 import java.math.BigDecimal;
 import java.util.Date;
-
 import org.apache.commons.lang3.builder.ToStringBuilder;
-
 import com.ym.mec.common.enums.BaseEnum;
 
 /**
@@ -79,6 +77,12 @@ public class MusicGroupStudentFee {
 	/**  */
 	private java.util.Date updateTime;
 
+	private SysUser sysUser;
+
+	private String subjectName;
+
+	private Integer remainNetworkClassTimes;
+
 	public MusicGroupStudentFee(String musicGroupId, Integer userId, Integer subjectId,
 								BigDecimal courseFee, Date nextPaymentDate, BigDecimal temporaryCourseFee,PaymentStatus paymentStatus) {
 		this.musicGroupId = musicGroupId;
@@ -94,6 +98,22 @@ public class MusicGroupStudentFee {
 	public MusicGroupStudentFee() {
 	}
 
+	public SysUser getSysUser() {
+		return sysUser;
+	}
+
+	public void setSysUser(SysUser sysUser) {
+		this.sysUser = sysUser;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
 	public Integer getIsLock() {
 		return isLock;
 	}
@@ -206,6 +226,13 @@ public class MusicGroupStudentFee {
 		this.temporaryCourseFee = temporaryCourseFee;
 	}
 
+	public Integer getRemainNetworkClassTimes() {
+		return remainNetworkClassTimes;
+	}
+
+	public void setRemainNetworkClassTimes(Integer remainNetworkClassTimes) {
+		this.remainNetworkClassTimes = remainNetworkClassTimes;
+	}
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

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

@@ -13,6 +13,9 @@ public class Student {
 	/**  */
 	private String subjectIdList;
 
+	/**  */
+	private String subjectNames;
+
 	private Integer serviceTag;
 
 	private Integer operatingTag;
@@ -32,6 +35,14 @@ public class Student {
 		this.subjectIdList = subjectIdList;
 	}
 
+	public String getSubjectNames() {
+		return subjectNames;
+	}
+
+	public void setSubjectNames(String subjectNames) {
+		this.subjectNames = subjectNames;
+	}
+
 	public Student(Integer userId) {
 		this.userId = userId;
 	}

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRepair.java

@@ -122,6 +122,11 @@ public class StudentRepair {
     private Integer repairStatus;
 
     /**
+     * 使用余额
+     */
+    private Boolean isUseBalancePayment;
+
+    /**
     * 送修时间
     */
     private Date createTime;
@@ -338,4 +343,12 @@ public class StudentRepair {
     public void setEmployeeAddress(String employeeAddress) {
         this.employeeAddress = employeeAddress;
     }
+
+    public Boolean getIsUseBalancePayment() {
+        return isUseBalancePayment;
+    }
+
+    public void setIsUseBalancePayment(Boolean useBalancePayment) {
+        isUseBalancePayment = useBalancePayment;
+    }
 }

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

@@ -38,6 +38,9 @@ public class TeacherDefaultMusicGroupSalary {
 	/** 助教薪酬 */
 	@ApiModelProperty(value = "助教30分钟课酬",required = false)
 	private BigDecimal assistantTeacher30MinSalary;
+	
+	@ApiModelProperty(value = "课酬规则",required = false)
+	private String salaryRuleJson;
 
 	/**  */
 	private java.util.Date createTime;
@@ -101,6 +104,14 @@ public class TeacherDefaultMusicGroupSalary {
 		this.assistantTeacher30MinSalary = assistantTeacher30MinSalary;
 	}
 
+	public String getSalaryRuleJson() {
+		return salaryRuleJson;
+	}
+
+	public void setSalaryRuleJson(String salaryRuleJson) {
+		this.salaryRuleJson = salaryRuleJson;
+	}
+
 	public Date getCreateTime() {
 		return createTime;
 	}

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

@@ -3,7 +3,7 @@ package com.ym.mec.biz.dal.enums;
 import com.ym.mec.common.enums.BaseEnum;
 
 public enum ClassGroupStudentStatusEnum implements BaseEnum<String, ClassGroupStudentStatusEnum> {
-    NORMAL("NORMAL", "在读"), LEAVE("LEAVE", "请假"), QUIT("QUIT", "退班"), QUIT_SCHOOL("QUIT_SCHOOL","休学");
+    NORMAL("NORMAL", "在读"), QUIT("QUIT", "退班"), QUIT_SCHOOL("QUIT_SCHOOL","休学");
 
     private String code;
 

+ 2 - 8
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ClassGroupTypeEnum.java

@@ -6,14 +6,8 @@ import com.ym.mec.common.enums.BaseEnum;
  * 班级类型
  */
 public enum ClassGroupTypeEnum implements BaseEnum<String, ClassGroupTypeEnum> {
-	NORMAL("NORMAL", "普通班级"),
-	MIX("MIX", "合奏班级"),
-	HIGH("HIGH", "提高班"),
-	VIP("VIP", "vip课"),
-	DEMO("DEMO", "试听课"),
-	PRACTICE("PRACTICE", "网管课"),
-	SNAP("SNAP", "临时班级"),
-	COMM("COMM","对外课程");
+	NORMAL("NORMAL", "普通班级"), MIX("MIX", "合奏班级"), HIGH("HIGH", "提高班"), VIP("VIP", "vip课"), DEMO("DEMO", "试听课"), PRACTICE("PRACTICE", "网管课"), SNAP("SNAP",
+			"临时班级"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "线上基础技能课"),MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课");
 
 	private String code;
 

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

@@ -62,6 +62,10 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     TRIAL_PRACTICE_CREATE_STUDENT_PUSH("TRIAL_PRACTICE_CREATE_STUDENT_PUSH", "试听课安排"),
     TRIAL_PRACTICE_CREATE_TEACHER_PUSH("TRIAL_PRACTICE_CREATE_TEACHER_PUSH", "试听课安排"),
 
+    /**乐团网管课*/
+    MUSIC_NETWORK_CRATE_TEACHER("MUSIC_NETWORK_CRATE_TEACHER", "乐团网管课安排"),
+    MUSIC_NETWORK_CRATE_STUDENT("MUSIC_NETWORK_CRATE_STUDENT", "乐团课通知"),
+
     /** 课外训练消息 */
     EXTRA_REMIND_PUSH("EXTRA_REMIND_PUSH", "作业提醒"),
     EXTRA_REMIND_IM("EXTRA_REMIND_IM", "作业提醒"),
@@ -141,7 +145,13 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     PUSH_STUDY_REPORT("PUSH_STUDY_REPORT", "陪练报告"),
     NEED_POST_STUDY_REPORT("NEED_POST_STUDY_REPORT", "新增待填写月报"),
 
-    TEACHER_SALARY_CONFIRM_PUSH("TEACHER_SALARY_CONFIRM_PUSH", "课酬确认");
+    TEACHER_SALARY_CONFIRM_PUSH("TEACHER_SALARY_CONFIRM_PUSH", "课酬确认"),
+
+    SMS_REPAIR_ONLINE_PAYMENT_SUCCESS("SMS_REPAIR_ONLINE_PAYMENT_SUCCESS","乐器线上维修支付成功"),
+    SMS_REPAIR_OFFLINE_PAYMENT_SUCCESS("SMS_REPAIR_OFFLINE_PAYMENT_SUCCESS","乐器线下维修支付成功"),
+    SMS_REPAIR_UNSEND_COMPLETED("SMS_REPAIR_UNSEND_COMPLETED","乐器维修完成自取"),
+    SMS_REPAIR_SEND_COMPLETED("SMS_REPAIR_SEND_COMPLETED","乐器维修完成邮寄");
+
 
 
     MessageTypeEnum(String code, String msg) {

+ 75 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ClassGroupQueryInfo.java

@@ -0,0 +1,75 @@
+package com.ym.mec.biz.dal.page;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.common.page.QueryInfo;
+
+public class ClassGroupQueryInfo extends QueryInfo {
+	
+	@ApiModelProperty(value = "班级编号", required = false)
+	private Integer id;
+
+	@ApiModelProperty(value = "课程组编号", required = false)
+    private String musicGroupId;
+    
+	@ApiModelProperty(value = "班级类型(普通班级、合奏班级、提高课班级、VIP班级、试听课)", required = false)
+    private ClassGroupTypeEnum type;
+    
+	@ApiModelProperty(value = "课程组类型(MUSIC、VIP、DEMO、PRACTICE、COMM、REPAIR)", required = true)
+    private GroupType groupType;
+    
+    @ApiModelProperty(value = "班级名称", required = false)
+    private String name;
+    
+    private Integer delFlag;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getMusicGroupId() {
+		return musicGroupId;
+	}
+
+	public void setMusicGroupId(String musicGroupId) {
+		this.musicGroupId = musicGroupId;
+	}
+
+	public ClassGroupTypeEnum getType() {
+		return type;
+	}
+
+	public void setType(ClassGroupTypeEnum type) {
+		this.type = type;
+	}
+
+	public GroupType getGroupType() {
+		return groupType;
+	}
+
+	public void setGroupType(GroupType groupType) {
+		this.groupType = groupType;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Integer getDelFlag() {
+		return delFlag;
+	}
+
+	public void setDelFlag(Integer delFlag) {
+		this.delFlag = delFlag;
+	}
+}

+ 66 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicCalenderDetailQueryInfo.java

@@ -0,0 +1,66 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class MusicCalenderDetailQueryInfo extends QueryInfo {
+
+	private Integer userId;
+
+	private String paymentStatus;
+
+	private Integer subjectId;
+
+	private String musicGroupId;
+
+	private String musicGroupStatus;
+
+	private Long id;
+
+	public String getPaymentStatus() {
+		return paymentStatus;
+	}
+
+	public void setPaymentStatus(String paymentStatus) {
+		this.paymentStatus = paymentStatus;
+	}
+
+	public String getMusicGroupStatus() {
+		return musicGroupStatus;
+	}
+
+	public void setMusicGroupStatus(String musicGroupStatus) {
+		this.musicGroupStatus = musicGroupStatus;
+	}
+
+	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 Integer getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicCalenderQueryInfo.java

@@ -0,0 +1,15 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class MusicCalenderQueryInfo extends QueryInfo {
+	private String musicGroupId;
+
+	public String getMusicGroupId() {
+		return musicGroupId;
+	}
+
+	public void setMusicGroupId(String musicGroupId) {
+		this.musicGroupId = musicGroupId;
+	}
+}

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.page;
 
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -20,6 +21,27 @@ public class MusicGroupQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "乐团状态",required = false)
     private String musicGroupStatus;
 
+    @ApiModelProperty(value = "教务老师编号")
+    private Integer educationalTeacherId;
+
+    private MusicGroupStatusEnum status;
+
+    public MusicGroupStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(MusicGroupStatusEnum status) {
+        this.status = status;
+    }
+
+    public Integer getEducationalTeacherId() {
+        return educationalTeacherId;
+    }
+
+    public void setEducationalTeacherId(Integer educationalTeacherId) {
+        this.educationalTeacherId = educationalTeacherId;
+    }
+
     public String getOrganId() {
         return organId;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/RepairStudentQueryInfo.java

@@ -24,6 +24,8 @@ public class RepairStudentQueryInfo extends QueryInfo {
 
     private Integer studentId;
 
+    private Integer payStatus;
+
     public Integer getSubjectId() {
         return subjectId;
     }
@@ -87,4 +89,12 @@ public class RepairStudentQueryInfo extends QueryInfo {
     public void setStudentId(Integer studentId) {
         this.studentId = studentId;
     }
+
+    public Integer getPayStatus() {
+        return payStatus;
+    }
+
+    public void setPayStatus(Integer payStatus) {
+        this.payStatus = payStatus;
+    }
 }

+ 0 - 10
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java

@@ -30,8 +30,6 @@ public class StudentManageQueryInfo extends QueryInfo {
     
     private Boolean isActive;
 
-    private Boolean isMake;
-
     private Boolean isExport = false;
 
     private Boolean hasCourse;
@@ -76,14 +74,6 @@ public class StudentManageQueryInfo extends QueryInfo {
         this.hasPracticeCourse = hasPracticeCourse;
     }
 
-    public Boolean getIsMake() {
-        return isMake;
-    }
-
-    public void setIsMake(Boolean make) {
-        isMake = make;
-    }
-
     public List<Integer> getUserIds() {
         return userIds;
     }

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherSalaryModifyQueryInfo.java

@@ -6,7 +6,7 @@ import com.ym.mec.common.page.QueryInfo;
 public class TeacherSalaryModifyQueryInfo extends QueryInfo {
     private String salarySettlementMonth;
 
-    private Integer organId;
+    private String organId;
 
     private Integer teacherId;
 
@@ -20,11 +20,11 @@ public class TeacherSalaryModifyQueryInfo extends QueryInfo {
         this.salarySettlementMonth = salarySettlementMonth;
     }
 
-    public Integer getOrganId() {
+    public String getOrganId() {
         return organId;
     }
 
-    public void setOrganId(Integer organId) {
+    public void setOrganId(String organId) {
         this.organId = organId;
     }
 

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

@@ -16,6 +16,10 @@ import java.util.List;
 import java.util.Map;
 
 public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
+	
+	public PageInfo<ClassGroup> queryPage(ClassGroupQueryInfo queryInfo);
+	
+	boolean create(ClassGroup classGroup);
 
     /**
      * 查询老师乐团课课程
@@ -225,7 +229,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @return com.ym.mec.biz.dal.dto.TeacherClassHeadInfo
      * @describe 获取班级信息
      */
-    TeacherClassHeadInfo findTeacherClassGroupInfo(Long classGroupId);
+    TeacherClassHeadInfo findTeacherClassGroupInfo(Integer classGroupId);
 
     /**
      * @describe 获取班级对应学生列表

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

@@ -27,7 +27,7 @@ public interface ClassGroupStudentMapperService extends BaseService<Long, ClassG
      * @param classGroupId
      * @return
      */
-    boolean delClassGroupStudent(Integer userId, Integer classGroupId) throws Exception;
+    boolean delClassGroupStudent(Integer userId, Integer classGroupId);
 
 
     /**

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

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.common.service.BaseService;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -54,6 +55,13 @@ public interface ClassGroupTeacherMapperService extends BaseService<Long, ClassG
     List<ClassGroupTeacherMapper> getClassGroupTeachers(Integer classGroupId);
 
     /**
+     * 获取班级老师
+     * @param classGroupId
+     * @return
+     */
+    ClassGroupTeacherMapper getClassGroupTeachersRole(Integer classGroupId,String teacherRole);
+
+    /**
      * 修改班级老师
      * @param groupId
      * @param groupType

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

@@ -491,7 +491,7 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @param groupId
 	 * @return
 	 */
-	Object getTeacherCourseHeadInfo(GroupType groupType,String groupId);
+	Object getTeacherCourseHeadInfo(GroupType groupType,String groupId,Long courseScheduleId);
 
 	/**
 	 * 根据课程组获取课表信息

+ 45 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java

@@ -0,0 +1,45 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import com.ym.mec.common.service.BaseService;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface MusicGroupPaymentCalenderDetailService extends BaseService<Long, MusicGroupPaymentCalenderDetail> {
+
+    /**
+     * 修改学员预计缴费金额
+     * @param expectAmount
+     * @param ids
+     * @return
+     */
+    void updateExpectAmount(BigDecimal expectAmount,String ids);
+
+    /**
+     * 开启缴费
+     * @param ids
+     */
+    void openPayment(String ids);
+
+    /**
+     * 根据声部获取乐团下完成缴费的学员
+     * @param musicGroupId
+     * @param subjectId
+     * @return
+     */
+    List<SimpleUserDto> findMusicGroupStudentWithSubject(String musicGroupId,Integer subjectId);
+
+    /**
+     * 刷新学员乐团付费状态
+     */
+    void refreshUserMusicGroupPaymentStatusTask();
+
+    /**
+     * 乐团缴费记录新增学员
+     * @param musicGroupPaymentCalenderId
+     * @param userId
+     */
+    void add(Long musicGroupPaymentCalenderId, Integer userId);
+}

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java

@@ -2,12 +2,26 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
+import com.ym.mec.biz.dal.page.MusicCalenderQueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.Date;
 import java.util.List;
 
 public interface MusicGroupPaymentCalenderService extends BaseService<Long, MusicGroupPaymentCalender> {
+	
+	/**
+	 * 创建缴费信息
+	 * @param musicGroupPaymentCalender
+	 * @return
+	 */
+	boolean create(MusicGroupPaymentCalender musicGroupPaymentCalender);
+	
+	/**
+	 * 自动更新付款日历记录状态
+	 * @return
+	 */
+	boolean autoUpdateMusicGroupPaymentCalenderStatus();
 
 	/**
 	 * 批量新增、修改乐团缴费周期
@@ -22,4 +36,31 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	 * @return
 	 */
 	Date getNextPaymentDate(String musicGroupId, Date latestPaidDate, MusicGroupStudentFee fee);
+
+	/**
+	 * 修改缴费日期
+	 * @param startTime
+	 * @param id
+	 */
+    void updateStartTime(Date startTime, Long id);
+
+	/**
+	 * 删除
+	 * @param id
+	 */
+	void del(Long id);
+
+	/**
+	 * 获取明细
+	 * @param id
+	 * @return
+	 */
+    Object getDetail(Long id);
+
+	/**
+	 * 获取列表
+	 * @param queryInfo
+	 * @return
+	 */
+	Object queryDetailPage(MusicCalenderQueryInfo queryInfo);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -165,6 +165,13 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	PageInfo<MusicGroup> queryMusicGroupPage(MusicGroupQueryInfo queryInfo);
 
 	/**
+	 * 获取乐团列表
+	 * @param queryInfo
+	 * @return
+	 */
+	PageInfo<MusicGroup> findEduTeacherMusicGroups(MusicGroupQueryInfo queryInfo);
+
+	/**
 	 * 修改乐团基本信息
 	 * @param subFeeSettingDto
 	 */

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

@@ -4,6 +4,8 @@ import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.common.service.BaseService;
 
+import java.math.BigDecimal;
+
 public interface MusicGroupStudentFeeService extends BaseService<Long, MusicGroupStudentFee> {
 
 	/**
@@ -31,4 +33,12 @@ public interface MusicGroupStudentFeeService extends BaseService<Long, MusicGrou
 	 * @param studentFeeDto
 	 */
 	void updateStudentFeeIsLock(UpdateStudentFeeDto studentFeeDto);
+
+
+	/**
+	 * 批量修改课程费用
+	 * @param ids
+	 * @param courseFee
+	 */
+    void batchUpdateCourseFee(String ids, BigDecimal courseFee);
 }

+ 38 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/OnlineMusicGroupService.java

@@ -0,0 +1,38 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.OnlineMusicGroupCourseDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.common.page.QueryInfo;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+public interface OnlineMusicGroupService {
+
+    /**
+     * 创建线上乐团班级
+     * @param onlineMusicGroupCourseInfo
+     */
+    Map<String, Object> createOnlineMusicClassGroup(OnlineMusicGroupCourseDto onlineMusicGroupCourseInfo);
+
+    /**
+     * @describe 获取可以预约的教师
+     * @author Joburgess
+     * @date 2020/2/9
+     * @param studentId: 学生编号
+     * @param subjectId: 声部编号
+     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
+     */
+    List<SimpleUserDto> getEnableApplyTeachers(Integer studentId, Integer subjectId);
+
+    /**
+     * 获取教师空闲时间
+     * @param studentId
+     * @param teacherId
+     * @return
+     */
+    Map getTeacherFreeTimes(Integer studentId, Integer teacherId, boolean skipHoliday);
+
+}

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

@@ -110,6 +110,9 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
      */
 	List<Date> getEnableApplyDates(Date startDay,Date endDay);
 
+
+	List<Date> getEnableApplyDatesIncludeAllTimes(Date startDay,Date endDay);
+
 	/**
 	 * @describe 陪练课预约
 	 * @author Joburgess

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

@@ -4,16 +4,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.ConditionDto;
-import com.ym.mec.biz.dal.dto.MusicGroupStudentSignDto;
-import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
-import com.ym.mec.biz.dal.dto.Student4operating;
-import com.ym.mec.biz.dal.dto.StudentManageAccountBaseInfoDto;
-import com.ym.mec.biz.dal.dto.StudentManageBaseInfoOfMusicGroupDto;
-import com.ym.mec.biz.dal.dto.StudentManageListDto;
-import com.ym.mec.biz.dal.dto.StudentManageVipGroupClassDto;
-import com.ym.mec.biz.dal.dto.StudentManageVipGroupDto;
-import com.ym.mec.biz.dal.dto.StudentRegisterPerDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
 import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
@@ -167,4 +158,12 @@ public interface StudentManageService {
      * @return
      */
     PageInfo<Student4operating> getOperatingStudents(StudentOperatingQueryInfo queryInfo);
+
+    /**
+     * 乐团修改--学员缴费记录--可新增学员列表
+     * @param musicGroupId
+     * @param musicGroupPaymentCalenderId
+     * @return
+     */
+    List<BasicUserDto> queryCanAddStudent(String musicGroupId, Long musicGroupPaymentCalenderId);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -235,4 +235,11 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
 	 * @return
 	 */
 	List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, ClassGroupTypeEnum type, Integer subjectId);
+
+	/**
+	 * 获取乐团下所有学员身上的声部列表
+	 * @param musicGroupId
+	 * @return
+	 */
+	List<Subject> findMusicGroupAllStudentSubjects(String musicGroupId);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRepairService.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentRepair;
 import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
@@ -60,4 +61,10 @@ public interface StudentRepairService extends BaseService<Integer, StudentRepair
      * @return
      */
     BasicUserDto getStudentRepairer(Integer studentId,Integer organId);
+
+    /**
+     * 支付回调
+     * @param order
+     */
+    Boolean orderCallback(StudentPaymentOrder order);
 }

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

@@ -185,6 +185,8 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
      */
     String EDU_TEACHER_BASE_URL = "edu_teacher_base_url";
 
+    String HOLIDAY_SETTING = "holiday_setting";
+
     /**
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @params paramName

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

@@ -29,7 +29,7 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	boolean batchSeoMessage(Set<Integer> userIds, MessageTypeEnum messageType,String memo, Object... args);
 
 	/**
-	 * 推送站内消息
+	 * 推送im文本消息,包换调整链接
 	 * @param senderId
 	 * @param messageType
 	 * @return
@@ -37,6 +37,14 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	void batchSendImMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);
 
 	/**
+	 * 推送im自定义节拍器消息
+	 * @param senderId
+	 * @param roomId
+	 * @param content
+	 */
+//	void batchSendImPlayMidiMessage(String senderId,String roomId, String content);
+
+	/**
 	 * 批量发送消息
 	 * @param messageSender 消息发送者
 	 * @param subject 消息主题
@@ -129,4 +137,18 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	
 	public List<SysMessage> queryUserInRecentMinList(String mobile, int recentMin, MessageSendMode type);
 
+	/**
+	 * 发送私聊消息
+	 * @param studentId
+	 * @param content
+	 */
+    void sendPrivateMessage(String studentId, String content);
+
+	/**
+	 * 发送私聊消息
+	 * @param sender
+	 * @param receiver
+	 * @param content
+	 */
+	void sendNoAuthPrivateMessage(String sender,String receiver, String content);
 }

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

@@ -2,10 +2,13 @@ package com.ym.mec.biz.service;
 
 import java.math.BigDecimal;
 
+import com.ym.mec.biz.dal.dto.CashAccountDetail;
 import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.TransTypeEnum;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface SysUserCashAccountDetailService extends BaseService<Long, SysUserCashAccountDetail> {
@@ -34,4 +37,11 @@ public interface SysUserCashAccountDetailService extends BaseService<Long, SysUs
 	boolean addCashAccountDetail(Integer userId, BigDecimal amount, String origOrderId, String transNo, PlatformCashAccountDetailTypeEnum type,
 			TransTypeEnum transType, DealStatusEnum status, String comment,String description);
 
+	/**
+	 * 流水明细查询-包含账户余额与课程余额
+	 * @param queryInfo
+	 * @return
+	 */
+	PageInfo<SysUserCashAccountDetail> queryAccountDetail(CashAccountDetail queryInfo);
+
 }

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

@@ -43,7 +43,7 @@ public interface SysUserCashAccountService extends BaseService<Integer, SysUserC
 	 * @param decimal 交易金额(支持负数)
 	 * @return
 	 */
-	boolean updateCourseBalance(Integer userId, BigDecimal decimal, BigDecimal amount, String description);
+	boolean updateCourseBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, BigDecimal amount, String description);
 
 	/**
 	 * 更新指定用户的账户课程余额
@@ -51,7 +51,7 @@ public interface SysUserCashAccountService extends BaseService<Integer, SysUserC
 	 * @param decimal 交易金额(支持负数)
 	 * @return
 	 */
-	boolean appendCourseBalance(Integer userId, BigDecimal decimal, String description);
+	boolean appendCourseBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description);
 
 	/**
 	 * 将课程余额转入到可用余额

+ 422 - 122
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -1,14 +1,127 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.enums.GroupType.COMM;
+import static com.ym.mec.biz.dal.enums.GroupType.PRACTICE;
+import static com.ym.mec.biz.dal.enums.GroupType.VIP;
+
+import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import com.alibaba.fastjson.JSON;
 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.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.biz.dal.page.*;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupRelationDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleEvaluateDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.CoursesGroupDao;
+import com.ym.mec.biz.dal.dao.GroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.PracticeGroupDao;
+import com.ym.mec.biz.dal.dao.SchoolDao;
+import com.ym.mec.biz.dal.dao.StudentApplyRefundsDao;
+import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SubjectDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.VipGroupDao;
+import com.ym.mec.biz.dal.dto.ClassGroup4MixDto;
+import com.ym.mec.biz.dal.dto.ClassGroupImGroupDto;
+import com.ym.mec.biz.dal.dto.ClassGroupTeacherMapDto;
+import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
+import com.ym.mec.biz.dal.dto.CourseListDto;
+import com.ym.mec.biz.dal.dto.CourseTimeDto;
+import com.ym.mec.biz.dal.dto.HighClassGroupDto;
+import com.ym.mec.biz.dal.dto.MusicGroupClassGroupDto;
+import com.ym.mec.biz.dal.dto.MusicGroupCourseScheduleDto;
+import com.ym.mec.biz.dal.dto.StudentAttendanceViewDto;
+import com.ym.mec.biz.dal.dto.StudentPayInfoDto;
+import com.ym.mec.biz.dal.dto.SuperClassGroupDto;
+import com.ym.mec.biz.dal.dto.TeacherClassGroupDto;
+import com.ym.mec.biz.dal.dto.TeacherClassHeadInfo;
+import com.ym.mec.biz.dal.dto.TeacherMusicClassInfoDto;
+import com.ym.mec.biz.dal.dto.TeacherVipClassInfoDto;
+import com.ym.mec.biz.dal.dto.UserMusicGroupQueryInfo;
+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.CourseScheduleEvaluate;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.biz.dal.entity.CoursesGroup;
+import com.ym.mec.biz.dal.entity.Group;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
+import com.ym.mec.biz.dal.entity.PracticeGroup;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
+import com.ym.mec.biz.dal.entity.VipGroup;
+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.SalarySettlementTypeEnum;
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import com.ym.mec.biz.dal.enums.TeachModeEnum;
+import com.ym.mec.biz.dal.enums.TeachTypeEnum;
+import com.ym.mec.biz.dal.enums.VipGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.page.ClassGroupQueryInfo;
+import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.StudentPayLogQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherMusicClassQueryInfo;
+import com.ym.mec.biz.dal.page.VipClassQueryInfo;
+import com.ym.mec.biz.dal.page.queryMusicGroupCourseScheduleQueryInfo;
+import com.ym.mec.biz.service.ClassGroupRelationService;
+import com.ym.mec.biz.service.ClassGroupService;
+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.SubjectService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.TeacherDefaultMusicGroupSalaryService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupMember;
@@ -24,20 +137,6 @@ import com.ym.mec.jiari.JiaRiFeignService;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateConvertor;
 import com.ym.mec.util.date.DateUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
-import java.math.BigDecimal;
-import java.time.*;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.enums.GroupType.*;
 
 @Service
 public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup> implements ClassGroupService {
@@ -124,6 +223,106 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
+	public PageInfo<ClassGroup> queryPage(ClassGroupQueryInfo queryInfo) {
+    	PageInfo<ClassGroup> pageInfo = new PageInfo<ClassGroup>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<ClassGroup> dataList = new ArrayList<ClassGroup>();
+		int count = this.findCount(params);
+		if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = this.getDAO().queryPage(params);
+            List<Integer> classGroupIds = dataList.stream().map(ClassGroup::getId).collect(Collectors.toList());
+
+            List<Map<Integer, Integer>> classGroupStudentNumMaps = classGroupStudentMapperDao.countClassGroupsStudentNum(classGroupIds, null);
+            Map<Integer, Long> classGroupStudentNumMap = MapUtil.convertIntegerMap(classGroupStudentNumMaps);
+
+            for (ClassGroup cg : dataList) {
+                Long studentNum = classGroupStudentNumMap.get(cg.getId());
+                cg.setStudentNum(Objects.isNull(studentNum) ? 0 : studentNum.intValue());
+                cg.setTeacherMapperList(classGroupTeacherMapperDao.findClassGroupTeachers(cg.getId() + ""));
+                cg.setCourseScheduleList(courseScheduleDao.findCoursesByClassGroupId(cg.getId(), null));
+            }
+        }
+
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public boolean create(ClassGroup classGroup) {
+
+		if(classGroup.getType() == null){
+			throw new BizException("班级类型不能为空");
+		}
+		if(classGroup.getGroupType() == null){
+			throw new BizException("课程组类型不能为空");
+		}
+        String userIds = classGroup.getUserIds();
+
+        Set<String> userIdStrSet = new HashSet<String>();
+
+        if(StringUtils.isNotBlank(userIds)){
+        	userIdStrSet = new HashSet<>(Arrays.asList(userIds.split(",")));
+        }
+
+        Date date = new Date();
+        classGroup.setCreateTime(date);
+        classGroup.setUpdateTime(date);
+        classGroup.setStudentNum(userIdStrSet.size());
+        //创建班级
+        insert(classGroup);
+
+        //设置班级上的老师
+        List<ClassGroupTeacherMapper> teacherMapperList = classGroup.getTeacherMapperList();
+        for(ClassGroupTeacherMapper tm : teacherMapperList){
+        	tm.setClassGroupId(classGroup.getId());
+        	tm.setMusicGroupId(classGroup.getMusicGroupId());
+        	tm.setGroupType(classGroup.getGroupType());
+        	tm.setCreateTime(date);
+        	tm.setUpdateTime(date);
+        }
+
+        if(teacherMapperList.size() > 0){
+        	classGroupTeacherMapperDao.classGroupTeachersInsert(teacherMapperList);
+        }
+
+        //2、插入班级学生关联关系
+		List<Integer> userIdList = new ArrayList<>();
+		List<ClassGroupStudentMapper> classGroupStudentList = new ArrayList<>();
+		for (String userId : userIdStrSet) {
+			ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+			classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
+			classGroupStudentMapper.setClassGroupId(classGroup.getId());
+			classGroupStudentMapper.setUserId(Integer.parseInt(userId));
+			classGroupStudentMapper.setCreateTime(date);
+			classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+			classGroupStudentMapper.setGroupType(GroupType.MUSIC);
+			classGroupStudentList.add(classGroupStudentMapper);
+
+			StudentRegistration studentRegistration = new StudentRegistration();
+			studentRegistration.setClassGroupId(classGroup.getId());
+			studentRegistration.setUserId(Integer.parseInt(userId));
+			studentRegistration.setMusicGroupId(classGroup.getMusicGroupId());
+			studentRegistrationDao.updateByUserIdAndMusicGroupId(studentRegistration);
+
+			userIdList.add(Integer.parseInt(userId));
+		}
+		if (classGroupStudentList.size() > 0) {
+			classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentList);
+		}
+
+		// 加入IM群组
+		if (userIdList.size() > 0) {
+			addImGroup(classGroup, userIdList);
+		}
+        return true;
+    }
+
+	@Override
     public List<ClassGroup> findClassGroup4Teacher(Integer teacherId) {
         return classGroupDao.findClassGroup4Teacher(teacherId);
     }
@@ -358,19 +557,17 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
 				String courseScheduleName = subjectList.stream().map(subject -> subject.getName()).collect(Collectors.joining("/"));
 
-				Map<String, Integer> holidayDays = new HashMap<>();
-				Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
+                Set<String> holidayDays = new HashSet<>();
+
 				if (highClassGroup.getHoliday()) {
-					holiday = jiaRiFeignService.query(now.getYear());
-					holidayDays = holiday.get(now.getYear());
+                    SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+                    if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+                        holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+                    }
 				}
 
 				WhileNode: while (highClassGroup.getCourseTimes() > times) {
-					if (highClassGroup.getHoliday() && !holiday.containsKey(now.getYear())) {
-						holiday = jiaRiFeignService.query(now.getYear());
-						holidayDays = holiday.get(now.getYear());
-					}
-					if (highClassGroup.getHoliday() && holidayDays.containsKey(now.format(DateTimeFormatter.ofPattern("MMdd")))) {
+					if (highClassGroup.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
 						now = now.plusDays(1);
 						continue;
 					}
@@ -398,6 +595,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 						courseSchedule.setType(CourseSchedule.CourseScheduleType.HIGH);
 						courseSchedule.setGroupType(GroupType.MUSIC);
 						courseSchedule.setName(courseScheduleName + "-" + CourseSchedule.CourseScheduleType.HIGH.getMsg());
+                        courseSchedule.setOrganId(musicGroup.getOrganId());
 						courseScheduleList.add(courseSchedule);
 						times++;
 					}
@@ -525,15 +723,36 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     public List<ClassGroupTeachersDto> getClassGroupAndTeacherSalary(String musicGroupId, SalarySettlementTypeEnum type, Integer classGroupId) throws Exception {
         //乐团班级及班级老师
-        List<ClassGroupTeachersDto> classGroupAndTeachers = getClassGroupAndTeachers(musicGroupId, "NORMAL,MIX,HIGH", classGroupId);
+        List<ClassGroupTeachersDto> classGroupAndTeachers = getClassGroupAndTeachers(musicGroupId, "NORMAL,MIX,HIGH,HIGH_ONLINE", classGroupId);
         BigDecimal zeroSalary = new BigDecimal(0);
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (type != null) {
             musicGroup.setSettlementType(type);
             musicGroupDao.update(musicGroup);
         }
+        if(classGroupAndTeachers == null || classGroupAndTeachers.size()==0){
+            return null;
+        }
+
+        List<Integer> classGroupIds = classGroupAndTeachers.stream().map(ClassGroupTeachersDto::getId).collect(Collectors.toList());
+
+        List<Map<Integer, Integer>> classGroupStudentNumMaps = classGroupStudentMapperDao.countClassGroupsStudentNum(classGroupIds, null);
+        Map<Integer, Long> classGroupStudentNumMap = MapUtil.convertIntegerMap(classGroupStudentNumMaps);
 
+        String waringStr = "";
         for (ClassGroupTeachersDto classGroupAndTeacher : classGroupAndTeachers) {
+            //所有教师列表
+            List<Integer> teacherUserIds = classGroupAndTeacher.getClassGroupTeacherMapperList().stream().map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toList());
+            List<Teacher> teachers = teacherDao.findByTeacherIds(teacherUserIds);
+            Map<Integer, Teacher> teacherMap = teachers.stream()
+                    .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
+
+            Long studentNum = classGroupStudentNumMap.get(classGroupAndTeacher.getId());
+            studentNum = Objects.isNull(studentNum) ? 0 : studentNum;
+            if(classGroupAndTeacher.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) && (studentNum < 3 || studentNum > 5)){
+                String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
+                waringStr += classGroupAndTeacher.getName()+numWaring;
+            }
             //班级的教师列表
             List<ClassGroupTeacherMapper> classGroupTeacherMapperList = classGroupAndTeacher.getClassGroupTeacherMapperList();
             for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
@@ -547,19 +766,24 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 List<TeacherDefaultMusicGroupSalary> teacherSalaryByUserIdAndType = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), courseType, type);
                 //老师课酬没有设置,设置成0
                 if (teacherSalaryByUserIdAndType == null || teacherSalaryByUserIdAndType.size() == 0) {
-                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = new TeacherDefaultMusicGroupSalary();
-                    teacherDefaultMusicGroupSalary.setAssistantTeacher30MinSalary(zeroSalary);
-                    teacherDefaultMusicGroupSalary.setMainTeacher30MinSalary(zeroSalary);
-                    teacherDefaultMusicGroupSalary.setMainTeacher90MinSalary(zeroSalary);
-                    teacherDefaultMusicGroupSalary.setAssistantTeacher90MinSalary(zeroSalary);
-                    teacherDefaultMusicGroupSalary.setUserId(classGroupTeacherMapper.getUserId());
-                    teacherDefaultMusicGroupSalary.setCourseScheduleType(CourseSchedule.getCourseScheduleTypeByCode(courseType));
-                    teacherSalaryByUserIdAndType.add(teacherDefaultMusicGroupSalary);
+                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
+                    throw new BizException("请设置"+teacher.getRealName()+"老师"+classGroupAndTeacher.getType().getMsg()+"课酬");
+                }
+
+                for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherSalaryByUserIdAndType) {
+                    if(teacherDefaultMusicGroupSalary.getCourseScheduleType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) && teacherDefaultMusicGroupSalary.getSalaryRuleJson() != null){
+                        BigDecimal salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+                        teacherDefaultMusicGroupSalary.setMainTeacher30MinSalary(salary);
+                        teacherDefaultMusicGroupSalary.setMainTeacher90MinSalary(salary);
+                    }
                 }
                 classGroupTeacherMapper.setTeacherDefaultMusicGroupSalaryList(teacherSalaryByUserIdAndType);
             }
 
         }
+        if(!waringStr.isEmpty()){
+            throw new BizException(waringStr+"请调整");
+        }
         return classGroupAndTeachers;
     }
 
@@ -574,7 +798,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //获取分页前的所有的乐团编号和vip编号
         params.put("offset", pageInfo.getOffset());
         List<String> musicGroupIds = null;
-        List<Group> groups=new ArrayList<>();
+        List<Group> groups;
         if (queryInfo.isHideOverGroup()) {
             groups = courseScheduleDao.queryMusicGroupIdsWithoutOverGroup(params);
             pageInfo.setTotal(courseScheduleDao.countMusicGroupIdsWithoutOverGroup(params));
@@ -1108,7 +1332,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public TeacherClassHeadInfo findTeacherClassGroupInfo(Long classGroupId) {
+    public TeacherClassHeadInfo findTeacherClassGroupInfo(Integer classGroupId) {
         if (Objects.isNull(classGroupId)) {
             throw new BizException("请指定班级");
         }
@@ -1258,6 +1482,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<StudentRegistration> studentList = studentRegistrationService.findStudentListByUserIdList(musicGroupId, studentIdList);
 
         List<Integer> subjectIdList = studentList.stream().map(student -> student.getActualSubjectId()).collect(Collectors.toList());
+        TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
+        if(classGroup4MixDto.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)){
+            subjectIdList.clear();
+            subjectIdList.add(classGroup4MixDto.getSubjectId());
+            teachMode = TeachModeEnum.ONLINE;
+        }
 
         List<Subject> subjectList = subjectService.findBySubjectByIdList(subjectIdList);
 
@@ -1274,6 +1504,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         classGroup.setName(classGroup4MixDto.getClassGroupName());
         classGroup.setExpectStudentNum(studentList.size());
         classGroup.setStudentNum(studentList.size());
+        classGroup.setExpectStudentNum(classGroup4MixDto.getExpectStudentNum());
         classGroup.setType(classGroup4MixDto.getType());
         classGroup.setDelFlag(0);
         classGroup.setGroupType(GroupType.MUSIC);
@@ -1345,21 +1576,19 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         BigDecimal expectPrice = new BigDecimal("0");
         int times = 0;
 
-        Map<String, Integer> holidayDays = new HashMap<>();
-        Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
+        Set<String> holidayDays = new HashSet<>();
+
         if (classGroup4MixDto.getHoliday()) {
-            holiday = jiaRiFeignService.query(now.getYear());
-            holidayDays = holiday.get(now.getYear());
+            SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+            if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+                holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+            }
         }
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
         WhileNode:
         while (true) {
-            if(classGroup4MixDto.getHoliday() && !holiday.containsKey(now.getYear())){
-                holiday = jiaRiFeignService.query(now.getYear());
-                holidayDays = holiday.get(now.getYear());
-            }
-            if (classGroup4MixDto.getHoliday() && holidayDays.containsKey(now.format(DateTimeFormatter.ofPattern("MMdd")))) {
+            if (classGroup4MixDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
                 now = now.plusDays(1);
                 continue;
             }
@@ -1390,13 +1619,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
                 courseSchedule.setCreateTime(date);
                 courseSchedule.setUpdateTime(date);
-                courseSchedule.setTeachMode(TeachModeEnum.OFFLINE);
+                courseSchedule.setTeachMode(teachMode);
                 courseSchedule.setType(classGroup4MixDto.getCourseType());
                 courseSchedule.setGroupType(GroupType.MUSIC);
+                courseSchedule.setOrganId(musicGroup.getOrganId());
                 if(classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MIX)){
                     courseSchedule.setName(classGroup4MixDto.getCourseType().getMsg());
                 }else{
-                    courseSchedule.setName(subjectNames + "-" + CourseSchedule.CourseScheduleType.SINGLE.getMsg());
+                    courseSchedule.setName(subjectNames + "-" + classGroup4MixDto.getCourseType().getMsg());
                 }
                 courseSchedule.setTeacherId(teacherId);
                 courseSchedule.setActualTeacherId(teacherId);
@@ -1412,19 +1642,24 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
 
                     TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(classGroup4MixDto.getCourseType());
-                    if(teacherDefaultMusicGroupSalary != null){
-						if (teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
-								|| teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
-								|| teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
-								|| teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == null) {
-							throw new BizException("请设置老师默认课酬");
-						}
+                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
+                    if(teacherDefaultMusicGroupSalary == null){
+                        throw new BizException("请设置"+teacher.getRealName()+"老师的"+classGroup4MixDto.getCourseType().getMsg()+"课酬");
+                    }
+                    if((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
+                            classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK))&&
+                            StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())){
+                        throw new BizException("请设置"+teacher.getRealName()+"老师的"+classGroup4MixDto.getCourseType().getMsg()+"课酬");
+                    }else if(teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == null) {
+                        throw new BizException("请设置"+teacher.getRealName()+"老师的"+classGroup4MixDto.getCourseType().getMsg()+"课酬");
                     }
 
                     //对应基准课酬
                     BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
 
-                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
                     SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
                     if(Objects.nonNull(teacher.getEntryDate())
                             &&(teacher.getEntryDate().after(entryDate)||teacher.getEntryDate().getTime()==entryDate.getTime())){
@@ -1444,22 +1679,33 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
 
+                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+
+
                     //课堂课课酬
-                    if (musicGroup.isClassroomLessons()) {
-                        //课程时长与结算单位时长占比
-                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                     }
                     //基础技能提高课
                     if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                        //课程时长与结算单位时长占比
-                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                         if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                            baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                            salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                         }
                     }
-                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+                    //线上小班课
+                    if(classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)){
+                        Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
+                        if (studentNum < 3 || studentNum > 5) {
+                            String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
+                            throw new BizException(classGroup.getName() + numWaring + "请调整");
+                        }
+                        salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+                    }
+
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+                        salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+                    }
 
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -1517,6 +1763,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (classGroup == null) {
             throw new BizException("班级不存在");
         }
+
+        TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
+        if(classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)){
+            teachMode = TeachModeEnum.ONLINE;
+        }
+
         List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupId);
         if(byClassGroup != null && byClassGroup.size() > 0){
             ClassGroupTeacherMapper groupTeacherMapper = byClassGroup.stream().filter(classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole() == TeachTypeEnum.BISHOP).findFirst().get();
@@ -1635,21 +1887,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<CourseSchedule> courseScheduleList = new ArrayList<>();
 
         int times = 0;
-        Map<String, Integer> holidayDays = new HashMap<>();
-        Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
+        Set<String> holidayDays = new HashSet<>();
         if (classGroup4MixDto.getHoliday()) {
-            holiday = jiaRiFeignService.query(now.getYear());
-            holidayDays = holiday.get(now.getYear());
+            SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+            if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+                holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+            }
         }
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
         WhileNode:
         while (true) {
-            if(classGroup4MixDto.getHoliday() && !holiday.containsKey(now.getYear())){
-                holiday = jiaRiFeignService.query(now.getYear());
-                holidayDays = holiday.get(now.getYear());
-            }
-            if (classGroup4MixDto.getHoliday() && holidayDays.containsKey(now.format(DateTimeFormatter.ofPattern("MMdd")))) {
+            if (classGroup4MixDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
                 now = now.plusDays(1);
                 continue;
             }
@@ -1679,7 +1928,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
                 courseSchedule.setCreateTime(date);
                 courseSchedule.setUpdateTime(date);
-                courseSchedule.setTeachMode(TeachModeEnum.OFFLINE);
+                courseSchedule.setTeachMode(teachMode);
                 courseSchedule.setMusicGroupId(classGroup.getMusicGroupId());
                 courseSchedule.setType(classGroup4MixDto.getCourseType());
                 if(classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MIX)){
@@ -1690,6 +1939,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 courseSchedule.setGroupType(GroupType.MUSIC);
                 courseSchedule.setTeacherId(teacherId);
                 courseSchedule.setActualTeacherId(teacherId);
+                courseSchedule.setOrganId(musicGroup.getOrganId());
                 courseScheduleDao.insert(courseSchedule);
                 courseScheduleList.add(courseSchedule);
                 times++;
@@ -1702,10 +1952,25 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                     TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(classGroup4MixDto.getCourseType());
 
+                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
+                    if(teacherDefaultMusicGroupSalary == null){
+                        throw new BizException("请设置"+teacher.getRealName()+"老师的"+classGroup4MixDto.getCourseType().getMsg()+"课酬");
+                    }
+
+                    if((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
+                            classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK))&&
+                        StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())){
+                        throw new BizException("请设置"+teacher.getRealName()+"老师的"+classGroup4MixDto.getCourseType().getMsg()+"课酬");
+                    }else if(teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == null) {
+                        throw new BizException("请设置"+teacher.getRealName()+"老师的"+classGroup4MixDto.getCourseType().getMsg()+"课酬");
+                    }
+
                     //对应基准课酬
                     BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
 
-                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
                     SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
                     if(Objects.nonNull(teacher.getEntryDate())
                             &&(teacher.getEntryDate().after(entryDate)||teacher.getEntryDate().getTime()==entryDate.getTime())){
@@ -1724,21 +1989,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
                         baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
-                    //课堂课课酬
-                    if (musicGroup.isClassroomLessons()) {
-                        //课程时长与结算单位时长占比
-                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                    }
-                    //基础技能提高课
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                        //课程时长与结算单位时长占比
-                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                        if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                            baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
-                        }
-                    }
+
                     salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     for (CourseScheduleTeacherSalary teacherSalary : allTeacherSalarys) {
@@ -1750,6 +2001,31 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         }
                     }
 
+                    //课堂课课酬
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    }
+                    //基础技能提高课
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                            salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                        }
+                    }
+                    //线上小班课
+                    if(classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)){
+                        Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
+                        if (studentNum < 3 || studentNum > 5) {
+                            String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
+                            throw new BizException(classGroup.getName() + numWaring + "请调整");
+                        }
+                        salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+                    }
+
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+                        salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+                    }
+
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
                     courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
@@ -1901,21 +2177,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         BigDecimal expectPrice = new BigDecimal("0");
         int times = 0;
-        Map<String, Integer> holidayDays = new HashMap<>();
-        Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
+        Set<String> holidayDays = new HashSet<>();
         if (classGroup4MixDto.getHoliday()) {
-            holiday = jiaRiFeignService.query(now.getYear());
-            holidayDays = holiday.get(now.getYear());
+            SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+            if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+                holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+            }
         }
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
         WhileNode:
         while (true) {
-            if(classGroup4MixDto.getHoliday() && !holiday.containsKey(now.getYear())){
-                holiday = jiaRiFeignService.query(now.getYear());
-                holidayDays = holiday.get(now.getYear());
-            }
-            if (classGroup4MixDto.getHoliday() && holidayDays.containsKey(now.format(DateTimeFormatter.ofPattern("MMdd")))) {
+            if (classGroup4MixDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
                 now = now.plusDays(1);
                 continue;
             }
@@ -1958,6 +2231,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 }
                 courseSchedule.setTeacherId(teacherId);
                 courseSchedule.setActualTeacherId(teacherId);
+                courseSchedule.setOrganId(musicGroup.getOrganId());
                 courseScheduleList.add(courseSchedule);
 
                 courseScheduleDao.insert(courseSchedule);
@@ -1972,10 +2246,24 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                     TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(classGroup4MixDto.getCourseType());
 
+                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
+                    if(teacherDefaultMusicGroupSalary == null){
+                        throw new BizException("请设置"+teacher.getRealName()+"老师的"+classGroup4MixDto.getCourseType().getMsg()+"课酬");
+                    }
+                    if((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
+                            classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK))&&
+                            StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())){
+                        throw new BizException("请设置"+teacher.getRealName()+"老师的"+classGroup4MixDto.getCourseType().getMsg()+"课酬");
+                    }else if(teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == null) {
+                        throw new BizException("请设置"+teacher.getRealName()+"老师的"+classGroup4MixDto.getCourseType().getMsg()+"课酬");
+                    }
+
                     //对应基准课酬
                     BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
 
-                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
                     SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
                     if(Objects.nonNull(teacher.getEntryDate())
                             &&(teacher.getEntryDate().after(entryDate)||teacher.getEntryDate().getTime()==entryDate.getTime())){
@@ -1994,23 +2282,33 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
                         baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
+
+                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+
                     //课堂课课酬
-                    if (musicGroup.isClassroomLessons()) {
-                        //课程时长与结算单位时长占比
-                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                     }
                     //基础技能提高课
                     if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                        //课程时长与结算单位时长占比
-                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                         if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                            baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                            salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                         }
                     }
+                    //线上小班课
+                    if(classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)){
+                        Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
+                        if (studentNum < 3 || studentNum > 5) {
+                            String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
+                            throw new BizException(classGroup.getName() + numWaring + "请调整");
+                        }
+                        salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+                    }
 
-                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+                        salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+                    }
 
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -2264,18 +2562,20 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<String> subjects = subjectService.findBySubIds(highClassGroup.getSubjectIdList());
             highClassGroup.setSubjectName(subjects.stream().collect(Collectors.joining(",")));
 
-            ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(highClassGroup.getId().longValue(), TeachTypeEnum.BISHOP);
+            ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(highClassGroup.getId(), TeachTypeEnum.BISHOP);
             highClassGroup.setTeacherName(bishopTeacher.getUserName());
             highClassGroup.setUserId(bishopTeacher.getUserId());
             CourseSchedule courseSchedule = courseScheduleDao.findOneCourseScheduleByClassGroupId(highClassGroup.getId());
-            highClassGroup.setStartClassTime(DateUtil.format(courseSchedule.getStartClassTime(), "HH:mm"));
-            highClassGroup.setEndClassTime(DateUtil.format(courseSchedule.getEndClassTime(), "HH:mm"));
-
-            Calendar calendar = Calendar.getInstance();
-            calendar.setTime(courseSchedule.getClassDate());
-            Integer dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
-            dayOfWeek = dayOfWeek.equals(0) ? 7 : dayOfWeek;
-            highClassGroup.setDayOfWeek(dayOfWeek);
+			if (courseSchedule != null) {
+				highClassGroup.setStartClassTime(DateUtil.format(courseSchedule.getStartClassTime(), "HH:mm"));
+				highClassGroup.setEndClassTime(DateUtil.format(courseSchedule.getEndClassTime(), "HH:mm"));
+
+				Calendar calendar = Calendar.getInstance();
+				calendar.setTime(courseSchedule.getClassDate());
+				Integer dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+				dayOfWeek = dayOfWeek.equals(0) ? 7 : dayOfWeek;
+				highClassGroup.setDayOfWeek(dayOfWeek);
+			}
         }
         return highClassGroupList;
     }

+ 101 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -1,6 +1,9 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
 import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
@@ -21,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, ClassGroupStudentMapper> implements ClassGroupStudentMapperService {
@@ -40,6 +44,14 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private ClassGroupRelationService classGroupRelationService;
     @Autowired
     private ImFeignService imFeignService;
+    @Autowired
+    private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+    @Autowired
+    private ClassGroupTeacherMapperService classGroupTeacherMapperService;
+    @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+    @Autowired
+    private TeacherDefaultMusicGroupSalaryService teacherDefaultMusicGroupSalaryService;
 
     private static String holidayUrl = "http://tool.bitefu.net/jiari/?d=";
 
@@ -49,14 +61,20 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     }
 
     @Override
-    public ClassGroupStudentMapper findClassStudentMapperByUserIdAndClassGroupId(Integer userId, Integer classGroupId,String status) {
+    public ClassGroupStudentMapper findClassStudentMapperByUserIdAndClassGroupId(Integer userId, Integer classGroupId, String status) {
         return classGroupStudentMapperDao.findClassStudentMapperByUserIdAndClassGroupId(userId, classGroupId, status);
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean delClassGroupStudent(Integer userId, Integer classGroupId) throws Exception {
-        ClassGroupStudentMapper classStudentMapper = findClassStudentMapperByUserIdAndClassGroupId(userId, classGroupId,"NORMAL");
+    public boolean delClassGroupStudent(Integer userId, Integer classGroupId) {
+        ClassGroup classGroup = classGroupService.get(classGroupId);
+        Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupId);
+        if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) && studentNum <= 3) {
+            throw new BizException(classGroup.getName()+"(线上基础技能课班级)人数不能少于3,请调整");
+        }
+
+        ClassGroupStudentMapper classStudentMapper = findClassStudentMapperByUserIdAndClassGroupId(userId, classGroupId, "NORMAL");
         if (classStudentMapper == null) {
             throw new BizException("班级学生不存在");
         }
@@ -78,9 +96,41 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
             courseScheduleStudentPaymentService.deleteStudentCourseSchedule(userId, courseScheduleList);
         }
 
-        //4、学生退出班级群组
-        ClassGroup classGroup = classGroupService.get(classGroupId);
+        //4、调整未上课课酬
+        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroupId);
+        if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) && courseScheduleList.size() > 0) {
+            studentNum -= 1;
+            Date nowDate = new Date();
+            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+            List<Long> courseScheduleIds = courseScheduleList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
+            for (CourseSchedule courseSchedule : courseScheduleList) {
+                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
+                    List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacher.getUserId(), ClassGroupTypeEnum.HIGH_ONLINE.getCode(), null);
+                    if (teacherSalaryList == null || teacherSalaryList.size() == 0) {
+                        throw new BizException("请设置老师线上网管课课酬");
+                    }
+                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
+                    BigDecimal salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+
+                    CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                    courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+                    courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+                    courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+                    courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
+                    courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
+                    courseScheduleTeacherSalary.setExpectSalary(salary);
+                    courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+                    courseScheduleTeacherSalary.setCreateTime(nowDate);
+                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
+                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+                }
+            }
+            courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+        }
 
+        //5、学生退出班级群组
         ImGroupMember[] imGroupMembers = {new ImGroupMember(userId.toString())};
         // 退出群组
         imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
@@ -95,7 +145,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean adjustClassGroup(Integer userId, Integer oldClassGroupId, Integer classGroupId) throws Exception {
-        ClassGroupStudentMapper classStudentMapper = findClassStudentMapperByUserIdAndClassGroupId(userId, oldClassGroupId,"NORMAL");
+        ClassGroupStudentMapper classStudentMapper = findClassStudentMapperByUserIdAndClassGroupId(userId, oldClassGroupId, "NORMAL");
         if (classStudentMapper == null) {
             throw new BizException("原班级学生不存在");
         }
@@ -146,6 +196,12 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         Date nowDate = new Date();
         HashSet<String> userIdStrSet = new HashSet<>(Arrays.asList(userIdsStr.split(",")));
 
+        Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupId);
+        if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) &&
+                ((studentNum + userIdStrSet.size()) < 3 || (studentNum + userIdStrSet.size()) > 5)) {
+            throw new BizException("线上基础技能课班级人数不能小于3大于5");
+        }
+
         //1、班级关系添加
         List<ClassGroupStudentMapper> classGroupStudentMappers = new ArrayList<>();
         List<ImGroupMember> imGroupMemberList = new ArrayList<>();
@@ -160,7 +216,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 iterator.remove();
                 continue;
             }
-            
+
             ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
             classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
             classGroupStudentMapper.setClassGroupId(classGroupId);
@@ -181,10 +237,6 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
             classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMappers);
         }
 
-        //添加进IM群组
-        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
-        imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
-
         //2、班级人数调整
         classGroupService.updateClassStudentNum(classGroupId.longValue(), userIdStrSet.size());
 
@@ -210,11 +262,48 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         if (courseScheduleStudentPayments.size() > 0) {
             courseScheduleStudentPaymentService.batchInsert(courseScheduleStudentPayments);
         }
+        //4、调整未上课课酬
+        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroupId);
+        if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) && courseScheduleList.size() > 0) {
+            studentNum += userIdStrSet.size();
+            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+            List<Long> courseScheduleIds = courseScheduleList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
+            for (CourseSchedule courseSchedule : courseScheduleList) {
+                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
+                    List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacher.getUserId(), ClassGroupTypeEnum.HIGH_ONLINE.getCode(), null);
+                    if (teacherSalaryList == null || teacherSalaryList.size() == 0) {
+                        throw new BizException("请设置老师线上网管课课酬");
+                    }
+                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
+                    BigDecimal salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+
+                    CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                    courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+                    courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+                    courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+                    courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
+                    courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
+                    courseScheduleTeacherSalary.setExpectSalary(salary);
+                    courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+                    courseScheduleTeacherSalary.setCreateTime(nowDate);
+                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
+                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+                }
+            }
+            courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+        }
+
         //乐团在合奏班
         if (classGroupRelation != null) {
             addStudents(classGroupRelation.getClassGroupId(), userIdsStr, GroupType.MUSIC);
         }
 
+        //5、添加进IM群组
+        ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
+        imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+
         return true;
     }
 
@@ -235,6 +324,6 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
     @Override
     public List<ClassGroupStudentInfoDto> findStudentByGroupOrClassGroup(String groupId, Integer classGroupId, GroupType groupType) {
-        return classGroupStudentMapperDao.findByGroupOrClassGroup(groupId,groupType,classGroupId);
+        return classGroupStudentMapperDao.findByGroupOrClassGroup(groupId, groupType, classGroupId);
     }
 }

+ 111 - 53
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -1,12 +1,10 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
-import com.ym.mec.biz.dal.enums.TeachTypeEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
@@ -54,6 +52,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private TeacherDao teacherDao;
+    @Autowired
+    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
     @Override
     public BaseDAO<Long, ClassGroupTeacherMapper> getDAO() {
@@ -157,7 +157,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
     public boolean classGroupTeacherMapperUpdate(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) throws Exception {
         Date date = new Date();
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(),"yyyy-MM-dd");
+        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
         List<Integer> classGroupIds = classGroupTeacherMapperList.stream().map(classGroupTeacherMapper -> classGroupTeacherMapper.getClassGroupId()).collect(Collectors.toList());
 
         List<CourseSchedule> classGroupNoStartCourseSchedules = courseScheduleService.findClassGroupNoStartCourseSchedules(classGroupIds, GroupType.MUSIC);
@@ -204,7 +204,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     teacherDefaultMusicGroupSalary = teacherDefaultSalary.get(classGroupNoStartCourseSchedule.getType().getCode() + classGroupTeacherMapper.getUserId());
                 }
                 if (teacherDefaultMusicGroupSalary == null) {
-                    throw new BizException("请先设置老师课酬");
+                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
+                    throw new BizException("请设置"+teacher.getRealName()+"老师"+classGroupNoStartCourseSchedule.getType().getMsg()+"默认课酬");
                 }
 
                 //对应基准课酬
@@ -212,8 +213,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
                 Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
                 SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
-                if(Objects.nonNull(teacher.getEntryDate())
-                        &&(teacher.getEntryDate().after(entryDate)||teacher.getEntryDate().getTime()==entryDate.getTime())){
+                if (Objects.nonNull(teacher.getEntryDate())
+                        && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
                     settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY;
                 }
 
@@ -230,23 +231,37 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
                     baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                 }
+
+                salary = baseSalary.multiply(classTimeDuty).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+
                 //课堂课课酬
-                if (musicGroup.isClassroomLessons()) {
-                    //课程时长与结算单位时长占比
-                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                if (musicGroup.isClassroomLessons() || classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                 }
                 //基础技能提高课
                 if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                    //课程时长与结算单位时长占比
-                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                     if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                    }
+                }
+                if(StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())){
+                	throw new BizException("请设置老师默认课酬");
+                }
+                //线上小班课
+                if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
+                    Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
+                    if (studentNum < 3 || studentNum > 5) {
+                        ClassGroup classGroup = classGroupService.get(classGroupTeacherMapper.getClassGroupId());
+                        String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
+                        throw new BizException(classGroup.getName() + numWaring + "请调整");
                     }
+                    salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
                 }
 
-                salary = baseSalary.multiply(classTimeDuty).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+                if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+                    salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+                }
 
                 //课程与老师薪水表
                 CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -270,10 +285,10 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     public void createMusicGroupTeacherMapper(List<CourseSchedule> courseSchedules, String musicGroupId) {
         Date date = new Date();
         MusicGroup musicGroup = musicGroupService.get(musicGroupId);
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(),"yyyy-MM-dd");
+        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
         List<Integer> teacherUserIds = courseSchedules.stream()
-                                        .map(CourseSchedule::getActualTeacherId)
-                                        .collect(Collectors.toList());
+                .map(CourseSchedule::getActualTeacherId)
+                .collect(Collectors.toList());
         //所有教师列表
         List<Teacher> teachers = teacherDao.findByTeacherIds(teacherUserIds);
         Map<Integer, Teacher> teacherMap = teachers.stream()
@@ -308,8 +323,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
                 Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
                 SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
-                if(Objects.nonNull(teacher.getEntryDate())
-                        &&(teacher.getEntryDate().after(entryDate)||teacher.getEntryDate().getTime()==entryDate.getTime())){
+                if (Objects.nonNull(teacher.getEntryDate())
+                        && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
                     settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY;
                 }
 
@@ -326,31 +341,41 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
                     baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                 }
+                salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+
+                for (CourseScheduleTeacherSalary teacherSalary : allTeacherSalarys) {
+                    if (teacherSalary.getUserId().equals(classGroupTeacherMapper.getUserId())
+                            && teacherSalary.getTeacherRole().equals(classGroupTeacherMapper.getTeacherRole())) {
+                        int oldDuration = DateUtil.minutesBetween(teacherSalary.getCourseSchedule().getStartClassTime(), teacherSalary.getCourseSchedule().getEndClassTime());
+                        salary = teacherSalary.getExpectSalary().divide(new BigDecimal(oldDuration), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(duration)).setScale(2, BigDecimal.ROUND_HALF_UP);
+                        break;
+                    }
+                }
+
                 //课堂课课酬
                 if (musicGroup.isClassroomLessons()) {
-                    //课程时长与结算单位时长占比
-                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                 }
                 //基础技能提高课
                 if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                    //课程时长与结算单位时长占比
-                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
                 }
-
-                salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
-
-                for (CourseScheduleTeacherSalary teacherSalary : allTeacherSalarys) {
-                    if(teacherSalary.getUserId().equals(classGroupTeacherMapper.getUserId())
-                            &&teacherSalary.getTeacherRole().equals(classGroupTeacherMapper.getTeacherRole())){
-                        int oldDuration=DateUtil.minutesBetween(teacherSalary.getCourseSchedule().getStartClassTime(),teacherSalary.getCourseSchedule().getEndClassTime());
-                        salary=teacherSalary.getExpectSalary().divide(new BigDecimal(oldDuration), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(duration)).setScale(2, BigDecimal.ROUND_HALF_UP);
-                        break;
+                //线上小班课
+                if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
+                    Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
+                    if (studentNum < 3 || studentNum > 5) {
+                        ClassGroup classGroup = classGroupService.get(classGroupTeacherMapper.getClassGroupId());
+                        String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
+                        throw new BizException(classGroup.getName() + numWaring + "请调整");
                     }
+                    salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+                }
+
+                if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+                    salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
                 }
 
                 //课程与老师薪水表
@@ -384,7 +409,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Transactional(rollbackFor = Exception.class)
     public void createCourseScheduleTeacherSalary(List<CourseSchedule> courseSchedules, Map<Long, CourseSchedule> oldCourseSchedules) {
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(),"yyyy-MM-dd");
+        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
 
         //课程编号列表
         List<Long> courseScheduleIds = courseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
@@ -393,7 +418,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         //助教老师列表
         List<Integer> teachingTeacherIds = new ArrayList<>();
         courseSchedules.forEach(courseSchedule -> {
-            if(Objects.nonNull(courseSchedule.getTeachingTeacherIdList())){
+            if (Objects.nonNull(courseSchedule.getTeachingTeacherIdList())) {
                 teachingTeacherIds.addAll(courseSchedule.getTeachingTeacherIdList());
             }
         });
@@ -418,7 +443,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
         Map<String, String> musicGroupSettlementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
 
-        courseSchedules.forEach(courseSchedule -> {
+        for (CourseSchedule courseSchedule : courseSchedules) {
             if (Objects.isNull(courseSchedule.getType())) {
                 courseSchedule.setType(oldCourseSchedules.get(courseSchedule.getId()).getType());
             }
@@ -440,8 +465,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
             if (!courseSchedule.isBishopTeacherSalaryNotCreate()) {
                 Teacher teacher = teacherMap.get(courseSchedule.getActualTeacherId());
-                if(Objects.nonNull(teacher.getEntryDate())
-                        &&(teacher.getEntryDate().after(entryDate)||teacher.getEntryDate().getTime()==entryDate.getTime())){
+                if (Objects.nonNull(teacher.getEntryDate())
+                        && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
                     settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY.getCode();
                 }
 
@@ -463,12 +488,12 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 return;
             }
             for (Integer teacherId : teachingTeacherIdList) {
-                if(Objects.isNull(teacherId)){
+                if (Objects.isNull(teacherId)) {
                     return;
                 }
                 Teacher teacher = teacherMap.get(teacherId);
-                if(Objects.nonNull(teacher.getEntryDate())
-                        &&(teacher.getEntryDate().after(entryDate)||teacher.getEntryDate().getTime()==entryDate.getTime())){
+                if (Objects.nonNull(teacher.getEntryDate())
+                        && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
                     settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY.getCode();
                 }
                 TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(teacherId);
@@ -480,8 +505,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                         teacherId,
                         teacherDefaultMusicGroupSalaryWithTeacherId));
             }
-        });
-        if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaryList)){
+        }
+        if (!CollectionUtils.isEmpty(courseScheduleTeacherSalaryList)) {
             courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
         }
     }
@@ -513,6 +538,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         //课时长度
         int duration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
 
+        BigDecimal teacherDefaultSalary = BigDecimal.ZERO;
+
         //如果结算方式是教师默认课酬
         if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
             BigDecimal baseTime = new BigDecimal(30);
@@ -524,10 +551,10 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
             }
             //课程时长与结算单位时长占比
             BigDecimal classTimeDuty = new BigDecimal(duration).divide(baseTime, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-            BigDecimal teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+            teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
             teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
         } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
-            BigDecimal teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
+            teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
             BigDecimal baseTime = new BigDecimal(90);
             if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                 baseTime = new BigDecimal(45);
@@ -540,6 +567,33 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
             BigDecimal classTimeDuty = new BigDecimal(duration).divide(baseTime, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
             teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
         }
+
+        //课堂课课酬
+        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+            teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+        }
+        //基础技能提高课
+        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+            teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+            if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
+            }
+        }
+        //线上小班课
+        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
+            Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(courseSchedule.getClassGroupId());
+            if (studentNum < 3 || studentNum > 5) {
+                ClassGroup classGroup = classGroupService.get(courseSchedule.getClassGroupId());
+                String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
+                throw new BizException(classGroup.getName() + numWaring + "请调整");
+            }
+            teacherSalary = JSON.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+        }
+
+        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+            teacherSalary = JSON.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson()).getBigDecimal("1");
+        }
+
         CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary(
                 courseSchedule.getId(),
                 teachType,
@@ -556,8 +610,12 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         return classGroupTeacherMapperDao.findClassGroupTeachers(classGroupId.toString());
     }
 
+    public ClassGroupTeacherMapper getClassGroupTeachersRole(Integer classGroupId,String teacherRole) {
+        return classGroupTeacherMapperDao.getClassGroupTeachersRole(classGroupId,teacherRole);
+    }
+
     @Override
-    public void updateTeacher(String groupId, Integer teacherId,String groupType) {
-        classGroupTeacherMapperDao.updateTeacher(groupId,teacherId,groupType);
+    public void updateTeacher(String groupId, Integer teacherId, String groupType) {
+        classGroupTeacherMapperDao.updateTeacher(groupId, teacherId, groupType);
     }
 }

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

@@ -296,7 +296,7 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
     public TeacherClassHeadInfo getCourseInfoHead(Integer id) {
         CourseSchedule courseSchedule = courseScheduleDao.get(id.longValue());
         ClassGroup classGroup = classGroupService.get(courseSchedule.getClassGroupId());
-        TeacherClassHeadInfo teacherClassGroupInfo = classGroupService.findTeacherClassGroupInfo(courseSchedule.getClassGroupId().longValue());
+        TeacherClassHeadInfo teacherClassGroupInfo = classGroupService.findTeacherClassGroupInfo(courseSchedule.getClassGroupId());
         teacherClassGroupInfo.setClassDate(DateUtil.dateToString(courseSchedule.getClassDate(), "yyyy年MM月dd日"));
         teacherClassGroupInfo.setStartClassTime(DateUtil.dateToString(courseSchedule.getStartClassTime(), "HH:mm"));
         teacherClassGroupInfo.setEndClassTime(DateUtil.dateToString(courseSchedule.getEndClassTime(), "HH:mm"));

+ 137 - 100
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -29,7 +29,6 @@ import com.ym.mec.util.collection.ListUtil;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.json.JsonUtil;
-import feign.codec.DecodeException;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -49,6 +48,7 @@ import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+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.PracticeGroupType.*;
 import static com.ym.mec.biz.dal.enums.SignInStatusEnum.*;
@@ -333,9 +333,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 		Date entryDate = null;
 		String settlementType = null;
+		Integer organId = null;
 
 		// 查询老师默认课酬
 		if (type == CourseScheduleType.PRACTICE) {
+			PracticeGroup practiceGroup = practiceGroupDao.get(Long.valueOf(classGroup.getMusicGroupId()));
+			if(Objects.isNull(practiceGroup)){
+				throw new BizException("找不到网管课信息");
+			}
+			organId=practiceGroup.getOrganId();
 
 			List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao
 					.queryByUserIdList(teacherIdList);
@@ -348,6 +354,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			if (musicGroup == null) {
 				throw new BizException("找不到乐团信息");
 			}
+			organId=musicGroup.getOrganId();
 			// 乐团结算方式
 			settlementType = musicGroup.getSettlementType().getCode();
 
@@ -389,22 +396,18 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<CourseScheduleTeacherSalary>();
 		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
 		List<TeacherAttendance> teacherAttendances = new ArrayList<TeacherAttendance>();
-		Map<String, Integer> holidayDays = new HashMap<>();
+		Set<String> holidayDays = new HashSet<>();
 		if (isJumpHoliday) {
-			try {
-		        Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
-				holiday = jiaRiFeignService.query(calendar.get(Calendar.YEAR));
-				holidayDays = holiday.get(calendar.get(Calendar.YEAR));
-
-			} catch (Exception e) {
-				throw new BizException("获取节假日失败",e);
+			SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+			if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+				holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
 			}
 		}
 		calendar.setTime(startDate);
 
 		int currentCourseTimes = 0;
 		while (coursesTimes != currentCourseTimes) {
-            if (holidayDays.containsKey(DateUtil.format(calendar.getTime(), "MMdd"))) {
+            if (holidayDays.contains(DateUtil.format(calendar.getTime(), "yyyy-MM-dd"))) {
                 calendar.add(Calendar.DATE, 1);
                 continue;
             }
@@ -462,6 +465,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					courseSchedule.setName(classGroup.getName());
 					courseSchedule.setSchoolId(schoolId);
 					courseSchedule.setSubsidy(subSidy);
+					courseSchedule.setOrganId(organId);
 					if (type == CourseScheduleType.PRACTICE || type == CourseScheduleType.VIP) {
 						courseSchedule.setName(subjectName + "•" + usernameList);
 					} else {
@@ -526,11 +530,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 								}
 							}
 							if (StringUtils.equals(settlementType, "TEACHER_DEFAULT")) {
-								if (type == CourseScheduleType.CLASSROOM) {
-									unitMinutes = 40;
-								} else if (type == CourseScheduleType.HIGH) {
-									unitMinutes = 45;
-								}
 								if (courseScheduleTeacherSalary.getTeacherRole() == TeachTypeEnum.BISHOP) {
 									courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(tdms.getMainTeacher30MinSalary().doubleValue() * newMinutes
 											/ unitMinutes));
@@ -553,6 +552,30 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 											/ unitMinutes));
 								}
 							}
+
+							//课堂课课酬
+							if (type == CourseScheduleType.CLASSROOM) {
+								BigDecimal salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? tdms.getMainTeacher30MinSalary() : tdms.getAssistantTeacher30MinSalary();
+								courseScheduleTeacherSalary.setExpectSalary(salary);
+							}
+							//基础技能提高课
+							if (type == CourseScheduleType.HIGH) {
+								BigDecimal salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? tdms.getMainTeacher30MinSalary() : tdms.getAssistantTeacher30MinSalary();
+								if (StringUtils.equals(settlementType, "GRADIENT_SALARY")) {
+									salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? tdms.getMainTeacher90MinSalary() : tdms.getAssistantTeacher90MinSalary();
+								}
+								courseScheduleTeacherSalary.setExpectSalary(salary);
+							}
+							//线上小班课
+							if(type == CourseScheduleType.HIGH_ONLINE){
+								Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroup.getId());
+								BigDecimal salary = JSON.parseObject(tdms.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+								courseScheduleTeacherSalary.setExpectSalary(salary);
+							}
+
+							if (type.equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+								courseScheduleTeacherSalary.setExpectSalary(JSON.parseObject(tdms.getSalaryRuleJson()).getBigDecimal("1"));
+							}
 						}
 						courseScheduleTeacherSalary.setCreateTime(now);
 						courseScheduleTeacherSalary.setUpdateTime(now);
@@ -1852,7 +1875,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     private Map<Integer, String> convertToMap(String[] result) {
         Map<Integer, String> map = new HashMap<>();
         for (String s : result) {
-            map.put(Integer.valueOf(s.split("-")[0]), s.split("-")[1].replace(",", "/"));
+        	if(s.split("-").length>1){
+				map.put(Integer.valueOf(s.split("-")[0]), s.split("-")[1].replace(",", "/"));
+			}
         }
         return map;
     }
@@ -1948,25 +1973,17 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         calendar.setTime(courseCreateStartTime);
         List<Date> courseStartDates = new ArrayList<>();
 
-        Map<String, Integer> holidayDays = new HashMap<>();
-        Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
+		Set<String> holidayDays = new HashSet<>();
 
-        try {
-            if (vipGroupCourseAdjustInfo.isHoliday()) {
-                holiday = jiaRiFeignService.query(calendar.get(Calendar.YEAR));
-                holidayDays = holiday.get(calendar.get(Calendar.YEAR));
-            }
-        } catch (DecodeException e) {
-            LOGGER.error("节假日解析错误");
-            vipGroupCourseAdjustInfo.setHoliday(false);
-        }
+		if (vipGroupCourseAdjustInfo.isHoliday()) {
+			SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+			if(StringUtils.isNotBlank(holidaySetting.getParanValue())){
+				holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+			}
+		}
 
         while (true) {
-            if (vipGroupCourseAdjustInfo.isHoliday() && !holiday.containsKey(calendar.get(Calendar.YEAR))) {
-                holiday = jiaRiFeignService.query(calendar.get(Calendar.YEAR));
-                holidayDays = holiday.get(calendar.get(Calendar.YEAR));
-            }
-            if (vipGroupCourseAdjustInfo.isHoliday() && holidayDays.containsKey(DateUtil.format(calendar.getTime(), "MMdd"))) {
+            if (vipGroupCourseAdjustInfo.isHoliday() && holidayDays.contains(DateUtil.format(calendar.getTime(), "yyyy-MM-dd"))) {
                 calendar.add(Calendar.DATE, 1);
                 continue;
             }
@@ -2110,8 +2127,14 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(coursePostPoneInfo.getRecoveryDate());
 
-        Map<String, Integer> holidayDays = new HashMap<>();
-        Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
+		Set<String> holidayDays = new HashSet<>();
+
+		if (coursePostPoneInfo.isSkipHoliday()) {
+			SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+			if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+				holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+			}
+		}
 
         classGroupCourseSchedulesWithDate.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
 
@@ -2128,17 +2151,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
             calendar.setTime(courseSchedule.getClassDate());
             calendar.add(Calendar.DATE, betweenDays);
-            try {
-                if (coursePostPoneInfo.isSkipHoliday() && !holiday.containsKey(calendar.get(Calendar.YEAR))) {
-                    holiday = jiaRiFeignService.query(calendar.get(Calendar.YEAR));
-                    holidayDays = holiday.get(calendar.get(Calendar.YEAR));
-                }
-            } catch (Exception e) {
-                LOGGER.error("节假日解析错误");
-                coursePostPoneInfo.setSkipHoliday(false);
-            }
 
-            if (coursePostPoneInfo.isSkipHoliday() && holidayDays.containsKey(DateUtil.format(calendar.getTime(), "MMdd"))) {
+            if (coursePostPoneInfo.isSkipHoliday() && holidayDays.contains(DateUtil.format(calendar.getTime(), "yyyy-MM-dd"))) {
                 betweenDays=betweenDays+7;
                 calendar.add(Calendar.DATE, betweenDays);
                 i=i-1;
@@ -2196,27 +2210,19 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(courseCreateStartTime);
 
-        Map<String, Integer> holidayDays = new HashMap<>();
-        Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
+		Set<String> holidayDays = new HashSet<>();
 
-        try {
-            if (vipGroupCourseAdjustInfo.isHoliday()) {
-                holiday = jiaRiFeignService.query(calendar.get(Calendar.YEAR));
-                holidayDays = holiday.get(calendar.get(Calendar.YEAR));
-            }
-        } catch (DecodeException e) {
-            LOGGER.error("节假日解析错误");
-            vipGroupCourseAdjustInfo.setHoliday(false);
-        }
+		if (vipGroupCourseAdjustInfo.isHoliday()) {
+			SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+			if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+				holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+			}
+		}
 
         List<CourseSchedule> courseSchedules = new ArrayList<>();
 
         while (true) {
-            if (vipGroupCourseAdjustInfo.isHoliday() && !holiday.containsKey(calendar.get(Calendar.YEAR))) {
-                holiday = jiaRiFeignService.query(calendar.get(Calendar.YEAR));
-                holidayDays = holiday.get(calendar.get(Calendar.YEAR));
-            }
-            if (vipGroupCourseAdjustInfo.isHoliday() && holidayDays.containsKey(DateUtil.format(calendar.getTime(), "MMdd"))) {
+            if (vipGroupCourseAdjustInfo.isHoliday() && holidayDays.contains(DateUtil.format(calendar.getTime(), "yyyy-MM-dd"))) {
                 calendar.add(Calendar.DATE, 1);
                 continue;
             }
@@ -2635,6 +2641,33 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 							}
 						}
 
+						//课堂课课酬
+						if (newCourseSchedule.getType() == CourseScheduleType.CLASSROOM) {
+							BigDecimal salary = ts.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? tdms.getMainTeacher30MinSalary() : tdms.getAssistantTeacher30MinSalary();
+							ts.setExpectSalary(salary);
+						}
+						//基础技能提高课
+						if (newCourseSchedule.getType() == CourseScheduleType.HIGH) {
+							BigDecimal salary = ts.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? tdms.getMainTeacher30MinSalary() : tdms.getAssistantTeacher30MinSalary();
+							if (StringUtils.equals(settlementType, "GRADIENT_SALARY")) {
+								salary = ts.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? tdms.getMainTeacher90MinSalary() : tdms.getAssistantTeacher90MinSalary();
+							}
+							ts.setExpectSalary(salary);
+						}
+	                    if(StringUtils.isBlank(tdms.getSalaryRuleJson())){
+	                    	throw new BizException("请设置老师默认课酬");
+	                    }
+						//线上小班课
+						if(newCourseSchedule.getType() == CourseScheduleType.HIGH_ONLINE){
+							Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(ts.getClassGroupId());
+							BigDecimal salary = JSON.parseObject(tdms.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+							ts.setExpectSalary(salary);
+						}
+
+						if (newCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+							ts.setExpectSalary(JSON.parseObject(tdms.getSalaryRuleJson()).getBigDecimal("1"));
+						}
+
 					} else if (newCourseSchedule.getGroupType() == GroupType.VIP) {
 						/*Map<Integer, TeacherDefaultVipGroupSalary> map = vipGroupSalaryMap.get(teacherId);
 						if (map == null) {
@@ -3413,7 +3446,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
     @Override
     public List<CourseSchedule> findNoStartCoursesByClassGroupId(Integer classGroupId) {
-        return courseScheduleDao.findNoStartCoursesByClassGroupId(classGroupId);
+        return courseScheduleDao.findCoursesByClassGroupId(classGroupId, CourseStatusEnum.NOT_START);
     }
 
 
@@ -3561,31 +3594,23 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(courseGenerateInfo.getCourseCreateStartTime());
 
-        Map<String, Integer> holidayDays = new HashMap<>();
-        Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
+        Set<String> holidayDays = new HashSet<>();
 
-        try {
-            if (courseGenerateInfo.isSkipHoliday()) {
-                holiday = jiaRiFeignService.query(calendar.get(Calendar.YEAR));
-                holidayDays = holiday.get(calendar.get(Calendar.YEAR));
-            }
-        } catch (DecodeException e) {
-            LOGGER.error("节假日解析错误");
-            courseGenerateInfo.setSkipHoliday(false);
-        }
+		if (courseGenerateInfo.isSkipHoliday()) {
+			SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+			if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+				holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+			}
+		}
 
         List<CourseSchedule> courseSchedules = new ArrayList<>();
         Date now=new Date();
 
         while (true) {
-            if (courseGenerateInfo.isSkipHoliday() && !holiday.containsKey(calendar.get(Calendar.YEAR))) {
-                holiday = jiaRiFeignService.query(calendar.get(Calendar.YEAR));
-                holidayDays = holiday.get(calendar.get(Calendar.YEAR));
-            }
-            if (courseGenerateInfo.isSkipHoliday() && holidayDays.containsKey(DateUtil.format(calendar.getTime(), "MMdd"))) {
-                calendar.add(Calendar.DATE, 1);
-                continue;
-            }
+			if (courseGenerateInfo.isSkipHoliday() && holidayDays.contains(DateUtil.format(calendar.getTime(), "yyyy-MM-dd"))) {
+				calendar.add(Calendar.DATE, 1);
+				continue;
+			}
             int i = calendar.get(Calendar.DAY_OF_WEEK);
             if (i == 1) {
                 i = 7;
@@ -3634,12 +3659,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         Map<String, Object> params = new HashMap<>(16);
         MapUtil.populateMap(params, queryInfo);
 
-		List<Group> groups = groupDao.searchGroups(params);
-
-        if(groups.size() <= 0){
-            return pageInfo;
-        }
-        params.put("classGroupIds", groups.stream().map(Group::getClassGroupId).collect(Collectors.toSet()));
         List<CourseScheduleEndDto> results = new ArrayList<>();
         int count = courseScheduleDao.endCountCourseSchedules(params);
         if(queryInfo.getIsExport() && count > 50000){
@@ -3662,19 +3681,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			List<Map<Long, String>> coursesSettlementTimeMaps = courseScheduleTeacherSalaryDao.getCoursesSettlementTime(courseScheduleIds);
 			Map<Long, String> coursesSettlementTimeMap = MapUtil.convertIntegerMap(coursesSettlementTimeMaps);
 
-			Map<Integer, Group> classGroupIdGroupMap = groups.stream().collect(Collectors.toMap(Group::getClassGroupId, e -> e));
-
 			//获取班级声部名称
             List<Map<Integer, String>> classGroupSubjectNameMaps = classGroupDao.findClassGroupSubjectNameMaps(courseScheduleIds);
             Map<Integer, String> classGroupSubjectNameMap = MapUtil.convertIntegerMap(classGroupSubjectNameMaps);
 			for (CourseScheduleEndDto result : results) {
-				Group group = classGroupIdGroupMap.get(result.getClassGroupId());
 				result.setTeacher(null);
-				if(Objects.nonNull(group)){
-					result.setGroupName(group.getGroupName());
-					result.setOrganName(group.getOrganName());
-					result.setClassGroupName(group.getClassGroupName());
-				}
 				result.setTeacherName(nameIdMap.get(result.getActualTeacherId()));
 				result.setSubjectName(classGroupSubjectNameMap.get(result.getId()));
 				result.setStudentId(studentIdMap.get(result.getId()));
@@ -3994,6 +4005,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         }
         teacherAttendanceDao.batchCleanCourseTeacherSignInfo(courseScheduleId);
         studentAttendanceDao.deleteByCourseSchedules(courseScheduleId);
+        //重置学生人数
+		courseScheduleDao.resetStudentNum(courseScheduleId);
     }
 
 	@Override
@@ -4064,7 +4077,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	}
 
 	@Override
-	public Object getTeacherCourseHeadInfo(GroupType groupType,String groupId){
+	public Object getTeacherCourseHeadInfo(GroupType groupType,String groupId,Long courseScheduleId){
 		Map<String,Object> resultMap = new HashMap<>(8);
 		Teacher teacher;
 		switch (groupType){
@@ -4101,6 +4114,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				//统计授课次数
 				resultMap.put("teacherGiveLesson",courseScheduleTeacherSalaryDao.countTeacherGiveLesson(coursesGroup.getTeacherId()));
 				break;
+			case MUSIC:
+				if(courseScheduleId != null){
+					ClassGroup byCourseSchedule = classGroupDao.findByCourseSchedule(courseScheduleId.intValue(),null);
+					resultMap.put("groupName",byCourseSchedule.getName());
+					ClassGroupTeacherMapper groupTeachersRole = classGroupTeacherMapperService.getClassGroupTeachersRole(byCourseSchedule.getId(), "BISHOP");
+					if(groupTeachersRole != null){
+						teacher = teacherDao.get(groupTeachersRole.getUserId());
+						resultMap.put("groupTeacher",teacher.getRealName());
+						resultMap.put("teacherIntroduction",teacher.getIntroduction());
+						resultMap.put("teacherAvatar",teacher.getAvatar());
+						resultMap.put("teacherGiveLesson",courseScheduleTeacherSalaryDao.countTeacherGiveLesson(groupTeachersRole.getUserId()));
+					}
+				}
+				break;
 			default:
 				throw new BizException("课程类型错误");
 		}
@@ -4189,7 +4216,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(schedule == null){
 			throw new BizException("课程不存在");
 		}
-		return getTeacherCourseHeadInfo(schedule.getGroupType(),schedule.getMusicGroupId());
+		return getTeacherCourseHeadInfo(schedule.getGroupType(),schedule.getMusicGroupId(),courseScheduleId);
 	}
 
 	@Override
@@ -4202,10 +4229,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(schedule == null){
 			throw new BizException("课程不存在");
 		}
-		//获取课程列表
-		List<CourseScheduleRateDto> courseScheduleRateDtos = courseScheduleDao.findCourseRate(schedule.getMusicGroupId(),schedule.getGroupType().getCode());
-		//获取最近一次已结束的课程
-		CourseSchedule courseSchedule = courseScheduleDao.getLastEndCourse(schedule.getMusicGroupId(),schedule.getGroupType().getCode());
+		//如果是乐团课
+		List<CourseScheduleRateDto> courseScheduleRateDtos;
+		CourseSchedule courseSchedule;
+		if(schedule.getGroupType() == MUSIC){
+			//获取当前班级
+			courseScheduleRateDtos = courseScheduleDao.findCourseRate(null,schedule.getGroupType().getCode(),schedule.getClassGroupId());
+			//获取最近一次已结束的课程
+			courseSchedule = courseScheduleDao.getLastEndCourse(null,schedule.getGroupType().getCode(),schedule.getClassGroupId());
+		}else {
+			//获取课程列表
+			courseScheduleRateDtos = courseScheduleDao.findCourseRate(schedule.getMusicGroupId(),schedule.getGroupType().getCode(),null);
+			//获取最近一次已结束的课程
+			courseSchedule = courseScheduleDao.getLastEndCourse(schedule.getMusicGroupId(),schedule.getGroupType().getCode(),null);
+		}
 		List<Long> courseScheduleIds = courseScheduleRateDtos.stream().map(CourseScheduleRateDto::getCourseScheduleId).collect(Collectors.toList());
 		List<CourseScheduleReview> courseReviews = courseScheduleReviewDao.findByCourseSchedules(courseScheduleIds);
 		Map<Integer, List<CourseScheduleReview>> reviews = courseReviews.stream().collect(Collectors.groupingBy(CourseScheduleReview::getCourseScheduleId));

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

@@ -3,10 +3,7 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.TeachModeEnum;
-import com.ym.mec.biz.dal.enums.VipGroupActivityTypeEnum;
-import com.ym.mec.biz.dal.enums.VipGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
 import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.constant.CommonConstants;
@@ -198,7 +195,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 						if(Objects.isNull(courseScheduleStudentPayment.getExpectPrice())){
 							courseScheduleStudentPayment.setExpectPrice(zeroPrice);
 						}
-						sysUserCashAccountService.appendCourseBalance(classGroupStudent.getUserId(), courseScheduleStudentPayment.getExpectPrice().negate(),"学生加课扣除课程余额");
+						sysUserCashAccountService.appendCourseBalance(classGroupStudent.getUserId(), courseScheduleStudentPayment.getExpectPrice().negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE,"学生加课扣除课程余额");
 						courseScheduleStudentPayments.add(courseScheduleStudentPayment);
 					}else{
 						CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment(

+ 33 - 30
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -86,6 +86,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private static final Logger LOGGER = LoggerFactory
             .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
 
+    //按节数计算课酬的课程类型
+    protected static final Set<CourseSchedule.CourseScheduleType> UNIT_PRICE_COURSE_TYPES=new HashSet<>(Arrays.asList(CourseSchedule.CourseScheduleType.CLASSROOM, CourseSchedule.CourseScheduleType.HIGH, CourseSchedule.CourseScheduleType.HIGH_ONLINE));
+
     @Override
     public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
         return courseScheduleTeacherSalaryDao;
@@ -205,7 +208,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findTeacherCourseSalaryNoSettlement(days,GroupType.PRACTICE.getCode());
         if (!CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)) {
             someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
-                courseScheduleTeacherSalary.setActualSalary(courseScheduleTeacherSalary.getExpectSalary());
+                courseScheduleTeacherSalary.setActualSalary(courseScheduleTeacherSalary.getTeacherActualSalary());
                 courseScheduleTeacherSalary.setSettlementTime(now);
                 courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
             });
@@ -294,8 +297,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
 
         //所有课程的学生考勤记录
-        List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseIds(courseScheduleIds);
-        Map<Long, List<StudentAttendance>> courseStudentAttendancesMap = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId));
+//        List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseIds(courseScheduleIds);
+//        Map<Long, List<StudentAttendance>> courseStudentAttendancesMap = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId));
 
         //所有课程的教师考勤记录
         List<TeacherAttendance> teacherAttendancesByCourseSchedule = teacherAttendanceDao.findTeacherIdByCourseSchedule(courseScheduleIds);
@@ -317,7 +320,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<CourseScheduleStudentPayment> updateStudentPayments = new ArrayList<>();
 
         //用户账户资金变动信息列表
-        List<SysUserCashAccountDetail> userCashAccountDetails = new ArrayList<>();
+//        List<SysUserCashAccountDetail> userCashAccountDetails = new ArrayList<>();
 
         //处理课酬信息
         someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
@@ -329,19 +332,19 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 return;
             }
 
-            List<StudentAttendance> courseStudentAttendances = courseStudentAttendancesMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
-            int normalStudentNum=0;
-            if(CollectionUtils.isEmpty(courseStudentAttendances)){
-                return;
-            }
-            for (StudentAttendance courseStudentAttendance : courseStudentAttendances) {
-                if(Objects.nonNull(courseStudentAttendance.getStatus())&&courseStudentAttendance.getStatus().equals(StudentAttendanceStatusEnum.NORMAL)){
-                    normalStudentNum+=1;
-                }
-            }
-            if(normalStudentNum==0){
-                return;
-            }
+//            List<StudentAttendance> courseStudentAttendances = courseStudentAttendancesMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+//            int normalStudentNum=0;
+//            if(CollectionUtils.isEmpty(courseStudentAttendances)){
+//                return;
+//            }
+//            for (StudentAttendance courseStudentAttendance : courseStudentAttendances) {
+//                if(Objects.nonNull(courseStudentAttendance.getStatus())&&courseStudentAttendance.getStatus().equals(StudentAttendanceStatusEnum.NORMAL)){
+//                    normalStudentNum+=1;
+//                }
+//            }
+//            if(normalStudentNum==0){
+//                return;
+//            }
 
             List<TeacherAttendance> teacherAttendances = courseTeacherAttendancesMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
             if(CollectionUtils.isEmpty(teacherAttendances)){
@@ -358,14 +361,14 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
 
             //当前课程缴费学生数量
-            BigDecimal courseStudentNum = new BigDecimal(studentPaymentsWithCourse.size());
+//            BigDecimal courseStudentNum = new BigDecimal(studentPaymentsWithCourse.size());
 
             //教师预计课酬
-            BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
+            BigDecimal expectSalary = courseScheduleTeacherSalary.getTeacherActualSalary();
             //当前课程每个学生平均课酬
-            BigDecimal avgSalary = expectSalary.divide(courseStudentNum, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+//            BigDecimal avgSalary = expectSalary.divide(courseStudentNum, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
             //教师当前课程责任总占比,当前课程应得课酬
-            BigDecimal teacherLiabilityAllratio;
+//            BigDecimal teacherLiabilityAllratio;
 
             //当前课程学生投诉记录
             List<CourseScheduleComplaints> courseStudentComplaints = complaintsGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
@@ -379,15 +382,15 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     return;
                 }
                 //计算教师责任总占比
-                double teacherLiabilityRatioSum = courseStudentComplaints.stream().mapToDouble(courseScheduleComplaint -> Objects.isNull(courseScheduleComplaint.getTeacherLiabilityRatio()) ? 0 : courseScheduleComplaint.getTeacherLiabilityRatio()).sum();
-                teacherLiabilityAllratio = new BigDecimal(teacherLiabilityRatioSum).divide(percent,CommonConstants.DECIMAL_PLACE,BigDecimal.ROUND_DOWN);
+//                double teacherLiabilityRatioSum = courseStudentComplaints.stream().mapToDouble(courseScheduleComplaint -> Objects.isNull(courseScheduleComplaint.getTeacherLiabilityRatio()) ? 0 : courseScheduleComplaint.getTeacherLiabilityRatio()).sum();
+//                teacherLiabilityAllratio = new BigDecimal(teacherLiabilityRatioSum).divide(percent,CommonConstants.DECIMAL_PLACE,BigDecimal.ROUND_DOWN);
             } else {
                 //如果没有投诉,则教师和学生的责任占比为0
-                teacherLiabilityAllratio = new BigDecimal(0);
+//                teacherLiabilityAllratio = new BigDecimal(0);
             }
 
             //教师应扣除费用
-            BigDecimal deductPrice = avgSalary.multiply(teacherLiabilityAllratio);
+            /*BigDecimal deductPrice = avgSalary.multiply(teacherLiabilityAllratio);
             //教师实际课酬
             BigDecimal schoolSubsidy = new BigDecimal(0);
             if (Objects.nonNull(courseScheduleTeacherSalary.getSubsidy())) {
@@ -396,7 +399,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             BigDecimal actualSalary = expectSalary.subtract(deductPrice).add(schoolSubsidy);
 
             //更新教师结算信息
-            courseScheduleTeacherSalary.setActualSalary(actualSalary);
+            courseScheduleTeacherSalary.setActualSalary(actualSalary);*/
+            courseScheduleTeacherSalary.setActualSalary(expectSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
             updateTeacherSalarys.add(courseScheduleTeacherSalary);
@@ -424,7 +428,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 complainsGroupByStudent = courseStudentComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getUserId));
             }
 
-            BigDecimal zero=new BigDecimal(0);
+//            BigDecimal zero=new BigDecimal(0);
 
             //计算学生当前课程应缴费用
             for (CourseScheduleStudentPayment studentPayment : studentPaymentsWithCourse) {
@@ -618,8 +622,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             //教师课酬
             BigDecimal teacherSalary = new BigDecimal(0);
 
-            if(durationIsChange){
-
+            if(durationIsChange&&!UNIT_PRICE_COURSE_TYPES.contains(courseSchedule.getType())){
                 //根据课程类型获取对应的默认课酬设置列表
                 List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
                 if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
@@ -664,7 +667,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
                 }
             }else{
-                teacherSalary=courseScheduleTeacherSalary.getExpectSalary();
+                teacherSalary=courseScheduleTeacherSalary.getTeacherActualSalary();
             }
 
             BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getSchoolId());

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

@@ -139,7 +139,7 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
         Date now=new Date();
         courseGroup.setSingleClassMinutes(courseCycleInfo.getSingleClassMinutes());
         courseGroup.setStatus(GroupStatusEnum.NORMAL);
-        courseGroup.setOrganId(teacher.getOrganId());
+        courseGroup.setOrganId(teacher.getTeacherOrganId());
         List<CourseSchedule> newCourses = courseScheduleService.createCourses(courseGroupCreateInfo.getCourseCycleInfo(),true);
         for (CourseSchedule newCourse : newCourses) {
             newCourse.setTeachMode(TeachModeEnum.ONLINE);
@@ -150,6 +150,7 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
             newCourse.setIsLock(0);
             newCourse.setStatus(CourseStatusEnum.NOT_START);
             newCourse.setName(courseGroup.getName());
+            newCourse.setOrganId(courseGroup.getOrganId());
         }
         try {
             courseScheduleService.checkNewCourseSchedules(newCourses,false);

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

@@ -364,6 +364,7 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
             courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
             courseSchedule.setGroupType(GroupType.PRACTICE);
             courseSchedule.setIsLock(1);
+            courseSchedule.setOrganId(practiceGroupBuyParams.getOrganId());
         }
         courseScheduleDao.batchAddCourseSchedules(practiceCourses);
         TeacherDefaultPracticeGroupSalary teacherDefaultPracticeGroupSalary = teacherDefaultPracticeGroupSalaryDao.findByTeacherAndCourseMinutes(practiceGroupBuyParams.getUserId(),practiceCourseMinutes);
@@ -1039,6 +1040,7 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
             courseSchedule.setCreateTime(now);
             courseSchedule.setUpdateTime(now);
             courseSchedule.setIsLock(0);
+            courseSchedule.setOrganId(practiceGroupBuyParams.getOrganId());
             practiceCourses.add(courseSchedule);
         }
         practiceCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));

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

@@ -58,6 +58,14 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 		if(StringUtils.isBlank(exercises.getStudentIdList())){
 			throw new BizException("请指定学生");
 		}
+		
+		Teacher teacher = teacherDao.getLocked(exercises.getTeacherId());
+
+		ExtracurricularExercises repeatLastExercises = extracurricularExercisesDao.findRepeatLastExercises(exercises.getTeacherId(), exercises.getStudentIdList(), exercises.getContent());
+		if(Objects.nonNull(repeatLastExercises)&&DateUtil.secondsBetween(repeatLastExercises.getCreateTime(),new Date())<60){
+			return;
+		}
+
 		if(Objects.isNull(exercises.getExpireDate())){
 			LocalDateTime localDateTime=LocalDateTime.now();
 			localDateTime=localDateTime.plusDays(2).withHour(21).withMinute(0).withSecond(0);
@@ -68,7 +76,6 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 		exercises.setExpectNum(studentIds.size());
 		extracurricularExercisesDao.insert(exercises);
 		String dateStr = DateUtil.dateToString(exercises.getExpireDate(), "MM月dd日HH点");
-		Teacher teacher = teacherDao.get(exercises.getTeacherId());
 		for (Integer studentId : studentIds) {
 			ExtracurricularExercisesReply studentExtraExercise=new ExtracurricularExercisesReply();
 			studentExtraExercise.setExtracurricularExercisesId(exercises.getId());

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

@@ -0,0 +1,189 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderDetailService;
+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.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+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 java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.FeeType.ONLINE;
+import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
+import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
+
+@Service
+public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalenderDetail>  implements MusicGroupPaymentCalenderDetailService {
+	
+	@Autowired
+	private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
+	@Autowired
+	private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
+	@Autowired
+	private MusicGroupDao musicGroupDao;
+	@Autowired
+	private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
+	@Autowired
+	private SysMessageService sysMessageService;
+
+	@Override
+	public BaseDAO<Long, MusicGroupPaymentCalenderDetail> getDAO() {
+		return musicGroupPaymentCalenderDetailDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateExpectAmount(BigDecimal expectAmount,String ids) {
+		if(expectAmount == null || StringUtils.isEmpty(ids)){
+			throw new BizException("参数校验失败");
+		}
+		//获取缴费列表
+		List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryListByIds(ids);
+		if(calenderDetails.size() == 0){
+			throw new BizException("缴费记录不存在");
+		}
+		Date date = new Date();
+		calenderDetails.forEach(e->{
+			if(e.getPaymentStatus() == null || e.getPaymentStatus() != NON_PAYMENT){
+				throw new BizException("修改失败,缴费状态不匹配");
+			}
+			if(expectAmount.doubleValue() == 0){
+				e.setPaymentStatus(PAID_COMPLETED);
+			}
+			e.setUpdateTime(date);
+			e.setExpectAmount(expectAmount);
+		});
+		if(expectAmount.doubleValue() == 0){
+			//如果是设置为0元
+			MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(calenderDetails.get(0).getMusicGroupPaymentCalenderId());
+			if(calender.getType() == ONLINE){
+				//剩余网管课可购买次数加一
+				musicGroupStudentFeeDao.remainNetworkClassTimesAdd(ids);
+			}
+			//缴费完成
+			musicGroupStudentFeeDao.setPaidCompleted(calenderDetails);
+		}
+		musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void openPayment(String ids) {
+		if(StringUtils.isEmpty(ids)){
+			throw new BizException("参数校验失败");
+		}
+		//获取可开启缴费列表
+		List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryCanOpenList(ids);
+		if(calenderDetails.size() == 0){
+			return;
+		}
+		Date date = new Date();
+		Iterator<MusicGroupPaymentCalenderDetail> iterator = calenderDetails.iterator();
+		MusicGroupPaymentCalenderDetail next;
+		while(iterator.hasNext()){
+			next = iterator.next();
+			int count1 = musicGroupPaymentCalenderDao.queryIntersectionByPaymentDate(next.getMusicGroupId(),date,date);
+			int count = musicGroupPaymentCalenderDetailDao.queryIntersectionByPaymentDate(next.getMusicGroupId(),next.getUserId());
+			if(count > 0 || count1 > 0){
+				iterator.remove();
+			}
+		}
+		if(calenderDetails.size() == 0){
+			return;
+		}
+		String musicGroupId = calenderDetails.get(0).getMusicGroupId();
+		calenderDetails.forEach(e->{
+			e.setUpdateTime(date);
+			e.setOpen(1);
+//			e.setPaymentStatus(PROCESSING);
+			e.setStartPaymentDate(date);
+			e.setDeadlinePaymentDate(date);
+		});
+		musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
+		//修改学员缴费状态为未缴费
+		musicGroupStudentFeeDao.setNoPayment(calenderDetails);
+		Set<Integer> studentIds = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+		//推送消息
+		if (studentIds.size() > 0) {
+			Map<Integer, String> push = new HashMap<>();
+			for (Integer userId : studentIds) {
+				push.put(userId, userId + "");
+			}
+			MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+			String memo = "4?http://mstudev.dayaedu.com/#/renew?musicGroupId=" + musicGroupId;
+			// 发送续费通知
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push, null, 0, memo,"STUDENT",musicGroup.getName());
+		}
+	}
+
+	@Override
+	public List<SimpleUserDto> findMusicGroupStudentWithSubject(String musicGroupId, Integer subjectId) {
+		if(Objects.isNull(musicGroupId)){
+			throw new BizException("请指定乐团");
+		}
+		return musicGroupPaymentCalenderDetailDao.findMusicGroupStudentWithSubject(musicGroupId, subjectId);
+	}
+
+	@Override
+	public void refreshUserMusicGroupPaymentStatusTask() {
+		musicGroupPaymentCalenderDetailDao.refreshUserMusicGroupPaymentStatusTask();
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void add(Long musicGroupPaymentCalenderId, Integer userId) {
+		if(musicGroupPaymentCalenderId == null || userId == null){
+			throw new BizException("参数校验异常");
+		}
+		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(musicGroupPaymentCalenderId);
+		if(calender == null){
+			throw new BizException("缴费信息不存在");
+		}
+		MusicGroupPaymentCalenderDetail userLastCalenderDetail = musicGroupPaymentCalenderDetailDao.getUserLastCalenderDetail(calender.getMusicGroupId(), userId);
+		if(userLastCalenderDetail != null){
+			throw new BizException("数据已存在");
+		}
+		Date date = new Date();
+		MusicGroupStudentFee studentFee = musicGroupStudentFeeDao.findByUser(userId, calender.getMusicGroupId());
+		calender.setUpdateTime(date);
+		//生成详情
+		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+		musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(calender.getId());
+		musicGroupPaymentCalenderDetail.setCreateTime(date);
+		musicGroupPaymentCalenderDetail.setExpectAmount(studentFee.getCourseFee());
+		studentFee.setUpdateTime(date);
+		if (studentFee.getCourseFee().doubleValue() == 0) {
+			studentFee.setPaymentStatus(PAID_COMPLETED);
+			musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
+			if(calender.getType() == ONLINE){
+				studentFee.setRemainNetworkClassTimes(studentFee.getRemainNetworkClassTimes() + 1);
+//				musicGroupStudentFeeDao.remainNetworkClassTimesAdd(userLastCalenderDetail.getId().toString());
+			}
+		} else {
+			studentFee.setPaymentStatus(NON_PAYMENT);
+			musicGroupPaymentCalenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.NON_PAYMENT);
+		}
+		musicGroupPaymentCalenderDetail.setUpdateTime(date);
+		musicGroupPaymentCalenderDetail.setUserId(userId);
+		musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
+		musicGroupPaymentCalenderDao.update(calender);
+		musicGroupStudentFeeDao.update(studentFee);
+	}
+}

+ 299 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -1,30 +1,55 @@
 package com.ym.mec.biz.service.impl;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-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.biz.dal.dao.MusicGroupDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.FeeType;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.dal.page.MusicCalenderQueryInfo;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
+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;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.NO;
+
 @Service
 public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalender> implements MusicGroupPaymentCalenderService {
 
 	@Autowired
 	private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
 
+	@Autowired
+	private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
+
+	@Autowired
+	private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
+	@Autowired
+	private MusicGroupDao musicGroupDao;
+	@Autowired
+	private SysMessageService sysMessageService;
+
 	@Override
 	public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
 		return musicGroupPaymentCalenderDao;
@@ -32,6 +57,198 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
+	public boolean create(MusicGroupPaymentCalender musicGroupPaymentCalender) {
+		String musicGroupId = musicGroupPaymentCalender.getMusicGroupId();
+
+		musicGroupDao.getLocked(musicGroupId);
+
+		Date date = new Date();
+		List<MusicGroupStudentFee> musicGroupStudentFeeList = null;
+
+		musicGroupPaymentCalender.setCreateTime(date);
+		musicGroupPaymentCalender.setUpdateTime(date);
+		musicGroupPaymentCalender.setDeadlinePaymentDate(DateUtil.addDays(musicGroupPaymentCalender.getStartPaymentDate(), 3));
+		// 判断缴费开始时间、结束时间是否被其他缴费记录占用
+		int count = musicGroupPaymentCalenderDao.queryIntersectionByPaymentDate(musicGroupId, musicGroupPaymentCalender.getStartPaymentDate(),
+				musicGroupPaymentCalender.getDeadlinePaymentDate());
+		if (count > 0) {
+			throw new BizException("缴费时间存在冲突,请修改缴费开始日期");
+		}
+		if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
+			musicGroupPaymentCalender.setPaymentStatus(PaymentStatusEnum.YES);
+		} else if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
+			musicGroupPaymentCalender.setPaymentStatus(PaymentStatusEnum.OPEN);
+			// 统计缴费人数
+			musicGroupStudentFeeList = musicGroupStudentFeeDao.queryByMusicGroupId(musicGroupId);
+			if (musicGroupStudentFeeList == null) {
+				musicGroupStudentFeeList = new ArrayList<>();
+			}
+			musicGroupPaymentCalender.setExpectNum(musicGroupStudentFeeList.size());
+		} else {
+			musicGroupPaymentCalender.setPaymentStatus(PaymentStatusEnum.NO);
+		}
+
+		this.insert(musicGroupPaymentCalender);
+
+		List<MusicGroupStudentFee> updateMusicGroupStudentFeeList = new ArrayList<MusicGroupStudentFee>();
+
+		List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = new ArrayList<MusicGroupPaymentCalenderDetail>();
+		if (musicGroupPaymentCalender.getPaymentStatus() == PaymentStatusEnum.OPEN) {
+			if (musicGroupStudentFeeList != null && musicGroupStudentFeeList.size() > 0) {
+				Set<Integer> studentIds = new HashSet<Integer>();
+				MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
+				// 创建缴费明细
+				for (MusicGroupStudentFee mgsf : musicGroupStudentFeeList) {
+					musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+					musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+					musicGroupPaymentCalenderDetail.setCreateTime(date);
+					musicGroupPaymentCalenderDetail.setExpectAmount(mgsf.getCourseFee());
+					if (mgsf.getCourseFee().doubleValue() == 0) {
+						musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+					} else {
+						musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+						studentIds.add(mgsf.getUserId());
+					}
+					musicGroupPaymentCalenderDetail.setUpdateTime(date);
+					musicGroupPaymentCalenderDetail.setUserId(mgsf.getUserId());
+
+					musicGroupPaymentCalenderDetailList.add(musicGroupPaymentCalenderDetail);
+				}
+
+				// 更新学员缴费状态
+				for (MusicGroupStudentFee mgsf : musicGroupStudentFeeList) {
+					if (mgsf.getCourseFee().doubleValue() == 0) {
+						mgsf.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+						if (musicGroupPaymentCalender.getType() != FeeType.OFFLINE) {
+							mgsf.setRemainNetworkClassTimes(mgsf.getRemainNetworkClassTimes() + 1);
+						}
+					} else {
+						mgsf.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+					}
+					mgsf.setUpdateTime(date);
+					updateMusicGroupStudentFeeList.add(mgsf);
+				}
+				if (studentIds.size() > 0) {
+					Map<Integer, String> push = new HashMap<>();
+					for (Integer userId : studentIds) {
+						push.put(userId, userId + "");
+					}
+					MusicGroup musicGroup = musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId());
+					String memo = "4?http://mstudev.dayaedu.com/#/renew?musicGroupId=" + musicGroup.getId();
+					// 发送续费通知
+					sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+							null, 0, memo, "STUDENT", musicGroup.getName());
+				}
+			}
+		}
+
+		if (musicGroupPaymentCalenderDetailList.size() > 0) {
+			musicGroupPaymentCalenderDetailDao.batchInsert(musicGroupPaymentCalenderDetailList);
+		}
+
+		if (updateMusicGroupStudentFeeList.size() > 0) {
+			musicGroupStudentFeeDao.batchUpdate(updateMusicGroupStudentFeeList);
+		}
+
+		return true;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean autoUpdateMusicGroupPaymentCalenderStatus() {
+		Date date = new Date();
+		List<PaymentStatusEnum> statusList = new ArrayList<PaymentStatusEnum>();
+		statusList.add(PaymentStatusEnum.NO);
+		statusList.add(PaymentStatusEnum.OPEN);
+		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.queryByPaymentStatus(statusList);
+
+		List<MusicGroupPaymentCalender> updateMusicGroupPaymentCalenderList = new ArrayList<MusicGroupPaymentCalender>();
+
+		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
+		List<MusicGroupStudentFee> updateMusicGroupStudentFeeList = new ArrayList<MusicGroupStudentFee>();
+		List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = new ArrayList<MusicGroupPaymentCalenderDetail>();
+
+		for (MusicGroupPaymentCalender mgpc : musicGroupPaymentCalenderList) {
+
+			if (mgpc.getDeadlinePaymentDate() != null && date.after(mgpc.getDeadlinePaymentDate()) && mgpc.getPaymentStatus() == PaymentStatusEnum.OPEN) {
+				// “进行中”更新至“已结束”
+				mgpc.setUpdateTime(date);
+				mgpc.setPaymentStatus(PaymentStatusEnum.YES);
+				updateMusicGroupPaymentCalenderList.add(mgpc);
+
+				// 学生状态更新已结束
+
+			} else if (mgpc.getStartPaymentDate() != null && date.after(mgpc.getStartPaymentDate()) && mgpc.getPaymentStatus() == PaymentStatusEnum.NO) {
+				// “未开始”更新至“进行中”
+				mgpc.setUpdateTime(date);
+				mgpc.setPaymentStatus(PaymentStatusEnum.OPEN);
+				updateMusicGroupPaymentCalenderList.add(mgpc);
+
+				// 学生状态更新进行中
+				List<MusicGroupStudentFee> musicGroupStudentFeeList = musicGroupStudentFeeDao.queryByMusicGroupId(mgpc.getMusicGroupId());
+				Set<Integer> studentIds = new HashSet<Integer>();
+				// 创建缴费明细
+				for (MusicGroupStudentFee mgsf : musicGroupStudentFeeList) {
+					musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+					musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(mgpc.getId());
+					musicGroupPaymentCalenderDetail.setCreateTime(date);
+					musicGroupPaymentCalenderDetail.setExpectAmount(mgsf.getCourseFee());
+					if (mgsf.getCourseFee().doubleValue() == 0) {
+						musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+					} else {
+						musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+						studentIds.add(mgsf.getUserId());
+					}
+					musicGroupPaymentCalenderDetail.setUpdateTime(date);
+					musicGroupPaymentCalenderDetail.setUserId(mgsf.getUserId());
+
+					musicGroupPaymentCalenderDetailList.add(musicGroupPaymentCalenderDetail);
+				}
+
+				// 更新学员缴费状态
+				for (MusicGroupStudentFee mgsf : musicGroupStudentFeeList) {
+					if (mgsf.getCourseFee().doubleValue() == 0) {
+						mgsf.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+						if (mgpc.getType() != FeeType.OFFLINE) {
+							mgsf.setRemainNetworkClassTimes(mgsf.getRemainNetworkClassTimes() + 1);
+						}
+					} else {
+						mgsf.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+					}
+					mgsf.setUpdateTime(date);
+					updateMusicGroupStudentFeeList.add(mgsf);
+				}
+				if (studentIds.size() > 0) {
+					Map<Integer, String> push = new HashMap<>();
+					for (Integer userId : studentIds) {
+						push.put(userId, userId + "");
+					}
+					MusicGroup musicGroup = musicGroupDao.get(mgpc.getMusicGroupId());
+					String memo = "4?http://mstudev.dayaedu.com/#/renew?musicGroupId=" + musicGroup.getId();
+					// 发送续费通知
+					sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+							null, 0, memo, "STUDENT", musicGroup.getName());
+				}
+			}
+		}
+
+		if (updateMusicGroupPaymentCalenderList.size() > 0) {
+			musicGroupPaymentCalenderDao.batchUpdate(updateMusicGroupPaymentCalenderList);
+		}
+
+		if (musicGroupPaymentCalenderDetailList.size() > 0) {
+			musicGroupPaymentCalenderDetailDao.batchInsert(musicGroupPaymentCalenderDetailList);
+		}
+
+		if (updateMusicGroupStudentFeeList.size() > 0) {
+			musicGroupStudentFeeDao.batchUpdate(updateMusicGroupStudentFeeList);
+		}
+
+		return true;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void batchInsert(List<MusicGroupPaymentCalender> musicGroupPaymentCalenders) {
 		if (musicGroupPaymentCalenders != null && musicGroupPaymentCalenders.size() > 0) {
 			musicGroupPaymentCalenderDao.delByGroupId(musicGroupPaymentCalenders.get(0).getMusicGroupId());
@@ -44,15 +261,15 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	@Override
 	public Date getNextPaymentDate(String musicGroupId, Date latestPaidDate, MusicGroupStudentFee fee) {
 		List<Integer> months = null;
-		if(fee != null){
+		if (fee != null) {
 			String paymentPeriodList = fee.getPaymentPeriodList();
-			if(StringUtils.isEmpty(paymentPeriodList)){
+			if (StringUtils.isEmpty(paymentPeriodList)) {
 				return null;
 			} else {
 				months = Arrays.asList(paymentPeriodList.split(",")).stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
 				Collections.sort(months);
 			}
-		}else {
+		} else {
 			List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByMusicGroupId(musicGroupId);
 			if (musicGroupPaymentCalenderList != null && musicGroupPaymentCalenderList.size() > 0) {
 				months = musicGroupPaymentCalenderList.stream().map(e -> e.getPaymentMonth()).sorted().collect(Collectors.toList());
@@ -85,4 +302,72 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		}
 		return null;
 	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateStartTime(Date startTime, Long id) {
+		if (startTime == null || id == null) {
+			throw new BizException("参数校验失败");
+		}
+		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(id);
+		if (calender == null) {
+			throw new BizException("缴费信息不存在");
+		}
+		if (calender.getPaymentStatus() == null || calender.getPaymentStatus() != NO) {
+			throw new BizException("修改失败,缴费状态不匹配");
+		}
+		calender.setStartPaymentDate(startTime);
+		calender.setDeadlinePaymentDate(DateUtil.addDays(startTime, 3));
+		calender.setUpdateTime(new Date());
+		musicGroupPaymentCalenderDao.update(calender);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void del(Long id) {
+		if (id == null) {
+			throw new BizException("参数校验失败");
+		}
+		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(id);
+		if (calender == null) {
+			throw new BizException("缴费信息不存在");
+		}
+		if (calender.getPaymentStatus() == null || calender.getPaymentStatus() != NO) {
+			throw new BizException("删除失败,缴费状态不匹配");
+		}
+		musicGroupPaymentCalenderDao.delete(id);
+	}
+
+	@Override
+	public Object getDetail(Long id) {
+		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(id);
+		Set<Long> set = new HashSet<>();
+		set.add(id);
+		Map<Long,Long> expectNumMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.countExpectNum(set));
+		Map<Long,Long> actualNumMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.countActualNum(set));
+		calender.setActualNum(actualNumMap.get(id)==null?0:actualNumMap.get(id).intValue());
+		calender.setExpectNum(expectNumMap.get(id)==null?0:expectNumMap.get(id).intValue());
+		BigDecimal sumActualAmount = musicGroupPaymentCalenderDetailDao.sumActualAmount(id);
+		Map<String, Object> result = new HashMap<>(2);
+		result.put("calender", calender);
+		result.put("sumActualAmount", sumActualAmount);
+		return result;
+	}
+
+	@Override
+	public Object queryDetailPage(MusicCalenderQueryInfo queryInfo) {
+		PageInfo<MusicGroupPaymentCalender> pageInfo = queryPage(queryInfo);
+		List<MusicGroupPaymentCalender> rows = pageInfo.getRows();
+		if(rows.size() == 0){
+			return pageInfo;
+		}
+		Set<Long> collect = rows.stream().map(e -> e.getId()).collect(Collectors.toSet());
+		Map<Long,Long> expectNumMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.countExpectNum(collect));
+		Map<Long,Long> actualNumMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.countActualNum(collect));
+		rows.forEach(e->{
+			e.setActualNum(actualNumMap.get(e.getId())==null?0:actualNumMap.get(e.getId()).intValue());
+			e.setExpectNum(expectNumMap.get(e.getId())==null?0:expectNumMap.get(e.getId()).intValue());
+		});
+		return pageInfo;
+	}
 }

+ 116 - 86
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -146,6 +146,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     private MusicGroupSubjectGoodsGroupService musicGroupSubjectGoodsGroupService;
     @Autowired
     private GoodsService goodsService;
+    @Autowired
+    private ClassGroupStudentMapperService classGroupStudentMapperService;
+    @Autowired
+    private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
 
     @Autowired
     private ImFeignService imFeignService;
@@ -193,10 +197,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             musicGroupPaymentEntitiesDao.batchAdd(subFeeSettingDto.getMusicGroupPaymentEntities(), musicGroupId);
         }
         // 保存学员付费周期
-        List<Integer> months = subFeeSettingDto.getMonths();
+        /*List<Integer> months = subFeeSettingDto.getMonths();
         if (months != null && months.size() > 0) {
             musicGroupPaymentCalenderDao.batchAdd(months, musicGroupId);
-        }
+        }*/
 
         //乐团科目学生
         if (subjectRegisters != null && subjectRegisters.size() > 0) {
@@ -256,10 +260,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         // 保存乐团声部商品规划
         if (musicGroupSubjectGoodsGroups != null && musicGroupSubjectGoodsGroups.size() > 0) {
             for (MusicGroupSubjectGoodsGroup musicGroupSubjectGoodsGroup : musicGroupSubjectGoodsGroups) {
-                if(musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT) && (musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson() == null
+                if (musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT) && (musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson() == null
                         || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().isEmpty()
-                        || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))){
-                    throw new BizException(musicGroupSubjectGoodsGroup.getName()+" 请选择提供方式");
+                        || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))) {
+                    throw new BizException(musicGroupSubjectGoodsGroup.getName() + " 请选择提供方式");
                 }
             }
             musicGroupSubjectGoodsGroupDao.batchInsert(musicGroupSubjectGoodsGroups, musicGroupId);
@@ -303,7 +307,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setVersion(0);
         Date date = new Date();
         if (sporadicPayDto.getUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
-            if(chargeInfo.getChargeType().getCode().equals(9)){
+            if (chargeInfo.getChargeType().getCode().equals(9)) {
                 throw new BizException("账户充值不支持余额支付");
             }
             SysUserCashAccount userCashAccount = sysUserCashAccountService.get(userId);
@@ -887,10 +891,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             }
             if (subFeeSettingDto.getMusicGroupSubjectGoodsGroups() != null && subFeeSettingDto.getMusicGroupSubjectGoodsGroups().size() > 0) {
                 for (MusicGroupSubjectGoodsGroup musicGroupSubjectGoodsGroup : subFeeSettingDto.getMusicGroupSubjectGoodsGroups()) {
-                    if(musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT) && (musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson() == null
+                    if (musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT) && (musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson() == null
                             || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().isEmpty()
-                            || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))){
-                        throw new BizException(musicGroupSubjectGoodsGroup.getName()+" 请选择提供方式");
+                            || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))) {
+                        throw new BizException(musicGroupSubjectGoodsGroup.getName() + " 请选择提供方式");
                     }
                 }
 
@@ -937,7 +941,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         //生成学员费用表
         List<MusicGroupStudentFee> musicGroupStudentFees = musicGroupStudentFeeDao.initMusicGroupStudentFee(musicGroupId);
         if (musicGroupStudentFees != null && musicGroupStudentFees.size() > 0) {
-            musicGroupStudentFeeDao.batchInsert(musicGroupStudentFees, musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, null, null), "PAID_COMPLETED");
+            musicGroupStudentFeeDao.batchInsert(musicGroupStudentFees, null, "PAID_COMPLETED");
         }
         musicGroupStudentFeeDao.batchUpdateCalenders(musicGroupId);
         //记录操作日志
@@ -1036,7 +1040,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
             //是否有基础训练班
             Integer num = classGroupDao.countClassNumByType(musicGroupId);
-            if(num != null && num > 0){
+            if (num != null && num > 0) {
                 Map<Integer, String> studentMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(studentRegistrationDao.findIdMapByMusicGroupId(musicGroupId, 2))), HashMap.class);
                 if (studentMap != null && studentMap.size() > 0) {
                     String baseURL = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
@@ -1091,14 +1095,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     }
 
     @Override
-    public List<BasicUserDto> findTeachersByStuId(Integer studentId,String search){
+    public List<BasicUserDto> findTeachersByStuId(Integer studentId, String search) {
         //获取相关课程,班级老师列表
         Set<Integer> teacherIds = teacherDao.findMusicTeacherIds(studentId);
         //获取学员所在乐团列表
         List<String> musicGroupIds = studentRegistrationDao.queryStudentMusicGroup(studentId);
-        if(musicGroupIds != null && musicGroupIds.size() > 0){
+        if (musicGroupIds != null && musicGroupIds.size() > 0) {
             List<MusicGroup> musicGroups = musicGroupDao.queryListByIds(StringUtils.join(musicGroupIds, ","));
-            musicGroups.forEach(e->{
+            musicGroups.forEach(e -> {
                 teacherIds.add(e.getDirectorUserId());
                 teacherIds.add(e.getEducationalTeacherId());
                 teacherIds.add(e.getTeamTeacherId());
@@ -1118,11 +1122,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         teacherIds.addAll(teacherDao.findCommEducationalTeacherId(studentId));
         //获取关联的指导老师
         Student student = studentDao.get(studentId);
-        if(student != null && student.getTeacherId() != null){
+        if (student != null && student.getTeacherId() != null) {
             teacherIds.add(student.getTeacherId());
         }
-        if(teacherIds.size() > 0){
-        	return teacherDao.queryTeacherBaseInfo(teacherIds,search);
+        if (teacherIds.size() > 0) {
+            return teacherDao.queryTeacherBaseInfo(teacherIds, search);
         }
         return new ArrayList<>();
     }
@@ -1249,13 +1253,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupDao.update(musicGroup);
 
         // 重新设置下次缴费时间
-        List<MusicGroupStudentFee> fees = musicGroupStudentFeeDao.queryByMusicGroupId(musicGroupId);
+        /*List<MusicGroupStudentFee> fees = musicGroupStudentFeeDao.queryByMusicGroupId(musicGroupId);
         Date date = new Date();
         fees.forEach(e -> {
             e.setNextPaymentDate(musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, null, e));
             e.setUpdateTime(date);
         });
-        musicGroupStudentFeeDao.batchUpdate(fees);
+        musicGroupStudentFeeDao.batchUpdate(fees);*/
 //        musicGroupStudentFeeDao.updateNextPaymentDate(musicGroupId, musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, null));
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "恢复乐团", sysUser.getId(), ""));
 
@@ -1355,31 +1359,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             if (studentRegistration == null) {
                 throw new BizException("用户注册信息不存在");
             }
-            //更新学员在班级的状态
-            classGroupStudentMapperDao.deleteStudentByMusicGroupId(musicGroupId, userId);
 
             List<Integer> classGroupIdList = classGroupStudentMapperDao.queryClassGroupIdList(musicGroupId, userId, GroupType.MUSIC);
-            if (classGroupIdList != null && classGroupIdList.size() > 0) {
-                //更新班级人数
-                //classGroupDao.batchUpdateStudentNumMinusOne(classGroupIdList);
-
-                List<ImGroupModel> imGroupModels = new ArrayList<>();
-                ImGroupMember[] imGroupMember = {new ImGroupMember(userId.toString())};
-                for (Integer classGroupId : classGroupIdList) {
-                    imGroupModels.add(new ImGroupModel(classGroupId + "", imGroupMember, ""));
-                }
-                imFeignService.groupBatchQuit(imGroupModels);
-            }
-
-            List<CourseSchedule> musicGroupCourseSchedules = courseScheduleDao.findMusicGroupCourseSchedulesWithStudent(musicGroupId, GroupType.MUSIC.getCode(), CourseStatusEnum.NOT_START.getCode(), userId);
-            if (!CollectionUtils.isEmpty(musicGroupCourseSchedules)) {
-                List<Long> courseScheduleIds = musicGroupCourseSchedules.stream().map(courseSchedule -> courseSchedule.getId()).collect(Collectors.toList());
-
-                // 删除未上课
-                courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudent(courseScheduleIds, userId);
-
-                //删除学生缴费表
-                courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId, musicGroupCourseSchedules);
+            //更新学员在班级的状态
+            for (Integer classGroupId : classGroupIdList) {
+                classGroupStudentMapperService.delClassGroupStudent(userId, classGroupId);
             }
 
             //删除续费周期
@@ -1472,32 +1456,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (studentRegistration == null) {
             throw new BizException("用户注册信息不存在");
         }
-        //更新学员在班级的状态
-        classGroupStudentMapperDao.deleteStudentByMusicGroupId(musicGroupId, userId);
 
         List<Integer> classGroupIdList = classGroupStudentMapperDao.queryClassGroupIdList(musicGroupId, userId, GroupType.MUSIC);
-        if (classGroupIdList != null && classGroupIdList.size() > 0) {
-            //更新班级人数
-            //classGroupDao.batchUpdateStudentNumMinusOne(classGroupIdList);
-
-            //删除融云群
-            List<ImGroupModel> imGroupModels = new ArrayList<ImGroupModel>();
-            ImGroupMember[] imGroupMember = {new ImGroupMember(userId.toString())};
-            for (Integer classGroupId : classGroupIdList) {
-                imGroupModels.add(new ImGroupModel(classGroupId + "", imGroupMember, ""));
-            }
-            imFeignService.groupBatchQuit(imGroupModels);
-        }
-
-        List<CourseSchedule> musicGroupCourseSchedules = courseScheduleDao.findMusicGroupCourseSchedulesWithStudent(musicGroupId, GroupType.MUSIC.getCode(), CourseStatusEnum.NOT_START.getCode(), userId);
-        if (!CollectionUtils.isEmpty(musicGroupCourseSchedules)) {
-            List<Long> courseScheduleIds = musicGroupCourseSchedules.stream().map(courseSchedule -> courseSchedule.getId()).collect(Collectors.toList());
-
-            // 删除未上课
-            courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudent(courseScheduleIds, userId);
-
-            // 删除学生缴费表
-            courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId, musicGroupCourseSchedules);
+        for (Integer classGroupId : classGroupIdList) {
+            classGroupStudentMapperService.delClassGroupStudent(userId, classGroupId);
         }
 
         //删除续费周期
@@ -1574,12 +1536,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroupStudentFee == null) {
             throw new BizException("个人续费信息错误");
         }
-        
+
         StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId, musicGroupId);
-        if(studentRegistration == null || studentRegistration.getPaymentStatus() != PaymentStatusEnum.YES){
-        	throw new BizException("请走报名缴费流程");
+        if (studentRegistration == null || studentRegistration.getPaymentStatus() != PaymentStatusEnum.YES) {
+            throw new BizException("请走报名缴费流程");
         }
-        
+        MusicGroupPaymentCalenderDetail userLastCalenderDetail = musicGroupPaymentCalenderDetailDao.getUserLastCalenderDetail(musicGroupId, userId);
+        if (userLastCalenderDetail == null) {
+            throw new BizException("当前续费时间已截止,请联系指导老师");
+        }
+
         //判断是否是续费
 		/*List<StudentPaymentOrder> orderList = studentPaymentOrderDao.queryByCondition(GroupType.MUSIC, musicGroupId, userId, DealStatusEnum.SUCCESS);
 		if (orderList == null || orderList.size() == 0) {
@@ -1591,10 +1557,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("已缴费");
         }
 
-        BigDecimal amount = musicGroupStudentFee.getCourseFee();
-        if (amount == null || amount.doubleValue() == 0) {
-            amount = musicGroupStudentFee.getCourseFee();
-        }
+        BigDecimal amount = userLastCalenderDetail.getExpectAmount();
 
         Date date = new Date();
         StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
@@ -1630,28 +1593,48 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             studentPaymentOrder.setPaymentChannel("BALANCE");
             if (userCashAccount.getBalance().subtract(amount).doubleValue() >= 0) {
                 // 更新订单信息
+                studentPaymentOrder.setActualAmount(BigDecimal.ZERO);
                 studentPaymentOrder.setBalancePaymentAmount(amount);
+                studentPaymentOrder.setActualAmount(new BigDecimal(0));
                 studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
                 studentPaymentOrder.setUpdateTime(date);
                 studentPaymentOrder.setOrganId(musicGroup.getOrganId());
-                studentPaymentOrder.setRoutingOrganId(42);
+                studentPaymentOrder.setRoutingOrganId(musicGroup.getOrganId());
                 studentPaymentOrderService.update(studentPaymentOrder);
 
                 sysUserCashAccountService.updateBalance(userId, amount.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐团续费");
 
+                MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(userLastCalenderDetail.getMusicGroupPaymentCalenderId());
                 //更新下次续费时间
                 musicGroupStudentFee.setUpdateTime(date);
                 musicGroupStudentFee.setLatestPaidTime(date);
                 musicGroupStudentFee.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
                 musicGroupStudentFee.setTemporaryCourseFee(new BigDecimal(0));
-                musicGroupStudentFee.setNextPaymentDate(musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, musicGroupStudentFee.getNextPaymentDate(), musicGroupStudentFee));
+                if (musicGroupPaymentCalender.getType().equals(MusicGroupPaymentCalender.FeeType.ONLINE)) {
+                    Integer getRemainNetworkClassTimes = musicGroupStudentFee.getRemainNetworkClassTimes() == null ? 0 : musicGroupStudentFee.getRemainNetworkClassTimes();
+                    musicGroupStudentFee.setRemainNetworkClassTimes(getRemainNetworkClassTimes + 1);
+                }
+//                musicGroupStudentFee.setNextPaymentDate(musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, musicGroupStudentFee.getNextPaymentDate(), musicGroupStudentFee));
                 musicGroupStudentFeeDao.update(musicGroupStudentFee);
+
+                //更新学生的缴费记录状态
+                userLastCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+                userLastCalenderDetail.setActualAmount(userLastCalenderDetail.getExpectAmount());
+                userLastCalenderDetail.setPayTime(date);
+                userLastCalenderDetail.setUpdateTime(date);
+                musicGroupPaymentCalenderDetailDao.update(userLastCalenderDetail);
+                //更新实际缴费人数
+                Integer actualNum = musicGroupPaymentCalender.getActualNum() == null ? 0 : musicGroupPaymentCalender.getActualNum();
+                musicGroupPaymentCalender.setActualNum(actualNum + 1);
+                musicGroupPaymentCalender.setUpdateTime(date);
+                musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
                 return null;
             } else {
                 if (userCashAccount.getBalance().doubleValue() > 0) {
                     sysUserCashAccountService.updateBalance(userId, userCashAccount.getBalance().negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐团续费");
                     amount = amount.subtract(userCashAccount.getBalance());
                     studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
+                    studentPaymentOrder.setActualAmount(studentPaymentOrder.getActualAmount().subtract(userCashAccount.getBalance()));
                 } else {
                     studentPaymentOrder.setBalancePaymentAmount(new BigDecimal(0));
                 }
@@ -1679,6 +1662,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             );
 
             Map<String, BigDecimal> routingFee = (Map<String, BigDecimal>) payMap.get("routingFee");
+            studentPaymentOrder.setActualAmount(amount);
             studentPaymentOrder.setOrganId(musicGroup.getOrganId());
             studentPaymentOrder.setRoutingOrganId((Integer) payMap.get("routingOrganId"));
             studentPaymentOrder.setComAmount(routingFee.get("COM"));
@@ -1698,8 +1682,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean renewForCallback(StudentPaymentOrder studentPaymentOrder) throws IOException {
 
-        studentPaymentOrderService.update(studentPaymentOrder);
-
+        int updateNum = studentPaymentOrderService.update(studentPaymentOrder);
+        if (updateNum <= 0) {
+            throw new BizException("订单更新失败");
+        }
         Integer userId = studentPaymentOrder.getUserId();
         String musicGroupId = studentPaymentOrder.getMusicGroupId();
 
@@ -1716,13 +1702,37 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         push.put(userId, userId.toString());
         yimei.put(userId, studentRegistration.getParentsPhone());
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+            MusicGroupPaymentCalenderDetail userLastCalenderDetail = musicGroupPaymentCalenderDetailDao.getUserLastCalenderDetail(musicGroupId, userId);
+            if (userLastCalenderDetail == null) {
+                throw new BizException("学生没有续费中的记录");
+            }
+
+            MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(userLastCalenderDetail.getMusicGroupPaymentCalenderId());
+
             musicGroupStudentFee.setUpdateTime(date);
             musicGroupStudentFee.setLatestPaidTime(date);
             musicGroupStudentFee.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
             musicGroupStudentFee.setTemporaryCourseFee(new BigDecimal(0));
-            musicGroupStudentFee.setNextPaymentDate(musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, musicGroupStudentFee.getNextPaymentDate(), musicGroupStudentFee));
+            if (musicGroupPaymentCalender.getType().equals(MusicGroupPaymentCalender.FeeType.ONLINE)) {
+                Integer getRemainNetworkClassTimes = musicGroupStudentFee.getRemainNetworkClassTimes() == null ? 0 : musicGroupStudentFee.getRemainNetworkClassTimes();
+                musicGroupStudentFee.setRemainNetworkClassTimes(getRemainNetworkClassTimes + 1);
+            }
+//            musicGroupStudentFee.setNextPaymentDate(musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, musicGroupStudentFee.getNextPaymentDate(), musicGroupStudentFee));
             musicGroupStudentFeeDao.update(musicGroupStudentFee);
 
+            //更新学生的缴费记录状态
+            userLastCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+            userLastCalenderDetail.setActualAmount(userLastCalenderDetail.getExpectAmount());
+            userLastCalenderDetail.setPayTime(date);
+            userLastCalenderDetail.setUpdateTime(date);
+            musicGroupPaymentCalenderDetailDao.update(userLastCalenderDetail);
+
+            //更新实际缴费人数
+            Integer actualNum = musicGroupPaymentCalender.getActualNum() == null ? 0 : musicGroupPaymentCalender.getActualNum();
+            musicGroupPaymentCalender.setActualNum(actualNum + 1);
+            musicGroupPaymentCalender.setUpdateTime(date);
+            musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
+
             //插入交易明细
             SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
             BigDecimal amount = studentPaymentOrder.getActualAmount();
@@ -1819,7 +1829,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         }
         Teacher teacher = teacherDao.get(teacherId);
-        MusicGroup musicGroup = musicGroupDao.get(classGroupDao.findByCourseSchedule(courseScheduleId.intValue()).getMusicGroupId());
+        MusicGroup musicGroup = musicGroupDao.get(classGroupDao.findByCourseSchedule(courseScheduleId.intValue(), 0).getMusicGroupId());
         Set<Integer> roleIds = new HashSet<>(1);
         roleIds.add(SysUserRole.SECTION_MANAGER);
 
@@ -1898,6 +1908,26 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         return musicGroupPageInfo;
     }
 
+    @Override
+    public PageInfo<MusicGroup> findEduTeacherMusicGroups(MusicGroupQueryInfo queryInfo) {
+        PageInfo<MusicGroup> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<MusicGroup> dataList = null;
+        int count = musicGroupDao.countMusicGroups(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = musicGroupDao.findMusicGroups(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
     private void updateTeamTeacher(MusicGroup oldMusicGroup, MusicGroup newMusicGroup) {
         //获取当前乐团所有班级
         List<ClassGroup> classGroups = classGroupDao.findClassGroups(newMusicGroup.getId());
@@ -1913,11 +1943,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         ImGroupMember[] nowImGroupMembers2 = {new ImGroupMember(educationalTeacherId.toString())};
 
         Integer oldDirectorUserId = oldMusicGroup.getDirectorUserId();
-        if(oldDirectorUserId == null){
+        if (oldDirectorUserId == null) {
             oldDirectorUserId = teamTeacherId;
         }
         Integer directorUserId = newMusicGroup.getDirectorUserId();
-        if(directorUserId == null){
+        if (directorUserId == null) {
             directorUserId = teamTeacherId;
         }
 
@@ -1949,13 +1979,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             //如果已生成课表,那么修改未上课时教学点
             courseScheduleDao.updateCourseScheduleSchool("MUSIC", musicGroupId, musicGroup.getSchoolId());
         }
-        updateTeamTeacher(group,musicGroup);
-        List<Integer> months = subFeeSettingDto.getMonths();
+        updateTeamTeacher(group, musicGroup);
+//        List<Integer> months = subFeeSettingDto.getMonths();
 
         Date date = new Date();
 
         //判断缴费日历是否修改
-        boolean isModifiedOfCalender = false;
+        /*boolean isModifiedOfCalender = false;
 
         List<MusicGroupPaymentCalender> calenderList = musicGroupPaymentCalenderDao.findByMusicGroupId(musicGroupId);
         if (months.size() == calenderList.size()) {
@@ -1995,7 +2025,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 e.setUpdateTime(date);
             });
             musicGroupStudentFeeDao.batchUpdate(fees);
-        }
+        }*/
         musicGroup.setUpdateTime(date);
         musicGroupDao.update(musicGroup);
         //修改课程里面的教学点

+ 11 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupStudentFeeServiceImpl.java

@@ -1,7 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
@@ -9,7 +8,6 @@ import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
 import com.ym.mec.biz.service.MusicGroupStudentFeeService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
@@ -17,13 +15,13 @@ 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.thirdparty.message.MessageSenderPluginContext.MessageSender;
+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 java.math.BigDecimal;
 import java.util.*;
-import java.util.stream.Collectors;
 
 @Service
 public class MusicGroupStudentFeeServiceImpl extends BaseServiceImpl<Long, MusicGroupStudentFee> implements MusicGroupStudentFeeService {
@@ -40,9 +38,6 @@ public class MusicGroupStudentFeeServiceImpl extends BaseServiceImpl<Long, Music
 	@Autowired
 	private SysMessageService sysMessageService;
 
-	@Autowired
-	private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
-
 	@Override
 	public BaseDAO<Long, MusicGroupStudentFee> getDAO() {
 		return musicGroupStudentFeeDao;
@@ -95,7 +90,7 @@ public class MusicGroupStudentFeeServiceImpl extends BaseServiceImpl<Long, Music
 		if(fee == null){
 			throw new BizException("学员缴费信息不存在");
 		}
-		fee.setNextPaymentDate(musicGroupPaymentCalenderService.getNextPaymentDate(studentFeeDto.getMusicGroupId(),null,fee));
+//		fee.setNextPaymentDate(musicGroupPaymentCalenderService.getNextPaymentDate(studentFeeDto.getMusicGroupId(),null,fee));
 		musicGroupStudentFeeDao.update(fee);
 	}
 
@@ -109,4 +104,13 @@ public class MusicGroupStudentFeeServiceImpl extends BaseServiceImpl<Long, Music
 		musicGroupStudentFeeDao.updateStudentFeeIsLock(studentFeeDto);
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void batchUpdateCourseFee(String ids, BigDecimal courseFee) {
+		if(StringUtils.isEmpty(ids) || courseFee == null){
+			throw new BizException("参数校验失败");
+		}
+		musicGroupStudentFeeDao.batchUpdateCourseFee(ids,courseFee);
+	}
+
 }

+ 725 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OnlineMusicGroupServiceImpl.java

@@ -0,0 +1,725 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+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.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.common.controller.BaseController;
+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.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;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.WeekFields;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@Service
+public class OnlineMusicGroupServiceImpl implements OnlineMusicGroupService {
+
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
+    @Autowired
+    private StudentDao studentDao;
+    @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
+    private SubjectDao subjectDao;
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+    @Autowired
+    private ClassGroupDao classGroupDao;
+    @Autowired
+    private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
+    @Autowired
+    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private TeacherAttendanceDao teacherAttendanceDao;
+    @Autowired
+    private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private TeacherFreeTimeDao teacherFreeTimeDao;
+    @Autowired
+    private PracticeGroupService practiceGroupService;
+    @Autowired
+    private ImFeignService imFeignService;
+    @Autowired
+    private SysMessageService sysMessageService;
+
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    @Override
+    public Map<String, Object> createOnlineMusicClassGroup(OnlineMusicGroupCourseDto onlineMusicGroupCourseInfo) {
+        if(Objects.isNull(onlineMusicGroupCourseInfo.getMusicGroupId())){
+            throw new BizException("请指定乐团");
+        }
+        if(Objects.isNull(onlineMusicGroupCourseInfo.getStudentId())){
+            throw new BizException("请指定学员");
+        }
+        if(Objects.isNull(onlineMusicGroupCourseInfo.getSubjectId())){
+            throw new BizException("请指定学员声部");
+        }
+        if(Objects.isNull(onlineMusicGroupCourseInfo.getTeacherId())){
+            throw new BizException("请指定教师");
+        }
+        if(Objects.isNull(onlineMusicGroupCourseInfo.getCourseCreateStartTime())){
+            throw new BizException("请指定首次上课时间");
+        }
+        MusicGroup musicGroup = musicGroupDao.get(onlineMusicGroupCourseInfo.getMusicGroupId());
+        if(Objects.isNull(musicGroupDao)){
+            throw new BizException("乐团不存在");
+        }
+        MusicGroupStudentFee studentFee = musicGroupStudentFeeDao.findByUser(onlineMusicGroupCourseInfo.getStudentId(), musicGroup.getId());
+        if(Objects.isNull(studentFee)){
+            throw new BizException("学员缴费信息不存在");
+        }
+        if(studentFee.getRemainNetworkClassTimes()<=0){
+            throw new BizException("该学员费用不足");
+        }
+
+        SysUser student = studentDao.lockUserReturnInfo(onlineMusicGroupCourseInfo.getStudentId());
+        if(Objects.isNull(student)){
+            throw new BizException("学员不存在");
+        }
+        Teacher teacher = teacherDao.get(onlineMusicGroupCourseInfo.getTeacherId());
+        if(Objects.isNull(teacher)){
+            throw new BizException("教师不存在");
+        }
+        Subject subject = subjectDao.get(onlineMusicGroupCourseInfo.getSubjectId());
+        if(Objects.isNull(subjectDao)){
+            throw new BizException("声部不存在");
+        }
+
+        onlineMusicGroupCourseInfo.setCourseCount(8);
+        onlineMusicGroupCourseInfo.setSingleClassMinutes(25);
+        onlineMusicGroupCourseInfo.setTeachMode(TeachModeEnum.ONLINE);
+        CourseTimeDto courseTimeDto=new CourseTimeDto();
+        LocalDateTime courseStartLocalDate = LocalDateTime.ofInstant(onlineMusicGroupCourseInfo.getCourseCreateStartTime().toInstant(), DateUtil.zoneId);
+        courseTimeDto.setDayOfWeek(courseStartLocalDate.getDayOfWeek().getValue());
+        courseTimeDto.setStartClassTime(DateUtil.dateToString(onlineMusicGroupCourseInfo.getCourseCreateStartTime(), "HH:mm:ss"));
+        List<CourseTimeDto> ts=new ArrayList<>();
+        ts.add(courseTimeDto);
+        onlineMusicGroupCourseInfo.setCourseTimes(ts);
+        List<CourseSchedule> courses = courseScheduleService.createCourses(onlineMusicGroupCourseInfo, true);
+        courses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+
+        Date now=new Date();
+
+        //创建班级信息
+        ClassGroup classGroup = new ClassGroup();
+        classGroup.setSubjectIdList(onlineMusicGroupCourseInfo.getSubjectId().toString());
+        classGroup.setExpectStudentNum(1);
+        classGroup.setStudentNum(1);
+        classGroup.setName(subject.getName()+"•"+student.getUsername());
+        classGroup.setTotalClassTimes(courses.size());
+        classGroup.setType(ClassGroupTypeEnum.MUSIC_NETWORK);
+        classGroup.setDelFlag(0);
+        classGroup.setGroupType(GroupType.MUSIC);
+        classGroup.setMusicGroupId(musicGroup.getId());
+        classGroup.setCreateTime(now);
+        classGroup.setUpdateTime(now);
+        classGroupDao.insert(classGroup);
+
+        //创建班级老师关联记录
+        ClassGroupTeacherMapper classGroupTeacherMapper = new ClassGroupTeacherMapper();
+        classGroupTeacherMapper.setMusicGroupId(classGroup.getMusicGroupId());
+        classGroupTeacherMapper.setClassGroupId(classGroup.getId());
+        classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
+        classGroupTeacherMapper.setUserId(onlineMusicGroupCourseInfo.getTeacherId());
+        classGroupTeacherMapper.setGroupType(GroupType.MUSIC);
+        classGroupTeacherMapper.setCreateTime(now);
+        classGroupTeacherMapper.setUpdateTime(now);
+        classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
+
+        //班级学生关联表
+        ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+        classGroupStudentMapper.setMusicGroupId(onlineMusicGroupCourseInfo.getMusicGroupId());
+        classGroupStudentMapper.setClassGroupId(classGroup.getId());
+        classGroupStudentMapper.setUserId(onlineMusicGroupCourseInfo.getStudentId());
+        classGroupStudentMapper.setCreateTime(now);
+        classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+        classGroupStudentMapper.setGroupType(GroupType.MUSIC);
+        classGroupStudentMapperDao.insert(classGroupStudentMapper);
+
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+        List<TeacherAttendance> teacherAttendances = new ArrayList<>();
+
+        for (CourseSchedule courseSchedule : courses) {
+            //课表
+            courseSchedule.setMusicGroupId(onlineMusicGroupCourseInfo.getMusicGroupId());
+            courseSchedule.setClassGroupId(classGroup.getId());
+            courseSchedule.setName(classGroup.getName());
+            courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+            courseSchedule.setTeacherId(onlineMusicGroupCourseInfo.getTeacherId());
+            courseSchedule.setActualTeacherId(onlineMusicGroupCourseInfo.getTeacherId());
+            courseSchedule.setCreateTime(now);
+            courseSchedule.setUpdateTime(now);
+            courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+            courseSchedule.setType(CourseSchedule.CourseScheduleType.MUSIC_NETWORK);
+            courseSchedule.setGroupType(GroupType.MUSIC);
+            courseSchedule.setIsLock(0);
+            courseSchedule.setOrganId(student.getOrganId());
+        }
+        courseScheduleDao.batchAddCourseSchedules(courses);
+        TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = teacherDefaultMusicGroupSalaryDao.findByTeacherAndCourseType(onlineMusicGroupCourseInfo.getTeacherId(), CourseSchedule.CourseScheduleType.MUSIC_NETWORK.getCode());
+        if(Objects.isNull(teacherDefaultMusicGroupSalary)){
+            throw new BizException("请设置教师课酬");
+        }
+        BigDecimal teacherDefaultSalary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+        BigDecimal studentSingleCourseCost=BigDecimal.ZERO;
+        for (CourseSchedule courseSchedule : courses) {
+            //课程与老师薪水表
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setGroupType(GroupType.MUSIC);
+            courseScheduleTeacherSalary.setMusicGroupId(musicGroup.getId());
+            courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+            courseScheduleTeacherSalary.setUserId(onlineMusicGroupCourseInfo.getTeacherId());
+            courseScheduleTeacherSalary.setExpectSalary(teacherDefaultSalary);
+            courseScheduleTeacherSalary.setCreateTime(now);
+            courseScheduleTeacherSalary.setUpdateTime(now);
+            courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+            courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+
+            //学生缴费记录
+            CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+            courseScheduleStudentPayment.setGroupType(GroupType.MUSIC);
+            courseScheduleStudentPayment.setMusicGroupId(musicGroup.getId());
+            courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleStudentPayment.setUserId(onlineMusicGroupCourseInfo.getStudentId());
+            courseScheduleStudentPayment.setExpectPrice(studentSingleCourseCost);
+            courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
+            courseScheduleStudentPayment.setCreateTime(now);
+            courseScheduleStudentPayment.setUpdateTime(now);
+            courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+
+            //教师签到记录
+            TeacherAttendance teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setMusicGroupId(musicGroup.getId());
+            teacherAttendance.setTeacherId(onlineMusicGroupCourseInfo.getTeacherId());
+            teacherAttendance.setClassGroupId(classGroup.getId());
+            teacherAttendance.setGroupType(GroupType.MUSIC);
+            teacherAttendance.setCourseScheduleId(courseSchedule.getId());
+            teacherAttendance.setCreateTime(now);
+            teacherAttendances.add(teacherAttendance);
+        }
+        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+        courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+        teacherAttendanceDao.batchInsert(teacherAttendances);
+
+        try {
+            courseScheduleService.checkNewCourseSchedules(courses,false);
+        } catch (Exception e) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            String errMessage=new String();
+            if(e.getMessage().indexOf("主教冲突")!=-1){
+                errMessage="抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。";
+            }else{
+                String courseName=e.getMessage().substring(e.getMessage().indexOf(")-")+2);
+                courseName = courseName.substring(0,courseName.indexOf("("));
+                errMessage="抱歉啦,当前所选时段组合,与您现有课程「";
+                errMessage+=courseName;
+                errMessage+="」时段冲突,请选择其他时段重试。";
+            }
+            throw new BizException(errMessage);
+        }
+
+        studentFee.setRemainNetworkClassTimes(studentFee.getRemainNetworkClassTimes()-1);
+        musicGroupStudentFeeDao.update(studentFee);
+
+        try{
+            List<String> cdstrs=new ArrayList<>();
+            for(int i=0;i<courses.size();i++){
+                cdstrs.add((i+1)+","+DateUtil.dateToString(courses.get(i).getStartClassTime(), "yyyy年MM月dd日 HH时mm分"));
+            }
+
+            Map<Integer, String> userMap = new HashMap<>();
+            userMap.put(onlineMusicGroupCourseInfo.getStudentId(), onlineMusicGroupCourseInfo.getStudentId().toString());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSIC_NETWORK_CRATE_STUDENT,
+                    userMap, null, 0, null, "STUDENT", student.getUsername(), musicGroup.getName(),
+                    teacher.getRealName(), DateUtil.dateToString(courses.get(0).getStartClassTime(),"yyyy年MM月dd日 HH时mm分"));
+
+            Map<Integer, String> teacherMap = new HashMap<>();
+            teacherMap.put(onlineMusicGroupCourseInfo.getTeacherId(), onlineMusicGroupCourseInfo.getTeacherId().toString());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSIC_NETWORK_CRATE_TEACHER,
+                    teacherMap, null, 0, null, "TEACHER", teacher.getRealName(), classGroup.getName(),
+                    StringUtils.join(cdstrs, ","));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        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()]);
+        // 创建群组
+        imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+
+        List<String> courseTimes = courses.stream().map(c -> DateUtil.dateToString(c.getStartClassTime(), "yyyy-MM-dd HH:mm")).collect(Collectors.toList());
+
+        Map<String, Object> result=new HashMap<>();
+        result.put("courseTimes", StringUtils.join(courseTimes,","));
+        return result;
+    }
+
+    @Override
+    public List<SimpleUserDto> getEnableApplyTeachers(Integer studentId, Integer subjectId) {
+        if (Objects.isNull(subjectId)) {
+            throw new BizException("请选择声部");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserById(studentId);
+        if (Objects.isNull(sysUser)) {
+            throw new BizException("用户不存在");
+        }
+        if (Objects.isNull(sysUser.getOrganId())) {
+            throw new BizException("未找到用户分部属性");
+        }
+
+        List<Integer> includeTeacherIds = new ArrayList<>();
+        List<ExtendTeacherBasicDto> organAndSubjectTeachers = teacherDao.findTeaTeachersByOrganAndSubject3(sysUser.getOrganId(), subjectId);
+        if (CollectionUtils.isEmpty(organAndSubjectTeachers)) {
+            return new ArrayList<>();
+        }
+
+        List<Integer> allTeacherIds = organAndSubjectTeachers.stream().map(TeacherBasicDto::getId).collect(Collectors.toList());
+
+        List<CourseSchedule> userCourses = courseScheduleDao.findUserCourses3(studentId, allTeacherIds);
+
+        if (!CollectionUtils.isEmpty(userCourses)) {
+            Map<GroupType, List<CourseSchedule>> courseTypeCourseMap = userCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType));
+
+            List<CourseSchedule> practiceCourses = courseTypeCourseMap.get(GroupType.PRACTICE);
+            if (!CollectionUtils.isEmpty(practiceCourses)) {
+                for (CourseSchedule practiceCourse : practiceCourses) {
+                    if (!includeTeacherIds.contains(practiceCourse.getTeacherId())) {
+                        includeTeacherIds.add(practiceCourse.getTeacherId());
+                    }
+                }
+            }
+
+            List<CourseSchedule> vipCourses = courseTypeCourseMap.get(GroupType.VIP);
+            if (!CollectionUtils.isEmpty(vipCourses)) {
+                for (CourseSchedule vipCourse : vipCourses) {
+                    if (!includeTeacherIds.contains(vipCourse.getTeacherId())) {
+                        includeTeacherIds.add(vipCourse.getTeacherId());
+                    }
+                }
+            }
+            List<CourseSchedule> singleCourses = courseTypeCourseMap.get(GroupType.MUSIC);
+            if (!CollectionUtils.isEmpty(singleCourses)) {
+                for (CourseSchedule singleCourse : singleCourses) {
+                    if (!includeTeacherIds.contains(singleCourse.getTeacherId())) {
+                        includeTeacherIds.add(singleCourse.getTeacherId());
+                    }
+                }
+            }
+        }
+
+        for (ExtendTeacherBasicDto organAndSubjectTeacher : organAndSubjectTeachers) {
+            if (!includeTeacherIds.contains(organAndSubjectTeacher.getId())) {
+                includeTeacherIds.add(organAndSubjectTeacher.getId());
+            }
+        }
+
+        if (CollectionUtils.isEmpty(new ArrayList<>(includeTeacherIds))) {
+            return new ArrayList<>();
+        }
+
+        List<SimpleUserDto> userInfos = new ArrayList<>();
+        Map<Integer, ExtendTeacherBasicDto> idTeacherMap = organAndSubjectTeachers.stream().collect(Collectors.toMap(ExtendTeacherBasicDto::getId, teacher -> teacher));
+        for (Integer includeTeacherId : includeTeacherIds) {
+            ExtendTeacherBasicDto teacher = idTeacherMap.get(includeTeacherId);
+            SimpleUserDto simpleUserDto=new SimpleUserDto(includeTeacherId, teacher.getRealName());
+            simpleUserDto.setAvatar(teacher.getAvatar());
+            simpleUserDto.setIntroduction(teacher.getIntroduction());
+            simpleUserDto.setSubjectNames(teacher.getSubjectNames());
+            userInfos.add(simpleUserDto);
+        }
+
+        return userInfos;
+    }
+
+    @Override
+    public Map getTeacherFreeTimes(Integer studentId, Integer teacherId, boolean skipHoliday){
+        if (Objects.isNull(teacherId)) {
+            throw new BizException("请选择教师");
+        }
+        SysUser student = sysUserFeignService.queryUserById(studentId);
+        if (Objects.isNull(student)) {
+            throw new BizException("用户不存在");
+        }
+        if (Objects.isNull(student.getOrganId())) {
+            throw new BizException("未找到用户分部属性");
+        }
+        Teacher teacher = teacherDao.get(teacherId);
+        if (Objects.isNull(teacher)) {
+            throw new BizException("教师不存在");
+        }
+        Map result = new HashMap();
+        Set<Date> allTeacherFreeDates = new HashSet<>();
+
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
+
+        boolean checkTeacherLeaveDate = true;
+        SysConfig allTeacherLeaveDataConfig = sysConfigService.findByParamName(SysConfigService.TEACHER_LEAVE_DATA);
+        JSONObject allTeacherLeaveData = JSONObject.parseObject(allTeacherLeaveDataConfig.getParanValue());
+        if (Objects.isNull(allTeacherLeaveData)) {
+            checkTeacherLeaveDate = false;
+        }
+
+        Set<String> holidayDays = new HashSet<>();
+
+        if (skipHoliday) {
+            SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+            if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+                holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+            }
+        }
+
+        Set<Integer> disableApplyWeekNum = new HashSet<>();
+        Set<Integer> disableApplyWeekDay = new HashSet<>();
+
+        TeacherFreeTime teacherFreeTime = teacherFreeTimeDao.findTeacherFreeTime(teacherId);
+        JSONObject teacherFreeTimes=new JSONObject();
+        int holiday = 0;
+        if (Objects.nonNull(teacherFreeTime)) {
+            if (Objects.nonNull(teacherFreeTime.getHoliday())) {
+                holiday = DateUtil.normalWeekNumCalendarWeekNumMap.get(teacherFreeTime.getHoliday());
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getMonday())){
+                teacherFreeTimes.put(String.valueOf(Calendar.MONDAY), JSON.parseArray(teacherFreeTime.getMonday()));
+            }else{
+                disableApplyWeekDay.add(Calendar.MONDAY);
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getTuesday())){
+                teacherFreeTimes.put(String.valueOf(Calendar.TUESDAY), JSON.parseArray(teacherFreeTime.getTuesday()));
+            }else{
+                disableApplyWeekDay.add(Calendar.TUESDAY);
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getWednesday())){
+                teacherFreeTimes.put(String.valueOf(Calendar.WEDNESDAY), JSON.parseArray(teacherFreeTime.getWednesday()));
+            }else{
+                disableApplyWeekDay.add(Calendar.WEDNESDAY);
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getThursday())){
+                teacherFreeTimes.put(String.valueOf(Calendar.THURSDAY), JSON.parseArray(teacherFreeTime.getThursday()));
+            }else{
+                disableApplyWeekDay.add(Calendar.THURSDAY);
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getFriday())){
+                teacherFreeTimes.put(String.valueOf(Calendar.FRIDAY), JSON.parseArray(teacherFreeTime.getFriday()));
+            }else{
+                disableApplyWeekDay.add(Calendar.FRIDAY);
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getSaturday())){
+                teacherFreeTimes.put(String.valueOf(Calendar.SATURDAY), JSON.parseArray(teacherFreeTime.getSaturday()));
+            }else{
+                disableApplyWeekDay.add(Calendar.SATURDAY);
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getSunday())){
+                teacherFreeTimes.put(String.valueOf(Calendar.SUNDAY), JSON.parseArray(teacherFreeTime.getSunday()));
+            }else{
+                disableApplyWeekDay.add(Calendar.SUNDAY);
+            }
+        }else{
+            result.put("teacherFreeDays", new ArrayList<>());
+            return result;
+        }
+
+        Date now = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setFirstDayOfWeek(Calendar.MONDAY);
+        calendar.setTime(now);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        calendar.add(Calendar.DATE, 1);
+        Date applyStartDate = calendar.getTime();
+        Date applyEndDate = DateUtil.addDays(applyStartDate, 14);
+        Date firstMonday = DateUtil.getWeekDayWithDate(applyStartDate, Calendar.MONDAY);
+        Date secondSunday = DateUtil.getWeekDayWithDate(applyEndDate, Calendar.SUNDAY);
+
+        List<Date> enableApplyDates = practiceGroupService.getEnableApplyDatesIncludeAllTimes(applyStartDate, applyEndDate);
+        List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeacherCoursesWithDateRange(teacherId, firstMonday, secondSunday);
+        allTeacherCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+
+        List<CourseSchedule> applyDateRangeCourses = new ArrayList<>();
+        for (int i = 0; i < allTeacherCourses.size(); i++) {
+            CourseSchedule teacherCourse = allTeacherCourses.get(i);
+            if ((!teacherCourse.getClassDate().before(applyStartDate))
+                    && (teacherCourse.getClassDate().before(applyEndDate) || DateUtil.isSameDay(teacherCourse.getClassDate(), applyEndDate))) {
+                applyDateRangeCourses.add(teacherCourse);
+            }
+        }
+
+        JSONObject teacherLeaveData = null;
+        if (checkTeacherLeaveDate) {
+            teacherLeaveData = allTeacherLeaveData.getJSONObject(teacherId.toString());
+        }
+
+        if (Objects.isNull(teacherLeaveData)) {
+            checkTeacherLeaveDate = false;
+        }
+
+        if (CollectionUtils.isEmpty(applyDateRangeCourses)) {
+            for (Date enableApplyDate : enableApplyDates) {
+                Date enableApplyDateCourseEndTime = DateUtil.addMinutes(enableApplyDate, practiceCourseMinutes);
+                if (teacherId == 100473) {
+                    checkTeacherLeaveDate = false;
+                    Calendar tempCalendar = Calendar.getInstance();
+                    tempCalendar.setFirstDayOfWeek(Calendar.MONDAY);
+                    tempCalendar.setTime(enableApplyDate);
+                    if (tempCalendar.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY
+                            || tempCalendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
+                        String date_str = DateUtil.dateToString(enableApplyDate, "yyyy-MM-dd");
+                        Date date1 = DateUtil.stringToDate(date_str + " 11:30:00");
+                        Date date2 = DateUtil.stringToDate(date_str + " 14:30:00");
+                        Date date3 = DateUtil.stringToDate(date_str + " 20:30:00");
+                        if (enableApplyDate.before(date2)
+                                && enableApplyDateCourseEndTime.after(date1)) {
+                            continue;
+                        }
+                        if (date3.before(enableApplyDateCourseEndTime)) {
+                            continue;
+                        }
+                    }
+                    if (tempCalendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
+                        continue;
+                    }
+                }
+                if (checkTeacherLeaveDate) {
+                    String dateStr = DateUtil.dateToString(enableApplyDate, "yyyy-MM-dd");
+                    JSONObject leaveDateData = teacherLeaveData.getJSONObject(dateStr);
+                    if (Objects.nonNull(leaveDateData)) {
+                        Date leaveStartTime = leaveDateData.getDate("leave_start_time");
+                        Date leaveEndTime = leaveDateData.getDate("leave_end_time");
+                        if (enableApplyDateCourseEndTime.after(leaveStartTime)
+                                && enableApplyDate.before(leaveEndTime)) {
+                            continue;
+                        }
+                    }
+                }
+                calendar.setTime(enableApplyDate);
+                int dayOfWeek=calendar.get(Calendar.DAY_OF_WEEK);
+                if(disableApplyWeekDay.contains(dayOfWeek)){
+                    continue;
+                }
+                JSONArray teacherWeekDayFreeTimes = teacherFreeTimes.getJSONArray(String.valueOf(dayOfWeek));
+                if(Objects.nonNull(teacherWeekDayFreeTimes)){
+                    LocalTime enableApplyStartTime=LocalDateTime.ofInstant(enableApplyDate.toInstant(),DateUtil.zoneId).toLocalTime();
+                    LocalTime enableApplyEndTime=LocalDateTime.ofInstant(enableApplyDateCourseEndTime.toInstant(),DateUtil.zoneId).toLocalTime();
+                    boolean isInclude=false;
+                    for (Object teacherWeekDayFreeTimeObject : teacherWeekDayFreeTimes) {
+                        JSONObject teacherWeekDayFreeTime=JSONObject.parseObject(teacherWeekDayFreeTimeObject.toString());
+                        LocalTime teacherFreeStartTime=LocalTime.parse(teacherWeekDayFreeTime.getString("startTime"),DateUtil.timeFormatter);
+                        LocalTime teacherFreeEndTime=LocalTime.parse(teacherWeekDayFreeTime.getString("endTime"),DateUtil.timeFormatter);
+                        if(enableApplyEndTime.compareTo(teacherFreeEndTime)<=0
+                                &&enableApplyStartTime.compareTo(teacherFreeStartTime)>=0){
+                            isInclude=true;
+                            break;
+                        }
+                    }
+                    if(!isInclude){
+                        continue;
+                    }
+                }
+                if (dayOfWeek != holiday) {
+                    allTeacherFreeDates.add(enableApplyDate);
+                }
+            }
+            if (!CollectionUtils.isEmpty(allTeacherFreeDates)) {
+                List<Date> tempDates = new ArrayList<>();
+                if (CollectionUtils.isEmpty(tempDates)) {
+                    tempDates = new ArrayList<>(allTeacherFreeDates);
+                }
+                tempDates.sort(Comparator.comparing(Date::getTime));
+                Map<String, List<String>> rt=new HashMap<>();
+                for (Date tempDate : tempDates) {
+                    String dateStr = DateUtil.dateToString(tempDate, "yyyy-MM-dd");
+                    if(holidayDays.contains(dateStr)){
+                        continue;
+                    }
+                    String timeStr = DateUtil.dateToString(tempDate, "HH:mm:ss");
+                    if(!rt.containsKey(dateStr)){
+                        rt.put(dateStr, new ArrayList<>());
+                    }
+                    rt.get(dateStr).add(timeStr);
+                }
+
+                result.put("teacherFreeDays", rt);
+            } else {
+                result.put("teacherFreeDays", new ArrayList<>());
+            }
+            return result;
+        }
+
+        List<Date> tempEnableApplyDates = new ArrayList<>();
+        for (Date enableApplyDate : enableApplyDates) {
+            Date enableApplyDateCourseEndTime = DateUtil.addMinutes(enableApplyDate, practiceCourseMinutes);
+
+            if (teacherId == 100473) {
+                checkTeacherLeaveDate = false;
+                Calendar tempCalendar = Calendar.getInstance();
+                tempCalendar.setFirstDayOfWeek(Calendar.MONDAY);
+                tempCalendar.setTime(enableApplyDate);
+                if (tempCalendar.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY
+                        || tempCalendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
+                    String date_str = DateUtil.dateToString(enableApplyDate, "yyyy-MM-dd");
+                    Date date1 = DateUtil.stringToDate(date_str + " 11:30:00");
+                    Date date2 = DateUtil.stringToDate(date_str + " 14:30:00");
+                    Date date3 = DateUtil.stringToDate(date_str + " 20:30:00");
+                    if (enableApplyDate.before(date2)
+                            && enableApplyDateCourseEndTime.after(date1)) {
+                        continue;
+                    }
+                    if (date3.before(enableApplyDateCourseEndTime)) {
+                        continue;
+                    }
+                }
+                if (tempCalendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
+                    continue;
+                }
+            }
+            if (checkTeacherLeaveDate) {
+                String dateStr = DateUtil.dateToString(enableApplyDate, "yyyy-MM-dd");
+                JSONObject leaveDateData = teacherLeaveData.getJSONObject(dateStr);
+                if (Objects.nonNull(leaveDateData)) {
+                    Date leaveStartTime = leaveDateData.getDate("leave_start_time");
+                    Date leaveEndTime = leaveDateData.getDate("leave_end_time");
+                    if (enableApplyDateCourseEndTime.after(leaveStartTime)
+                            && enableApplyDate.before(leaveEndTime)) {
+                        continue;
+                    }
+                }
+            }
+            calendar.setTime(enableApplyDate);
+
+            int dayOfWeek=calendar.get(Calendar.DAY_OF_WEEK);
+            if(disableApplyWeekDay.contains(dayOfWeek)){
+                continue;
+            }
+            JSONArray teacherWeekDayFreeTimes = teacherFreeTimes.getJSONArray(String.valueOf(dayOfWeek));
+            if(Objects.nonNull(teacherWeekDayFreeTimes)){
+                LocalTime enableApplyStartTime=LocalDateTime.ofInstant(enableApplyDate.toInstant(),DateUtil.zoneId).toLocalTime();
+                LocalTime enableApplyEndTime=LocalDateTime.ofInstant(enableApplyDateCourseEndTime.toInstant(),DateUtil.zoneId).toLocalTime();
+                boolean isInclude=false;
+                for (Object teacherWeekDayFreeTimeObject : teacherWeekDayFreeTimes) {
+                    JSONObject teacherWeekDayFreeTime=JSONObject.parseObject(teacherWeekDayFreeTimeObject.toString());
+                    LocalTime teacherFreeStartTime=LocalTime.parse(teacherWeekDayFreeTime.getString("startTime"),DateUtil.timeFormatter);
+                    LocalTime teacherFreeEndTime=LocalTime.parse(teacherWeekDayFreeTime.getString("endTime"),DateUtil.timeFormatter);
+                    if(enableApplyEndTime.compareTo(teacherFreeEndTime)<=0
+                            &&enableApplyStartTime.compareTo(teacherFreeStartTime)>=0){
+                        isInclude=true;
+                        break;
+                    }
+                }
+                if(!isInclude){
+                    continue;
+                }
+            }
+
+            if (dayOfWeek == holiday) {
+                continue;
+            }
+
+            if (!disableApplyWeekNum.contains(calendar.get(Calendar.WEEK_OF_YEAR))) {
+                tempEnableApplyDates.add(enableApplyDate);
+            }
+        }
+
+        applyDateRangeCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+        for (int j = 0; j < applyDateRangeCourses.size(); j++) {
+            CourseSchedule preCourseSchedule = applyDateRangeCourses.get(j);
+            CourseSchedule backCourseSchedule = j >= applyDateRangeCourses.size() - 1 ? preCourseSchedule : applyDateRangeCourses.get(j + 1);
+            if (preCourseSchedule.getEndClassTime().after(backCourseSchedule.getEndClassTime())) {
+                backCourseSchedule.setEndClassTime(preCourseSchedule.getEndClassTime());
+            }
+            if (j == 0) {
+                for (Date enableApplyDate : tempEnableApplyDates) {
+                    Date enableApplyDateCourseEndTime = DateUtil.addMinutes(enableApplyDate, practiceCourseMinutes);
+                    if (!enableApplyDateCourseEndTime.after(preCourseSchedule.getStartClassTime())) {
+                        allTeacherFreeDates.add(enableApplyDate);
+                    }
+                }
+            }
+            if (j == applyDateRangeCourses.size() - 1) {
+                for (Date enableApplyDate : tempEnableApplyDates) {
+                    if (!enableApplyDate.before(backCourseSchedule.getEndClassTime())) {
+                        allTeacherFreeDates.add(enableApplyDate);
+                    }
+                }
+            }
+            if (j >= applyDateRangeCourses.size() - 1) {
+                break;
+            }
+            for (Date enableApplyDate : tempEnableApplyDates) {
+                Date enableApplyDateCourseEndTime = DateUtil.addMinutes(enableApplyDate, practiceCourseMinutes);
+                if (!enableApplyDate.before(preCourseSchedule.getEndClassTime())
+                        && !enableApplyDateCourseEndTime.after(backCourseSchedule.getStartClassTime())) {
+                    allTeacherFreeDates.add(enableApplyDate);
+                }
+            }
+        }
+        if (!CollectionUtils.isEmpty(allTeacherFreeDates)) {
+            List<Date> tempDates = new ArrayList<>();
+            if (CollectionUtils.isEmpty(tempDates)) {
+                tempDates = new ArrayList<>(allTeacherFreeDates);
+            }
+            tempDates.sort(Comparator.comparing(Date::getTime));
+            Map<String, List<String>> rt=new HashMap<>();
+            for (Date tempDate : tempDates) {
+                String dateStr = DateUtil.dateToString(tempDate, "yyyy-MM-dd");
+                if(holidayDays.contains(dateStr)){
+                    continue;
+                }
+                String timeStr = DateUtil.dateToString(tempDate, "HH:mm:ss");
+                if(!rt.containsKey(dateStr)){
+                    rt.put(dateStr, new ArrayList<>());
+                }
+                rt.get(dateStr).add(timeStr);
+            }
+
+            result.put("teacherFreeDays", rt);
+        }
+        return result;
+    }
+}

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

@@ -1625,6 +1625,50 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     }
 
     @Override
+    public List<Date> getEnableApplyDatesIncludeAllTimes(Date startDay, Date endDay) {
+        List<Date> result = new ArrayList<>();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startDay);
+        calendar.add(Calendar.DATE, -1);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        SysConfig practiceApplyStartTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_START_TIME);
+        SysConfig practiceApplyEndTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_END_TIME);
+        SysConfig practiceApplyIntervalTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_INTERVAL_TIME);
+        String enableStartTimeStr = practiceApplyStartTimeConfig.getParanValue();
+        String enableEndTimeStr = practiceApplyEndTimeConfig.getParanValue();
+        Integer practiceApplyIntervalMinutes = practiceApplyIntervalTimeConfig.getParanValue(Integer.class);
+        LocalTime dayStartTime=LocalTime.parse("00:00:00",DateUtil.timeFormatter);
+        LocalTime dayEndTime=LocalTime.parse("00:00:00",DateUtil.timeFormatter);
+        List<String> dayApplyTimes=new ArrayList<>();
+        while (true){
+            dayApplyTimes.add(dayStartTime.format(DateUtil.timeFormatter));
+            dayStartTime=dayStartTime.plusMinutes(practiceApplyIntervalMinutes);
+            if(dayStartTime.compareTo(dayEndTime)==0){
+                break;
+            }
+        }
+
+        while (!calendar.getTime().after(endDay)) {
+            calendar.add(Calendar.DATE, 1);
+            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(enableStartTimeStr.split(":")[0]));
+            calendar.set(Calendar.MINUTE, Integer.valueOf(enableStartTimeStr.split(":")[1]));
+            Date enableApplyDayStartTime = calendar.getTime();
+            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(enableEndTimeStr.split(":")[0]));
+            calendar.set(Calendar.MINUTE, Integer.valueOf(enableEndTimeStr.split(":")[1]));
+            Date enableApplyDayEndTime = calendar.getTime();
+            Calendar applyStartCalendar = Calendar.getInstance();
+            applyStartCalendar.setTime(enableApplyDayStartTime);
+            for (String applyDayTime : dayApplyTimes) {
+                String temp = DateUtil.dateToString(applyStartCalendar.getTime(), "yyyy-MM-dd");
+                temp = temp + " " + applyDayTime;
+                result.add(DateUtil.stringToDate(temp, "yyyy-MM-dd HH:mm:ss"));
+            }
+        }
+        return result;
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public Map practiceApply(PracticeGroup practiceGroup) {
         if (Objects.isNull(practiceGroup.getUserId())) {
@@ -1921,6 +1965,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
             courseSchedule.setGroupType(GroupType.PRACTICE);
             courseSchedule.setName(practiceGroup.getName());
+            courseSchedule.setOrganId(practiceGroup.getOrganId());
             courseScheduleDao.insert(courseSchedule);
 
             //课程与老师薪水表
@@ -2911,6 +2956,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
             courseSchedule.setGroupType(GroupType.PRACTICE);
             courseSchedule.setIsLock(1);
+            courseSchedule.setOrganId(practiceGroupBuyParams.getOrganId());
         }
         courseScheduleDao.batchAddCourseSchedules(practiceCourses);
         TeacherDefaultPracticeGroupSalary teacherDefaultPracticeGroupSalary = teacherDefaultPracticeGroupSalaryDao.findByTeacherAndCourseMinutes(practiceGroupBuyParams.getUserId(),practiceCourseMinutes);
@@ -3295,7 +3341,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         practiceBuyResult.setStatus(order.getStatus());
         practiceBuyResult.setCreateTime(order.getCreateTime());
         practiceBuyResult.setPrice(order.getExpectAmount());
-        if(order.getStatus().equals(DealStatusEnum.FAILED)){
+        practiceBuyResult.setType(order.getType().getCode());
+        if(order.getStatus().equals(DealStatusEnum.FAILED) || order.getGroupType().equals(GroupType.REPAIR)){
             return practiceBuyResult;
         }
         SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);

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

@@ -76,7 +76,7 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
             //福袋活动,增加课程余额
             if (info.getChargeType().getCode() == 6) {
-                sysUserCashAccountService.appendCourseBalance(userId, studentPaymentOrder.getActualAmount(), "活动");
+                sysUserCashAccountService.appendCourseBalance(userId, studentPaymentOrder.getActualAmount(),PlatformCashAccountDetailTypeEnum.SPORADIC, "活动");
             } else if (info.getChargeType().getCode() == 9) { //零星收费账户充值
                 sysUserCashAccountService.updateBalance(userId, studentPaymentOrder.getActualAmount(), PlatformCashAccountDetailTypeEnum.RECHARGE, "零星收费账户充值",studentPaymentOrder.getTransNo());
             } else {

+ 8 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -459,7 +459,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 	public void addStudentAttendanceRecord(Integer courseScheduleId, Integer userId, StudentAttendanceStatusEnum statusEnum,SignStatusEnum signStatusEnum) {
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId.longValue());
-		ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId);
+		ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId,0);
 		StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(userId,courseScheduleId);
 		Date date = new Date();
 		if(studentAttendance == null){
@@ -471,7 +471,12 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 			studentAttendance.setMusicGroupId(classGroup.getMusicGroupId());
 			studentAttendance.setUserId(userId);
 			studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
-
+			if(signStatusEnum == SignStatusEnum.SIGN_IN){
+				if(courseSchedule.getStudentNum() == null){
+					courseSchedule.setStudentNum(0);
+				}
+				courseSchedule.setStudentNum(courseSchedule.getStudentNum() + 1);
+			}
 			studentAttendanceDao.insert(studentAttendance);
 		}else {
 			studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
@@ -495,7 +500,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 				studentAttendance.setSignInTime(date);
 
 				courseSchedule.setUpdateTime(date);
-				courseSchedule.setStudentNum((courseSchedule.getStudentNum() == null?0:courseSchedule.getStudentNum()) + 1);
+//				courseSchedule.setStudentNum((courseSchedule.getStudentNum() == null?0:courseSchedule.getStudentNum()) + 1);
 				courseScheduleDao.update(courseSchedule);
 			}
 		}else if(signStatusEnum == SignStatusEnum.SIGN_OUT){

+ 41 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java

@@ -1,9 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.ExtracurricularExercisesReplyDao;
-import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.StudentEduTeacherDto;
 import com.ym.mec.biz.dal.dto.StudentExercisesSituationDto;
 import com.ym.mec.biz.dal.dto.StudentServiceDetailDto;
 import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
@@ -16,8 +14,10 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.time.DayOfWeek;
 import java.time.LocalDate;
@@ -37,6 +37,8 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 	private CourseScheduleDao courseScheduleDao;
 	@Autowired
 	private TeacherDao teacherDao;
+	@Autowired
+	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
 	@Override
 	public BaseDAO<Long, StudentExtracurricularExercisesSituation> getDAO() {
@@ -63,12 +65,42 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 
 			List<Map<Integer, Long>> studentPracticeCoursesMaps = courseScheduleDao.countStudentPayPracticeCoursesWithDate(studentIds, queryInfo.getMonday(), queryInfo.getSunday());
 			Map<Integer, Long> studentPracticeCourseMap = MapUtil.convertIntegerMap(studentPracticeCoursesMaps);
+
+			List<StudentEduTeacherDto> studentEducationalTeachers = classGroupStudentMapperDao.getStudentEducationalTeachers(studentIds);
+			Map<Integer, List<StudentEduTeacherDto>> studentEduTeachersMap = studentEducationalTeachers.stream().collect(Collectors.groupingBy(StudentEduTeacherDto::getStudentId));
+
 			for (StudentExercisesSituationDto exercisesSituationDto : dataList) {
 				Long vipCourses=studentVipCourseMap.get(exercisesSituationDto.getStudentId());
 				exercisesSituationDto.setExistVipCourse(Objects.isNull(vipCourses)?0:vipCourses.intValue());
 				Long practiceCourses=studentPracticeCourseMap.get(exercisesSituationDto.getStudentId());
 				exercisesSituationDto.setExistPracticeCourse(Objects.isNull(practiceCourses)?0:practiceCourses.intValue());
 				exercisesSituationDto.setExpectExercisesNum((int) until+1);
+				List<StudentEduTeacherDto> studentEduTeachers = studentEduTeachersMap.get(exercisesSituationDto.getStudentId());
+				if(!CollectionUtils.isEmpty(studentEduTeachers)){
+					List<StudentEduTeacherDto> t1 = studentEduTeachers.stream().filter(set -> set.getGroupType().equals(GroupType.VIP.getCode())||set.getGroupType().equals(GroupType.PRACTICE.getCode())).collect(Collectors.toList());
+					if(!CollectionUtils.isEmpty(t1)){
+						for (StudentEduTeacherDto studentEduTeacherDto : t1) {
+							if(StringUtils.isNotBlank(studentEduTeacherDto.getEducationalTeacherName())){
+								exercisesSituationDto.setEducationalTeacherId(studentEduTeacherDto.getEducationalTeacherId());
+								exercisesSituationDto.setEducationalTeacherName(studentEduTeacherDto.getEducationalTeacherName());
+								break;
+							}
+						}
+					}
+					if(StringUtils.isNoneBlank(exercisesSituationDto.getEducationalTeacherName())){
+						continue;
+					}
+					List<StudentEduTeacherDto> t2 = studentEduTeachers.stream().filter(set -> set.getGroupType().equals(GroupType.MUSIC.getCode())).collect(Collectors.toList());
+					if(!CollectionUtils.isEmpty(t2)){
+						for (StudentEduTeacherDto studentEduTeacherDto : t2) {
+							if(StringUtils.isNotBlank(studentEduTeacherDto.getEducationalTeacherName())){
+								exercisesSituationDto.setEducationalTeacherId(studentEduTeacherDto.getEducationalTeacherId());
+								exercisesSituationDto.setEducationalTeacherName(studentEduTeacherDto.getEducationalTeacherName());
+								break;
+							}
+						}
+					}
+				}
 			}
 		}
 		if (count == 0) {
@@ -90,11 +122,14 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 			pageInfo.setTotal(count);
 			params.put("offset", pageInfo.getOffset());
 			dataList = studentExtracurricularExercisesSituationDao.findExercisesSituations(params);
+			Map<Integer, Long> studentVipCourseMap=new HashMap<>();
 			if(Objects.isNull(queryInfo.getExistVipCourse())){
 				List<Integer> studentIds = dataList.stream().map(StudentExtracurricularExercisesSituation::getStudentId).collect(Collectors.toList());
 				List<Map<Integer, Long>> studentVipCoursesMaps = courseScheduleDao.countStudentVipCoursesWithDate(studentIds, queryInfo.getMonday(), queryInfo.getSunday(),GroupType.VIP);
-				Map<Integer, Long> studentVipCourseMap = MapUtil.convertIntegerMap(studentVipCoursesMaps);
-				for (StudentExercisesSituationDto exercisesSituationDto : dataList) {
+				studentVipCourseMap = MapUtil.convertIntegerMap(studentVipCoursesMaps);
+			}
+			for (StudentExercisesSituationDto exercisesSituationDto : dataList) {
+				if(Objects.isNull(queryInfo.getExistVipCourse())){
 					Long vipCourses=studentVipCourseMap.get(exercisesSituationDto.getStudentId());
 					if(Objects.isNull(vipCourses)||vipCourses<=0){
 						exercisesSituationDto.setExistVipCourse(0);

+ 6 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dto.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -26,17 +27,6 @@ import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dao.VipGroupDao;
-import com.ym.mec.biz.dal.dto.ConditionDto;
-import com.ym.mec.biz.dal.dto.MusicGroupStudentSignDto;
-import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
-import com.ym.mec.biz.dal.dto.Student4operating;
-import com.ym.mec.biz.dal.dto.StudentManageAccountBaseInfoDto;
-import com.ym.mec.biz.dal.dto.StudentManageBaseInfoOfMusicGroupDto;
-import com.ym.mec.biz.dal.dto.StudentManageCourseListDto;
-import com.ym.mec.biz.dal.dto.StudentManageListDto;
-import com.ym.mec.biz.dal.dto.StudentManageVipGroupClassDto;
-import com.ym.mec.biz.dal.dto.StudentManageVipGroupDto;
-import com.ym.mec.biz.dal.dto.StudentRegisterPerDto;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
@@ -505,4 +495,9 @@ public class StudentManageServiceImpl implements StudentManageService {
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+    @Override
+    public List<BasicUserDto> queryCanAddStudent(String musicGroupId, Long musicGroupPaymentCalenderId) {
+        return studentManageDao.queryCanAddStudent(musicGroupId,musicGroupPaymentCalenderId);
+    }
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.dto.SporadicChargeInfoDto;
 import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentRepair;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.SporadicOrderQueryInfo;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
@@ -53,6 +54,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private PracticeGroupService practiceGroupService;
     @Autowired
     private SysUserCashAccountDao sysUserCashAccountDao;
+    @Autowired
+    private StudentRepairService studentRepairService;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -203,6 +206,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             sporadicChargeInfoService.renewForCallback(order);
         } else if (order.getType().equals(OrderTypeEnum.PRACTICE_GROUP_BUY) || order.getType().equals(OrderTypeEnum.PRACTICE_GROUP_RENEW)) {
             practiceGroupService.orderCallback(order);
+        }else if (order.getType().equals(OrderTypeEnum.REPAIR)) {
+            studentRepairService.orderCallback(order);
         }
     }
 
@@ -236,6 +241,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                     sporadicChargeInfoService.renewForCallback(order);
                 } else if (order.getType().equals(OrderTypeEnum.PRACTICE_GROUP_BUY) || order.getType().equals(OrderTypeEnum.PRACTICE_GROUP_RENEW)) {
                     practiceGroupService.orderCallback(order);
+                }else if (order.getType().equals(OrderTypeEnum.REPAIR)) {
+                    studentRepairService.orderCallback(order);
                 }
             } catch (Exception e) {
                 e.printStackTrace();

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

@@ -609,7 +609,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, studentRegistration.getActualSubjectId());
                 studentAddDto.setCourseFee(musicOneSubjectClassPlan.getFee());
             }
-            Date nextPaymentDate = musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, null, null);
+//            Date nextPaymentDate = musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, null, null);
 
             StudentPaymentOrder waitPayOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.WAIT_PAY);
 
@@ -656,7 +656,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             }
             musicGroupStudentFeeDao.insert(new MusicGroupStudentFee(musicGroupId,
                     userId, studentRegistration.getSubjectId(), studentAddDto.getCourseFee(),
-                    nextPaymentDate, studentAddDto.getTemporaryCourseFee(), paymentStatus));
+                    null, studentAddDto.getTemporaryCourseFee(), paymentStatus));
+//            musicGroupStudentFeeDao.insert(new MusicGroupStudentFee(musicGroupId,
+//                    userId, studentRegistration.getSubjectId(), studentAddDto.getCourseFee(),
+//                    nextPaymentDate, studentAddDto.getTemporaryCourseFee(), paymentStatus));
             musicGroupStudentFeeDao.updateCalender(userId, musicGroupId);
             studentPaymentOrder.setExpectAmount(reduce);
             //当前学员是否以前存在过当前乐团
@@ -1041,4 +1044,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
         return students;
     }
+
+    @Override
+    public List<Subject> findMusicGroupAllStudentSubjects(String musicGroupId) {
+        return studentRegistrationDao.findMusicGroupAllStudentSubjects(musicGroupId);
+    }
 }

+ 185 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java

@@ -2,32 +2,26 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dao.StudentRepairDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.StudentManageListDto;
-import com.ym.mec.biz.dal.entity.Group;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentRepair;
-import com.ym.mec.biz.dal.enums.DealStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
-import com.ym.mec.biz.service.PayService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentRepairService;
-import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
@@ -49,7 +43,14 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
     private SysConfigDao sysConfigDao;
     @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
-
+    @Autowired
+    private SysUserCashAccountService sysUserCashAccountService;
+    @Autowired
+    private SysUserCashAccountDetailService sysUserCashAccountDetailService;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private StudentDao studentDao;
 
     @Override
     public BaseDAO<Integer, StudentRepair> getDAO() {
@@ -86,6 +87,16 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Map addRepair(StudentRepair repairInfo) throws Exception {
+        studentDao.lockUser(repairInfo.getEmployeeId());
+        if (repairInfo.getSendType() != null && repairInfo.getSendType().equals(1) &&
+                (repairInfo.getContactName() == null || repairInfo.getContactName().isEmpty()) &&
+                (repairInfo.getContactMobile() == null || repairInfo.getContactMobile().isEmpty()) &&
+                (repairInfo.getAddress() == null || repairInfo.getAddress().isEmpty())
+        ) {
+            throw new BizException("邮寄信息必填");
+        }
+        SysUser student = sysUserFeignService.queryUserById(repairInfo.getStudentId());
+        repairInfo.setOrganId(student.getOrganId());
 
         Date date = new Date();
         BigDecimal amount = repairInfo.getAmount();
@@ -121,6 +132,22 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         studentPaymentOrderService.insert(studentPaymentOrder);
         studentPaymentOrder.setVersion(0);
 
+        if (repairInfo.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(repairInfo.getStudentId());
+            if (userCashAccount == null) {
+                throw new BizException("用户账户找不到");
+            }
+            if (userCashAccount.getBalance() != null && userCashAccount.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal balance = amount.compareTo(userCashAccount.getBalance()) >= 0 ? userCashAccount.getBalance() : amount;
+                amount = amount.subtract(balance);
+                studentPaymentOrder.setActualAmount(amount);
+                studentPaymentOrder.setBalancePaymentAmount(balance);
+                sysUserCashAccountService.updateBalance(repairInfo.getStudentId(), balance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐器维修");
+            }
+        }
+        studentPaymentOrderService.update(studentPaymentOrder);
+        studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
+
         if (amount.compareTo(BigDecimal.ZERO) == 0) {
             Map<String, String> notifyMap = new HashMap<>();
             notifyMap.put("tradeState", "1");
@@ -128,10 +155,11 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             notifyMap.put("channelType", channelType);
             notifyMap.put("orderNo", "");
             studentPaymentOrderService.updateOrder(notifyMap);
+            notifyMap.put("orderNo", orderNo);
             return notifyMap;
         }
 
-        String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.EDU_TEACHER_BASE_URL);
+        String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
 
         Map<String, BigDecimal> classFee = new HashMap<>();
         classFee.put("course", BigDecimal.ZERO);
@@ -142,8 +170,8 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         Map payMap = payService.getPayMap(
                 amount,
                 orderNo,
-                baseApiUrl + "/api-web/studentOrder/notify",
-                baseApiUrl + "/api-web/studentOrder/paymentResult?orderNo=" + orderNo,
+                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/paymentResult?type=edu&orderNo=" + orderNo,
                 "乐器维修",
                 "乐器维修",
                 repairInfo.getStudentId(),
@@ -169,7 +197,8 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         if (sysUser == null) {
             throw new BizException("用户信息获取失败");
         }
-        StudentRepair studentRepair = studentRepairDao.get(id);
+        studentDao.lockUser(sysUser.getId());
+        StudentRepair studentRepair = studentRepairDao.getRepairInfo(id);
         if (studentRepair == null) {
             throw new BizException("维修信息不存在");
         }
@@ -180,6 +209,27 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         studentRepair.setUpdateTime(new Date());
         studentRepair.setDescription(description);
         studentRepairDao.update(studentRepair);
+
+        if (repairStatus != null) {
+            SysUser student = sysUserFeignService.queryUserById(studentRepair.getStudentId());
+            Map<Integer, String> map = new HashMap();
+            map.put(student.getId(), student.getId().toString());
+
+            String imContent = student.getUsername() + "您的乐器已保养维修完毕,请安排时间来维修点取回\n" +
+                    "联系人:" + studentRepair.getEmployeeName() + "(" + studentRepair.getEmployeePhone() + ")\n" +
+                    "地址:" + studentRepair.getEmployeeAddress();
+
+            if (studentRepair.getSendType().equals(0)) {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_REPAIR_UNSEND_COMPLETED, map, null, 0, "1", "STUDENT",
+                        student.getUsername(), studentRepair.getEmployeeName(), studentRepair.getEmployeePhone(), studentRepair.getEmployeeAddress());
+            } else {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_REPAIR_SEND_COMPLETED, map, null, 0, "1", "STUDENT",
+                        student.getUsername());
+                imContent = student.getUsername() + "学员您好,您的乐器已保养维修完毕,快递已寄出,请注意查收。";
+            }
+
+            sysMessageService.sendPrivateMessage(student.getId().toString(), imContent);
+        }
         log.info("操作人 :" + sysUser.getId());
     }
 
@@ -205,8 +255,10 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         }
         Date date = new Date();
         StudentRepair studentRepair = studentRepairDao.get(repairInfo.getId());
+        studentDao.lockUser(studentRepair.getStudentId());
         BigDecimal amount = studentRepair.getAmount();
         String orderNo = idGeneratorService.generatorId("payment") + "";
+        studentRepair.setIsUseBalancePayment(repairInfo.getIsUseBalancePayment());
         studentRepair.setTransNo(orderNo);
         studentRepair.setRepairStatus(0);
         studentRepair.setPayStatus(1);
@@ -236,6 +288,22 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         studentPaymentOrderService.insert(studentPaymentOrder);
         studentPaymentOrder.setVersion(0);
 
+        if (studentRepair.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(studentRepair.getStudentId());
+            if (userCashAccount == null) {
+                throw new BizException("用户账户找不到");
+            }
+            if (userCashAccount.getBalance() != null && userCashAccount.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal balance = amount.compareTo(userCashAccount.getBalance()) >= 0 ? userCashAccount.getBalance() : amount;
+                amount = amount.subtract(balance);
+                studentPaymentOrder.setActualAmount(amount);
+                studentPaymentOrder.setBalancePaymentAmount(balance);
+                sysUserCashAccountService.updateBalance(studentRepair.getStudentId(), balance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐器维修");
+            }
+        }
+        studentPaymentOrderService.update(studentPaymentOrder);
+        studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
+
         if (amount.compareTo(BigDecimal.ZERO) == 0) {
             Map<String, String> notifyMap = new HashMap<>();
             notifyMap.put("tradeState", "1");
@@ -243,6 +311,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             notifyMap.put("channelType", channelType);
             notifyMap.put("orderNo", "");
             studentPaymentOrderService.updateOrder(notifyMap);
+            notifyMap.put("orderNo", orderNo);
             return notifyMap;
         }
 
@@ -286,4 +355,103 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         return repairer;
     }
 
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public Boolean orderCallback(StudentPaymentOrder studentPaymentOrder) {
+        Date nowDate = new Date();
+        //更新订单信息
+        studentPaymentOrder.setUpdateTime(nowDate);
+        int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
+        if (updateCount <= 0) {
+            throw new BizException("订单更新失败");
+        }
+        //更新维修单信息
+        StudentRepair repairInfo = getRepairInfo(Integer.parseInt(studentPaymentOrder.getMusicGroupId()));
+        if (repairInfo == null) {
+            throw new BizException("维修单不存在");
+        }
+
+        Integer userId = studentPaymentOrder.getUserId();
+
+        Map<Integer, String> map = new HashMap();
+        map.put(userId, userId.toString());
+
+        if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+            repairInfo.setPayStatus(2);
+            repairInfo.setUpdateTime(nowDate);
+            if (this.update(repairInfo) <= 0) {
+                throw new BizException("维修单更新失败");
+            }
+
+            //插入交易明细
+            BigDecimal amount = studentPaymentOrder.getActualAmount();
+            SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
+            //充值
+            SysUserCashAccountDetail rechargeDetail = new SysUserCashAccountDetail();
+            rechargeDetail.setAmount(amount);
+            rechargeDetail.setBalance(cashAccount.getBalance().add(amount));
+            rechargeDetail.setComment("缴费前充值");
+            rechargeDetail.setCreateTime(nowDate);
+            rechargeDetail.setStatus(DealStatusEnum.SUCCESS);
+            rechargeDetail.setTransNo(studentPaymentOrder.getTransNo());
+            rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
+            rechargeDetail.setUpdateTime(nowDate);
+            rechargeDetail.setUserId(userId);
+            rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+            rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
+            rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
+            sysUserCashAccountDetailService.insert(rechargeDetail);
+
+            //缴费
+            SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
+            paymentDetail.setAmount(amount.negate());
+            paymentDetail.setBalance(cashAccount.getBalance());
+            paymentDetail.setComment("乐器维修");
+            paymentDetail.setCreateTime(nowDate);
+            paymentDetail.setStatus(DealStatusEnum.SUCCESS);
+            paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
+            paymentDetail.setType(PlatformCashAccountDetailTypeEnum.PAY_FEE);
+            paymentDetail.setUpdateTime(nowDate);
+            paymentDetail.setUserId(userId);
+            rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+            if (studentPaymentOrder.getComAmount() != null) {
+                rechargeDetail.setComAmount(studentPaymentOrder.getComAmount().negate());
+                rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
+            }
+            sysUserCashAccountDetailService.insert(paymentDetail);
+
+            String imContent = repairInfo.getStudentName() + "学员您好,您的乐器维修已受理,我们会尽快完成保养维修";
+
+            if (repairInfo.getType().equals(1)) { //线上
+                imContent = repairInfo.getStudentName() + "学员您好,请尽快寄送乐器至维修点,我们会尽快完成保养维修\n" +
+                        "联系人:" + repairInfo.getEmployeeName() + "(" + repairInfo.getEmployeePhone() + ")\n" +
+                        "地址:" + repairInfo.getEmployeeAddress() + "";
+
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_REPAIR_ONLINE_PAYMENT_SUCCESS, map, null, 0, "1", "STUDENT",
+                        repairInfo.getStudentName(), repairInfo.getEmployeeName(), repairInfo.getEmployeePhone(), repairInfo.getEmployeeAddress());
+            } else {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_REPAIR_OFFLINE_PAYMENT_SUCCESS, map, null, 0, "1", "STUDENT",
+                        repairInfo.getStudentName());
+            }
+            sysMessageService.sendNoAuthPrivateMessage(repairInfo.getEmployeeId().toString(), userId.toString(), imContent);
+            return true;
+        }
+
+        if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
+            repairInfo.setPayStatus(0);
+            repairInfo.setUpdateTime(nowDate);
+            if (this.update(repairInfo) <= 0) {
+                throw new BizException("维修单更新失败");
+            }
+            if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+                sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐器维修支付失败");
+            }
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_SPORADIC_PAYMENT_FAILED, map, null, 0, "", "STUDENT",
+                    studentPaymentOrder.getActualAmount(), "乐器维修");
+            return false;
+        }
+        return false;
+    }
+
 }

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

@@ -12,6 +12,8 @@ import com.ym.mec.biz.dal.enums.SendStatusEnum;
 import com.ym.mec.biz.service.SysMessageConfigService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.entity.ImGroupMessage;
+import com.ym.mec.common.entity.ImPlayMidiMessage;
 import com.ym.mec.common.entity.ImPrivateMessage;
 import com.ym.mec.common.entity.ImTxtMessage;
 import com.ym.mec.common.exception.BizException;
@@ -21,7 +23,6 @@ import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.string.MessageFormatter;
-
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -191,6 +192,41 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		imFeignService.privateSend(privateMessage);
 	}
 
+	/*@Override
+	public void batchSendImPlayMidiMessage(String senderId,String roomId, String content) {
+		ImGroupMessage groupMessage = new ImGroupMessage();
+		privateMessage.setObjectName("DY:PlayMidiMessage");
+		groupMessage.setTargetId(roomId.split(","));
+		groupMessage.setSenderId(senderId);
+		groupMessage.setContent(new ImPlayMidiMessage(content,null));
+		groupMessage.setType("DY:PlayMidiMessage");
+		imFeignService.privateSendCustom(groupMessage);
+	}*/
+
+	@Override
+	public void sendPrivateMessage(String studentId, String content) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if(sysUser == null){
+			throw new BizException("用户信息获取失败");
+		}
+		ImPrivateMessage privateMessage = new ImPrivateMessage();
+		privateMessage.setObjectName("RC:TxtMsg");
+		privateMessage.setTargetId(studentId.split(","));
+		privateMessage.setSenderId(sysUser.getId().toString());
+		privateMessage.setContent(new ImTxtMessage(content,null));
+		imFeignService.privateSend(privateMessage);
+	}
+
+	@Override
+	public void sendNoAuthPrivateMessage(String sender, String receiver, String content) {
+		ImPrivateMessage privateMessage = new ImPrivateMessage();
+		privateMessage.setObjectName("RC:TxtMsg");
+		privateMessage.setTargetId(receiver.split(","));
+		privateMessage.setSenderId(sender);
+		privateMessage.setContent(new ImTxtMessage(content,null));
+		imFeignService.privateSend(privateMessage);
+	}
+
 	@Override
 	@Async
 	public boolean batchSendMessage(MessageSender messageSender, String subject, String content, Map<Integer, String> receivers, Date triggerTime,

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

@@ -1,8 +1,11 @@
 package com.ym.mec.biz.service.impl;
 
 import java.math.BigDecimal;
-import java.util.Date;
+import java.util.*;
 
+import com.ym.mec.biz.dal.dto.CashAccountDetail;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.util.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
@@ -77,4 +80,24 @@ public class SysUserCashAccountDetailServiceImpl extends BaseServiceImpl<Long, S
 
 		return true;
 	}
+
+	@Override
+	public PageInfo<SysUserCashAccountDetail> queryAccountDetail(CashAccountDetail queryInfo) {
+		PageInfo<SysUserCashAccountDetail> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<SysUserCashAccountDetail> dataList = null;
+		int count = sysUserCashAccountDetailDao.countAccountDetails(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = sysUserCashAccountDetailDao.queryAccountDetail(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
 }

+ 27 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountServiceImpl.java

@@ -90,13 +90,19 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
             throw new BizException("现金账户[{}]余额不足,可用余额剩{}元", userId, cashAccount.getBalance().doubleValue());
         }
 
+        String comment = memo;
+        if(sysUserFeignService.queryUserInfo() != null){
+            comment = memo + "-" + sysUserFeignService.queryUserInfo().getId();
+        }
+
         Date date = new Date();
 
         SysUserCashAccountDetail detail = new SysUserCashAccountDetail();
         detail.setAmount(decimal);
         detail.setBalance(cashAccount.getBalance().add(decimal));
-        detail.setComment(memo);
+        detail.setComment(comment);
         detail.setCreateTime(date);
+        detail.setDescription(memo);
         detail.setStatus(DealStatusEnum.SUCCESS);
         detail.setType(type);
         detail.setUpdateTime(date);
@@ -175,34 +181,43 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    public boolean updateCourseBalance(Integer userId, BigDecimal decimal, BigDecimal amount, String description) {
+    public boolean updateCourseBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, BigDecimal amount, String description) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
         SysUserCashAccount cashAccount = sysUserCashAccountDao.getLocked(userId);
         if (cashAccount == null) {
             throw new BizException("用户[{}]现金账户不存在", userId);
         }
 
+        amount = decimal.subtract(cashAccount.getCourseBalance());
+        
+        Date date = new Date();
+
         cashAccount.setCourseBalance(decimal);
-        cashAccount.setUpdateTime(new Date());
+        cashAccount.setUpdateTime(date);
 
         sysUserCashAccountDao.update(cashAccount);
 
-        if (amount.compareTo(BigDecimal.ZERO) != 0) {
-            SysUser sysUser = sysUserFeignService.queryUserById(userId);
+        if (amount.compareTo(BigDecimal.ZERO) !=0 ) {
             SysUserCoursesAccountDetail sysUserCoursesAccountDetail = new SysUserCoursesAccountDetail();
             sysUserCoursesAccountDetail.setUserId(userId);
             sysUserCoursesAccountDetail.setAmount(amount);
             sysUserCoursesAccountDetail.setBalance(decimal);
-            sysUserCoursesAccountDetail.setDescription(description + "-" + sysUser.getId());
+            sysUserCoursesAccountDetail.setComment(description + "-" + sysUser.getId());
             sysUserCoursesAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+            sysUserCoursesAccountDetail.setType(type);
+            sysUserCoursesAccountDetail.setUpdateTime(date);
+            sysUserCoursesAccountDetail.setCreateTime(date);
             sysUserCoursesAccountDetailDao.insert(sysUserCoursesAccountDetail);
         }
-
         return true;
     }
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    public boolean appendCourseBalance(Integer userId, BigDecimal decimal, String description) {
+    public boolean appendCourseBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description) {
         SysUserCashAccount cashAccount = sysUserCashAccountDao.getLocked(userId);
         if (cashAccount == null) {
             throw new BizException("用户[{}]现金账户不存在", userId);
@@ -225,8 +240,11 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
             sysUserCoursesAccountDetail.setUserId(userId);
             sysUserCoursesAccountDetail.setAmount(decimal);
             sysUserCoursesAccountDetail.setBalance(balance);
-            sysUserCoursesAccountDetail.setDescription(description + "-" + sysUser.getId());
+            sysUserCoursesAccountDetail.setComment(description + "-" + sysUser.getId());
             sysUserCoursesAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+            sysUserCoursesAccountDetail.setType(type);
+            sysUserCoursesAccountDetail.setUpdateTime(date);
+            sysUserCoursesAccountDetail.setCreateTime(date);
             sysUserCoursesAccountDetailDao.insert(sysUserCoursesAccountDetail);
         }
 

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

@@ -241,7 +241,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	@Transactional(rollbackFor = Exception.class)
 	public void addTeacherAttendanceRecord(Integer courseScheduleId, Integer userId, SignStatusEnum signStatus, boolean updateCourseScheduleStatus) {
 		TeacherAttendance teacherAttendance=teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(),courseScheduleId.longValue());
-		ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId);
+		ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId,0);
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId.longValue());
 
 		if(Objects.isNull(teacherAttendance)){

+ 42 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultMusicGroupSalaryServiceImpl.java

@@ -15,6 +15,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
 import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
 import com.ym.mec.biz.dal.dao.MusicGroupDao;
 import com.ym.mec.biz.dal.dao.TeacherDefaultMusicGroupSalaryDao;
@@ -39,6 +42,9 @@ public class TeacherDefaultMusicGroupSalaryServiceImpl extends BaseServiceImpl<L
 
 	@Autowired
 	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+	
+	@Autowired
+	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
 	@Autowired
 	private MusicGroupDao musicGroupDao;
@@ -84,6 +90,8 @@ public class TeacherDefaultMusicGroupSalaryServiceImpl extends BaseServiceImpl<L
 				}*/
 				salaryMap.put(ms.getCourseScheduleType(), ms);
 			}
+			
+			Map<Integer,Integer> classGroupStudentNumMap = new HashMap<Integer, Integer>();
 
 			if (salaryMap.size() > 0) {
 
@@ -115,33 +123,52 @@ public class TeacherDefaultMusicGroupSalaryServiceImpl extends BaseServiceImpl<L
 								BigDecimal duration = new BigDecimal(DateUtil.minutesBetween(ts.getCourseSchedule().getStartClassTime(), ts.getCourseSchedule()
 										.getEndClassTime()));
 								int mins = 0;
-								if (musicGroup.getSettlementType() == SalarySettlementTypeEnum.GRADIENT_SALARY) {// 3.0课酬
-									mins = 90;
-									if (tdms.getCourseScheduleType() == CourseScheduleType.CLASSROOM) {
-										mins = 40;
-									} else if (tdms.getCourseScheduleType() == CourseScheduleType.HIGH) {
-										mins = 45;
+								if(tdms.getCourseScheduleType() == CourseScheduleType.HIGH_ONLINE) {
+									if (!classGroupStudentNumMap.containsKey(ts.getClassGroupId())) {
+										// 查询 班级人数
+										String[] strs = classGroupStudentMapperDao.findStudentNumByClassGroupId(ts.getClassGroupId());
+										classGroupStudentNumMap.put(ts.getClassGroupId(), strs.length);
+									}
+									String salaryRuleJson = tdms.getSalaryRuleJson();
+									if (StringUtils.isNotBlank(salaryRuleJson)) {
+										JSONObject obj = JSON.parseObject(salaryRuleJson);
+										ts.setExpectSalary(new BigDecimal(obj.getDouble(classGroupStudentNumMap.get(ts.getClassGroupId()) + "")));
+										list.add(ts);
 									}
+									
+								} else if (musicGroup.getSettlementType() == SalarySettlementTypeEnum.GRADIENT_SALARY) {// 3.0课酬
+									mins = 90;
 									// 判断是助教、主教
 									if (ts.getTeacherRole() == TeachTypeEnum.BISHOP) {
-										ts.setExpectSalary(duration.divide(new BigDecimal(mins), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(tdms.getMainTeacher90MinSalary()));
+										if (tdms.getCourseScheduleType() == CourseScheduleType.CLASSROOM || tdms.getCourseScheduleType() == CourseScheduleType.HIGH) {
+											ts.setExpectSalary(tdms.getMainTeacher90MinSalary());
+										}else{
+											ts.setExpectSalary(duration.divide(new BigDecimal(mins), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(tdms.getMainTeacher90MinSalary()));
+										}
 									} else {
-										ts.setExpectSalary(duration.divide(new BigDecimal(mins), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(tdms.getAssistantTeacher90MinSalary()));
+										if (tdms.getCourseScheduleType() == CourseScheduleType.CLASSROOM || tdms.getCourseScheduleType() == CourseScheduleType.HIGH) {
+											ts.setExpectSalary(tdms.getAssistantTeacher90MinSalary());
+										}else{
+											ts.setExpectSalary(duration.divide(new BigDecimal(mins), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(tdms.getAssistantTeacher90MinSalary()));
+										}
 									}
 									list.add(ts);
 								} else if (musicGroup.getSettlementType() == SalarySettlementTypeEnum.TEACHER_DEFAULT) {// 默认课酬
 									mins = 30;
-									if (tdms.getCourseScheduleType() == CourseScheduleType.CLASSROOM) {
-										mins = 40;
-									} else if (tdms.getCourseScheduleType() == CourseScheduleType.HIGH) {
-										mins = 45;
-									}
 									BigDecimal minsDecimal = new BigDecimal(mins);
 									// 判断是助教、主教
 									if (ts.getTeacherRole() == TeachTypeEnum.BISHOP) {
-										ts.setExpectSalary(duration.divide(minsDecimal, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(tdms.getMainTeacher30MinSalary()));
+										if (tdms.getCourseScheduleType() == CourseScheduleType.CLASSROOM || tdms.getCourseScheduleType() == CourseScheduleType.HIGH) {
+											ts.setExpectSalary(tdms.getMainTeacher30MinSalary());
+										}else{
+											ts.setExpectSalary(duration.divide(minsDecimal, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(tdms.getMainTeacher30MinSalary()));
+										}
 									} else {
-										ts.setExpectSalary(duration.divide(minsDecimal, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(tdms.getAssistantTeacher30MinSalary()));
+										if (tdms.getCourseScheduleType() == CourseScheduleType.CLASSROOM || tdms.getCourseScheduleType() == CourseScheduleType.HIGH) {
+											ts.setExpectSalary(tdms.getAssistantTeacher30MinSalary());
+										}else{
+											ts.setExpectSalary(duration.divide(minsDecimal, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(tdms.getAssistantTeacher30MinSalary()));
+										}
 									}
 									list.add(ts);
 								}

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

@@ -63,8 +63,6 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 	@Autowired
 	private ImFeignService imFeignService;
 	@Autowired
-	private SysConfigDao configDao;
-	@Autowired
 	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
 	@Autowired
 	private StudentDao studentDao;

+ 7 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -382,6 +382,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		    courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
 			courseSchedule.setClassGroupId(classGroup.getId());
 			courseSchedule.setName(vipGroupApplyBaseInfoDto.getName());
+			courseSchedule.setOrganId(vipGroupApplyBaseInfoDto.getOrganId());
 		});
 		courseScheduleService.checkNewCourseSchedules(vipGroup.getCourseSchedules(),false);
 		vipGroupApplyBaseInfoDto.setCourseSchedulesJson(JSON.toJSONString(vipGroup.getCourseSchedules()));
@@ -1638,7 +1639,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         studentPauseInfoDao.insert(studentPauseInfo);
 
-        sysUserCashAccountService.appendCourseBalance(studentId, surplusCourseFee,"学生休学剩余课时转化为课程余额");
+        sysUserCashAccountService.appendCourseBalance(studentId, surplusCourseFee,PlatformCashAccountDetailTypeEnum.REFUNDS,"学生休学剩余课时转化为课程余额");
 		classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT_SCHOOL);
 		classGroupStudentMapperDao.update(classStudentMapperByUserIdAndClassGroupId);
 
@@ -1750,6 +1751,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				if(newCourseSchedules.get(i).getTeachMode().equals(TeachModeEnum.OFFLINE)){
 					newCourseSchedules.get(i).setSchoolId(vipGroup.getTeacherSchoolId());
 				}
+				newCourseSchedules.get(i).setOrganId(vipGroup.getOrganId());
 			}
 			courseScheduleService.batchAddCourseSchedule(newCourseSchedules);
 
@@ -1804,7 +1806,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(!CollectionUtils.isEmpty(courseScheduleStudentPaymentList)){
 			courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPaymentList);
 		}
-		sysUserCashAccountService.appendCourseBalance(studentRecoverInfo.getUserId(), surplusCourseFee.negate(), "学生复学扣除课程余额");
+		sysUserCashAccountService.appendCourseBalance(studentRecoverInfo.getUserId(), surplusCourseFee.negate(),PlatformCashAccountDetailTypeEnum.PAY_FEE, "学生复学扣除课程余额");
 		studentPauseInfo.setDelFlag(1);
 		studentPauseInfoDao.update(studentPauseInfo);
         vipGroup.setStatus(VipGroupStatusEnum.PROGRESS);
@@ -2363,6 +2365,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			courseSchedule.setGroupType(GroupType.VIP);
 			courseSchedule.setMusicGroupId(vipGroup.getId().toString());
 			courseSchedule.setName(vipGroup.getName());
+			courseSchedule.setOrganId(vipGroup.getOrganId());
 //			if (courseSchedule.getTeachMode().equals(TeachModeEnum.ONLINE)) {
 //				surplusCourseTotalPrice = surplusCourseTotalPrice.add(onlineCoursePrice);
 //			} else if (courseSchedule.getTeachMode().equals(TeachModeEnum.OFFLINE)) {
@@ -2436,7 +2439,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				courseScheduleStudentPayment.setUpdateTime(now);
 				courseScheduleStudentPayments.add(courseScheduleStudentPayment);
 			}
-			sysUserCashAccountService.updateCourseBalance(classGroupStudent.getUserId(),sysUserCashAccount.getCourseBalance().subtract(surplusCourseTotalPrice),surplusCourseTotalPrice.negate(),"后台加课扣除课程余额");
+			sysUserCashAccountService.updateCourseBalance(classGroupStudent.getUserId(),sysUserCashAccount.getCourseBalance().subtract(surplusCourseTotalPrice),PlatformCashAccountDetailTypeEnum.PAY_FEE,surplusCourseTotalPrice.negate(),"后台加课扣除课程余额");
 
 			courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
 			imGroupMemberList.add(new ImGroupMember(classGroupStudent.getUserId().toString()));
@@ -2655,7 +2658,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			}
 			courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
 
-			sysUserCashAccountService.updateCourseBalance(studentId,sysUserCashAccount.getCourseBalance().subtract(surplusCoursesPrice), surplusCoursesPrice.negate(), "后台添加学员扣除课程余额");
+			sysUserCashAccountService.updateCourseBalance(studentId,sysUserCashAccount.getCourseBalance().subtract(surplusCoursesPrice),PlatformCashAccountDetailTypeEnum.PAY_FEE, surplusCoursesPrice.negate(), "后台添加学员扣除课程余额");
 
 			//创建班级学生关联记录
 			ClassGroupStudentMapper classGroupStudentMapper;

+ 51 - 12
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -22,10 +22,6 @@
         <result column="total_class_times_" property="totalClassTimes"/>
         <result column="img_" property="img"/>
         <result column="current_class_times_" property="currentClassTimes"/>
-        <!--<association property="musicGroupId" javaType="com.ym.mec.biz.dal.entity.MusicGroup" >-->
-        <!--<result column="name_" property="name"/>-->
-        <!--<result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>-->
-        <!--</association>-->
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.entity.ClassGroup4Teacher" id="ClassGroup4Teacher">
@@ -151,15 +147,54 @@
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="ClassGroup" parameterType="map">
-        SELECT * FROM class_group where del_flag_ = 0 ORDER BY id_
+        SELECT * FROM class_group 
+        <where>
+        	<if test="delFlag != null">
+				and del_flag_ = #{delFlag}
+			</if>
+        	<if test="id != null">
+				and id_ = #{id}
+			</if>
+        	<if test="type != null">
+				and type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+        	<if test="groupType != null">
+				and group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+        	<if test="musicGroupId != null and musicGroupId != ''">
+				and music_group_id_ = #{musicGroupId}
+			</if>
+        	<if test="name != null and name != ''">
+				and name_ LIKE CONCAT('%',#{name},'%')
+			</if>
+        </where>
+        ORDER BY id_ desc
         <include refid="global.limit"/>
     </select>
 
     <!-- 查询当前表的总记录数 -->
     <select id="queryCount" resultType="int">
-        SELECT COUNT(*)
-        FROM class_group
-        where del_flag_ = 0
+        SELECT COUNT(*) FROM class_group
+        <where>
+        	<if test="delFlag != null">
+				and del_flag_ = #{delFlag}
+			</if>
+        	<if test="id != null">
+				and id_ = #{id}
+			</if>
+        	<if test="type != null">
+				and type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+        	<if test="groupType != null">
+				and group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+        	<if test="musicGroupId != null and musicGroupId != ''">
+				and music_group_id_ = #{musicGroupId}
+			</if>
+        	<if test="name != null and name != ''">
+				and name_ LIKE CONCAT('%',#{name},'%')
+			</if>
+        </where>
     </select>
 
     <!-- 查询根据主教助教查询班级信息 -->
@@ -410,6 +445,7 @@
     <select id="findAllClassGroupByMusicGroup" resultMap="ClassGroup">
         SELECT * FROM class_group cg
         WHERE cg.music_group_id_=#{musicGroupId} AND del_flag_ = '0'
+        AND cg.group_type_='MUSIC'
         <if test="classGroupType != null">
             AND cg.type_ = #{classGroupType}
         </if>
@@ -514,7 +550,7 @@
             mg.id_ music_group_id_,
             mg.name_ music_group_name_,
             s.id_ school_id_,
-            s.name_ school_name_
+            CASE WHEN cg.type_ IN ("HIGH_ONLINE","MUSIC_NETWORK") THEN '网络教室' ELSE s.name_ END school_name_
         FROM
             course_schedule_teacher_salary csts
             LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
@@ -900,7 +936,10 @@
         FROM
         course_schedule cs
         LEFT JOIN class_group cg ON cs.class_group_id_=cg.id_
-        WHERE cs.id_=#{courseScheduleId} AND cg.del_flag_ = 0
+        WHERE cs.id_ = #{courseScheduleId}
+        <if test="delFlag != null">
+            AND cg.del_flag_ = #{delFlag}
+        </if>
     </select>
     <select id="findClassGroupsByMixClassGroup" resultMap="ClassGroup">
         SELECT
@@ -933,7 +972,7 @@
         <if test="subjectId != null">
             AND FIND_IN_SET(#{subjectId},subject_id_list_)
         </if>
-        AND type_='HIGH' AND del_flag_='0';
+        AND type_ IN ('HIGH','HIGH_ONLINE') AND del_flag_='0';
     </select>
     <select id="findByMusicGroupAndType" resultMap="ClassGroup">
         SELECT
@@ -1194,7 +1233,7 @@
         WHERE su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.id_=#{search}
     </select>
     <select id="countClassNumByType" resultType="java.lang.Integer">
-        SELECT COUNT(id_) FROM class_group WHERE type_ = 'HIGH' AND del_flag_ = '0'
+        SELECT COUNT(id_) FROM class_group WHERE type_ IN ('HIGH','HIGH_ONLINE') AND del_flag_ = '0'
     </select>
 
     <select id="findClassGroupSubjectNameMaps" resultType="java.util.Map">

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

@@ -366,7 +366,10 @@
     </select>
     
     <select id="queryClassGroupIdList" resultType="int" parameterType="map">
-      SELECT distinct class_group_id_ FROM class_group_student_mapper WHERE user_id_=#{userId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} AND music_group_id_ = #{musicGroupId}
+      SELECT distinct class_group_id_ FROM class_group_student_mapper WHERE user_id_=#{userId}
+        AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        AND music_group_id_ = #{musicGroupId}
+        AND status_ != 'QUIT'
     </select>
 
     <select id="findMusicGroupClassGroupByType" resultMap="ClassGroupStudentMapper">
@@ -451,4 +454,55 @@
             </if>
         </where>
     </select>
+    <select id="getStudentEducationalTeachers" resultType="com.ym.mec.biz.dal.dto.StudentEduTeacherDto">
+        SELECT
+        t.user_id_ studentId,
+        t.educational_teacher_id_ educationalTeacherId,
+        su.real_name_ educationalTeacherName,
+        t.group_type_ groupType
+        FROM
+        (
+        SELECT
+        mgsf.user_id_,
+        g.educational_teacher_id_,
+        'MUSIC' group_type_
+        FROM
+        music_group_student_fee_ mgsf
+        LEFT JOIN music_group g ON mgsf.music_group_id_ = g.id_
+        WHERE
+        mgsf.user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+        UNION ALL
+        SELECT
+        cgsm.user_id_,
+        g.educational_teacher_id_,
+        'VIP' group_type_
+        FROM
+        class_group_student_mapper cgsm
+        LEFT JOIN vip_group g ON cgsm.music_group_id_ = g.id_
+        WHERE
+        cgsm.group_type_ = 'VIP'
+        AND cgsm.user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+        UNION ALL
+        SELECT
+        cgsm.user_id_,
+        g.educational_teacher_id_,
+        'PRACTICE' group_type_
+        FROM
+        class_group_student_mapper cgsm
+        LEFT JOIN practice_group g ON cgsm.music_group_id_ = g.id_
+        WHERE
+        cgsm.group_type_ = 'PRACTICE'
+        AND cgsm.user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+        ) t
+        LEFT JOIN sys_user su ON t.educational_teacher_id_=su.id_
+    </select>
 </mapper>

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/ClassGroupTeacherMapperMapper.xml

@@ -198,4 +198,10 @@
             AND teacher_role_ = #{teacherRole}
         </if>
     </select>
+    <select id="getClassGroupTeachersRole" resultMap="ClassGroupTeacherMapper">
+        SELECT u.real_name_, ct.*
+        FROM sys_user u,
+        class_group_teacher_mapper ct
+        WHERE u.id_ = ct.user_id_ AND ct.class_group_id_ = #{classGroupId} AND ct.teacher_role_ = #{teacherRole} LIMIT 1
+    </select>
 </mapper>

+ 68 - 20
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -33,6 +33,7 @@
         <result column="class_group_type_" property="classGroupType"/>
         <result column="teaching_content_" property="teachingContent"/>
         <result column="note_" property="note"/>
+        <result column="organ_id_" property="organId"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -44,6 +45,7 @@
         <result column="course_start_time_" property="startClassTime"/>
         <result column="course_end_time_" property="endClassTime"/>
         <result column="settlement_time_" property="settlementTime"/>
+        <result column="organ_name_" property="organName"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.CourseScheduleDto" id="courseScheduleDto" extends="CourseSchedule">
@@ -128,7 +130,8 @@
                leave_student_num_,
                teaching_content_,
                note_,
-               schoole_id_
+               schoole_id_,
+               organ_id_
         FROM course_schedule
         WHERE id_ = #{id}
     </select>
@@ -149,9 +152,15 @@
         </selectKey>
         -->
         INSERT INTO course_schedule
-        (id_,group_type_,music_group_id_,class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,teacher_id_,actual_teacher_id_,create_time_,update_time_,type_,name_,teach_mode_,student_num_,leave_student_num_,schoole_id_,is_lock_,note_,teaching_content_)
-        VALUES(#{id},#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{classGroupId},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{subsidy},#{classDate},#{startClassTime},#{endClassTime},#{teacherId},#{teacherId},now(),now(),
-        #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{name},#{teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{studentNum},#{leaveStudentNum},#{schoolId},#{isLock},#{note},#{teachingContent})
+        (id_,group_type_,music_group_id_,class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,
+        teacher_id_,actual_teacher_id_,create_time_,update_time_,type_,name_,teach_mode_,student_num_,leave_student_num_,
+        schoole_id_,is_lock_,note_,teaching_content_,organ_id_)
+        VALUES(#{id},#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{classGroupId},
+        #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{subsidy},#{classDate},#{startClassTime},
+        #{endClassTime},#{teacherId},#{teacherId},now(),now(),
+        #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{name},
+        #{teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{studentNum},#{leaveStudentNum},
+        #{schoolId},#{isLock},#{note},#{teachingContent},#{organId})
     </insert>
 
     <insert id="batchAddCourseSchedules" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id"
@@ -159,7 +168,7 @@
         INSERT INTO course_schedule
         (group_type_,music_group_id_,class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,
         teacher_id_,actual_teacher_id_,create_time_,update_time_,type_,name_,teach_mode_,student_num_,leave_student_num_,
-        schoole_id_,is_lock_,note_,teaching_content_)
+        schoole_id_,is_lock_,note_,teaching_content_,organ_id_)
         VALUE
         <foreach collection="list" item="course" separator=",">
             (#{course.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.musicGroupId},
@@ -167,7 +176,7 @@
             #{course.subsidy},#{course.classDate},#{course.startClassTime},#{course.endClassTime},#{course.teacherId},
             #{course.teacherId},now(),now(),#{course.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{course.name},#{course.teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.studentNum},
-            #{course.leaveStudentNum},#{course.schoolId},#{course.isLock},#{course.note},#{course.teachingContent})
+            #{course.leaveStudentNum},#{course.schoolId},#{course.isLock},#{course.note},#{course.teachingContent},#{course.organId})
         </foreach>
     </insert>
 
@@ -175,6 +184,9 @@
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.CourseSchedule">
         UPDATE course_schedule
         <set>
+            <if test="organId != null">
+                organ_id_ = #{organId},
+            </if>
             <if test="note != null">
                 note_ = #{note},
             </if>
@@ -1468,12 +1480,13 @@
         ORDER BY CONCAT(cs.class_date_,' ',cs.start_class_time_)
     </select>
     <!-- 查找班级未开始的课程 -->
-    <select id="findNoStartCoursesByClassGroupId" resultMap="CourseSchedule">
+    <select id="findCoursesByClassGroupId" resultMap="CourseSchedule">
         SELECT *
         FROM course_schedule
         WHERE class_group_id_ = #{classGroupId}
-          AND status_ = 'NOT_START'
-          AND group_type_ = 'MUSIC'
+        <if test="status != null">
+            and status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        </if>
     </select>
 
     <resultMap id="CourseAttendanceDetailHeadInfoDto" type="com.ym.mec.biz.dal.dto.CourseAttendanceDetailHeadInfoDto">
@@ -1910,7 +1923,6 @@
         WHERE cg.music_group_id_ = #{musicGroupId}
           AND cs.group_type_ = #{groupType}
           AND status_ = #{status}
-          AND cs.type_ != 'HIGH'
     </select>
     <select id="findMusicGroupCourseSchedulesWithStudent" resultMap="CourseSchedule">
         SELECT cs.*
@@ -2227,12 +2239,6 @@
         <where>
             (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
             <include refid="queryVipCourseScheduleIds"/>
-            <if test="classGroupIds != null">
-                AND cs.class_group_id_ IN
-                <foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
-                    #{classGroupId}
-                </foreach>
-            </if>
         </where>
     </sql>
 
@@ -2250,10 +2256,12 @@
             cs.teach_mode_,
             cs.type_,
             cs.schoole_id_,
-            s.name_ schoole_name_
+            s.name_ schoole_name_,
+            o.name_ organ_name_
         FROM
             course_schedule cs
             LEFT JOIN school s ON cs.schoole_id_=s.id_
+            LEFT JOIN organization o ON cs.organ_id_=o.id_
         <include refid="endFindCourseSchedulesCondition"/>
         ORDER BY course_start_time_,cs.id_
         <include refid="global.limit"/>
@@ -2363,6 +2371,12 @@
         <if test="teacherIdList != null">
             AND cs.actual_teacher_id_=#{teacherIdList}
         </if>
+        <if test="organIdList!=null">
+            AND FIND_IN_SET(cs.organ_id_,#{organIdList})
+        </if>
+        <if test="search!=null">
+            AND (cs.music_group_id_=#{search} OR cs.id_=#{search} OR cs.name_ LIKE CONCAT( '%', #{search}, '%' ))
+        </if>
     </sql>
     <select id="queryPracticeCourseScheduleIds" resultType="java.lang.Integer">
         SELECT cs.id_ FROM course_schedule cs
@@ -2451,6 +2465,7 @@
           AND cs.class_date_ BETWEEN DATE_FORMAT(#{startTime}, "%Y-%m-%d") AND DATE_FORMAT(#{endTime}, "%Y-%m-%d")
           AND csts.user_id_ = #{userId}
     </select>
+
     <select id="findStudentPracticeCourses" resultMap="courseScheduleDto">
         SELECT cs.id_                                            seal_class_id_,
                cs.type_,
@@ -2622,6 +2637,28 @@
         </foreach>
         AND ( cs.del_flag_ != 1 OR cs.del_flag_ IS NULL )
     </select>
+    <select id="findUserCourses3" resultMap="CourseSchedule">
+        SELECT
+        cs.id_,
+        cs.group_type_,
+        cgtm.`user_id_` teacher_id_
+        FROM
+        `class_group_student_mapper` cgsm
+        LEFT JOIN `class_group` cg ON cgsm.`class_group_id_` = cg.`id_`
+        LEFT JOIN `class_group_teacher_mapper` cgtm ON cgtm.`class_group_id_` = cg.`id_`
+        AND cgtm.`teacher_role_` = 'BISHOP'
+        LEFT JOIN `course_schedule` cs ON cs.`class_group_id_` = cg.`id_`
+        WHERE
+        cgtm.teacher_role_='BISHOP'
+        AND cgsm.status_ = 'NORMAL'
+        AND cg.group_type_ IN ( 'PRACTICE', 'MUSIC', 'VIP' )
+        AND cs.`id_` IS NOT NULL
+        AND cgtm.user_id_ IN
+        <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+            #{teacherId}
+        </foreach>
+        AND ( cs.del_flag_ != 1 OR cs.del_flag_ IS NULL )
+    </select>
     <select id="findUserCoursesWithPay" resultMap="CourseSchedule">
         SELECT
         cs.id_,
@@ -2817,8 +2854,13 @@
                cs.status_
         FROM course_schedule cs
                  LEFT JOIN course_schedule_evaluate cse ON cs.id_ = cse.course_schedule_id_
-        WHERE cs.music_group_id_ = #{groupId}
-          AND cs.group_type_ = #{groupType}
+        WHERE cs.group_type_ = #{groupType}
+        <if test="groupId != null">
+            AND cs.music_group_id_ = #{groupId}
+        </if>
+        <if test="classGroupId != null">
+            AND cs.class_group_id_ = #{classGroupId}
+        </if>
         GROUP BY cs.id_
         ORDER BY cs.class_date_, cs.start_class_time_ ASC
     </select>
@@ -2906,7 +2948,13 @@
         UPDATE course_schedule
         SET name_=#{name}
         WHERE group_type_ = #{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-          AND music_group_id_ = #{groupId};
+          AND music_group_id_ = #{groupId}
+    </update>
+    <update id="resetStudentNum">
+        UPDATE course_schedule cs SET cs.student_num_ = 0 WHERE cs.id_ IN
+        <foreach collection="courseScheduleId" separator="," open="(" close=")" item="id">
+            #{id}
+        </foreach>
     </update>
 
     <select id="getStudentCourseScheduleNum" resultMap="com.ym.mec.biz.dal.dao.PracticeGroupDao.courseGroupExport">

Некоторые файлы не были показаны из-за большого количества измененных файлов