Parcourir la source

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

zouxuan il y a 4 ans
Parent
commit
512fada175
100 fichiers modifiés avec 1905 ajouts et 532 suppressions
  1. 9 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  3. 11 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/PracticeGroupDao.java
  4. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java
  5. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserCashAccountDetailDao.java
  6. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserCoursesAccountDetailDao.java
  7. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java
  8. 74 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentErrorLeaveDto.java
  9. 117 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLeaveCourseDto.java
  10. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendancesDto.java
  11. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherIncomeDto.java
  12. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherServeDto.java
  13. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupApplyDto.java
  14. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java
  15. 30 18
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSubjectPlan.java
  16. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCashAccountDetail.java
  17. 35 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCoursesAccountDetail.java
  18. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  19. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/DeductReasonEnum.java
  20. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexErrorType.java
  21. 126 131
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  22. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TeachIncomeTypeEnum.java
  23. 48 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentErrorLeaveQueryInfo.java
  24. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentExercisesSituationQueryInfo.java
  25. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherServeQueryInfo.java
  26. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  27. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SoundService.java
  28. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  29. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  30. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentVisitService.java
  31. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  32. 8 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  33. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  34. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java
  35. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleEvaluateServiceImpl.java
  36. 94 39
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  37. 114 77
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  38. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java
  39. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java
  40. 7 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java
  41. 6 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  42. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesMessageServiceImpl.java
  43. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  44. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  45. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java
  46. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  47. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/InspectionItemPlanServiceImpl.java
  48. 6 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  49. 26 25
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  50. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OnlineMusicGroupServiceImpl.java
  51. 10 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  52. 7 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ReplacementInstrumentActivityServiceImpl.java
  53. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ReplacementInstrumentCooperationServiceImpl.java
  54. 249 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundServiceImpl.java
  55. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  56. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkReplyServiceImpl.java
  57. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  58. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  59. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentInstrumentServiceImpl.java
  60. 51 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  61. 21 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  62. 5 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  63. 30 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  64. 28 23
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java
  65. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  66. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  67. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultMusicGroupSalaryServiceImpl.java
  68. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultPracticeGroupSalaryServiceImpl.java
  69. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultVipGroupSalaryServiceImpl.java
  70. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherSalaryComplaintsServiceImpl.java
  71. 60 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  72. 4 6
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  73. 10 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  74. 14 6
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  75. 124 4
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  76. 4 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupSubjectPlanMapper.xml
  77. 12 0
      mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml
  78. 3 0
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  79. 18 6
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  80. 12 0
      mec-biz/src/main/resources/config/mybatis/SysUserCashAccountDetailMapper.xml
  81. 14 9
      mec-biz/src/main/resources/config/mybatis/SysUserCoursesAccountDetailMapper.xml
  82. 7 2
      mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml
  83. 15 0
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  84. 6 0
      mec-common/common-core/pom.xml
  85. 4 1
      mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java
  86. 3 3
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  87. 3 3
      mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java
  88. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java
  89. 6 0
      mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java
  90. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java
  91. 6 1
      mec-student/src/main/java/com/ym/mec/student/controller/StudentInstrumentController.java
  92. 5 1
      mec-student/src/main/java/com/ym/mec/student/controller/SubjectChangeController.java
  93. 32 0
      mec-student/src/main/java/com/ym/mec/student/controller/SysMessageController.java
  94. 35 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SoundController.java
  95. 15 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMessageController.java
  96. 6 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMusicScoreController.java
  97. 6 6
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  98. 6 5
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherVipGroupController.java
  99. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  100. 96 3
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

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

@@ -517,6 +517,13 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
                                                             @Param("studentId") Integer studentId);
 
     List<CourseScheduleStudentPayment> getWithGroup(@Param("groupId") String groupId,
-                                                            @Param("groupType") GroupType groupType,
-                                                            @Param("studentIds") List<Integer> studentIds);
+                                                    @Param("groupType") GroupType groupType,
+                                                    @Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * 获取学生VIP课的教务老师
+     *
+     * @return
+     */
+    String getStudentEduTeacher(@Param("studentId") Integer studentId);
 }

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

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.OrganVipGroupCategoryCourseNumDto;
+import com.ym.mec.biz.dal.dto.StudentErrorLeaveDto;
+import com.ym.mec.biz.dal.dto.StudentLeaveCourseDto;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
 import com.ym.mec.biz.dal.entity.IndexErrInfoDto;
 import com.ym.mec.biz.dal.enums.*;
@@ -285,4 +287,14 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
     List<IndexBaseMonthData> getTotalAmountDataWithTimely(@Param("startDate") String startDate,
                                                             @Param("endDate") String endDate,
                                                             @Param("organIds") List<Integer> organIds);
+
+    int countStudentErrorLeave(@Param("organIdList") Set<Integer> organIdList, @Param("format") String format, @Param("classGroupIds") List<Long> classGroupIds);
+
+    int countStudentErrorLeave1(Map<String, Object> params);
+
+    List<StudentErrorLeaveDto> queryStudentErrorLeave(Map<String, Object> params);
+
+    int countStudentLeaveCourseList(Map<String, Object> params);
+
+    List<StudentLeaveCourseDto> queryStudentLeaveCourseList(Map<String, Object> params);
 }

+ 11 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/PracticeGroupDao.java

@@ -170,7 +170,7 @@ public interface PracticeGroupDao extends com.ym.mec.common.dal.BaseDAO<Long, Pr
      */
     List<PracticeGroup> findUserStatusPracticeGroups(@Param("userId") Integer userId,
                                                      @Param("groupStatus") GroupStatusEnum groupStatusEnum,
-                                                     @Param("groupType")PracticeGroupType groupType);
+                                                     @Param("groupType") PracticeGroupType groupType);
 
     /**
      * @param userId:
@@ -366,18 +366,26 @@ public interface PracticeGroupDao extends com.ym.mec.common.dal.BaseDAO<Long, Pr
     List<PracticeGroup> getWithIds(@Param("practiceIds") List<Long> practiceIds);
 
     /**
+     * @param practiceIds:
+     * @return java.util.List<java.util.Map < java.lang.Long, java.lang.String>>
      * @describe 获取网管课类型
      * @author Joburgess
      * @date 2020.08.20
-     * @param practiceIds:
-     * @return java.util.List<java.util.Map<java.lang.Long,java.lang.String>>
      */
     List<Map<Long, String>> getPracticeGroupType(@Param("practiceIds") List<Long> practiceIds);
 
     /**
      * 获取课程关联教务老师名称
+     *
      * @param courseIds
      * @return
      */
     List<Map<Long, String>> queryEduNameMapByCourseId(@Param("courseIds") List<Long> courseIds);
+
+    /**
+     * 获取学生网管课的教务老师
+     *
+     * @return
+     */
+    String getStudentEduTeacher(@Param("studentId") Integer studentId);
 }

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -343,4 +343,10 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return
      */
     List<Map<Integer, Long>> queryLeaveNum(@Param("userIds") Set<Integer> userIds, @Param("month") String month);
+
+    /**
+     * 修改学员请假回访
+     * @param userId
+     */
+    void updateLeaveVisitFlag(Integer userId);
 }

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

@@ -37,4 +37,6 @@ public interface SysUserCashAccountDetailDao extends BaseDAO<Long, SysUserCashAc
      */
     List<SysUserCashAccountDetail> queryAccountDetail(Map<String, Object> params);
     int countAccountDetails(Map<String, Object> params);
+
+    List<SysUserCashAccountDetail> exportDetail(Integer userId);
 }

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

@@ -3,7 +3,10 @@ package com.ym.mec.biz.dal.dao;
 import com.ym.mec.biz.dal.entity.SysUserCoursesAccountDetail;
 import com.ym.mec.common.dal.BaseDAO;
 
+import java.util.List;
+
 public interface SysUserCoursesAccountDetailDao extends BaseDAO<Long, SysUserCoursesAccountDetail> {
 
-	
+
+    List<SysUserCoursesAccountDetail> exportDetail(Integer userId);
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java

@@ -365,4 +365,18 @@ public interface VipGroupDao extends BaseDAO<Long, VipGroup> {
      * @return
      */
     List<Map<Long, String>> queryEduNameMapByCourseId(@Param("courseIds") List<Long> courseIds);
+
+    /**
+     * @describe 统计学员在指定活动上关联的次数
+     * @author Joburgess
+     * @date 2021/5/17 0017
+     * @param vipGroupActivityId:
+     * @param studentId:
+     * @return int
+     */
+    int countStudentUserActivityNum(@Param("vipGroupActivityId") Integer vipGroupActivityId,
+                                    @Param("studentId") Integer studentId);
+
+    int countStudentUseingActivityNum(@Param("vipGroupActivityId") Integer vipGroupActivityId,
+                                    @Param("studentId") Integer studentId);
 }

+ 74 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentErrorLeaveDto.java

@@ -0,0 +1,74 @@
+package com.ym.mec.biz.dal.dto;
+
+public class StudentErrorLeaveDto {
+
+    private String phone;
+
+    private Integer organId;
+
+    private String organName;
+
+    private String studentName;
+
+    private Integer userId;
+
+    private Integer totalNum;
+
+    private Integer currentNum;
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(Integer totalNum) {
+        this.totalNum = totalNum;
+    }
+
+    public Integer getCurrentNum() {
+        return currentNum;
+    }
+
+    public void setCurrentNum(Integer currentNum) {
+        this.currentNum = currentNum;
+    }
+}

+ 117 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLeaveCourseDto.java

@@ -0,0 +1,117 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.enums.GroupType;
+
+public class StudentLeaveCourseDto {
+
+    private Long courseScheduleId;
+
+    private String courseName;
+
+    private String groupId;
+
+    private GroupType groupType;
+
+    private CourseSchedule.CourseScheduleType courseScheduleType;
+
+    private Integer actualTeacherId;
+
+    private String teacherName;
+
+    private String classDate;
+
+    private String startClassTime;
+
+    private String endClassTime;
+
+    private Integer leaveVisitFlag;
+
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public CourseSchedule.CourseScheduleType getCourseScheduleType() {
+        return courseScheduleType;
+    }
+
+    public void setCourseScheduleType(CourseSchedule.CourseScheduleType courseScheduleType) {
+        this.courseScheduleType = courseScheduleType;
+    }
+
+    public Integer getActualTeacherId() {
+        return actualTeacherId;
+    }
+
+    public void setActualTeacherId(Integer actualTeacherId) {
+        this.actualTeacherId = actualTeacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getStartClassTime() {
+        return startClassTime;
+    }
+
+    public void setStartClassTime(String startClassTime) {
+        this.startClassTime = startClassTime;
+    }
+
+    public String getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(String endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+
+    public Integer getLeaveVisitFlag() {
+        return leaveVisitFlag;
+    }
+
+    public void setLeaveVisitFlag(Integer leaveVisitFlag) {
+        this.leaveVisitFlag = leaveVisitFlag;
+    }
+}

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

@@ -79,6 +79,17 @@ public class TeacherAttendancesDto {
     @ApiModelProperty(value = "申述处理状态",required = false)
     private ComplaintsStatusEnum complaintsStatus;
 
+    /** 结算时间 */
+    private java.util.Date settlementTime;
+
+    public Date getSettlementTime() {
+        return settlementTime;
+    }
+
+    public void setSettlementTime(Date settlementTime) {
+        this.settlementTime = settlementTime;
+    }
+
     public String getDisposeContent() {
         return disposeContent;
     }

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

@@ -26,6 +26,8 @@ public class TeacherIncomeDto extends CourseSchedule {
 
     private long sortNum;
 
+    private List<TeacherSalaryDeductReasonDto> incomes;
+
     private List<TeacherSalaryDeductReasonDto> deductReasons;
 
     public long getSortNum() {
@@ -93,4 +95,12 @@ public class TeacherIncomeDto extends CourseSchedule {
     public void setBelongToDaya(Boolean belongToDaya) {
         this.belongToDaya = belongToDaya;
     }
+
+    public List<TeacherSalaryDeductReasonDto> getIncomes() {
+        return incomes;
+    }
+
+    public void setIncomes(List<TeacherSalaryDeductReasonDto> incomes) {
+        this.incomes = incomes;
+    }
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherServeDto.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dto;
 import com.ym.mec.biz.dal.enums.JobNatureEnum;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -51,6 +52,17 @@ public class TeacherServeDto {
     /** 及时训练评价次数 */
     private Integer exercisesMessageTimelyNum;
 
+    @ApiModelProperty(value = "提交率")
+    private String submitRate;
+
+    public String getSubmitRate() {
+        return submitRate;
+    }
+
+    public void setSubmitRate(String submitRate) {
+        this.submitRate = submitRate;
+    }
+
     public Integer getExpectExercisesNum() {
         return expectExercisesNum;
     }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupApplyDto.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.sun.org.apache.xpath.internal.operations.Bool;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
 import io.swagger.annotations.ApiModelProperty;
@@ -24,6 +25,17 @@ public class VipGroupApplyDto {
 
     private BigDecimal singleClassPrice;
 
+    @ApiModelProperty(value = "是否允许超出活动允许的学生使用次数")
+    private Boolean allowOverstepActivityStudentNum = false;
+
+    public Boolean getAllowOverstepActivityStudentNum() {
+        return allowOverstepActivityStudentNum;
+    }
+
+    public void setAllowOverstepActivityStudentNum(Boolean allowOverstepActivityStudentNum) {
+        this.allowOverstepActivityStudentNum = allowOverstepActivityStudentNum;
+    }
+
     public BigDecimal getSingleClassPrice() {
         return singleClassPrice;
     }

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

@@ -71,6 +71,8 @@ public class CourseScheduleTeacherSalary {
 
 	private Boolean belongToDaya;
 
+	private Boolean enableChangeSalary = true;
+
 	private List<TeacherSalaryDeductReasonDto> deductReasons;
 
 	public List<TeacherSalaryDeductReasonDto> getDeductReasons() {
@@ -273,6 +275,14 @@ public class CourseScheduleTeacherSalary {
 		this.courseSchedule = courseSchedule;
 	}
 
+	public Boolean getEnableChangeSalary() {
+		return enableChangeSalary;
+	}
+
+	public void setEnableChangeSalary(Boolean enableChangeSalary) {
+		this.enableChangeSalary = enableChangeSalary;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 30 - 18
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSubjectPlan.java

@@ -23,7 +23,7 @@ public class MusicGroupSubjectPlan {
 	/** 乐团编号 */
 	@ApiModelProperty(value = "乐团编号",required = false)
 	private String musicGroupId;
-	
+
 	/** 科目编号 */
 	@ApiModelProperty(value = "科目编号",required = false)
 	private Integer subjectId;
@@ -31,11 +31,11 @@ public class MusicGroupSubjectPlan {
 	/** 科目编号 */
 	@ApiModelProperty(value = "科目名称",required = false)
 	private String subName;
-	
+
 	/** 预计学生数 */
 	@ApiModelProperty(value = "预计学生数",required = false)
 	private Integer expectedStudentNum;
-	
+
 	/** 报名学生数 */
 	@ApiModelProperty(value = "报名学生数",required = false)
 	private Integer applyStudentNum;
@@ -44,6 +44,10 @@ public class MusicGroupSubjectPlan {
 	@ApiModelProperty(value = "已缴费学生数",required = false)
 	private Integer paidStudentNum;
 
+	/** 0元缴费学生数 */
+	@ApiModelProperty(value = "已缴费学生数",required = false)
+	private Integer paidZeroNum = 0;
+
 	/** 未分班学生数 */
 	@ApiModelProperty(value = "未分班学生数",hidden = true)
 	private Integer noClassStudentNum;
@@ -55,13 +59,13 @@ public class MusicGroupSubjectPlan {
 	/** 乐器团购类型(免费、租赁、借用) */
 	@ApiModelProperty(value = "乐器团购类型(免费、租赁、借用)",required = false)
 	private KitGroupPurchaseTypeEnum kitGroupPurchaseType;
-	
+
 	/** 保证金(只有租赁才有) */
 	@ApiModelProperty(value = "保证金(只有租赁才有)",required = false)
 	private BigDecimal depositFee = new BigDecimal(0);
 	/**  */
 	private java.util.Date createTime;
-	
+
 	/**  */
 	private java.util.Date updateTime;
 
@@ -76,39 +80,39 @@ public class MusicGroupSubjectPlan {
 	public void setId(Integer id){
 		this.id = id;
 	}
-	
+
 	public Integer getId(){
 		return this.id;
 	}
-			
+
 	public void setMusicGroupId(String musicGroupId){
 		this.musicGroupId = musicGroupId;
 	}
-	
+
 	public String getMusicGroupId(){
 		return this.musicGroupId;
 	}
-			
+
 	public void setSubjectId(Integer subjectId){
 		this.subjectId = subjectId;
 	}
-	
+
 	public Integer getSubjectId(){
 		return this.subjectId;
 	}
-			
+
 	public void setExpectedStudentNum(Integer expectedStudentNum){
 		this.expectedStudentNum = expectedStudentNum;
 	}
-	
+
 	public Integer getExpectedStudentNum(){
 		return this.expectedStudentNum;
 	}
-			
+
 	public void setApplyStudentNum(Integer applyStudentNum){
 		this.applyStudentNum = applyStudentNum;
 	}
-	
+
 	public Integer getApplyStudentNum(){
 		return this.applyStudentNum;
 	}
@@ -140,15 +144,15 @@ public class MusicGroupSubjectPlan {
 	public void setCreateTime(java.util.Date createTime){
 		this.createTime = createTime;
 	}
-	
+
 	public java.util.Date getCreateTime(){
 		return this.createTime;
 	}
-			
+
 	public void setUpdateTime(java.util.Date updateTime){
 		this.updateTime = updateTime;
 	}
-	
+
 	public java.util.Date getUpdateTime(){
 		return this.updateTime;
 	}
@@ -176,9 +180,17 @@ public class MusicGroupSubjectPlan {
 	public void setVersion(Integer version) {
 		this.version = version;
 	}
-			
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}
+
+	public Integer getPaidZeroNum() {
+		return paidZeroNum;
+	}
+
+	public void setPaidZeroNum(Integer paidZeroNum) {
+		this.paidZeroNum = paidZeroNum;
+	}
 }

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCashAccountDetail.java

@@ -23,6 +23,15 @@ public class SysUserCashAccountDetail {
 	@ApiModelProperty(value = "用户编号",required = false)
 	private Integer userId;
 
+	@ApiModelProperty(value = "手机号",required = false)
+	private String phone;
+
+	@ApiModelProperty(value = "姓名",required = false)
+	private String username;
+
+	@ApiModelProperty(value = "声部",required = false)
+	private String subjectName;
+
 	/** 交易流水号 */
 	@ApiModelProperty(value = "交易流水号",required = false)
 	private String transNo;
@@ -79,6 +88,30 @@ public class SysUserCashAccountDetail {
 	@ApiModelProperty(value = "平台账户号",required = false)
 	private String platformAccountNo;
 
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
 	public String getAttribute() {
 		return attribute;
 	}

+ 35 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCoursesAccountDetail.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.entity;
 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 io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
@@ -15,6 +16,15 @@ public class SysUserCoursesAccountDetail {
 	
 	/** 用户编号 */
 	private Integer userId;
+
+	@ApiModelProperty(value = "手机号",required = false)
+	private String phone;
+
+	@ApiModelProperty(value = "姓名",required = false)
+	private String username;
+
+	@ApiModelProperty(value = "声部",required = false)
+	private String subjectName;
 	
 	/** 交易流水号 */
 	private String transNo;
@@ -54,7 +64,31 @@ public class SysUserCoursesAccountDetail {
 	
 	/** 平台账户号 */
 	private String platformAccountNo;
-	
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
 	public void setId(Long id){
 		this.id = id;
 	}

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

@@ -86,6 +86,9 @@ public class VipGroupActivity {
 	@ApiModelProperty(value = "最多可排课数量")
 	private Integer maxCourseNum;
 
+	@ApiModelProperty(value = "每位学员最大使用次数")
+	private Integer studentMaxUsedTimes;
+
 	public Integer getMinCourseNum() {
 		return minCourseNum;
 	}
@@ -294,6 +297,14 @@ public class VipGroupActivity {
 		this.delFlag = delFlag;
 	}
 
+	public Integer getStudentMaxUsedTimes() {
+		return studentMaxUsedTimes;
+	}
+
+	public void setStudentMaxUsedTimes(Integer studentMaxUsedTimes) {
+		this.studentMaxUsedTimes = studentMaxUsedTimes;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

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

@@ -11,7 +11,11 @@ public enum DeductReasonEnum implements BaseEnum<String,DeductReasonEnum> {
     SIGN_OUT_TIME_ERR("SIGN_OUT_TIME_ERR", "签退时间异常", ""),
     GPS_ERR("GPS_ERR", "位置异常", ""),
     NOT_SETTLEMENT("NOT_SETTLEMENT", "不结算课酬", "特殊老师不结算课酬"),
-    TRAIL("TRAIL", "试用期扣减", "试用期老师课酬按正式老师的80%计算");
+    TRAIL("TRAIL", "试用期扣减", "试用期老师课酬按正式老师的80%计算"),
+
+    //收入
+    SALARY("SALARY", "基本课酬", "课时应发课酬"),
+    COURSE_SUBSIDY("COURSE_SUBSIDY", "课酬调剂", "课时课酬调剂金额");
 
     private String code;
 

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

@@ -15,6 +15,7 @@ public enum IndexErrorType implements BaseEnum<String, IndexErrorType> {
     STUDENT_INFO("STUDENT_INFO", "学员处理"),
     STUDENT_ARREARAGE("STUDENT_ARREARAGE", "欠费学员数"),
     STUDENT_NOT_PAYMENT("STUDENT_NOT_PAYMENT", "未缴费学员数"),
+    STUDENT_ERROR_LEAVE("STUDENT_ERROR_LEAVE", "学员异常请假"),
     STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP("STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP", "申请退团学员数"),
     WAIT_CREATE_PAYMENT_CALENDER("WAIT_CREATE_PAYMENT_CALENDER", "待创建缴费项目"),
     ATTENDANCE_ERR_STUDENT_NUM("COURSE_TRUANT_STUDENT_NUM", "学员考勤异常"),

+ 126 - 131
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -4,177 +4,172 @@ import com.ym.mec.common.enums.BaseEnum;
 
 public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SMS_APPLY_MESSAGE("SMS_APPLY_MESSAGE", "报名通知"),
-    PUSH_STUDENT_VIP_STOP("PUSH_STUDENT_VIP_STOP", "VIP课取消"),
-    PUSH_TEACHER_VIP_STOP("PUSH_TEACHER_VIP_STOP", "VIP课取消"),
-    SMS_MUSIC_GROUP_ADD_STUDENT("SMS_MUSIC_GROUP_ADD_STUDENT", "入团通知"),
-    SMS_MUSIC_GROUP_ADD_STUDENT_FREE("SMS_MUSIC_GROUP_ADD_STUDENT_FREE", "入团通知"),
     SMS_VERIFY_CODE_LOGIN("SMS_VERIFY_CODE_LOGIN", "验证码登录"),
     KAPTCHA_SESSION_KEY("KAPTCHA_SESSION_KEY", "登录图形验证码"),
     SMS_PAYMENT_MESSAGE("SMS_PAYMENT_MESSAGE", "缴费通知"),
-    SMS_PAYMENT_SUCCESS("SMS_PAYMENT_SUCCESS", "缴费成功"),
-    SMS_RENEW_SUCCESS("SMS_RENEW_SUCCESS", "续费成功"),
-    SMS_BALANCE_PAY("SMS_BALANCE_PAY", "余额充值"),
-    SMS_BASICS_SKILL_APPLY_MESSAGE("SMS_BASICS_SKILL_APPLY_MESSAGE", "基础技能训练报名通知"),
-    SMS_VIP_COURSE_BUY_SUCCESS("SMS_VIP_COURSE_BUY_SUCCESS", "VIP课购买成功"),
-    SMS_VIP_COURSE_SIGN("SMS_VIP_COURSE_SIGN", "VIP课签到"),
-    SMS_QUIT_COURSE_SUCCESS("SMS_QUIT_COURSE_SUCCESS", "退课成功"),
-    SMS_WITHDRAW_SUCCESS("SMS_WITHDRAW_SUCCESS", "提现成功"),
-    SMS_MUSIC_GROUP_CLOSE("SMS_MUSIC_GROUP_CLOSE", "乐团关闭(关闭后)"),
-
-    STUDENT_SMS_PAYMENT_SUCCESS("STUDENT_SMS_PAYMENT_SUCCESS", "缴费成功结果通知"),
-    STUDENT_SMS_PAYMENT_FAILED("STUDENT_SMS_PAYMENT_FAILED", "缴费失败结果通知"),
-    STUDENT_PUSH_PAYMENT_RESULT("STUDENT_PUSH_PAYMENT_RESULT", "缴费结果"),
-    STUDENT_PUSH_MUSIC_GROUP_CLOSE("STUDENT_PUSH_MUSIC_GROUP_CLOSE", "乐团关闭(确认后)"),
-    STUDENT_PUSH_BASICS_SKILL_APPLY_MESSAGE("STUDENT_PUSH_BASICS_SKILL_APPLY_MESSAGE", "基础技能训练报名通知"),
-    STUDENT_SMS_WAIT_RENEW_MESSAGE("STUDENT_SMS_WAIT_RENEW_MESSAGE", "待续费通知"),
-    STUDENT_PUSH_WAIT_RENEW_MESSAGE("STUDENT_PUSH_WAIT_RENEW_MESSAGE", "待续费通知"),
-    STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS("STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS", "乐团续费成功结果"),
-    STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED("STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED", "乐团续费失败结果"),
-    SMS_SPORADIC_PAYMENT_SUCCESS("SMS_SPORADIC_PAYMENT_SUCCESS", "零星支付成功结果"),
-    SMS_SPORADIC_PAYMENT_FAILED("SMS_SPORADIC_PAYMENT_FAILED", "零星支付失败结果"),
+//    SMS_PAYMENT_SUCCESS("SMS_PAYMENT_SUCCESS", "缴费成功"),
+//    SMS_RENEW_SUCCESS("SMS_RENEW_SUCCESS", "续费成功"),
+//    SMS_BALANCE_PAY("SMS_BALANCE_PAY", "余额充值"),
+//    SMS_BASICS_SKILL_APPLY_MESSAGE("SMS_BASICS_SKILL_APPLY_MESSAGE", "基础技能训练报名通知"),
+//    SMS_VIP_COURSE_BUY_SUCCESS("SMS_VIP_COURSE_BUY_SUCCESS", "VIP课购买成功"),
+//    SMS_VIP_COURSE_SIGN("SMS_VIP_COURSE_SIGN", "VIP课签到"),
+//    SMS_QUIT_COURSE_SUCCESS("SMS_QUIT_COURSE_SUCCESS", "退课成功"),
+//    SMS_WITHDRAW_SUCCESS("SMS_WITHDRAW_SUCCESS", "提现成功"),
+//    SMS_MUSIC_GROUP_CLOSE("SMS_MUSIC_GROUP_CLOSE", "乐团关闭(关闭后)"),
+
+    STUDENT_SMS_PUSH_PAYMENT_SUCCESS("STUDENT_SMS_PUSH_PAYMENT_SUCCESS", "缴费成功结果通知"),
     STUDENT_SMS_BALANCE_CONSUME("STUDENT_SMS_BALANCE_CONSUME", "余额消费"),
-    STUDENT_PUSH_BALANCE_CONSUME("STUDENT_PUSH_BALANCE_CONSUME", "余额消费"),
     STUDENT_PUSH_VIP_BUY("STUDENT_PUSH_VIP_BUY", "VIP课购买"),
     STUDENT_PUSH_HAVE_COURSE_MESSAGE("STUDENT_PUSH_HAVE_COURSE_MESSAGE", "有课提醒"),
-    STUDENT_PUSH_ATTEND_COURSE_MESSAGE("STUDENT_PUSH_ATTEND_COURSE_MESSAGE", "上课提醒"),
     STUDENT_PUSH_ONLINE_COURSE_ACTION("STUDENT_PUSH_ONLINE_COURSE_ACTION", "线上课开始"),
-    PUSH_TEACHER_COURSE_COLLIDE("PUSH_TEACHER_COURSE_COLLIDE", "课程冲突"),
-    PAY_PRACTICE_BUY_SUCCESS("PAY_PRACTICE_BUY_SUCCESS", "网管课购买成功"),
-    PRACTICE_COMPLETED_STUDY_REPORT("PRACTICE_COMPLETED_STUDY_REPORT", "网管课完成学习报告"),
-    PRACTICE_RENEW_REMIND_PUSH("PRACTICE_RENEW_REMIND_PUSH", "网管课续费推送"),
-    PUBLIC_EXTRA_REMIND("PUBLIC_EXTRA_REMIND", "本周应布置课外训练"),
-    FREE_PRACTICE_APPLY_PUSH("FREE_PRACTICE_APPLY_PUSH", "免费陪练课预约推送"),
     STUDENT_PUSH_NAMES_ACHIEVE("STUDENT_PUSH_NAMES_ACHIEVE", "点名完成"),
-    SCHEDULE_CHANGE("SCHEDULE_CHANGE", "课表变动"),
-    STUDENT_SMS_TEACHING_SCHOOL_CHANGE("STUDENT_SMS_TEACHING_SCHOOL_CHANGE", "教学点变动"),
-    STUDENT_PUSH_TEACHING_SCHOOL_CHANGE("STUDENT_PUSH_TEACHING_SCHOOL_CHANGE", "教学点变动"),
+//    SCHEDULE_CHANGE("SCHEDULE_CHANGE", "课表变动"),
+//    STUDENT_SMS_TEACHING_SCHOOL_CHANGE("STUDENT_SMS_TEACHING_SCHOOL_CHANGE", "教学点变动"),
     STUDENT_PUSH_JOB_MESSAGE("STUDENT_PUSH_JOB_MESSAGE", "作业提醒"),
-    HOMEWORK_REMIND("HOMEWORK_REMIND", "作业提醒-网管课"),
+//    STUDENT_PUSH_CLASS_MESSAGE("STUDENT_PUSH_CLASS_MESSAGE", "班级消息"),
+    TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN("TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN", "乐团课新增安排"),
+    TEACHER_SMS_PUSH_VIP_COURSE_APPLY_RESULT("TEACHER_SMS_PUSH_VIP_COURSE_APPLY_RESULT", "VIP课申请结果"),
+    TEACHER_SMS_VIP_COURSE_ADD("TEACHER_SMS_VIP_COURSE_ADD", "VIP课新增"),
+    TEACHER_PUSH_VIP_COURSE_STOP("TEACHER_PUSH_VIP_COURSE_STOP", "VIP课停止"),
+//    TEACHER_PUSH_ACTION_COURSE_MESSAGE("TEACHER_PUSH_ACTION_COURSE_MESSAGE", "开课提醒"),
+    TEACHER_PUSH_HAVE_COURSE_MESSAGE("TEACHER_PUSH_HAVE_COURSE_MESSAGE", "有课提醒"),
+    TEACHER_PUSH_ATTEND_CLASS_MESSAGE("TEACHER_PUSH_ATTEND_CLASS_MESSAGE", "上课提醒"),
+//    TEACHER_PUSH_SIGN_IN_MESSAGE("TEACHER_PUSH_SIGN_IN_MESSAGE", "签到提醒"),
+//    TEACHER_PUSH_NAMES_MESSAGE("TEACHER_PUSH_NAMES_MESSAGE", "点名提醒"),
+    TEACHER_PUSH_SIGN_OUT_MESSAGE("TEACHER_PUSH_SIGN_OUT_MESSAGE", "签退提醒"),
+    TEACHER_PUSH_JOB_WAIT_REPLY("TEACHER_PUSH_JOB_WAIT_REPLY", "作业待回复"),
+//    TEACHER_PUSH_SUBSTITUTE_PLAN("TEACHER_PUSH_SUBSTITUTE_PLAN", "代课安排"),
+    TEACHER_PUSH_LEAVE_RESULT("TEACHER_PUSH_LEAVE_RESULT", "请假结果"),
+    TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT("TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT", "课时调整结果"),
+    TEACHER_PUSH_STUDENT_LEAVE("TEACHER_PUSH_STUDENT_LEAVE", "学员请假"),
+//    TEACHER_PUSH_CLASS_MESSAGE("TEACHER_PUSH_CLASS_MESSAGE", "班级消息"),
+    STUDENT_SMS_PAYMENT_FAILED("STUDENT_SMS_PAYMENT_FAILED", "缴费失败结果通知"),
+//    STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED("STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED", "乐团续费失败结果"),
+    STUDENT_PUSH_VIP_STOP("STUDENT_PUSH_VIP_STOP", "VIP课取消"),
+//    SMS_MUSIC_GROUP_ADD_STUDENT("SMS_MUSIC_GROUP_ADD_STUDENT", "入团通知"),
+    TEACHER_PUSH_VIP_STOP("TEACHER_PUSH_VIP_STOP", "VIP课取消"),
+    STUDENT_SMS_OPEN_PAYMENT("STUDENT_SMS_OPEN_PAYMENT", "开启缴费"),
+//    SMS_MUSIC_GROUP_ADD_STUDENT_FREE("SMS_MUSIC_GROUP_ADD_STUDENT_FREE", "入团通知"),
+    STUDENT_SMS_PUSH_SPORADIC_PAYMENT_SUCCESS("STUDENT_SMS_PUSH_SPORADIC_PAYMENT_SUCCESS", "零星支付成功结果"),
+    STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED("STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED", "零星支付失败结果"),
+    TEACHER_PUSH_COURSE_COLLIDE("TEACHER_PUSH_COURSE_COLLIDE", "课程冲突"),
+//    PUSH_STUDY_REPORT("PUSH_STUDY_REPORT", "陪练报告"),
+    STUDENT_SMS_PUSH_PAY_PRACTICE_BUY_SUCCESS("STUDENT_SMS_PUSH_PAY_PRACTICE_BUY_SUCCESS", "网管课购买成功"),
+    STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT("STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT", "网管课完成学习报告"),
+    STUDENT_SMS_PUSH_FREE_PRACTICE_APPLY_PUSH("STUDENT_SMS_PUSH_FREE_PRACTICE_APPLY_PUSH", "免费陪练课预约推送"),
+    TEACHER_PUSH_NEED_POST_STUDY_REPORT("TEACHER_PUSH_NEED_POST_STUDY_REPORT", "新增待填写月报"),
+    STUDENT_PUSH_HOMEWORK_REMIND("STUDENT_PUSH_HOMEWORK_REMIND", "作业提醒-网管课"),
+    TEACHER_PUSH_COMM_NO_STUDENTS_PUSH("TEACHER_PUSH_COMM_NO_STUDENTS_PUSH", "对外课程组无学生提醒"),
+    TEACHER_PUSH_HOMEWORK_SUBMIT("TEACHER_PUSH_HOMEWORK_SUBMIT", "学生提交作业提醒"),
+    TEACHER_PUSH_HOMEWORK_REPLY("TEACHER_PUSH_HOMEWORK_REPLY", "学生作业回复提醒"),
+    STUDENT_PUSH_HOMEWORK_REPLY("STUDENT_PUSH_HOMEWORK_REPLY", "教师回复作业提醒"),
+
     IM_HOMEWORK_REMIND("IM_HOMEWORK_REMIND", "作业提醒"),
-    IM_HOMEWORK_REMIND_DETAIL("IM_HOMEWORK_REMIND_DETAIL", "作业提醒"),
     IM_HOMEWORK_SUBMIT_PUSH("IM_HOMEWORK_SUBMIT_PUSH", "作业提交提醒"),
     IM_HOMEWORK_SUBMIT_PUSH_GROUP("IM_HOMEWORK_SUBMIT_PUSH_GROUP", "作业提交提醒"),
     IM_HOMEWORK_STUDENT_REPLY_PUSH("IM_HOMEWORK_STUDENT_REPLY_PUSH", "作业回复提醒"),
     IM_HOMEWORK_TEACHER_REPLY_PUSH("IM_HOMEWORK_TEACHER_REPLY_PUSH", "作业点评提醒"),
-    STUDENT_PUSH_CLASS_MESSAGE("STUDENT_PUSH_CLASS_MESSAGE", "班级消息"),
-    COMM_NO_STUDENTS_PUSH("COMM_NO_STUDENTS_PUSH", "对外课程组无学生提醒"),
-    HOMEWORK_SUBMIT_PUSH("HOMEWORK_SUBMIT_PUSH", "学生提交作业提醒"),
-    HOMEWORK_STUDENT_REPLY_PUSH("HOMEWORK_STUDENT_REPLY_PUSH", "学生作业回复提醒"),
-    HOMEWORK_TEACHER_REPLY_PUSH("HOMEWORK_TEACHER_REPLY_PUSH", "教师回复作业提醒"),
-
-    /**试听课*/
-    TRIAL_PRACTICE_CREATE_STUDENT_PUSH("TRIAL_PRACTICE_CREATE_STUDENT_PUSH", "试听课安排"),
-
-    PRACTICE_CREATE_TEACHER_PUSH("PRACTICE_CREATE_TEACHER_PUSH", "新增网管课程"),
-
-    /**乐团网管课*/
-    MUSIC_NETWORK_CRATE_TEACHER("MUSIC_NETWORK_CRATE_TEACHER", "乐团网管课安排"),
-    MUSIC_NETWORK_CRATE_STUDENT("MUSIC_NETWORK_CRATE_STUDENT", "乐团课通知"),
+    IM_HOMEWORK_REMIND_DETAIL("IM_HOMEWORK_REMIND_DETAIL", "作业提醒"),
 
     /** 课外训练消息 */
-    EXTRA_REMIND_PUSH("EXTRA_REMIND_PUSH", "作业提醒"),
+    STUDENT_PUSH_EXTRA_REMIND("STUDENT_PUSH_EXTRA_REMIND", "作业提醒"),
     EXTRA_REMIND_IM("EXTRA_REMIND_IM", "作业提醒"),
     EXTRA_REMIND_IM_DETAIL("EXTRA_REMIND_IM_DETAIL", "作业提醒"),
-    EXTRA_TEACHER_REPLY_PUSH("EXTRA_TEACHER_REPLY_PUSH", "作业点评提醒"),
+    STUDENT_PUSH_EXTRA_REPLY("STUDENT_PUSH_EXTRA_REPLY", "作业点评提醒"),
     EXTRA_TEACHER_REPLY_IM("EXTRA_TEACHER_REPLY_IM", "作业点评提醒"),
-    EXTRA_SUBMIT_PUSH("EXTRA_SUBMIT_PUSH", "作业提交提醒"),
+    TEACHER_PUSH_EXTRA_SUBMIT("TEACHER_PUSH_EXTRA_SUBMIT", "作业提交提醒"),
     EXTRA_SUBMIT_IM("EXTRA_SUBMIT_IM", "作业提交提醒"),
-    EXTRA_STUDENT_REPLY_PUSH("EXTRA_STUDENT_REPLY_PUSH", "作业回复提醒"),
+    TEACHER_PUSH_EXTRA_REPLY("TEACHER_PUSH_EXTRA_REPLY", "作业回复提醒"),
     EXTRA_STUDENT_REPLY_IM("EXTRA_STUDENT_REPLY_IM", "作业回复提醒"),
 
-    TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN("TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN", "乐团课新增安排"),
-    TEACHER_SMS_VIP_COURSE_APPLY_RESULT("TEACHER_SMS_VIP_COURSE_APPLY_RESULT", "VIP课申请结果"),
+    TEACHER_PUSH_COURSE_SALARY_COMPLAINTS_RESULT("TEACHER_PUSH_COURSE_SALARY_COMPLAINTS_RESULT", "课酬申述结果"),
+    TEACHER_PUSH_SALARY_CONFIRM("TEACHER_PUSH_SALARY_CONFIRM", "课酬确认"),
+    STUDENT_PUSH_TRIAL_PRACTICE_CREATE("STUDENT_PUSH_TRIAL_PRACTICE_CREATE", "试听课安排"),
+    TEACHER_SMS_PUSH_PRACTICE_CREATE("TEACHER_SMS_PUSH_PRACTICE_CREATE", "新增网管课程"),
+    STUDENT_PUSH_REPAIR_UNSEND_COMPLETED("STUDENT_PUSH_REPAIR_UNSEND_COMPLETED","乐器维修完成自取"),
+    STUDENT_PUSH_REPAIR_SEND_COMPLETED("STUDENT_PUSH_REPAIR_SEND_COMPLETED","乐器维修完成邮寄"),
+    STUDENT_PUSH_REPAIR_ONLINE_PAYMENT_SUCCESS("STUDENT_PUSH_REPAIR_ONLINE_PAYMENT_SUCCESS","乐器线上维修支付成功"),
+    STUDENT_PUSH_REPAIR_OFFLINE_PAYMENT_SUCCESS("STUDENT_PUSH_REPAIR_OFFLINE_PAYMENT_SUCCESS","乐器线下维修支付成功"),
+
+    TEACHER_PUSH_MUSIC_NETWORK_CRATE("TEACHER_PUSH_MUSIC_NETWORK_CRATE", "乐团网管课安排"),
+    STUDENT_PUSH_MUSIC_NETWORK_CRATE("STUDENT_PUSH_MUSIC_NETWORK_CRATE", "乐团课通知"),
+    TEACHER_PUSH_EXCEPTION_ATTENDANCE("TEACHER_PUSH_EXCEPTION_ATTENDANCE", "异常考勤通知"),
+    STUDENT_PUSH_PRACTICE_RENEW_REMIND("STUDENT_PUSH_PRACTICE_RENEW_REMIND", "网管课续费推送"),
+    TEACHER_PUSH_ATTENDANCE_COMPLAINTS_RESULT("TEACHER_PUSH_ATTENDANCE_COMPLAINTS_RESULT", "考勤申述结果"),
+    TEACHER_PUSH_PUBLIC_EXTRA_REMIND("TEACHER_PUSH_PUBLIC_EXTRA_REMIND", "本周应布置课外训练"),
+    SYSTEM_SMS_PUSH_PAYMENT_DETAIL("SYSTEM_SMS_PUSH_PAYMENT_DETAIL","缴费项目缴费详情提醒"),
+    SYSTEM_SMS_PUSH_PAYMENT_CREATE("SYSTEM_SMS_PUSH_PAYMENT_CREATE","缴费项目创建提醒"),
+    SYSTEM_SMS_GOODS_REPERTORY_WARN("SYSTEM_SMS_GOODS_REPERTORY_WARN","商品库存预警"),
+    SYSTEM_PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY("SYSTEM_PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY", "学员申请退团"),
+    SYSTEM_PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY("SYSTEM_PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY", "撤销退团申请"),
+    STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE("STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE","乐团家长会通知"),
+    SYSTEM_PUSH_SMS_INSPECTION_NOTICE("SYSTEM_PUSH_SMS_INSPECTION_NOTICE","巡查日程提醒"),
+    STUDENT_SMS_WAIT_RENEW_MESSAGE("STUDENT_SMS_WAIT_RENEW_MESSAGE", "待续费通知"),
+    TEACHER_PUSH_SERVE("TEACHER_PUSH_SERVE", "服务指标未完成提醒"),
+    STUDENT_PUSH_MAINTENANCE_NOTICE("STUDENT_PUSH_MAINTENANCE_NOTICE", "乐保到期提醒"),
+    TEACHER_IM_STUDENT_LEAVE("TEACHER_IM_STUDENT_LEAVE", "学员请假"),
+    STUDENT_SMS_PUSH_REPLACEMENT_PAY("STUDENT_SMS_PUSH_REPLACEMENT_PAY", "乐器置换支付提醒"),
+    TEACHER_PUSH_INCOME_REMIND("TEACHER_PUSH_INCOME_REMIND", "今日收入"),
+    STUDENT_PUSH_PAYMENT_RESULT("STUDENT_PUSH_PAYMENT_RESULT", "缴费结果"),
+    STUDENT_PUSH_MUSIC_GROUP_CLOSE("STUDENT_PUSH_MUSIC_GROUP_CLOSE", "乐团关闭(确认后)"),
+    STUDENT_PUSH_BASICS_SKILL_APPLY_MESSAGE("STUDENT_PUSH_BASICS_SKILL_APPLY_MESSAGE", "基础技能训练报名通知"),
+    STUDENT_PUSH_WAIT_RENEW_MESSAGE("STUDENT_PUSH_WAIT_RENEW_MESSAGE", "待续费通知"),
+    STUDENT_SMS_PUSH_MUSIC_GROUP_RENEW_SUCCESS("STUDENT_SMS_PUSH_MUSIC_GROUP_RENEW_SUCCESS", "乐团续费成功结果"),
+    STUDENT_PUSH_BALANCE_CONSUME("STUDENT_PUSH_BALANCE_CONSUME", "余额消费"),
+    STUDENT_PUSH_ATTEND_COURSE_MESSAGE("STUDENT_PUSH_ATTEND_COURSE_MESSAGE", "上课提醒"),
+    STUDENT_PUSH_TEACHING_SCHOOL_CHANGE("STUDENT_PUSH_TEACHING_SCHOOL_CHANGE", "教学点变动"),
     TEACHER_PUSH_VIP_COURSE_APPLY_RESULT("TEACHER_PUSH_VIP_COURSE_APPLY_RESULT", "VIP课申请结果"),
-    TEACHER_SMS_VIP_COURSE_ADD("TEACHER_SMS_VIP_COURSE_ADD", "VIP课新增"),
     TEACHER_PUSH_VIP_COURSE_ADD("TEACHER_PUSH_VIP_COURSE_ADD", "VIP课新增"),
-    TEACHER_PUSH_VIP_COURSE_STOP("TEACHER_PUSH_VIP_COURSE_STOP", "VIP课停止"),
-    TEACHER_PUSH_ACTION_COURSE_MESSAGE("TEACHER_PUSH_ACTION_COURSE_MESSAGE", "开课提醒"),
-    TEACHER_PUSH_HAVE_COURSE_MESSAGE("TEACHER_PUSH_HAVE_COURSE_MESSAGE", "有课提醒"),
-    TEACHER_PUSH_ATTEND_CLASS_MESSAGE("TEACHER_PUSH_ATTEND_CLASS_MESSAGE", "上课提醒"),
-    TEACHER_PUSH_SIGN_IN_MESSAGE("TEACHER_PUSH_SIGN_IN_MESSAGE", "签到提醒"),
-    TEACHER_PUSH_NAMES_MESSAGE("TEACHER_PUSH_NAMES_MESSAGE", "点名提醒"),
-    TEACHER_PUSH_SIGN_OUT_MESSAGE("TEACHER_PUSH_SIGN_OUT_MESSAGE", "签退提醒"),
-    TEACHER_PUSH_JOB_WAIT_REPLY("TEACHER_PUSH_JOB_WAIT_REPLY", "作业待回复"),
-    TEACHER_ATTENDANCE_COMPLAINTS_RESULT("TEACHER_ATTENDANCE_COMPLAINTS_RESULT", "考勤申述结果"),
-    TEACHER_PUSH_SUBSTITUTE_PLAN("TEACHER_PUSH_SUBSTITUTE_PLAN", "代课安排"),
-    TEACHER_PUSH_LEAVE_RESULT("TEACHER_PUSH_LEAVE_RESULT", "请假结果"),
-    TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT("TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT", "课时调整结果"),
-    TEACHER_PUSH_STUDENT_LEAVE("TEACHER_PUSH_STUDENT_LEAVE", "学员请假"),
-    TEACHER_IM_STUDENT_LEAVE("TEACHER_IM_STUDENT_LEAVE", "学员请假"),
-    TEACHER_PUSH_CLASS_MESSAGE("TEACHER_PUSH_CLASS_MESSAGE", "班级消息"),
-    COURSE_SALARY_COMPLAINTS_RESULT("COURSE_SALARY_COMPLAINTS_RESULT", "课酬申述结果"),
-    PUSH_TEACHER_EXCEPTION_ATTENDANCE("PUSH_TEACHER_EXCEPTION_ATTENDANCE", "异常考勤通知"),
-
-    EDUCATION_PUSH_MUSIC_GROUP_FOUND("EDUCATION_PUSH_MUSIC_GROUP_FOUND", "乐团成立"),
-    EDUCATION_PUSH_MUSIC_GROUP_CLOSE("EDUCATION_PUSH_MUSIC_GROUP_CLOSE", "乐团关闭"),
-    EDUCATION_PUSH_COURSE_CHANGE("EDUCATION_PUSH_COURSE_CHANGE", "课程调整"),
-    EDUCATION_PUSH_TOMORROW_COURSE_PLAN("EDUCATION_PUSH_TOMORROW_COURSE_PLAN", "明日课程安排"),
-    EDUCATION_PUSH_TEACHER_NO_SIGN_IN("EDUCATION_PUSH_TEACHER_NO_SIGN_IN", "老师未签到"),
-    EDUCATION_PUSH_TEACHER_EXCEPTION_SING_IN("EDUCATION_PUSH_TEACHER_EXCEPTION_SING_IN", "老师异常签到"),
-    EDUCATION_PUSH_TEACHER_NO_SIGN_OUT("EDUCATION_PUSH_TEACHER_NO_SIGN_OUT", "老师未签退"),
-    EDUCATION_PUSH_STUDENT_LEAVE("EDUCATION_PUSH_STUDENT_LEAVE", "学员请假"),
-    EDUCATION_PUSH_STUDENT_CONTINUE_NO_ARRIVAL("EDUCATION_PUSH_STUDENT_CONTINUE_NO_ARRIVAL", "学员连续未到"),
-    EDUCATION_PUSH_STUDENT_NO_PAYMENT("EDUCATION_PUSH_STUDENT_NO_PAYMENT", "学员未交费"),
-    EDUCATION_PUSH_VIP_COURSE_APPLY("EDUCATION_PUSH_VIP_COURSE_APPLY", "VIP课申请"),
+
+
+//    EDUCATION_PUSH_MUSIC_GROUP_FOUND("EDUCATION_PUSH_MUSIC_GROUP_FOUND", "乐团成立"),
+//    EDUCATION_PUSH_MUSIC_GROUP_CLOSE("EDUCATION_PUSH_MUSIC_GROUP_CLOSE", "乐团关闭"),
+//    EDUCATION_PUSH_COURSE_CHANGE("EDUCATION_PUSH_COURSE_CHANGE", "课程调整"),
+//    EDUCATION_PUSH_TOMORROW_COURSE_PLAN("EDUCATION_PUSH_TOMORROW_COURSE_PLAN", "明日课程安排"),
+//    EDUCATION_PUSH_TEACHER_NO_SIGN_IN("EDUCATION_PUSH_TEACHER_NO_SIGN_IN", "老师未签到"),
+//    EDUCATION_PUSH_TEACHER_EXCEPTION_SING_IN("EDUCATION_PUSH_TEACHER_EXCEPTION_SING_IN", "老师异常签到"),
+//    EDUCATION_PUSH_TEACHER_NO_SIGN_OUT("EDUCATION_PUSH_TEACHER_NO_SIGN_OUT", "老师未签退"),
+//    EDUCATION_PUSH_STUDENT_LEAVE("EDUCATION_PUSH_STUDENT_LEAVE", "学员请假"),
+//    EDUCATION_PUSH_STUDENT_CONTINUE_NO_ARRIVAL("EDUCATION_PUSH_STUDENT_CONTINUE_NO_ARRIVAL", "学员连续未到"),
+//    EDUCATION_PUSH_STUDENT_NO_PAYMENT("EDUCATION_PUSH_STUDENT_NO_PAYMENT", "学员未交费"),
+//    EDUCATION_PUSH_VIP_COURSE_APPLY("EDUCATION_PUSH_VIP_COURSE_APPLY", "VIP课申请"),
     EDUCATION_PUSH_TEACHER_LEAVE_APPLY("EDUCATION_PUSH_TEACHER_LEAVE_APPLY", "老师请假申请"),
-    EDUCATION_PUSH_STUDENT_QUIT_MUSIC_GROUP_APPLY("EDUCATION_PUSH_STUDENT_QUIT_MUSIC_GROUP_APPLY", "学员退团申请"),
-    EDUCATION_PUSH_STUDENT_QUIT_COURSE_APPLY("EDUCATION_PUSH_STUDENT_QUIT_COURSE_APPLY", "学员退课申请"),
-    EDUCATION_PUSH_STUDENT_WITHDRAW_APPLY("EDUCATION_PUSH_STUDENT_WITHDRAW_APPLY", "学员提现申请"),
-    EDUCATION_PUSH_STUDENT_APPEAL("EDUCATION_PUSH_STUDENT_APPEAL", "学员申诉"),
+//    EDUCATION_PUSH_STUDENT_QUIT_MUSIC_GROUP_APPLY("EDUCATION_PUSH_STUDENT_QUIT_MUSIC_GROUP_APPLY", "学员退团申请"),
+//    EDUCATION_PUSH_STUDENT_QUIT_COURSE_APPLY("EDUCATION_PUSH_STUDENT_QUIT_COURSE_APPLY", "学员退课申请"),
+//    EDUCATION_PUSH_STUDENT_WITHDRAW_APPLY("EDUCATION_PUSH_STUDENT_WITHDRAW_APPLY", "学员提现申请"),
+//    EDUCATION_PUSH_STUDENT_APPEAL("EDUCATION_PUSH_STUDENT_APPEAL", "学员申诉"),
 
     BACKSTAGE_CREATE_MUSIC_GROUP_APPLY("BACKSTAGE_CREATE_MUSIC_GROUP_APPLY", "建团申请"),
     BACKSTAGE_CREATE_MUSIC_GROUP_ADJUST_SUCCESS("BACKSTAGE_CREATE_MUSIC_GROUP_ADJUST_SUCCESS", "建团申请审核通过"),
-    BACKSTAGE_ACTION_APPLY("BACKSTAGE_ACTION_APPLY", "开启报名"),
+//    BACKSTAGE_ACTION_APPLY("BACKSTAGE_ACTION_APPLY", "开启报名"),
     BACKSTAGE_PAYMENT_CALENDER_AUDIT("BACKSTAGE_PAYMENT_CALENDER_AUDIT", "缴费项目审核"),
     BACKSTAGE_ACTION_PAYMENT("BACKSTAGE_ACTION_PAYMENT", "开启缴费"),
-    SMS_STUDENT_OPEN_PAYMENT("SMS_STUDENT_OPEN_PAYMENT", "开启缴费"),
+
     BACKSTAGE_LENGTHEN_PAYMENT("BACKSTAGE_LENGTHEN_PAYMENT", "延长缴费"),
     BACKSTAGE_ACTION_GROUP("BACKSTAGE_ACTION_GROUP", "开团"),
     BACKSTAGE_STUDENT_SUBJECT_CHANGE("BACKSTAGE_STUDENT_SUBJECT_CHANGE", "学员声部调整"),
     BACKSTAGE_MUSIC_GROUP_MARKING("BACKSTAGE_MUSIC_GROUP_MARKING", "乐团筹备中"),
-    BACKSTAGE_MARK_OK("BACKSTAGE_MARK_OK", "筹备完成"),
-    BACKSTAGE_MARK_QUIT("BACKSTAGE_MARK_QUIT", "筹备中,退回"),
+//    BACKSTAGE_MARK_OK("BACKSTAGE_MARK_OK", "筹备完成"),
+//    BACKSTAGE_MARK_QUIT("BACKSTAGE_MARK_QUIT", "筹备中,退回"),
     BACKSTAGE_MUSIC_GROUP_ADD_STUDENT("BACKSTAGE_MUSIC_GROUP_ADD_STUDENT", "乐团添加学员"),
-    BACKSTAGE_TEACHER_AMOUNT_CHANGE("BACKSTAGE_TEACHER_AMOUNT_CHANGE", "老师课酬调整"),
-    BACKSTAGE_COURSE_CHANGE("BACKSTAGE_COURSE_CHANGE", "课时、课程调整"),
-    BACKSTAGE_MUSIC_GROUP_IN_CHANGE("BACKSTAGE_MUSIC_GROUP_IN_CHANGE", "乐团内调整"),
-    BACKSTAGE_SPAN_GROUP_CHANGE("BACKSTAGE_SPAN_GROUP_CHANGE", "跨越团调整"),
+//    BACKSTAGE_TEACHER_AMOUNT_CHANGE("BACKSTAGE_TEACHER_AMOUNT_CHANGE", "老师课酬调整"),
+//    BACKSTAGE_COURSE_CHANGE("BACKSTAGE_COURSE_CHANGE", "课时、课程调整"),
+//    BACKSTAGE_MUSIC_GROUP_IN_CHANGE("BACKSTAGE_MUSIC_GROUP_IN_CHANGE", "乐团内调整"),
+//    BACKSTAGE_SPAN_GROUP_CHANGE("BACKSTAGE_SPAN_GROUP_CHANGE", "跨越团调整"),
     BACKSTAGE_MUSIC_GROUP_STOP("BACKSTAGE_MUSIC_GROUP_STOP", "乐团暂停"),
-    BACKSTAGE_MUSIC_GROUP_CLOSE("BACKSTAGE_MUSIC_GROUP_CLOSE", "乐团结束"),
-    BACKSTAGE_VIP_COURSE_APPLY("BACKSTAGE_VIP_COURSE_APPLY", "VIP课申请"),
+//    BACKSTAGE_MUSIC_GROUP_CLOSE("BACKSTAGE_MUSIC_GROUP_CLOSE", "乐团结束"),
+//    BACKSTAGE_VIP_COURSE_APPLY("BACKSTAGE_VIP_COURSE_APPLY", "VIP课申请"),
     BACKSTAGE_TEACHER_APPLY_VIP("BACKSTAGE_TEACHER_APPLY_VIP", "VIP课申请"),
-    BACKSTAGE_VIP_COURSE_STOP("BACKSTAGE_VIP_COURSE_STOP", "VIP课停止"),
-    BACKSTAGE_TEACHER_FREEZE("BACKSTAGE_TEACHER_FREEZE", "老师冻结"),
-    BACKSTAGE_TEACHER_POSITIVE("BACKSTAGE_TEACHER_POSITIVE", "老师转正"),
-    BACKSTAGE_STUDENT_OK_QUIT_GROUP("BACKSTAGE_STUDENT_OK_QUIT_GROUP", "学员确认退团"),
-    BACKSTAGE_STUDENT_OK_QUIT_COURSE("BACKSTAGE_STUDENT_OK_QUIT_COURSE", "学员确认退课"),
+//    BACKSTAGE_VIP_COURSE_STOP("BACKSTAGE_VIP_COURSE_STOP", "VIP课停止"),
+//    BACKSTAGE_TEACHER_FREEZE("BACKSTAGE_TEACHER_FREEZE", "老师冻结"),
+//    BACKSTAGE_TEACHER_POSITIVE("BACKSTAGE_TEACHER_POSITIVE", "老师转正"),
+//    BACKSTAGE_STUDENT_OK_QUIT_GROUP("BACKSTAGE_STUDENT_OK_QUIT_GROUP", "学员确认退团"),
+//    BACKSTAGE_STUDENT_OK_QUIT_COURSE("BACKSTAGE_STUDENT_OK_QUIT_COURSE", "学员确认退课"),
     BACKSTAGE_STUDENT_APPEAL("BACKSTAGE_STUDENT_APPEAL", "学员申述"),
     BACKSTAGE_STUDENT_APPLY_QUIT_GROUP("BACKSTAGE_STUDENT_APPLY_QUIT_GROUP", "学员申请退团"),
-    PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY("PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY", "学员申请退团"),
-    PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY("PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY", "撤销退团申请"),
-    BACKSTAGE_STUDENT_APPLY_QUIT_COURSE("BACKSTAGE_STUDENT_APPLY_QUIT_COURSE", "学员申请退课"),
-    BACKSTAGE_STUDENT_APPLY_WITHDRAW("BACKSTAGE_STUDENT_APPLY_WITHDRAW", "学员申请提现"),
-    PUSH_STUDY_REPORT("PUSH_STUDY_REPORT", "陪练报告"),
-    NEED_POST_STUDY_REPORT("NEED_POST_STUDY_REPORT", "新增待填写月报"),
-
-    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_PAYMENT_DETAIL("SMS_PAYMENT_DETAIL","缴费项目缴费详情提醒"),
-    SMS_PAYMENT_CREATE("SMS_PAYMENT_CREATE","缴费项目创建提醒"),
-    SMS_GOODS_REPERTORY_WARN("SMS_GOODS_REPERTORY_WARN","商品库存预警"),
-    SMS_REPAIR_SEND_COMPLETED("SMS_REPAIR_SEND_COMPLETED","乐器维修完成邮寄"),
-    SMS_MUSIC_GROUP_PARENT_MEETING_NOTICE("SMS_MUSIC_GROUP_PARENT_MEETING_NOTICE","乐团家长会通知"),
-    SMS_INSPECTION_NOTICE("SMS_INSPECTION_NOTICE","巡查日程提醒"),
-    TEACHER_SERVE_PUSH("TEACHER_SERVE_PUSH", "服务指标未完成提醒"),
-    MAINTENANCE_NOTICE_PUSH("MAINTENANCE_NOTICE_PUSH", "乐保到期提醒"),
-
-    TEACHER_INCOME_REMIND("TEACHER_INCOME_REMIND", "今日收入"),
-    REPLACEMENT_PAY_PUSH("REPLACEMENT_PAY_PUSH", "乐器置换支付提醒");
-
 
+    BACKSTAGE_STUDENT_APPLY_QUIT_COURSE("BACKSTAGE_STUDENT_APPLY_QUIT_COURSE", "学员申请退课"),
+    BACKSTAGE_STUDENT_APPLY_WITHDRAW("BACKSTAGE_STUDENT_APPLY_WITHDRAW", "学员申请提现");
 
     MessageTypeEnum(String code, String msg) {
         this.code = code;

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

@@ -4,7 +4,7 @@ import com.ym.mec.common.enums.BaseEnum;
 
 public enum TeachIncomeTypeEnum implements BaseEnum<String, TeachIncomeTypeEnum> {
 	SALARY("SALARY", "课酬"),
-	SUBSIDY("SUBSIDY", "教学点补贴"),
+	SUBSIDY("SUBSIDY", "课程补贴"),
 	SALE_REWARD("SALE_REWARD", "销售奖励");
 
 	private String code;

+ 48 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentErrorLeaveQueryInfo.java

@@ -0,0 +1,48 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class StudentErrorLeaveQueryInfo extends QueryInfo {
+    private Integer userId;
+
+    private String organId;
+
+    @ApiModelProperty(value = "是否回访")
+    private Integer leaveVisitFlag;
+
+    @ApiModelProperty(value = "学员编号")
+    private String courseType;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public Integer getLeaveVisitFlag() {
+        return leaveVisitFlag;
+    }
+
+    public void setLeaveVisitFlag(Integer leaveVisitFlag) {
+        this.leaveVisitFlag = leaveVisitFlag;
+    }
+
+    public String getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType) {
+        this.courseType = courseType;
+    }
+}

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

@@ -48,6 +48,17 @@ public class StudentExercisesSituationQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "作业提交截至时间")
     private String submitEndDate;
 
+    @ApiModelProperty(value = "服务是否异常")
+    private Boolean serviceIsError;
+
+    public Boolean getServiceIsError() {
+        return serviceIsError;
+    }
+
+    public void setServiceIsError(Boolean serviceIsError) {
+        this.serviceIsError = serviceIsError;
+    }
+
     public String getSubmitStartDate() {
         return submitStartDate;
     }

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

@@ -44,6 +44,17 @@ public class TeacherServeQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "及时训练评价次数是否达到预期")
     private Integer exercisesMessageTimelyNumIsAchieve;
 
+    @ApiModelProperty(value = "服务是否异常")
+    private Boolean serviceIsError;
+
+    public Boolean getServiceIsError() {
+        return serviceIsError;
+    }
+
+    public void setServiceIsError(Boolean serviceIsError) {
+        this.serviceIsError = serviceIsError;
+    }
+
     public JobNatureEnum getJobNature() {
         return jobNature;
     }

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

@@ -108,7 +108,7 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @return
 	 */
 	boolean batchAddCourseSchedule(Integer classGroupId, int coursesTimes, Date startDate, Date groupEndDate, Date groupStartDate, List<CourseTimeDto> teachingArrangementList,
-			TeachModeEnum teachMode, CourseScheduleType type, Integer schoolId, boolean isJumpHoliday);
+			TeachModeEnum teachMode, CourseScheduleType type, Integer schoolId, boolean isJumpHoliday, List<CourseScheduleTeacherSalary> oldCourseScheduleTeacherSalaries);
 	
 	/**
 	 * 批量调整

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

@@ -0,0 +1,15 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.common.entity.HttpResponseResult;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/19 0019
+ **/
+public interface SoundService {
+
+    HttpResponseResult compare(MultipartFile record, Integer musicScoreId);
+
+}

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -206,4 +206,8 @@ public interface StudentManageService {
      * @return
      */
     List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(String musicGroupId);
+
+    PageInfo<StudentErrorLeaveDto> queryStudentErrorLeaveList(StudentErrorLeaveQueryInfo queryInfo);
+
+    PageInfo<StudentLeaveCourseDto> queryStudentLeaveCourseList(StudentErrorLeaveQueryInfo queryInfo);
 }

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 import java.text.ParseException;
 
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import org.springframework.http.ResponseEntity;
 
@@ -19,7 +20,7 @@ public interface StudentService extends BaseService<Integer, Student> {
     /**
      * 更新学生运营指标
      * @return
-     * @throws ParseException 
+     * @throws ParseException
      */
     boolean updateOperatingTempTag();
 
@@ -57,4 +58,12 @@ public interface StudentService extends BaseService<Integer, Student> {
      * @return void
      */
     void updateStudentTeacherAndSubject();
+
+
+    /**
+     * 获取学生的教务老师
+     * @param userId
+     * @return
+     */
+    CooperationOrgan getStudentEduTeacher(Integer userId);
 }

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

@@ -8,7 +8,6 @@ import com.ym.mec.biz.dal.entity.StudentVisit;
 import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
-
 import java.util.List;
 
 public interface StudentVisitService extends BaseService<Integer, StudentVisit> {

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

@@ -25,6 +25,7 @@ import com.ym.mec.biz.dal.page.VipGroupAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupTeachingRecordQueryInfo;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
@@ -37,7 +38,7 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
      * @param vipGroup: VIP课申请信息
      * @return void
      */
-    String createVipGroup(VipGroupApplyDto vipGroup);
+    HttpResponseResult createVipGroup(VipGroupApplyDto vipGroup);
 
     /**
      * @describe 获取教务与教师共有分部

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

@@ -1332,35 +1332,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         //4、调整未上课课酬
         if (allNotStartCourses.size() > 0) {
-            Date nowDate = new Date();
-//            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
             List<Long> courseScheduleIds = allNotStartCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList());
             List<CourseScheduleTeacherSalary> oldCourseSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
             courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
             Map<Long, CourseSchedule> idCourseMap = allNotStartCourses.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
             for (CourseScheduleTeacherSalary oldCourseSalary : oldCourseSalaries) {
                 oldCourseSalary.setId(null);
+                //课酬调整后不能更新课酬
+                if(!oldCourseSalary.getEnableChangeSalary()){
+                    continue;
+                }
                 courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, idCourseMap.get(oldCourseSalary.getCourseScheduleId()), oldCourseSalary);
             }
-//            for (CourseSchedule courseSchedule : allNotStartCourses) {
-//                if(!ctm.containsKey(courseSchedule.getClassGroupId())){
-//                    continue;
-//                }
-//                List<ClassGroupTeacherMapper> classGroupTeachers = ctm.get(courseSchedule.getClassGroupId());
-//                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
-//                    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.setClassGroupId(courseSchedule.getClassGroupId());
-//                    courseScheduleTeacherSalary.setCreateTime(nowDate);
-//                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
-//                    courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, courseSchedule, courseScheduleTeacherSalary);
-//                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
-//                }
-//            }
             courseScheduleTeacherSalaryService.batchInsert(oldCourseSalaries);
         }
 
@@ -3955,6 +3938,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                             if (courseSchedule.getType() == CourseScheduleType.HIGH_ONLINE || courseSchedule.getType() == CourseScheduleType.HIGH) {
                                 List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedule(courseSchedule.getId());
                                 for (CourseScheduleTeacherSalary teacherSalary : courseScheduleTeacherSalaries) {
+                                    //课酬调整后不能更新课酬
+                                    if(!teacherSalary.getEnableChangeSalary()){
+                                        continue;
+                                    }
                                     List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(teacherSalary.getUserId(), null, null);
                                     if (teacherSalaryList == null || teacherSalaryList.size() == 0) {
                                         throw new BizException("请设置老师线上网管课课酬");

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -613,6 +613,10 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
             Map<Long, CourseSchedule> idCourseMap = classGroupNotStartCourse.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
             for (CourseScheduleTeacherSalary oldCourseSalary : oldCourseSalaries) {
                 oldCourseSalary.setId(null);
+                //课酬调整后不能更新课酬
+                if(!oldCourseSalary.getEnableChangeSalary()){
+                    continue;
+                }
                 courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, idCourseMap.get(oldCourseSalary.getCourseScheduleId()), oldCourseSalary);
             }
 

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

@@ -245,7 +245,7 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
                                 new String[]{courseScheduleStudentPayment.getUserId().toString()},
                                 null, courseSchedule.getName(), dateStr, courseHomework.getContent());
                     }
-                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_REMIND,
+                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_HOMEWORK_REMIND,
                             userMap, null, 0, 3 + notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
                 }
             }
@@ -379,7 +379,7 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
             userMap.put(integerListEntry.getKey(), integerListEntry.getKey().toString());
         }
 
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.NEED_POST_STUDY_REPORT,
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_NEED_POST_STUDY_REPORT,
                 userMap, null, 0, "8?" + pushUrl, "TEACHER");
 
     }
@@ -607,7 +607,7 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
                         new String[]{courseScheduleStudentPayment.getUserId().toString()},
                         null, courseSchedule.getName(), dateStr, courseHomework.getContent());
 
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_REMIND,
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_HOMEWORK_REMIND,
                         userMap, null, 0, 3 + notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
             }
 

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

@@ -222,7 +222,7 @@ public class CourseScheduleEvaluateServiceImpl extends BaseServiceImpl<Long, Cou
             userMap.put(integerListEntry.getKey(), integerListEntry.getKey().toString());
         }
 
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.NEED_POST_STUDY_REPORT,
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_NEED_POST_STUDY_REPORT,
                 userMap, null, 0, "8?" + pushUrl, "TEACHER");
 
     }

+ 94 - 39
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -410,7 +410,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public boolean batchAddCourseSchedule(Integer classGroupId, int coursesTimes, Date startDate, Date groupEndDate, Date groupStartDate, List<CourseTimeDto> teachingArrangementList,
-			TeachModeEnum teachMode, CourseScheduleType type, Integer schoolId, boolean isJumpHoliday) {
+			TeachModeEnum teachMode, CourseScheduleType type, Integer schoolId, boolean isJumpHoliday, List<CourseScheduleTeacherSalary> oldCourseScheduleTeacherSalaries) {
 		ClassGroup classGroup = classGroupService.get(classGroupId);
 		if (classGroup == null) {
 			throw new BizException("排课失败,班级信息不存在");
@@ -432,6 +432,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			throw new BizException("请设置课时安排");
 		}
 
+		if(!CollectionUtils.isEmpty(oldCourseScheduleTeacherSalaries)){
+			oldCourseScheduleTeacherSalaries.sort(Comparator.comparing(c->c.getCourseSchedule().getStartClassTime()));
+		}
+
 		BigDecimal subSidy = new BigDecimal(0);
 		// 查询教学点补贴
 		if (schoolId != null) {
@@ -627,6 +631,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					courseScheduleDao.insert(courseSchedule);
 					courseScheduleList.add(courseSchedule);
 
+					CourseScheduleTeacherSalary oldCourseMainTeacherSalary = null;
+					if(!CollectionUtils.isEmpty(oldCourseScheduleTeacherSalaries)){
+						oldCourseMainTeacherSalary = oldCourseScheduleTeacherSalaries.get(courseScheduleList.size()-1);
+					}
+
 					// 课程与老师薪水表
 					for (ClassGroupTeacherMapper cgtm : classGroupTeacherMapperList) {
 						CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -635,7 +644,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 						courseScheduleTeacherSalary.setMusicGroupId(classGroup.getMusicGroupId());
 						courseScheduleTeacherSalary.setTeacherRole(cgtm.getTeacherRole());
 						courseScheduleTeacherSalary.setUserId(cgtm.getUserId());
-						if (type == CourseScheduleType.PRACTICE) {
+						if(TeachTypeEnum.BISHOP.equals(cgtm.getTeacherRole())&&Objects.nonNull(oldCourseMainTeacherSalary)&&!oldCourseMainTeacherSalary.getEnableChangeSalary()){
+							courseScheduleTeacherSalary.setExpectSalary(oldCourseMainTeacherSalary.getExpectSalary());
+							courseScheduleTeacherSalary.setSubsidy(oldCourseMainTeacherSalary.getSubsidy());
+							courseScheduleTeacherSalary.setEnableChangeSalary(oldCourseMainTeacherSalary.getEnableChangeSalary());
+						}else if (type == CourseScheduleType.PRACTICE) {
 							PracticeGroup practiceGroup = practiceGroupDao.get(Long.parseLong(classGroup.getMusicGroupId()));
 							if(practiceGroup == null){
 								throw new BizException("课程组不存在");
@@ -653,11 +666,18 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 							}else if (practiceGroup.getType() == TRIAL){
 								courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(0));
 							}else {
-								BigDecimal salary = teacherPracticeSalaryMap.get(cgtm.getUserId());
-								if (salary == null) {
-									throw new BizException("请设置老师网管课课酬");
+								SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+								BigDecimal freeTeacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+
+								if(Objects.nonNull(oldCourseMainTeacherSalary)&&freeTeacherSalary.compareTo(oldCourseMainTeacherSalary.getExpectSalary())==0){
+									courseScheduleTeacherSalary.setExpectSalary(freeTeacherSalary);
+								}else{
+									BigDecimal salary = teacherPracticeSalaryMap.get(cgtm.getUserId());
+									if (salary == null) {
+										throw new BizException("请设置老师网管课课酬");
+									}
+									courseScheduleTeacherSalary.setExpectSalary(salary);
 								}
-								courseScheduleTeacherSalary.setExpectSalary(salary);
 							}
 						} else if (type == CourseScheduleType.VIP) {
 
@@ -874,6 +894,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}
 		}
 
+		Map<Long, CourseSchedule> idCourseMap = courseScheduleList.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
+		List<CourseScheduleTeacherSalary> oldCourseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
+		oldCourseScheduleTeacherSalaries = oldCourseScheduleTeacherSalaries.stream().filter(c->TeachTypeEnum.BISHOP.equals(c.getTeacherRole())).collect(Collectors.toList());
+		oldCourseScheduleTeacherSalaries.forEach(o->o.setCourseSchedule(idCourseMap.get(o.getCourseScheduleId())));
+
 		courseScheduleDao.batchDeleteAllCourseSchedules(courseScheduleIds);
 		courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
 		courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
@@ -902,7 +927,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		// 批量加课
 		batchAddCourseSchedule(classGroupId, batchInsertCoursesDto.getCourseScheduleIdList().size(), batchInsertCoursesDto.getStartDate(), endDate, startDate,
 				batchInsertCoursesDto.getTeachingArrangementList(), batchInsertCoursesDto.getTeachMode(), batchInsertCoursesDto.getType(),
-				batchInsertCoursesDto.getSchoolId(), batchInsertCoursesDto.getIsJumpHoliday());
+				batchInsertCoursesDto.getSchoolId(), batchInsertCoursesDto.getIsJumpHoliday(), oldCourseScheduleTeacherSalaries);
 		return true;
 	}
 
@@ -2973,6 +2998,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					if(courseSalaryListMap.containsKey(oldCourses.get(i).getId())){
 						List<CourseScheduleTeacherSalary> ctss = courseSalaryListMap.get(oldCourses.get(i).getId());
 						for (CourseScheduleTeacherSalary teacherSalary : ctss) {
+							//课酬调整后不能更新课酬
+							if(!teacherSalary.getEnableChangeSalary()){
+								continue;
+							}
 							courseScheduleTeacherSalaryService.updateSingleCourseTeacherSalary(oldCourses.get(i), teacherSalary);
 						}
 						courseScheduleTeacherSalaryDao.batchUpdate(ctss);
@@ -2993,6 +3022,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				throw new BizException("上课时间不得早于当前时间");
 			}
 
+			List<CourseScheduleTeacherSalary> oldCourseSalarys = courseSalaryListMap.get(oldCourses.get(i).getId());
+			CourseScheduleTeacherSalary oldMainTeacherSalary = null;
+			if(!CollectionUtils.isEmpty(oldCourseSalarys)){
+				List<CourseScheduleTeacherSalary> mainTeachSalarys = oldCourseSalarys.stream().filter(c -> TeachTypeEnum.BISHOP.equals(c.getTeacherRole())).collect(Collectors.toList());
+				oldMainTeacherSalary = CollectionUtils.isEmpty(mainTeachSalarys)?null:mainTeachSalarys.get(0);
+			}
+
 			for (ClassGroupTeacherMapper classGroupTeacherMapper : courseAdjustInfo.getClassGroupTeacherMapperList()) {
 				if(!changeSalaryTeachTypes.contains(classGroupTeacherMapper.getTeacherRole())){
 					continue;
@@ -3006,10 +3042,17 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				courseScheduleTeacherSalary.setClassGroupId(oldCourses.get(i).getClassGroupId());
 				courseScheduleTeacherSalary.setCreateTime(now);
 				courseScheduleTeacherSalary.setUpdateTime(now);
-				if(CourseScheduleType.PRACTICE.equals(oldCourses.get(i).getType())&&courseSalaryListMap.containsKey(oldCourses.get(i).getId())){
-					courseScheduleTeacherSalary.setExpectSalary(courseSalaryListMap.get(oldCourses.get(i).getId()).get(0).getExpectSalary());
+
+				if(TeachTypeEnum.BISHOP.equals(classGroupTeacherMapper.getTeacherRole())&&!oldMainTeacherSalary.getEnableChangeSalary()){
+					courseScheduleTeacherSalary.setExpectSalary(oldMainTeacherSalary.getExpectSalary());
+					courseScheduleTeacherSalary.setSubsidy(oldMainTeacherSalary.getSubsidy());
+					courseScheduleTeacherSalary.setEnableChangeSalary(oldMainTeacherSalary.getEnableChangeSalary());
+				}else{
+					if(CourseScheduleType.PRACTICE.equals(oldCourses.get(i).getType())&&courseSalaryListMap.containsKey(oldCourses.get(i).getId())){
+						courseScheduleTeacherSalary.setExpectSalary(courseSalaryListMap.get(oldCourses.get(i).getId()).get(0).getExpectSalary());
+					}
+					courseScheduleTeacherSalaryService.updateSingleCourseTeacherSalary(oldCourses.get(i), courseScheduleTeacherSalary);
 				}
-				courseScheduleTeacherSalaryService.updateSingleCourseTeacherSalary(oldCourses.get(i), courseScheduleTeacherSalary);
 				courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
 
 				if (courseAdjustInfo.getConfirmGenerate() && !courseAdjustInfo.getAllowZeroSalary() && BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getExpectSalary()) == 0) {
@@ -3460,8 +3503,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		List<CourseScheduleTeacherSalary> insertCourseScheduleTeacherSalaryList = new ArrayList<CourseScheduleTeacherSalary>();
 
 		// 获取课程对应教学点补贴
-		List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
-		Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
+//		List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+//		Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
 
 		// 课程对应乐团结算方式集合
 		List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
@@ -3617,8 +3660,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 				List<CourseScheduleTeacherSalary> oldCourseScheduleTeacherSalaryList = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
 				Map<Long, List<CourseScheduleTeacherSalary>> courseSalaryListMap = new HashMap<>();
+				CourseScheduleTeacherSalary mainTeacherSalary = null;
 				if(!CollectionUtils.isEmpty(oldCourseScheduleTeacherSalaryList)){
 					courseSalaryListMap = oldCourseScheduleTeacherSalaryList.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId));
+					List<CourseScheduleTeacherSalary> mainTeacherSalarys = oldCourseScheduleTeacherSalaryList.stream().filter(t -> TeachTypeEnum.BISHOP.equals(t.getTeacherRole())).collect(Collectors.toList());
+					if(!CollectionUtils.isEmpty(mainTeacherSalarys)){
+						mainTeacherSalary = mainTeacherSalarys.get(0);
+					}
 				}
 
 				courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIdList);
@@ -3630,7 +3678,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					ts.setCreateTime(date);
 					ts.setGroupType(newCourseSchedule.getGroupType());
 					ts.setMusicGroupId(newCourseSchedule.getMusicGroupId());
-					ts.setSubsidy(courseSubsidyMap.get(courseScheduleId));
 					if (teacherId == newCourseSchedule.getActualTeacherId().intValue()) {
 						ts.setTeacherRole(TeachTypeEnum.BISHOP);
 					} else {
@@ -3638,37 +3685,45 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					}
 					ts.setUpdateTime(date);
 					ts.setUserId(teacherId);
-					// 重新生成课酬
-					if (newCourseSchedule.getGroupType() == GroupType.MUSIC) {
-						courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, newCourseSchedule, ts);
-					} else if (newCourseSchedule.getGroupType() == GroupType.VIP) {
-						Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, teacherId, ts.getCourseScheduleId());
 
-						BigDecimal teacherSalary=null;
+					if(TeachTypeEnum.BISHOP.equals(ts.getTeacherRole())&&Objects.nonNull(mainTeacherSalary)&&!mainTeacherSalary.getEnableChangeSalary()){
+						ts.setExpectSalary(mainTeacherSalary.getExpectSalary());
+						ts.setSubsidy(mainTeacherSalary.getSubsidy());
+						ts.setEnableChangeSalary(mainTeacherSalary.getEnableChangeSalary());
+					}else{
+						// 重新生成课酬
+						if (newCourseSchedule.getGroupType() == GroupType.MUSIC) {
+							courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, newCourseSchedule, ts);
+						} else if (newCourseSchedule.getGroupType() == GroupType.VIP) {
+							Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, teacherId, ts.getCourseScheduleId());
+
+							BigDecimal teacherSalary=null;
+
+							if(Objects.nonNull(salaryMap)){
+								teacherSalary=newCourseSchedule.getTeachMode() == TeachModeEnum.OFFLINE?salaryMap.get("offlineTeacherSalary"):salaryMap.get("onlineTeacherSalary");
+							}
 
-						if(Objects.nonNull(salaryMap)){
-							teacherSalary=newCourseSchedule.getTeachMode() == TeachModeEnum.OFFLINE?salaryMap.get("offlineTeacherSalary"):salaryMap.get("onlineTeacherSalary");
-						}
+							ts.setExpectSalary(teacherSalary);
+
+						} else if (newCourseSchedule.getGroupType() == PRACTICE) {
+							SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+							BigDecimal freeTeacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
 
-						ts.setExpectSalary(teacherSalary);
-
-					} else if (newCourseSchedule.getGroupType() == PRACTICE) {
-						SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
-						BigDecimal freeTeacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
-
-						List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao
-								.queryByUserId(teacherId);
-						List<CourseScheduleTeacherSalary> teacherSalaries = courseSalaryListMap.get(ts.getCourseScheduleId());
-						if(!CollectionUtils.isEmpty(teacherSalaries)&&freeTeacherSalary.compareTo(teacherSalaries.get(0).getExpectSalary())==0){
-							ts.setExpectSalary(freeTeacherSalary);
-						}else{
-							if (teacherDefaultPracticeGroupSalaryList != null && teacherDefaultPracticeGroupSalaryList.size() > 0) {
-								ts.setExpectSalary(teacherDefaultPracticeGroupSalaryList.get(0).getMainTeacherSalary());
-							} else {
-								throw new BizException("请设置老师 的网管课课酬");
+							List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao
+									.queryByUserId(teacherId);
+							List<CourseScheduleTeacherSalary> teacherSalaries = courseSalaryListMap.get(ts.getCourseScheduleId());
+							if(!CollectionUtils.isEmpty(teacherSalaries)&&freeTeacherSalary.compareTo(teacherSalaries.get(0).getExpectSalary())==0){
+								ts.setExpectSalary(freeTeacherSalary);
+							}else{
+								if (teacherDefaultPracticeGroupSalaryList != null && teacherDefaultPracticeGroupSalaryList.size() > 0) {
+									ts.setExpectSalary(teacherDefaultPracticeGroupSalaryList.get(0).getMainTeacherSalary());
+								} else {
+									throw new BizException("请设置老师 的网管课课酬");
+								}
 							}
 						}
 					}
+
 					if(ts.getExpectSalary() == null){
 						throw new BizException("请设置老师的课酬");
 					}
@@ -4719,7 +4774,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         Map<String, Object> params = new HashMap<>(16);
         MapUtil.populateMap(params, queryInfo);
 
-        List<CourseScheduleEndDto> results = new ArrayList<>();
+        List<CourseScheduleEndDto> results;
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
 		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息

+ 114 - 77
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -238,24 +238,35 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
         }
 
+        BigDecimal zero = new BigDecimal("0");
+
         //获取课程对应教学点补贴
-        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(new ArrayList<>(courseScheduleIds));
-        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
+//        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(new ArrayList<>(courseScheduleIds));
+//        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
 
         someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
             List<String> deductReasons = new ArrayList<>();
 
             BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
 
-            BigDecimal subsidy = courseSubsidyMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
-            if (Objects.isNull(subsidy)) {
-                subsidy = new BigDecimal(0);
+//            BigDecimal subsidy = courseSubsidyMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+//            if (Objects.isNull(subsidy)) {
+//                subsidy = new BigDecimal(0);
+//            }
+//            courseScheduleTeacherSalary.setSubsidy(subsidy);
+//            expectSalary = expectSalary.add(subsidy);
+//
+//            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
+//                deductReasons.add("教学点补贴:" + subsidy);
+//            }
+
+            if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
+                courseScheduleTeacherSalary.setSubsidy(zero);
             }
-            courseScheduleTeacherSalary.setSubsidy(subsidy);
-            expectSalary = expectSalary.add(subsidy);
 
-            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
-                deductReasons.add("教学点补贴:" + subsidy);
+            if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy())!=0){
+                expectSalary = expectSalary.add(courseScheduleTeacherSalary.getSubsidy());
+                deductReasons.add("课程补贴:" + courseScheduleTeacherSalary.getSubsidy());
             }
 
             Teacher teacher = idTeacherMap.get(courseScheduleTeacherSalary.getUserId());
@@ -380,9 +391,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseScheduleIds);
         Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
 
+        BigDecimal zero = new BigDecimal(0);
+
         //获取课程对应教学点补贴
-        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
-        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
+//        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+//        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
 
         //处理课酬信息
         someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
@@ -390,14 +403,23 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
 
-            BigDecimal subsidy = courseSubsidyMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
-            if (Objects.isNull(subsidy)) {
-                subsidy = new BigDecimal(0);
+//            BigDecimal subsidy = courseSubsidyMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+//            if (Objects.isNull(subsidy)) {
+//                subsidy = new BigDecimal(0);
+//            }
+//            courseScheduleTeacherSalary.setSubsidy(subsidy);
+//            expectSalary = expectSalary.add(subsidy);
+//            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
+//                deductReasons.add("教学点补贴:" + subsidy);
+//            }
+
+            if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
+                courseScheduleTeacherSalary.setSubsidy(zero);
             }
-            courseScheduleTeacherSalary.setSubsidy(subsidy);
-            expectSalary = expectSalary.add(subsidy);
-            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
-                deductReasons.add("教学点补贴:" + subsidy);
+
+            if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy())!=0){
+                expectSalary = expectSalary.add(courseScheduleTeacherSalary.getSubsidy());
+                deductReasons.add("课程补贴:" + courseScheduleTeacherSalary.getSubsidy());
             }
 
             Teacher teacher = idTeacherMap.get(courseScheduleTeacherSalary.getUserId());
@@ -513,9 +535,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
         }
 
+        BigDecimal zero = new BigDecimal(0);
+
         //获取课程对应教学点补贴
-        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
-        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
+//        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+//        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
 
         Set<Integer> schoolIds = yesterdayCourseSchedules.stream().map(CourseSchedule::getSchoolId).collect(Collectors.toSet());
         List<School> schools = schoolDao.getSchools(new ArrayList<>(schoolIds));
@@ -616,13 +640,22 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
                 List<String> deductReasons = new ArrayList<>();
 
-                BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getId());
-                if (Objects.isNull(subsidy)) {
-                    subsidy = new BigDecimal(0);
+//                BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getId());
+//                if (Objects.isNull(subsidy)) {
+//                    subsidy = new BigDecimal(0);
+//                }
+//                teacherSalary = teacherSalary.add(subsidy);
+//                if(BigDecimal.ZERO.compareTo(subsidy)!=0){
+//                    deductReasons.add("教学点补贴:" + subsidy);
+//                }
+
+                if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
+                    courseScheduleTeacherSalary.setSubsidy(zero);
                 }
-                teacherSalary = teacherSalary.add(subsidy);
-                if(BigDecimal.ZERO.compareTo(subsidy)!=0){
-                    deductReasons.add("教学点补贴:" + subsidy);
+
+                if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy())!=0){
+                    teacherSalary = teacherSalary.add(courseScheduleTeacherSalary.getSubsidy());
+                    deductReasons.add("课程补贴:" + courseScheduleTeacherSalary.getSubsidy());
                 }
 
                 //未转正
@@ -700,7 +733,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     courseScheduleTeacherSalary.setDeductionReason(org.apache.commons.lang3.StringUtils.join(deductReasons, ";"));
 
                 //更新教师结算信息
-                courseScheduleTeacherSalary.setSubsidy(subsidy);
                 courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
                 courseScheduleTeacherSalary.setBelongToDaya(false);
                 courseScheduleTeacherSalary.setSettlementTime(now);
@@ -713,13 +745,22 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             List<String> deductReasons = new ArrayList<>();
 
-            BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getId());
-            if (Objects.isNull(subsidy)) {
-                subsidy = new BigDecimal(0);
+//            BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getId());
+//            if (Objects.isNull(subsidy)) {
+//                subsidy = new BigDecimal(0);
+//            }
+//            teacherSalary = teacherSalary.add(subsidy);
+//            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
+//                deductReasons.add("教学点补贴:" + subsidy);
+//            }
+
+            if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
+                courseScheduleTeacherSalary.setSubsidy(zero);
             }
-            teacherSalary = teacherSalary.add(subsidy);
-            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
-                deductReasons.add("教学点补贴:" + subsidy);
+
+            if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy())!=0){
+                teacherSalary = teacherSalary.add(courseScheduleTeacherSalary.getSubsidy());
+                deductReasons.add("课程补贴:" + courseScheduleTeacherSalary.getSubsidy());
             }
 
 //            boolean notPositive = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0;
@@ -847,7 +888,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
 
             //更新教师结算信息
-            courseScheduleTeacherSalary.setSubsidy(subsidy);
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setBelongToDaya(false);
             courseScheduleTeacherSalary.setSettlementTime(now);
@@ -892,6 +932,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             List<Map<Integer, String>> teachModeById = courseScheduleDao.getTeachModeById(courseIds);
             Map<Integer, String> coureTeachModeMap = MapUtil.convertIntegerMap(teachModeById);
             for(int i=0;i<courseScheduleTeacherSalaries.size();i++){
+                if(!courseScheduleTeacherSalaries.get(i).getEnableChangeSalary()){
+                    continue;
+                }
                 String courseType = coureTeachModeMap.get(courseScheduleTeacherSalaries.get(i).getCourseScheduleId());
 
                 Map<String, BigDecimal> salary = vipGroupService.countVipGroupPredictFee(vipGroup, vipGroup.getUserId(), courseScheduleTeacherSalaries.get(i).getCourseScheduleId());
@@ -1163,7 +1206,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         String expireDateStr = DateUtil.dateToString(DateUtil.addDays(new Date(), 2), "M月d号");
         List<Integer> teacherIds = courseScheduleTeacherSalaryDao.findIsSettlementTeacherIdsWithMonth(month);
         Map<Integer, String> userMap = teacherIds.stream().collect(Collectors.toMap(Integer::valueOf, id->String.valueOf(id)));
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_SALARY_CONFIRM_PUSH,
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_SALARY_CONFIRM,
                 userMap, null, 0, notifyUrl, "TEACHER", monthStr, expireDateStr);
     }
 
@@ -1437,6 +1480,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             t.setTeacherId(courseScheduleTeacherSalary.getUserId());
             t.setTeacherName(idUserMap.containsKey(t.getTeacherId())?idUserMap.get(t.getTeacherId()).getUserName():"");
             t.setTeacherRole(courseScheduleTeacherSalary.getTeacherRole());
+            t.setSettlementTime(courseScheduleTeacherSalary.getSettlementTime());
             if(idTeacherAttendanceMap.containsKey(t.getTeacherId())){
                 TeacherAttendance teacherAttendance = idTeacherAttendanceMap.get(t.getTeacherId());
                 t.setTeacherAttendance(teacherAttendance);
@@ -1619,12 +1663,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
             List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
 
-            BigDecimal subsidy = new BigDecimal(0);
-            if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
-                subsidy = school.getSubsidy();
-            }
-
-            teacherSalary = teacherSalary.add(subsidy);
+            teacherSalary = teacherSalary.add(courseScheduleTeacherSalary.getSubsidy());
             if(BigDecimal.ZERO.compareTo(teacherSalary)>0){
                 teacherSalary = new BigDecimal(0);
             }
@@ -1695,17 +1734,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
             //更新教师结算信息
-            courseScheduleTeacherSalary.setSubsidy(subsidy);
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setDeductReasons(deductReasons);
         }else{
             List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
 
-            BigDecimal subsidy = new BigDecimal(0);
-            if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
-                subsidy = school.getSubsidy();
-            }
-            teacherSalary = teacherSalary.add(subsidy);
+            teacherSalary = teacherSalary.add(courseScheduleTeacherSalary.getSubsidy());
             if(BigDecimal.ZERO.compareTo(teacherSalary)>0){
                 teacherSalary = new BigDecimal(0);
             }
@@ -1833,7 +1867,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
             //更新教师结算信息
-            courseScheduleTeacherSalary.setSubsidy(subsidy);
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setDeductReasons(deductReasons);
         }
@@ -1856,12 +1889,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         
         BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
 
-        BigDecimal subsidy = new BigDecimal(0);
-        if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
-            subsidy = school.getSubsidy();
-        }
-        courseScheduleTeacherSalary.setSubsidy(subsidy);
-        expectSalary = expectSalary.add(subsidy);
+        expectSalary = expectSalary.add(courseScheduleTeacherSalary.getSubsidy());
         if(BigDecimal.ZERO.compareTo(expectSalary)>0){
             expectSalary = new BigDecimal(0);
         }
@@ -1968,12 +1996,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         
         BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
 
-        BigDecimal subsidy = new BigDecimal(0);
-        if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
-            subsidy = school.getSubsidy();
-        }
-        courseScheduleTeacherSalary.setSubsidy(subsidy);
-        expectSalary = expectSalary.add(subsidy);
+        expectSalary = expectSalary.add(courseScheduleTeacherSalary.getSubsidy());
         if(BigDecimal.ZERO.compareTo(expectSalary)>0){
             expectSalary = new BigDecimal(0);
         }
@@ -2125,6 +2148,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<Teacher> teachers = teacherDao.findByTeacherIds(new ArrayList<>(teacherIds));
         Map<Integer, Teacher> idTeacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, t -> t, (t1, t2) -> t1));
 
+        BigDecimal zero = new BigDecimal(0);
+
         for (CourseScheduleTeacherSalary teacherSalary : teacherSalaries) {
             //课程
             CourseSchedule courseSchedule = idCourseMap.get(teacherSalary.getCourseScheduleId());
@@ -2135,6 +2160,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             //教师
             Teacher teacher = idTeacherMap.get(teacherSalary.getUserId());
 
+            if(Objects.isNull(teacherSalary.getSubsidy())){
+                teacherSalary.setSubsidy(zero);
+            }
+
+            teacherSalary.setExpectSalary(teacherSalary.getExpectSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
+            teacherSalary.setSubsidy(teacherSalary.getSubsidy().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
+
             if(Objects.nonNull(teacherSalary.getActualSalary())){
                 continue;
             }
@@ -2233,6 +2265,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             List<Teacher> teachers = teacherDao.findByTeacherIds(new ArrayList<>(teacherIds));
             Map<Integer, Teacher> idTeacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, t -> t, (t1, t2) -> t1));
 
+            BigDecimal zero = new BigDecimal(0);
+
             for (CourseScheduleTeacherSalary teacherSalary : teacherSalaries) {
                 //课程
                 CourseSchedule courseSchedule = idCourseMap.get(teacherSalary.getCourseScheduleId());
@@ -2243,6 +2277,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 //教师
                 Teacher teacher = idTeacherMap.get(teacherSalary.getUserId());
 
+                if(Objects.isNull(teacherSalary.getSubsidy())){
+                    teacherSalary.setSubsidy(zero);
+                }
+
+                teacherSalary.setExpectSalary(teacherSalary.getExpectSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
+                teacherSalary.setSubsidy(teacherSalary.getSubsidy().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
+
                 BigDecimal oldSalary = null;
                 BigDecimal oldSubsidy = null;
                 if(Objects.nonNull(teacherSalary.getSettlementTime())){
@@ -2296,6 +2337,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 }
                 teacherIncomeInfo.setBelongToDaya(teacherSalary.getBelongToDaya());
                 teacherIncomeInfo.setSortNum(courseSchedule.getStartClassTime().getTime()+courseSchedule.getId());
+
+                //收入项
+                List<TeacherSalaryDeductReasonDto> incomes = new ArrayList<>();
+                incomes.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SALARY, teacherIncomeInfo.getExpectSalary()));
+                incomes.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.COURSE_SUBSIDY, teacherIncomeInfo.getSubsidy()));
+                teacherIncomeInfo.setIncomes(incomes);
+
                 dataList.add(teacherIncomeInfo);
             }
         }
@@ -2401,18 +2449,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         salaryResult.put("amount", BigDecimal.ZERO);
         salaryResult.put("data", Collections.emptyList());
 
-        Map<String, Object> subsidyResult = new HashMap<>();
-        subsidyResult.put("desc", "教学点补贴");
-        subsidyResult.put("amount", BigDecimal.ZERO);
-        subsidyResult.put("data", Collections.emptyList());
-
         Map<String, Object> saleRewardResult = new HashMap<>();
         saleRewardResult.put("desc", "销售奖励");
         saleRewardResult.put("amount", BigDecimal.ZERO);
         saleRewardResult.put("data", Collections.emptyList());
 
         data.add(salaryResult);
-        data.add(subsidyResult);
         data.add(saleRewardResult);
 
         result.put("data", data);
@@ -2458,10 +2500,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<LocalDateBigDecimalMapDto> subsidyList = new ArrayList<>();
         List<LocalDateBigDecimalMapDto> saleRewardList = new ArrayList<>();
         for (LocalDateBigDecimalMapDto localDateBigDecimalMapDto : monthIncomeMapList) {
-            if(localDateBigDecimalMapDto.getAmount().compareTo(BigDecimal.ZERO)<0){
-                localDateBigDecimalMapDto.setSubsidy(localDateBigDecimalMapDto.getSubsidy().subtract(localDateBigDecimalMapDto.getAmount().abs()));
-                localDateBigDecimalMapDto.setAmount(BigDecimal.ZERO);
-            }
+//            if(localDateBigDecimalMapDto.getAmount().compareTo(BigDecimal.ZERO)<0){
+//                localDateBigDecimalMapDto.setSubsidy(localDateBigDecimalMapDto.getSubsidy().subtract(localDateBigDecimalMapDto.getAmount().abs()));
+//                localDateBigDecimalMapDto.setAmount(BigDecimal.ZERO);
+//            }
 
             LocalDateBigDecimalMapDto subsidyData = new LocalDateBigDecimalMapDto();
             BeanUtils.copyProperties(localDateBigDecimalMapDto, subsidyData);
@@ -2476,15 +2518,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
         BigDecimal reduce = monthIncomeMapList.stream().map(LocalDateBigDecimalMapDto::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 
-        BigDecimal subsidy = monthIncomeMapList.stream().map(LocalDateBigDecimalMapDto::getSubsidy).reduce(BigDecimal.ZERO, BigDecimal::add);
-
-        result.put("total", reduce.add(subsidy));
+        result.put("total", reduce);
         salaryResult.put("amount", reduce);
         salaryResult.put("data", monthIncomeMapList);
 
-        subsidyResult.put("amount", subsidy);
-        subsidyResult.put("data", subsidyList);
-
         saleRewardResult.put("data", saleRewardList);
 
         return result;
@@ -2500,7 +2537,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         for (Integer teacherId : teacherIds) {
             userMap.put(teacherId, teacherId.toString());
         }
-        sysMessageService.batchPushMessage(MessageTypeEnum.TEACHER_INCOME_REMIND,
+        sysMessageService.batchPushMessage(MessageTypeEnum.TEACHER_PUSH_INCOME_REMIND,
                 userMap, null, 0, "12", "TEACHER","income_remind.mp3","income_remind_channel");
     }
 }

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

@@ -770,7 +770,7 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
         for (CoursesGroup noStudentsGroup : noStudentsGroups) {
             Map<Integer, String> userMap = new HashMap<>();
             userMap.put(noStudentsGroup.getTeacherId(), noStudentsGroup.getTeacherId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.COMM_NO_STUDENTS_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_COMM_NO_STUDENTS_PUSH,
                     userMap, null, 0, null, "TEACHER", noStudentsGroup.getName());
         }
     }

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

@@ -315,7 +315,7 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
             notifyMap.put("channelType", channelType);
             notifyMap.put("orderNo", "");
             studentPaymentOrderService.updateOrder(notifyMap);
-            return BaseController.failed(HttpStatus.CREATED, "恭喜您,支付成功!");
+            return BaseController.failed(HttpStatus.CREATED, notifyMap,"恭喜您,支付成功!");
         }
 
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
@@ -511,7 +511,7 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
             notifyMap.put("channelType", channelType);
             notifyMap.put("orderNo", "");
             studentPaymentOrderService.updateOrder(notifyMap);
-            return BaseController.failed(HttpStatus.CREATED, "恭喜您,支付成功!");
+            return BaseController.failed(HttpStatus.CREATED, notifyMap,"恭喜您,支付成功!");
         }
 
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");

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

@@ -944,13 +944,13 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         try{
             Map<Integer, String> userMap = new HashMap<>();
             userMap.put(practiceGroup.getStudentId(), practiceGroup.getStudentId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PAY_PRACTICE_BUY_SUCCESS,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_PAY_PRACTICE_BUY_SUCCESS,
                     userMap, null, 0, null, "STUDENT", groupStartTime, groupEndTime, teacherName, drillTimesOnWeek, firstCourseStartTime);
 //            SysUser student = sysUserFeignService.queryUserById(practiceGroup.getStudentId());
             SysUser student = teacherDao.getUser(practiceGroup.getStudentId());
             Map<Integer, String> userPhoneMap = new HashMap<>();
             userPhoneMap.put(practiceGroup.getStudentId(), student.getPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.PAY_PRACTICE_BUY_SUCCESS,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_PAY_PRACTICE_BUY_SUCCESS,
                     userPhoneMap, null, 0, null, "STUDENT", groupStartTime, groupEndTime, teacherName, drillTimesOnWeek, firstCourseStartTime);
 
             String practiceType = "网管课";
@@ -969,12 +969,12 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
 
             Map<Integer, String> teacherMap = new HashMap<>();
             teacherMap.put(practiceGroup.getUserId(), practiceGroup.getUserId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_CREATE_TEACHER_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_SMS_PUSH_PRACTICE_CREATE,
                     teacherMap, null, 0, null, "TEACHER", teacher.getRealName(),
                     practiceType, practiceGroup.getName());
             Map<Integer, String> teacherPhoneMap = new HashMap<>();
             teacherPhoneMap.put(practiceGroup.getUserId(), teacher.getPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.PRACTICE_CREATE_TEACHER_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.TEACHER_SMS_PUSH_PRACTICE_CREATE,
                     teacherPhoneMap, null, 0, null, "TEACHER", teacher.getRealName(),
                     practiceType, practiceGroup.getName());
         }catch (Exception e){
@@ -1497,7 +1497,7 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
 
             Map<Integer, String> userMap = new HashMap<>();
             userMap.put(practiceGroupBuyParams.getStudentId(), practiceGroupBuyParams.getStudentId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TRIAL_PRACTICE_CREATE_STUDENT_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_TRIAL_PRACTICE_CREATE,
                     userMap, null, 0, null, "STUDENT", student.getUsername(), teacher.getRealName(),
                     oneCourseTimeStr, twoCourseTimeStr);
 //            Map<Integer, String> userPhoneMap = new HashMap<>();
@@ -1522,12 +1522,12 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
 
             Map<Integer, String> teacherMap = new HashMap<>();
             teacherMap.put(practiceGroupBuyParams.getUserId(), practiceGroupBuyParams.getUserId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_CREATE_TEACHER_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_SMS_PUSH_PRACTICE_CREATE,
                     teacherMap, null, 0, null, "TEACHER", teacher.getRealName(),
                     practiceType, practiceGroupBuyParams.getName());
             Map<Integer, String> teacherPhoneMap = new HashMap<>();
             teacherPhoneMap.put(practiceGroupBuyParams.getUserId(), teacher.getPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.PRACTICE_CREATE_TEACHER_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.TEACHER_SMS_PUSH_PRACTICE_CREATE,
                     teacherPhoneMap, null, 0, null, "TEACHER", teacher.getRealName(),
                     practiceType, practiceGroupBuyParams.getName());
         }catch (Exception e){

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

@@ -12,6 +12,7 @@ import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleService;
 import com.ym.mec.biz.service.ExportService;
 import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.storage.StoragePluginContext;
 import com.ym.mec.thirdparty.storage.provider.KS3StoragePlugin;
@@ -58,6 +59,8 @@ public class ExportServiceImpl implements ExportService {
     private ReplacementInstrumentActivityDao replacementInstrumentActivityDao;
     @Autowired
     private CourseScheduleService courseScheduleService;
+    @Autowired
+    private StudentService studentService;
 
     @Override
     @Async
@@ -252,7 +255,7 @@ public class ExportServiceImpl implements ExportService {
             }
             //如果合作单位不存在取学员的第一个乐团的合作单位,乐团主管
             if (row.getCooperationOrganName() == null) {
-                CooperationOrgan cooperationOrgan = musicGroupDao.findUserMusicGroupCooperationOrgan(row.getUserId());
+                CooperationOrgan cooperationOrgan = studentService.getStudentEduTeacher(row.getUserId());
                 if (cooperationOrgan != null) {
                     row.setCooperationOrganName(cooperationOrgan.getName());
                     row.setEduTeacher(cooperationOrgan.getLinkman() != null ? cooperationOrgan.getLinkman() : row.getEduTeacher());
@@ -513,7 +516,7 @@ public class ExportServiceImpl implements ExportService {
             }
             //如果合作单位不存在取学员的第一个乐团的合作单位和教学点
             if (row.getCooperationOrganName() == null) {
-                CooperationOrgan cooperationOrgan = musicGroupDao.findUserMusicGroupCooperationOrgan(row.getUserId());
+                CooperationOrgan cooperationOrgan = studentService.getStudentEduTeacher(row.getUserId());
                 if (cooperationOrgan != null) {
                     row.setCooperationOrganName(cooperationOrgan.getName());
                     row.setEduTeacher(cooperationOrgan.getLinkman() != null ? cooperationOrgan.getLinkman() : row.getEduTeacher());
@@ -725,6 +728,7 @@ public class ExportServiceImpl implements ExportService {
     }
 
     @Override
+    @Async
     public void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException {
         List<CourseScheduleEndDto> rows = courseScheduleService.endFindCourseSchedules(queryInfo).getRows();
         for (CourseScheduleEndDto row : rows) {

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

@@ -103,7 +103,7 @@ public class ExtracurricularExercisesMessageServiceImpl extends BaseServiceImpl<
 						new String[]{extracurricularExercisesReply.getUserId().toString()},
 						null, extracurricularExercises.getTitle(), extracurricularExercisesMessage.getContent());
 			}
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.EXTRA_TEACHER_REPLY_PUSH,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_EXTRA_REPLY,
 					userMap, null, 0, 3+notifyUrl, "STUDENT", extracurricularExercises.getTitle());
 		}else if("STUDENT".equals(extracurricularExercisesMessage.getRole())&&Objects.nonNull(extracurricularExercisesReply.getAttachments())){
 			Map<Integer, String> userMap = new HashMap<>();
@@ -121,7 +121,7 @@ public class ExtracurricularExercisesMessageServiceImpl extends BaseServiceImpl<
 						new String[]{extracurricularExercises.getTeacherId().toString()},
 						null,extracurricularExercises.getTitle(), extracurricularExercisesMessage.getContent());
 			}
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.EXTRA_STUDENT_REPLY_PUSH,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_EXTRA_REPLY,
 					userMap, null, 0, 9+notifyUrl, "TEACHER", extracurricularExercises.getTitle(), user.getUsername());
 		}
 		studentServeService.updateExercisesSituation(extracurricularExercises.getCreateTime(), new ArrayList<>(Arrays.asList(extracurricularExercisesReply.getUserId())), extracurricularExercises.getTeacherId());

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

@@ -171,7 +171,7 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 			sysMessageService.batchSendImMessage(MessageTypeEnum.EXTRA_SUBMIT_IM,existExtra.getUserId().toString(),"dayaedu"+notifyUrl,
 					new String[]{extracurricularExercises.getTeacherId().toString()},
 					null,extracurricularExercises.getTitle());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.EXTRA_SUBMIT_PUSH,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_EXTRA_SUBMIT,
 					userMap, null, 0, 9+notifyUrl, "TEACHER",
 					extracurricularExercises.getTitle(), user.getUsername());
 		}

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

@@ -110,7 +110,7 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 			}
 			Map<Integer, String> userMap = new HashMap<>();
 			userMap.put(studentId, studentId.toString());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.EXTRA_REMIND_PUSH,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_EXTRA_REMIND,
 					userMap, null, 0, 3+notifyUrl, "STUDENT",
 					teacher.getRealName(),exercises.getTitle(), dateStr);
 		}
@@ -183,7 +183,7 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 		for (Map.Entry<Integer, Long> integerLongEntry : noFinishedServiceTeacherMap.entrySet()) {
 			Map<Integer, String> userMap = new HashMap<>();
 			userMap.put(integerLongEntry.getKey(), integerLongEntry.getKey().toString());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PUBLIC_EXTRA_REMIND,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_PUBLIC_EXTRA_REMIND,
 					userMap, null, 0, "11" , "TEACHER", integerLongEntry.getValue());
 		}
 	}

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

@@ -449,7 +449,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		if(StringUtils.isNotEmpty(innerRepertoryWarnNum)){
 			String goodsNames = goodsDao.getInnerRepertoryWarnName(innerRepertoryWarnNum);
 			if(StringUtils.isNotEmpty(goodsNames)){
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_GOODS_REPERTORY_WARN, receivers, null, 0, null,null,
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_GOODS_REPERTORY_WARN, receivers, null, 0, null,null,
 						goodsNames,"内部");
 			}
 		}
@@ -459,7 +459,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		if(StringUtils.isNotEmpty(outerRepertoryWarnNum)){
 			String goodsNames = goodsDao.getOuterRepertoryWarnName(outerRepertoryWarnNum);
 			if(StringUtils.isNotEmpty(goodsNames)){
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SMS_GOODS_REPERTORY_WARN, receivers, null, 0, null,null,
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SYSTEM_SMS_GOODS_REPERTORY_WARN, receivers, null, 0, null,null,
 						goodsNames,"税务");
 			}
 		}

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

@@ -485,6 +485,9 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			two.setErrorType(IndexErrorType.STUDENT_INFO);
 			two.setDesc(IndexErrorType.STUDENT_INFO.getMsg());
 			List<IndexErrInfoDto> twoChild = new ArrayList<>();
+			//学员请假异常提醒(获取前两个月的)
+			String format1 = DateUtil.format(DateUtil.addMonths(new Date(), -1), DateUtil.ISO_YEAR_MONTH_FORMAT);
+			twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_ERROR_LEAVE, IndexErrorType.STUDENT_ERROR_LEAVE.getMsg(), indexBaseMonthDataDao.countStudentErrorLeave(organIds,format1,classGroupIds), null));
 
 			//未缴费学员数
 			twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_ARREARAGE, IndexErrorType.STUDENT_ARREARAGE.getMsg(), indexBaseMonthDataDao.countNoPaymentStudentNum(organIds,educationUserId,0), Arrays.asList(educationUserId)));
@@ -824,6 +827,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
 		Integer educationUserId = null;
 		if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+			//获取教务老师关联的班级列表
 			educationUserId = sysUser.getId();
 		}
 		//获取关联的乐团列表
@@ -848,7 +852,6 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		//未缴费学员数
 		result.add(new IndexErrInfoDto(IndexErrorType.STUDENT_NOT_PAYMENT, IndexErrorType.STUDENT_NOT_PAYMENT.getMsg(), indexBaseMonthDataDao.countNoPaymentStudentNum(organIdSet,educationUserId, 1), Arrays.asList(educationUserId)));
 
-
 		String monthStr = DateUtil.format(date, DateUtil.ISO_YEAR_MONTH_FORMAT);
 		//全职未离职老师
 		//预计课酬较低
@@ -899,6 +902,14 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		resultMap.put("musicPatrol",flag1);
 		boolean flag2 = false;
 		if(!flag2){
+			//学员请假异常提醒(获取前两个月的)
+			String format1 = DateUtil.format(DateUtil.addMonths(date, -1), DateUtil.ISO_YEAR_MONTH_FORMAT);
+			int studentErrorLeaveNum = indexBaseMonthDataDao.countStudentErrorLeave(organIds,format1,classGroupIds);
+			if(studentErrorLeaveNum > 0){
+				flag2 = true;
+			}
+		}
+		if(!flag2){
 			List<Long> quitGroupNum = indexBaseMonthDataDao.queryApplyForQuitGroupNum(organIds,educationUserId);
 			if(quitGroupNum.size() > 0){
 				flag2 = true;

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

@@ -180,7 +180,7 @@ public class InspectionItemPlanServiceImpl extends BaseServiceImpl<Long, Inspect
 
         String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.EDU_TEACHER_BASE_URL);
         String pushUrl = baseApiUrl + "/#/musicInspection";
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_INSPECTION_NOTICE,
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_PUSH_SMS_INSPECTION_NOTICE,
                 userMap, null, 0, "8?" + pushUrl, "SYSTEM");
         return startPlans;
     }

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

@@ -941,12 +941,12 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				CalenderPushDto calenderPushDto = collect.get(e).get(0);
 				Map<Integer, String> receivers = new HashMap<>(1);
 				receivers.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherPhone());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_PAYMENT_DETAIL, receivers, null, 0,
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_DETAIL, receivers, null, 0,
 						null, null, calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate(),
 						maps.get(e));
 				Map<Integer, String> receivers1 = new HashMap<>(1);
 				receivers1.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherId().toString());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_PAYMENT_DETAIL, receivers1, null, 0,
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_DETAIL, receivers1, null, 0,
 						null, "SYSTEM", calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate(),
 						maps.get(e));
 			});
@@ -961,11 +961,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				CalenderPushDto calenderPushDto = collect.get(e).get(0);
 				Map<Integer, String> receivers = new HashMap<>(1);
 				receivers.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherPhone());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_PAYMENT_CREATE, receivers, null, 0,
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers, null, 0,
 						null, null, calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate());
 				Map<Integer, String> receivers1 = new HashMap<>(1);
 				receivers1.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherId().toString());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_PAYMENT_CREATE, receivers1, null, 0,
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers1, null, 0,
 						null, "SYSTEM", calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate());
 			});
 		}
@@ -976,11 +976,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			calenderPushDtos.forEach(e -> {
 				Map<Integer, String> receivers = new HashMap<>(1);
 				receivers.put(e.getTeacherId(), e.getTeacherPhone());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_PAYMENT_CREATE, receivers, null, 0,
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers, null, 0,
 						null, null, e.getMusicGroupName(), e.getPaymentValidStartDate(), e.getPaymentValidEndDate());
 				Map<Integer, String> receivers1 = new HashMap<>(1);
 				receivers1.put(e.getTeacherId(), e.getTeacherId().toString());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_PAYMENT_CREATE, receivers1, null, 0,
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers1, null, 0,
 						null, "SYSTEM", e.getMusicGroupName(), e.getPaymentValidStartDate(), e.getPaymentValidEndDate());
 			});
 		}

+ 26 - 25
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -8,15 +8,7 @@ import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-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.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import com.ym.mec.biz.dal.dao.*;
@@ -469,8 +461,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Map<Integer, String> receiverList = studentPreRegistrationList.stream().collect(Collectors.toMap(StudentPreRegistration::getUserId, StudentPreRegistration::getPhone));
 
         String meetingDateStr = sdf_ymdhms.format(meetingDate);
-        sysMessageService.batchSendImGroupMessage(MessageTypeEnum.SMS_MUSIC_GROUP_PARENT_MEETING_NOTICE, userId + "", null, new String[]{musicGroupId}, null, meetingDateStr, address);
-        sysMessageService.batchSendMessage(MessageSender.AWSMS, MessageTypeEnum.SMS_MUSIC_GROUP_PARENT_MEETING_NOTICE, receiverList, null, 1, null, null, meetingDateStr, address);
+        sysMessageService.batchSendImGroupMessage(MessageTypeEnum.STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE, userId + "", null, new String[]{musicGroupId}, null, meetingDateStr, address);
+        sysMessageService.batchSendMessage(MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE, receiverList, null, 1, null, null, meetingDateStr, address);
         return true;
     }
 
@@ -1225,7 +1217,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             url = baseURL + "/#/smallRegister?musicGroupId=" + musicGroupId + "&classGroupIds=" + classGroupIds;
         }
         String serverPhone = sysConfigDao.findConfigValue(SysConfigService.SERVER_PHONE);
-        sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.SMS_BASICS_SKILL_APPLY_MESSAGE,
+        sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_BASICS_SKILL_APPLY_MESSAGE,
                 studentMap, null, 0, "5?" + url, "STUDENT", musicGroup.getName(), HttpUtil.getSortUrl(url), serverPhone);
 
         return studentMap.size();
@@ -1629,7 +1621,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         for (Integer integer : integers) {
             receivers.put(integer, integer.toString());
         }
-        sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY,
+        sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY,
                 receivers, null, 0, null, "SYSTEM", musicGroup.getName(), sysUser.getUsername());
         return true;
     }
@@ -1658,7 +1650,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         Map<Integer, String> receivers = new HashMap<>(1);
         receivers.put(musicGroup.getEducationalTeacherId(), musicGroup.getEducationalTeacherId().toString());
-        sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY,
+        sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY,
                 receivers, null, 0, null, "SYSTEM", musicGroup.getName(), sysUser.getUsername());
         return true;
     }
@@ -1772,14 +1764,17 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             BigDecimal amount = new BigDecimal(0);
 
             StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
-            BigDecimal orderExpectAmount = studentPaymentOrder == null ? BigDecimal.ZERO : studentPaymentOrder.getExpectAmount();
 
             boolean hasPaid = studentRegistration.getMusicGroupStatus().equals(StudentMusicGroupStatusEnum.NORMAL);
             // 缴费人数更新
             MusicGroupSubjectPlan musicGroupSubjectPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, studentRegistration.getActualSubjectId());
-            if (hasPaid && musicGroupSubjectPlan != null && (!musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER) || orderExpectAmount.compareTo(BigDecimal.ZERO) > 0)) {
+            if (hasPaid && musicGroupSubjectPlan != null) {
                 musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
                 musicGroupSubjectPlan.setUpdateTime(date);
+                List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
+                if (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER) && !orderDetailTypes.contains("CLOUD_TEACHER")) {
+                    musicGroupSubjectPlan.setPaidZeroNum(musicGroupSubjectPlan.getPaidZeroNum() - 1);
+                }
                 musicGroupSubjectPlanDao.update(musicGroupSubjectPlan);
             }
 
@@ -1997,13 +1992,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         BigDecimal amount = new BigDecimal(0);
 
         StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
-        BigDecimal orderExpectAmount = studentPaymentOrder == null ? BigDecimal.ZERO : studentPaymentOrder.getExpectAmount();
 
         // 判断乐器是否是租赁
         MusicGroupSubjectPlan musicGroupSubjectPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, studentRegistration.getActualSubjectId());
-        if (hasPaid && musicGroupSubjectPlan != null && (!musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER) || orderExpectAmount.compareTo(BigDecimal.ZERO) > 0)) {
+        if (hasPaid && musicGroupSubjectPlan != null) {
             musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
             musicGroupSubjectPlan.setUpdateTime(date);
+            List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
+            if (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER) && !orderDetailTypes.contains("CLOUD_TEACHER")) {
+                musicGroupSubjectPlan.setPaidZeroNum(musicGroupSubjectPlan.getPaidZeroNum() - 1);
+            }
             musicGroupSubjectPlanDao.update(musicGroupSubjectPlan);
         }
 
@@ -2342,9 +2340,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             }
             if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
                 // 发送续费结果通知
-                sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, push, null, 0, "1", "STUDENT",
+                sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_MUSIC_GROUP_RENEW_SUCCESS, push, null, 0, "1", "STUDENT",
                         studentRegistration.getName(), studentPaymentOrder.getActualAmount());
-                sysMessageService.batchSendMessage(MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, yimei, null, 0, "1", "",
+                sysMessageService.batchSendMessage(MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_MUSIC_GROUP_RENEW_SUCCESS, yimei, null, 0, "1", "",
                         studentRegistration.getName(), studentPaymentOrder.getActualAmount());
             }
             return true;
@@ -2380,10 +2378,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("课程信息不存在");
         }
 
-        if (salary == null) {
-            throw new BizException("请设置老师课酬");
-        }
-
         if ("all".equals(scope)) {
             Integer classGrpupId = courseSchedule.getClassGroupId();
             String startDateTime = sdf_ymd.format(courseSchedule.getClassDate()) + " " + sdf_hms.format(courseSchedule.getStartClassTime());
@@ -2399,9 +2393,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             if (courseScheduleTeacherSalary.getSettlementTime() != null) {
                 throw new BizException("课程已结算");
             }
-            courseScheduleTeacherSalary.setExpectSalary(salary);
+            if(Objects.nonNull(salary)){
+                courseScheduleTeacherSalary.setExpectSalary(salary);
+            }
             courseScheduleTeacherSalary.setSubsidy(subsidy);
             courseScheduleTeacherSalary.setUpdateTime(new Date());
+            if(TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole())){
+                courseScheduleTeacherSalary.setEnableChangeSalary(false);
+            }else{
+                courseScheduleTeacherSalary.setEnableChangeSalary(true);
+            }
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         }
         return true;

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

@@ -277,13 +277,13 @@ public class OnlineMusicGroupServiceImpl implements OnlineMusicGroupService {
 
             Map<Integer, String> userMap = new HashMap<>();
             userMap.put(onlineMusicGroupCourseInfo.getStudentId(), onlineMusicGroupCourseInfo.getStudentId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSIC_NETWORK_CRATE_STUDENT,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_MUSIC_NETWORK_CRATE,
                     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,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_MUSIC_NETWORK_CRATE,
                     teacherMap, null, 0, null, "TEACHER", teacher.getRealName(), classGroup.getName(),
                     StringUtils.join(cdstrs, ","));
         }catch (Exception e){

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

@@ -2145,7 +2145,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 String courseNamesStr = StringUtils.join(courseNames, "、");
                 Map<Integer, String> teacherMap = new HashMap<>();
                 teacherMap.put(practiceGroup.getUserId(), practiceGroup.getUserId().toString());
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PUSH_TEACHER_COURSE_COLLIDE,
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_COURSE_COLLIDE,
                         teacherMap, null, 0, null, "TEACHER", Objects.isNull(sysUser.getUsername()) ? sysUser.getPhone() : sysUser.getUsername(), courseDatesStr, courseNamesStr, courseNamesStr);
             }
         }
@@ -2166,12 +2166,12 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
         Map<Integer, String> teacherMap = new HashMap<>();
         teacherMap.put(practiceGroup.getUserId(), practiceGroup.getUserId().toString());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_CREATE_TEACHER_PUSH,
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_SMS_PUSH_PRACTICE_CREATE,
                 teacherMap, null, 0, null, "TEACHER",
                 teacher.getRealName(),practiceType, practiceGroup.getName());
         Map<Integer, String> teacherPhoneMap = new HashMap<>();
         teacherPhoneMap.put(practiceGroup.getUserId(), teacher.getPhone());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.PRACTICE_CREATE_TEACHER_PUSH,
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.TEACHER_SMS_PUSH_PRACTICE_CREATE,
                 teacherPhoneMap, null, 0, null, "TEACHER",
                 teacher.getRealName(), practiceType, practiceGroup.getName());
 
@@ -3781,13 +3781,13 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         try {
             Map<Integer, String> userMap = new HashMap<>();
             userMap.put(practiceGroup.getStudentId(), practiceGroup.getStudentId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PAY_PRACTICE_BUY_SUCCESS,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_PAY_PRACTICE_BUY_SUCCESS,
                     userMap, null, 0, null, "STUDENT", groupStartTime, groupEndTime, teacherName, drillTimesOnWeek, firstCourseStartTime);
 //            SysUser student = sysUserFeignService.queryUserById(practiceGroup.getStudentId());
             SysUser student = teacherDao.getUser(practiceGroup.getStudentId());
             Map<Integer, String> userPhoneMap = new HashMap<>();
             userPhoneMap.put(practiceGroup.getStudentId(), student.getPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.PAY_PRACTICE_BUY_SUCCESS,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_PAY_PRACTICE_BUY_SUCCESS,
                     userPhoneMap, null, 0, null, "STUDENT", groupStartTime, groupEndTime, teacherName, drillTimesOnWeek, firstCourseStartTime);
 
             String practiceType = "网管课";
@@ -3806,12 +3806,12 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
             Map<Integer, String> teacherMap = new HashMap<>();
             teacherMap.put(practiceGroup.getUserId(), practiceGroup.getUserId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_CREATE_TEACHER_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_SMS_PUSH_PRACTICE_CREATE,
                     teacherMap, null, 0, null, "TEACHER",
                     teacher.getRealName(), practiceType, practiceGroup.getName());
             Map<Integer, String> teacherPhoneMap = new HashMap<>();
             teacherPhoneMap.put(practiceGroup.getUserId(), teacher.getPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.PRACTICE_CREATE_TEACHER_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.TEACHER_SMS_PUSH_PRACTICE_CREATE,
                     teacherPhoneMap, null, 0, null, "TEACHER",
                     teacher.getRealName(), practiceType, practiceGroup.getName());
         } catch (Exception e) {
@@ -4138,14 +4138,14 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             if (pushType.equals("ALL") || pushType.equals("JIGUANG")) {
                 Map<Integer, String> userMap = new HashMap<>();
                 userMap.put(userFreePracticeGroup.getStudentId(), userFreePracticeGroup.getStudentId().toString());
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_COMPLETED_STUDY_REPORT,
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT,
                         userMap, null, 0, "5?" + pushUrl, "STUDENT", pushUrl);
             }
 
             if (pushType.equals("ALL") || pushType.equals("SMS")) {
                 Map<Integer, String> userPhoneMap = new HashMap<>();
                 userPhoneMap.put(userFreePracticeGroup.getStudentId(), student.getPhone());
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.PRACTICE_COMPLETED_STUDY_REPORT,
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT,
                         userPhoneMap, null, 0, null, "STUDENT", HttpUtil.getSortUrl(smsUrl));
             }
             report.setIsPushed(1);
@@ -4268,7 +4268,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 Map<Integer, String> userMap = new HashMap<>();
                 userMap.put(integerStringEntry.getKey(), integerStringEntry.getKey().toString());
                 String[] params = integerStringEntry.getValue().split("-");
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_RENEW_REMIND_PUSH,
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_PRACTICE_RENEW_REMIND,
                         userMap, null, 0, "5?" + pushUrl + (params[0].equals("CHARGE") ? params[1] : ""), "STUDENT");
             }
             List<Integer> practiceIds = userNeedRemindPracticeIdMap.values().stream().map(e -> Integer.valueOf(e.split("-")[1])).collect(Collectors.toList());

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

@@ -141,12 +141,12 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
             String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
             String pushUrl = baseApiUrl + "/#/questionGoodsSale?id=";
             userMap.put(userId, userId.toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.REPLACEMENT_PAY_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_REPLACEMENT_PAY,
                     userMap, null, 0, "5?" + pushUrl + replacementInstrumentActivity.getId(), "STUDENT", goods.getBrand(), "");
 
             userPhoneMap.put(replacementInstrumentActivity.getUserId(), replacementInstrumentActivity.getMobileNo());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.REPLACEMENT_PAY_PUSH,
-                    userPhoneMap, null, 0, null, "STUDENT", goods.getBrand(), HttpUtil.getSortUrl(pushUrl + replacementInstrumentActivity.getId()));
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_REPLACEMENT_PAY,
+                    userPhoneMap, null, 0, null, null, goods.getBrand(), HttpUtil.getSortUrl(pushUrl + replacementInstrumentActivity.getId()));
         }
         return replacementInstrumentActivity;
     }
@@ -219,12 +219,12 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
             String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
             String pushUrl = baseApiUrl + "/#/questionGoodsSale?id=";
             userMap.put(userId, userId.toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.REPLACEMENT_PAY_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_REPLACEMENT_PAY,
                     userMap, null, 0, "5?" + pushUrl + replacementInstrumentActivity.getId(), "STUDENT", goods.getBrand(), "");
 
             userPhoneMap.put(replacementInstrumentActivity.getUserId(), replacementInstrumentActivity.getMobileNo());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.REPLACEMENT_PAY_PUSH,
-                    userPhoneMap, null, 0, null, "STUDENT", goods.getBrand(), HttpUtil.getSortUrl(pushUrl + replacementInstrumentActivity.getId()));
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_REPLACEMENT_PAY,
+                    userPhoneMap, null, 0, null, null, goods.getBrand(), HttpUtil.getSortUrl(pushUrl + replacementInstrumentActivity.getId()));
         }
         return replacementInstrumentActivity;
     }
@@ -453,7 +453,7 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐保购买支付失败");
             }
 
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
                     studentPaymentOrder.getActualAmount(), "乐器置换");
             return false;
         }

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

@@ -70,12 +70,12 @@ public class ReplacementInstrumentCooperationServiceImpl extends BaseServiceImpl
             Map<Integer, String> userMap = new HashMap<>();
             Map<Integer, String> userPhoneMap = new HashMap<>();
             userMap.put(pushUser.getUserId(), pushUser.getUserId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.REPLACEMENT_PAY_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_REPLACEMENT_PAY,
                     userMap, null, 0, "5?" + pushUrl + pushUser.getId(), "STUDENT", pushUser.getBrand(), "");
 
             userPhoneMap.put(pushUser.getUserId(), pushUser.getMobileNo());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.REPLACEMENT_PAY_PUSH,
-                    userPhoneMap, null, 0, null, "STUDENT", pushUser.getBrand(), HttpUtil.getSortUrl(pushUrl + pushUser.getId()));
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_REPLACEMENT_PAY,
+                    userPhoneMap, null, 0, null, null, pushUser.getBrand(), HttpUtil.getSortUrl(pushUrl + pushUser.getId()));
         }
 
         return replacementInstrumentCooperation;

+ 249 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundServiceImpl.java

@@ -0,0 +1,249 @@
+package com.ym.mec.biz.service.impl;
+
+import be.tarsos.dsp.AudioDispatcher;
+import be.tarsos.dsp.AudioEvent;
+import be.tarsos.dsp.AudioProcessor;
+import be.tarsos.dsp.SilenceDetector;
+import be.tarsos.dsp.beatroot.BeatRootOnsetEventHandler;
+import be.tarsos.dsp.io.PipedAudioStream;
+import be.tarsos.dsp.io.TarsosDSPAudioInputStream;
+import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
+import be.tarsos.dsp.onsets.ComplexOnsetDetector;
+import be.tarsos.dsp.onsets.OnsetHandler;
+import com.ym.mec.biz.dal.dao.SysMusicScoreAccompanimentDao;
+import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
+import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.entity.SysMusicScoreAccompaniment;
+import com.ym.mec.biz.service.SoundService;
+import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.IdGeneratorService;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.UnsupportedAudioFileException;
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URL;
+import java.util.*;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/19 0019
+ */
+@Service
+public class SoundServiceImpl implements SoundService {
+
+    private final Logger LOGGER = LoggerFactory.getLogger(SoundServiceImpl.class);
+
+    private float sampleRate = 44100;
+
+    @Autowired
+    private SysMusicScoreDao sysMusicScoreDao;
+    @Autowired
+    private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+
+    /**
+     * @describe 音频节拍信息提取
+     * @author Joburgess
+     * @date 2021/5/19 0019
+     * @return
+     */
+    private List<Double> beatExtractor(byte[] bytes, String url) throws UnsupportedAudioFileException {
+        List<Double> times = new ArrayList<>();
+        int size = 256;
+        int overlap = 128;
+        AudioDispatcher dispatcher = StringUtils.isBlank(url)?getFromByteArray(bytes, size, overlap):getFromFile(url, size, overlap);
+
+        ComplexOnsetDetector detector = new ComplexOnsetDetector(size);
+        BeatRootOnsetEventHandler handler = new BeatRootOnsetEventHandler();
+        detector.setHandler(handler);
+
+        dispatcher.addAudioProcessor(detector);
+        dispatcher.run();
+
+        handler.trackBeats(new OnsetHandler() {
+            @Override
+            public void handleOnset(double time, double salience) {
+                times.add(time);
+            }
+        });
+        return times;
+    }
+
+    /**
+     * @describe 音频分贝信息提取
+     * @author Joburgess
+     * @date 2021/5/19 0019
+     * @param bytes: 文件字节
+     * @return java.util.List<java.lang.Double>
+     */
+    private List<Double> soundPressureLevelExtractor(byte[] bytes, String url) throws UnsupportedAudioFileException {
+        List<Double> pitchs = new ArrayList<>();
+        int size = 2048;
+        int overlap = 0;
+        Double[] t = new Double[1];
+        final SilenceDetector silenceDetecor = new SilenceDetector();
+        AudioDispatcher dispatcher = StringUtils.isBlank(url)?getFromByteArray(bytes, size, overlap):getFromFile(url, size, overlap);
+        dispatcher.addAudioProcessor(silenceDetecor);
+        dispatcher.addAudioProcessor(new AudioProcessor() {
+            @Override
+            public void processingFinished() {
+
+            }
+
+            @Override
+            public boolean process(AudioEvent audioEvent) {
+                t[0] = audioEvent.getEndTimeStamp();
+                pitchs.add(Double.isInfinite(silenceDetecor.currentSPL())?0:silenceDetecor.currentSPL());
+                return true;
+            }
+        });
+        dispatcher.run();
+        pitchs.add(t[0]);
+        return pitchs;
+    }
+
+    private AudioDispatcher getFromByteArray(byte[] bytes, int size, int overlap) throws UnsupportedAudioFileException {
+        AudioFormat audioFormat = new AudioFormat(sampleRate, 16, 1, true, false);
+        AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(bytes, audioFormat, size, overlap);
+        return dispatcher;
+    }
+
+    private AudioDispatcher getFromFile(String url, int size, int overlap) {
+        PipedAudioStream file = new PipedAudioStream(url);
+        TarsosDSPAudioInputStream stream = file.getMonoStream(44100,0);
+
+        AudioDispatcher dispatcher = new AudioDispatcher(stream, size, overlap);
+        return dispatcher;
+    }
+
+    @Override
+    public HttpResponseResult compare(MultipartFile record, Integer musicScoreId) {
+        SysMusicScore sysMusicScore = sysMusicScoreDao.get(musicScoreId);
+        if(Objects.isNull(sysMusicScore)|| StringUtils.isBlank(sysMusicScore.getUrl())){
+            throw new BizException("伴奏信息错误");
+        }
+        Map<String, BigDecimal> result = new HashMap<>();
+
+        BigDecimal score = BigDecimal.ZERO;
+        BigDecimal intonation = BigDecimal.ZERO;
+        BigDecimal cadence = BigDecimal.ZERO;
+        BigDecimal integrity = BigDecimal.ZERO;
+        File f = null;
+        File f_r = null;
+        try {
+            URL url = new URL(sysMusicScore.getUrl());
+            String filePath = FileUtils.getTempDirectoryPath()+ idGeneratorService.generatorId("sound") + ".mp3";
+            f = new File(filePath);
+            FileUtils.copyURLToFile(url, f);
+
+            LOGGER.info("文件名:{},伴奏编号:{},源文件:{}", record.getOriginalFilename(), musicScoreId, filePath);
+
+            BigDecimal oneHandred = new BigDecimal(100);
+
+            BigDecimal l_s = new BigDecimal(0);
+            BigDecimal l_r = new BigDecimal(0);
+
+            String filePath_r = FileUtils.getTempDirectoryPath()+ idGeneratorService.generatorId("sound") + ".mp3";
+            f_r = new File(filePath_r);
+            FileUtils.copyToFile(record.getInputStream(), f_r);
+
+            //相似度
+            List<Double> pitchs_s = soundPressureLevelExtractor(null, filePath);
+            List<Double> pitchs_r = soundPressureLevelExtractor(null, filePath_r);
+
+            int maxLength = pitchs_s.size();
+            if(pitchs_r.size()<maxLength){
+                maxLength = pitchs_r.size();
+            }
+
+            if(maxLength>0){
+                l_s = new BigDecimal(pitchs_s.get(pitchs_s.size() - 1));
+                pitchs_s.remove(pitchs_s.size() - 1);
+                l_r = new BigDecimal(pitchs_r.get(pitchs_r.size() - 1));
+                pitchs_r.remove(pitchs_r.size() - 1);
+                maxLength = maxLength-1;
+            }
+
+            double pitchSize = 0;
+            double allPitchGap = 0;
+            for(int i=0;i<maxLength;i++){
+                double pitch1 = Math.abs(pitchs_s.get(i));
+                double pitch2 = Math.abs(pitchs_r.get(i));
+                double pitchGap = Math.abs(pitch1-pitch2);
+                if(pitchGap>pitch1){
+                    pitchGap = pitch1;
+                }
+                allPitchGap+=pitchGap;
+                pitchSize+=pitch1;
+            }
+            double intonation_d = 0;
+            if(pitchSize>0){
+                intonation_d = 1-(allPitchGap/pitchSize);
+            }
+            intonation = new BigDecimal(intonation_d).multiply(oneHandred).setScale(0, BigDecimal.ROUND_HALF_UP);
+
+            //节奏
+            List<Double> times_s = beatExtractor(null, filePath);
+            List<Double> times_r = beatExtractor(null, filePath_r);
+
+            float sameTimes = 0;
+            for (Double time1 : times_s) {
+                for (Double time2 : times_r) {
+                    if(Math.abs(time2-time1)<1.5){
+                        sameTimes++;
+                        break;
+                    }
+                }
+            }
+            double cadence_d = 0;
+            sameTimes = sameTimes>times_r.size()?times_r.size():sameTimes;
+            if (times_r.size()>0){
+                cadence_d = sameTimes/times_r.size();
+            }
+            cadence = new BigDecimal(cadence_d).multiply(oneHandred).setScale(0, BigDecimal.ROUND_HALF_UP);
+
+            integrity = new BigDecimal(0);
+            if(l_r.compareTo(BigDecimal.ZERO)<=0||l_s.compareTo(BigDecimal.ZERO)<=0){
+
+            }else if(l_r.compareTo(l_s)<0){
+                integrity = l_r.divide(l_s, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(oneHandred).setScale(0, BigDecimal.ROUND_HALF_UP);
+            }else{
+                integrity = new BigDecimal(100);
+            }
+
+            score = intonation.add(cadence).add(integrity).divide(new BigDecimal(3), 0, BigDecimal.ROUND_HALF_UP);
+
+
+        } catch (UnsupportedAudioFileException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            if(f!=null){
+                f.delete();
+            }
+            if(f_r!=null){
+                f_r.delete();
+            }
+        }
+
+        result.put("score", score);
+        result.put("intonation", intonation);
+        result.put("cadence", cadence);
+        result.put("integrity", integrity);
+        return BaseController.succeed(result);
+    }
+}

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

@@ -156,9 +156,9 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
                 sysUserCashAccountDetailService.insert(paymentDetail);
             }
 
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_SPORADIC_PAYMENT_SUCCESS, map, null, 0, "1", "STUDENT",
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_SUCCESS, map, null, 0, "1", "STUDENT",
                     studentPaymentOrder.getActualAmount(), info.getTitle());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_SPORADIC_PAYMENT_SUCCESS, yimei, null, 0, "1", "",
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_SUCCESS, yimei, null, 0, "1", "",
                     studentPaymentOrder.getActualAmount(), info.getTitle());
             return true;
         }
@@ -172,9 +172,9 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, info.getTitle() + "支付失败");
             }
 
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_SPORADIC_PAYMENT_FAILED, map, null, 0, "", "STUDENT",
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, "", "STUDENT",
                     studentPaymentOrder.getActualAmount(), info.getTitle());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_SPORADIC_PAYMENT_FAILED, yimei, null, 0, "", "",
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, yimei, null, 0, "", "",
                     studentPaymentOrder.getActualAmount(), info.getTitle());
             return false;
         }

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

@@ -73,7 +73,7 @@ public class StudentCourseHomeworkReplyServiceImpl extends BaseServiceImpl<Long,
 					new String[]{courseSchedule.getActualTeacherId().toString()},
 					null,courseDate,courseSchedule.getName(),bean.getContent());
 		}
-		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_STUDENT_REPLY_PUSH,
+		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_HOMEWORK_REPLY,
 				userMap, null, 0, notifyUrl, "TEACHER", courseDate,courseSchedule.getName(), user.getUsername());
 		return super.insert(bean);
 	}
@@ -108,7 +108,7 @@ public class StudentCourseHomeworkReplyServiceImpl extends BaseServiceImpl<Long,
 					null, courseDate,courseSchedule.getName(),bean.getContent());
 		}
 
-		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_TEACHER_REPLY_PUSH,
+		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_HOMEWORK_REPLY,
 				userMap, null, 0, 3+notifyUrl, "STUDENT", user.getRealName(), courseSchedule.getName());
 
 		studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), Arrays.asList(studentCourseHomework.getUserId()), courseSchedule.getActualTeacherId());

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

@@ -176,7 +176,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             sysMessageService.batchSendImMessage(MessageTypeEnum.IM_HOMEWORK_SUBMIT_PUSH, bean.getUserId().toString(), extra,
                     new String[]{courseSchedule.getActualTeacherId().toString()},
                     null, courseDate, courseSchedule.getName());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_SUBMIT_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_HOMEWORK_SUBMIT,
                     userMap, null, 0, notifyUrl, "TEACHER", courseSchedule.getName(), courseDate, user.getUsername());
 
             Date date = new Date();

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

@@ -301,7 +301,7 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 
 			Map<Integer, String> userMap = new HashMap<>();
 			userMap.put(teacherServe.getTeacherId(), teacherServe.getTeacherId().toString());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_SERVE_PUSH,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_SERVE,
 					userMap, null, 0, null, "TEACHER", teacherServe.getHomeworkNum(), teacherServe.getExerciseNum());
 		}
 		if(!CollectionUtils.isEmpty(reminds)){

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

@@ -256,7 +256,7 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐保购买支付失败");
             }
 
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
                     studentPaymentOrder.getActualAmount(), "乐保购买");
             return false;
         }
@@ -334,7 +334,7 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
         for (StudentInstrument studentInstrument : studentInstruments) {
             Map<Integer, String> userMap = new HashMap<>();
             userMap.put(studentInstrument.getStudentId(), studentInstrument.getStudentId().toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MAINTENANCE_NOTICE_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_MAINTENANCE_NOTICE,
                     userMap, null, 0, "5?" + pushUrl, "STUDENT", studentInstrument.getGoodsName());
         }
         return true;

+ 51 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -7,13 +7,13 @@ import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.ym.mec.auth.api.entity.SysUserRole;
 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.CloudTeacherOrderService;
-import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.*;
 
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.im.WebFeignService;
@@ -47,8 +47,6 @@ import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.SubjectChange;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.service.StudentManageService;
-import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
@@ -113,11 +111,13 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Autowired
     private StudentCourseHomeworkDao studentCourseHomeworkDao;
     @Autowired
-    private StudentAttendanceDao studentAttendanceDao;
+    private IndexBaseMonthDataDao indexBaseMonthDataDao;
     @Autowired
     private StudentInstrumentDao studentInstrumentDao;
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
+    @Autowired
+    private EmployeeDao employeeDao;
 
     @Override
     public PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
@@ -851,4 +851,50 @@ public class StudentManageServiceImpl implements StudentManageService {
     public List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(String musicGroupId) {
         return musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
     }
+
+    @Override
+    public PageInfo<StudentErrorLeaveDto> queryStudentErrorLeaveList(StudentErrorLeaveQueryInfo queryInfo) {
+        //学员请假异常提醒(获取前两个月的)
+        Date date = new Date();
+        PageInfo<StudentErrorLeaveDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("offset", pageInfo.getOffset());
+        String totalMonth = DateUtil.format(DateUtil.addMonths(date, -1), DateUtil.ISO_YEAR_MONTH_FORMAT);
+        String currentMonth = DateUtil.format(date, DateUtil.ISO_YEAR_MONTH_FORMAT);
+        params.put("totalMonth", totalMonth);
+        params.put("currentMonth", currentMonth);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        //当前用户是否是分部经理
+        List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+        if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+            //获取教务老师关联的班级列表
+            List<Long> classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
+            params.put("classGroupIds", classGroupIds);
+        }
+        int count = indexBaseMonthDataDao.countStudentErrorLeave1(params);
+        List<StudentErrorLeaveDto> dataList = new ArrayList<>();
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            dataList = indexBaseMonthDataDao.queryStudentErrorLeave(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<StudentLeaveCourseDto> queryStudentLeaveCourseList(StudentErrorLeaveQueryInfo queryInfo) {
+        PageInfo<StudentLeaveCourseDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("offset", pageInfo.getOffset());
+        int count = indexBaseMonthDataDao.countStudentLeaveCourseList(params);
+        List<StudentLeaveCourseDto> dataList = new ArrayList<>();
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            dataList = indexBaseMonthDataDao.queryStudentLeaveCourseList(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 }

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

@@ -25,6 +25,7 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -493,16 +494,19 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
         MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
 
-        //增加缴费学生数
+        //增加缴费学生数,0元订单不增加报名人数(没买云教练的)
         boolean updateFlag = false;
         for (int i = 0; i < 10; i++) {
-            if (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER) && amount.compareTo(BigDecimal.ZERO) <= 0) { //0元订单不增加报名人数
-                updateFlag = true;
-                break;
-            }
             MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanService.getMusicOneSubjectClassPlan(studentRegistration.getMusicGroupId(), studentRegistration.getActualSubjectId());
             int paidNum = musicOneSubjectClassPlan.getPaidStudentNum() == null ? 0 : musicOneSubjectClassPlan.getPaidStudentNum();
+            int paidZeroNum = musicOneSubjectClassPlan.getPaidZeroNum() == null ? 0 : musicOneSubjectClassPlan.getPaidZeroNum();
             musicOneSubjectClassPlan.setPaidStudentNum(paidNum + 1);
+            if (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER) && !buyCloudTeacher) {
+                if (paidZeroNum > 0) {
+                    throw new BizException("205");
+                }
+                musicOneSubjectClassPlan.setPaidZeroNum(paidZeroNum + 1);
+            }
             if (studentRegistration.getTemporaryCourseFee() == null && musicOneSubjectClassPlan.getPaidStudentNum() > musicOneSubjectClassPlan.getExpectedStudentNum()) {
                 throw new BizException("乐团该声部人数暂时已满,请稍后再试");
             }
@@ -1172,13 +1176,13 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 Map<Integer, String> map = new HashMap<>(1);
                 map.put(studentPaymentOrder.getUserId(), studentRegistration.getParentsPhone());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS,
-                        MessageTypeEnum.STUDENT_SMS_PAYMENT_SUCCESS, map, null, 0, null, "",
+                        MessageTypeEnum.STUDENT_SMS_PUSH_PAYMENT_SUCCESS, map, null, 0, null, "",
                         studentRegistration.getName(), studentPaymentOrder.getActualAmount());
                 //push
                 Map<Integer, String> map1 = new HashMap<>(1);
                 map1.put(studentPaymentOrder.getUserId(), studentPaymentOrder.getUserId().toString());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-                        MessageTypeEnum.STUDENT_SMS_PAYMENT_SUCCESS, map1, null, 0, null, "STUDENT",
+                        MessageTypeEnum.STUDENT_SMS_PUSH_PAYMENT_SUCCESS, map1, null, 0, null, "STUDENT",
                         studentRegistration.getName(), studentPaymentOrder.getActualAmount());
             }
             try {
@@ -1198,12 +1202,14 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         if (studentPaymentOrder.getStatus().equals(DealStatusEnum.FAILED)) {
             MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
             //减去缴费人数(器乐收费,0元时不减缴费人数)
-            if (!musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER) || studentPaymentOrder.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
-                musicOneSubjectClassPlan.setPaidStudentNum(musicOneSubjectClassPlan.getPaidStudentNum() - 1);
-                updateCount = musicGroupSubjectPlanService.update(musicOneSubjectClassPlan);
-                if (updateCount <= 0) {
-                    throw new BizException("减去缴费人数失败");
-                }
+            List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
+            musicOneSubjectClassPlan.setPaidStudentNum(musicOneSubjectClassPlan.getPaidStudentNum() - 1);
+            if (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER) && !orderDetailTypes.contains("CLOUD_TEACHER")) {
+                musicOneSubjectClassPlan.setPaidZeroNum(musicOneSubjectClassPlan.getPaidZeroNum() - 1);
+            }
+            updateCount = musicGroupSubjectPlanService.update(musicOneSubjectClassPlan);
+            if (updateCount <= 0) {
+                throw new BizException("减去缴费人数失败");
             }
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "报名缴费失败");
@@ -1416,7 +1422,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                     receivers.put(e.getUserId(), e.getParentsPhone());
                 });
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS,
-                        MessageTypeEnum.SMS_STUDENT_OPEN_PAYMENT, receivers, null, 0, null, "",
+                        MessageTypeEnum.STUDENT_SMS_OPEN_PAYMENT, receivers, null, 0, null, "",
                         musicGroup.getName(), HttpUtil.getSortUrl(configValue + musicGroup.getId()));
             }
         }
@@ -1792,6 +1798,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
     @Override
     public Integer quitAllStudent(String musicGroupId, String remark) {
-        return studentRegistrationDao.quitAllStudent(musicGroupId,remark);
+        return studentRegistrationDao.quitAllStudent(musicGroupId, remark);
     }
 }

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

@@ -544,10 +544,10 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                     "地址:" + studentRepair.getEmployeeAddress();
 
             if (studentRepair.getSendType().equals(0)) {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_REPAIR_UNSEND_COMPLETED, map, null, 0, "1", "STUDENT",
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_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",
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_REPAIR_SEND_COMPLETED, map, null, 0, "1", "STUDENT",
                         student.getUsername());
                 imContent = student.getUsername() + "学员您好,您的乐器已保养维修完毕,快递已寄出,请注意查收。";
             }
@@ -1064,10 +1064,10 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                         "联系人:" + repairInfo.getEmployeeName() + "(" + repairInfo.getEmployeePhone() + ")\n" +
                         "地址:" + repairInfo.getEmployeeAddress() + "";
 
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_REPAIR_ONLINE_PAYMENT_SUCCESS, map, null, 0, null, "STUDENT",
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_REPAIR_ONLINE_PAYMENT_SUCCESS, map, null, 0, null, "STUDENT",
                         repairInfo.getStudentName(), repairInfo.getEmployeeName(), repairInfo.getEmployeePhone(), repairInfo.getEmployeeAddress());
             } else {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_REPAIR_OFFLINE_PAYMENT_SUCCESS, map, null, 0, null, "STUDENT",
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_REPAIR_OFFLINE_PAYMENT_SUCCESS, map, null, 0, null, "STUDENT",
                         repairInfo.getStudentName());
             }
             sysMessageService.sendNoAuthPrivateMessage(repairInfo.getEmployeeId().toString(), userId.toString(), imContent);
@@ -1084,7 +1084,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐器维修支付失败");
             }
 
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
                     studentPaymentOrder.getActualAmount(), "乐器维修");
             return false;
         }

+ 30 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -3,22 +3,18 @@ package com.ym.mec.biz.service.impl;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.StudentClassInfoDto;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
-import com.ym.mec.common.page.QueryInfo;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dto.StudentCourseTimesDto;
 import com.ym.mec.biz.dal.dto.StudentTeacherCourseDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
@@ -44,6 +40,12 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     private StudentRegistrationDao studentRegistrationDao;
 
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+
+    @Autowired
+    private PracticeGroupDao practiceGroupDao;
+
     @Override
     public BaseDAO<Integer, Student> getDAO() {
         return studentDao;
@@ -205,35 +207,50 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Override
     public void updateStudentTeacherAndSubject() {
         List<Student> noTeacherOrNoSubjectStudent = studentDao.getNoTeacherOrNoSubjectStudent();
-        if(CollectionUtils.isEmpty(noTeacherOrNoSubjectStudent)){
+        if (CollectionUtils.isEmpty(noTeacherOrNoSubjectStudent)) {
             return;
         }
         List<Integer> studentIds = noTeacherOrNoSubjectStudent.stream().map(Student::getUserId).collect(Collectors.toList());
         List<StudentClassInfoDto> studentClassInfo = studentRegistrationDao.getStudentClassInfo(studentIds);
-        if(CollectionUtils.isEmpty(studentClassInfo)){
+        if (CollectionUtils.isEmpty(studentClassInfo)) {
             return;
         }
         List<Student> needUpdateStudents = new ArrayList<>();
         Map<Integer, List<StudentClassInfoDto>> scm = studentClassInfo.stream().collect(Collectors.groupingBy(StudentClassInfoDto::getStudentId));
         for (Student student : noTeacherOrNoSubjectStudent) {
-            if(!scm.containsKey(student.getUserId())){
+            if (!scm.containsKey(student.getUserId())) {
                 continue;
             }
             List<StudentClassInfoDto> studentClassInfoDtos = scm.get(student.getUserId());
             StudentClassInfoDto studentClassInfoDto = studentClassInfoDtos.stream().max(Comparator.comparing(StudentClassInfoDto::getClassGroupId)).get();
-            if(Objects.isNull(student.getTeacherId())){
+            if (Objects.isNull(student.getTeacherId())) {
                 student.setTeacherId(studentClassInfoDto.getMainTeacherId());
             }
-            if(StringUtils.isBlank(student.getSubjectIdList())){
+            if (StringUtils.isBlank(student.getSubjectIdList())) {
                 student.setSubjectIdList(studentClassInfoDto.getSubjectId().toString());
             }
-            if(Objects.isNull(student.getCooperationOrganId())){
+            if (Objects.isNull(student.getCooperationOrganId())) {
                 student.setCooperationOrganId(studentClassInfoDto.getCooperationOrganId());
             }
             needUpdateStudents.add(student);
         }
-        if(!CollectionUtils.isEmpty(needUpdateStudents)){
+        if (!CollectionUtils.isEmpty(needUpdateStudents)) {
             studentDao.batchUpdate(needUpdateStudents);
         }
     }
+
+    @Override
+    public CooperationOrgan getStudentEduTeacher(Integer userId) {
+        CooperationOrgan cooperationOrgan = musicGroupDao.findUserMusicGroupCooperationOrgan(userId);
+        if (cooperationOrgan != null) {
+            return cooperationOrgan;
+        }
+        cooperationOrgan = new CooperationOrgan();
+        String studentEduTeacher = courseScheduleStudentPaymentDao.getStudentEduTeacher(userId);
+        if (studentEduTeacher == null) {
+            studentEduTeacher = practiceGroupDao.getStudentEduTeacher(userId);
+        }
+        cooperationOrgan.setLinkman(studentEduTeacher);
+        return cooperationOrgan;
+    }
 }

+ 28 - 23
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java

@@ -55,30 +55,35 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
         SysUser user = teacherDao.getUser(studentVisit.getStudentId());
         studentVisit.setOrganId(user.getOrganId());
         studentVisit.setCreateTime(now);
-        if(Objects.nonNull(studentVisit.getObjectId()) && "考勤申诉".equals(studentVisit.getPurpose())){
-            CourseScheduleStudentPayment courseScheduleStudentPayment = courseScheduleStudentPaymentDao.get(studentVisit.getObjectId());
-            if(Objects.isNull(courseScheduleStudentPayment)){
-                throw new BizException("学员课程信息不存在");
-            }
-            StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(courseScheduleStudentPayment.getUserId(), courseScheduleStudentPayment.getCourseScheduleId().intValue());
-            if (studentAttendance == null) {
-                studentAttendance = new StudentAttendance();
-                studentAttendance.setClassGroupId(courseScheduleStudentPayment.getClassGroupId());
-                studentAttendance.setCourseScheduleId(courseScheduleStudentPayment.getCourseScheduleId());
-                studentAttendance.setGroupType(courseScheduleStudentPayment.getGroupType());
-                studentAttendance.setMusicGroupId(courseScheduleStudentPayment.getMusicGroupId());
-                studentAttendance.setUserId(courseScheduleStudentPayment.getUserId());
-                studentAttendance.setCreateTime(now);
-                studentAttendance.setUpdateTime(now);
-                studentAttendance.setVisitFlag(YesOrNoEnum.YES);
-                studentAttendanceDao.insert(studentAttendance);
-            } else {
-                studentAttendance.setVisitFlag(YesOrNoEnum.YES);
-                studentAttendance.setUpdateTime(now);
-                studentAttendanceDao.update(studentAttendance);
+        if(Objects.nonNull(studentVisit.getObjectId())){
+            if("考勤申诉".equals(studentVisit.getPurpose())){
+                CourseScheduleStudentPayment courseScheduleStudentPayment = courseScheduleStudentPaymentDao.get(studentVisit.getObjectId());
+                if(Objects.isNull(courseScheduleStudentPayment)){
+                    throw new BizException("学员课程信息不存在");
+                }
+                StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(courseScheduleStudentPayment.getUserId(), courseScheduleStudentPayment.getCourseScheduleId().intValue());
+                if (studentAttendance == null) {
+                    studentAttendance = new StudentAttendance();
+                    studentAttendance.setClassGroupId(courseScheduleStudentPayment.getClassGroupId());
+                    studentAttendance.setCourseScheduleId(courseScheduleStudentPayment.getCourseScheduleId());
+                    studentAttendance.setGroupType(courseScheduleStudentPayment.getGroupType());
+                    studentAttendance.setMusicGroupId(courseScheduleStudentPayment.getMusicGroupId());
+                    studentAttendance.setUserId(courseScheduleStudentPayment.getUserId());
+                    studentAttendance.setCreateTime(now);
+                    studentAttendance.setUpdateTime(now);
+                    studentAttendance.setVisitFlag(YesOrNoEnum.YES);
+                    studentAttendanceDao.insert(studentAttendance);
+                } else {
+                    studentAttendance.setVisitFlag(YesOrNoEnum.YES);
+                    studentAttendance.setUpdateTime(now);
+                    studentAttendanceDao.update(studentAttendance);
+                }
+                CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleStudentPayment.getCourseScheduleId());
+                studentVisit.setOrganId(courseSchedule.getOrganId());
+            }else if("异常请假回访".equals(studentVisit.getPurpose())){
+                //处理所有的请假考勤为已回访
+                studentAttendanceDao.updateLeaveVisitFlag(user.getId());
             }
-            CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleStudentPayment.getCourseScheduleId());
-            studentVisit.setOrganId(courseSchedule.getOrganId());
         }
         studentVisitDao.insert(studentVisit);
         return studentVisit;

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

@@ -549,7 +549,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "声部更改支付失败");
             }
 
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
                     studentPaymentOrder.getActualAmount(), "声部更换");
             return false;
         }

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

@@ -320,7 +320,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 									new String[]{studentCourseHomework.getUserId().toString()},
 									null, courseSchedule.getName(), dateStr, courseHomework.getContent());
 
-							sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_REMIND,
+							sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_HOMEWORK_REMIND,
 									userMap, null, 0, 3 + notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
 						}
 					}
@@ -737,7 +737,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			receivers.put(e,e.toString());
 		});
 		String url = new StringBuffer("10?date=").append(format).toString();
-		sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.PUSH_TEACHER_EXCEPTION_ATTENDANCE,receivers,null,0,url,"TEACHER",format);
+		sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.TEACHER_PUSH_EXCEPTION_ATTENDANCE,receivers,null,0,url,"TEACHER",format);
 	}
 
 	@Override
@@ -866,7 +866,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			String format = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 			Map<Integer, String> receivers = new HashMap<>(1);
 			receivers.put(teacherAttendance.getTeacherId(),teacherAttendance.getTeacherId().toString());
-			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_ATTENDANCE_COMPLAINTS_RESULT, receivers, null, 0, null, "TEACHER",
+			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_ATTENDANCE_COMPLAINTS_RESULT, receivers, null, 0, null, "TEACHER",
 					format,courseSchedule.getName(),"通过");
 		}else {
 			throw new BizException("操作失败: 当前申述状态不允许该操作");
@@ -892,7 +892,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			String format = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 			Map<Integer, String> receivers = new HashMap<>(1);
 			receivers.put(teacherAttendance.getTeacherId(),teacherAttendance.getTeacherId().toString());
-			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_ATTENDANCE_COMPLAINTS_RESULT, receivers, null, 0, null, "TEACHER",
+			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_ATTENDANCE_COMPLAINTS_RESULT, receivers, null, 0, null, "TEACHER",
 					format,courseSchedule.getName(),"拒绝");
 		}else {
 			throw new BizException("操作失败: 当前申述状态不允许该操作");

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultMusicGroupSalaryServiceImpl.java

@@ -116,6 +116,10 @@ public class TeacherDefaultMusicGroupSalaryServiceImpl extends BaseServiceImpl<L
 					List<CourseScheduleTeacherSalary> list = new ArrayList<CourseScheduleTeacherSalary>();
 					// 批量修改课程课酬
 					for (CourseScheduleTeacherSalary ts : updateTeacherSalaryList) {
+						//课酬调整后不能更新课酬
+						if(!ts.getEnableChangeSalary()){
+							continue;
+						}
 						MusicGroup musicGroup = musicGroupMap.get(ts.getMusicGroupId());
 						// 课酬结算标准
 						if (musicGroup != null) {

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultPracticeGroupSalaryServiceImpl.java

@@ -94,6 +94,10 @@ public class TeacherDefaultPracticeGroupSalaryServiceImpl extends BaseServiceImp
 					List<CourseScheduleTeacherSalary> list = new ArrayList<CourseScheduleTeacherSalary>();
 
 					for (CourseScheduleTeacherSalary ts : updateTeacherSalaryList) {
+						//课酬调整后不能更新课酬
+						if(!ts.getEnableChangeSalary()){
+							continue;
+						}
 						if (origSalary != null && origSalary.getMainTeacherSalary().compareTo(ts.getExpectSalary()) == 0
 								&& origSalary.getMainTeacherSalary().compareTo(salary) != 0) {
 							if(freeTeacherSalary.compareTo(ts.getExpectSalary())==0){

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultVipGroupSalaryServiceImpl.java

@@ -139,6 +139,10 @@ public class TeacherDefaultVipGroupSalaryServiceImpl extends BaseServiceImpl<Lon
 					List<CourseScheduleTeacherSalary> list = new ArrayList<CourseScheduleTeacherSalary>();
 
 					for (CourseScheduleTeacherSalary ts : updateTeacherSalaryList) {
+						//课酬调整后不能更新课酬
+						if(!ts.getEnableChangeSalary()){
+							continue;
+						}
 						VipGroup vipGroup = vipGroupMap.get(Long.parseLong(ts.getMusicGroupId()));
 						// 课酬结算标准
 						if (vipGroup != null) {

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

@@ -68,7 +68,7 @@ public class TeacherSalaryComplaintsServiceImpl extends BaseServiceImpl<Long, Te
 		map.put(salaryComplaints.getTeacherId(), salaryComplaints.getTeacherId().toString());
 		if (map != null && map.size() > 0) {
 			String url = new StringBuffer("8?").append(sysConfigDao.findConfigValue(SysConfigService.TEACHER_BASE_URL)).append("/#/appealResult?id=").append(salaryComplaints.getId()).toString();
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.COURSE_SALARY_COMPLAINTS_RESULT, map, null, 0, url,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_COURSE_SALARY_COMPLAINTS_RESULT, map, null, 0, url,
 					"TEACHER", DateUtil.format(salaryComplaints.getCreateTime(),DateUtil.DEFAULT_PATTERN),complaints.getStatusEnum().getMsg());
 		}
 	}

+ 60 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -14,7 +14,9 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.*;
 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.dal.BaseDAO;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.exception.BizException;
@@ -33,15 +35,18 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.http.HttpStatus;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.MessageFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
@@ -163,7 +168,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 	@Override
-	public String createVipGroup(VipGroupApplyDto vipGroup) {
+	public HttpResponseResult createVipGroup(VipGroupApplyDto vipGroup) {
 
 		if (Objects.isNull(vipGroup.getVipGroupApplyBaseInfo().getUserId())){
 			throw new BizException("请选择指导老师");
@@ -197,8 +202,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         String studentIds=vipGroup.getStudentIds();
 		List<String> studentIdList=new ArrayList<>();
-
-        if(StringUtils.isNotBlank(studentIds)){
+		if(StringUtils.isNotBlank(studentIds)){
 			studentIdList = Arrays.asList(studentIds.split(","));
 		}
 
@@ -243,6 +247,22 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		//获取活动信息
 		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId());
+		if(!vipGroup.getAllowOverstepActivityStudentNum()&&Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes())&&vipGroupActivity.getStudentMaxUsedTimes()!=-1&&StringUtils.isNotBlank(vipGroupApplyBaseInfoDto.getStudentIdList())){
+			List<String> tempStudentIds = Arrays.asList(vipGroupApplyBaseInfoDto.getStudentIdList().split(","));
+			List<Integer> errStudentIds = new ArrayList<>();
+			for (String studentIdStr : tempStudentIds) {
+				int useNum = vipGroupDao.countStudentUserActivityNum(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId(), Integer.valueOf(studentIdStr));
+				if(useNum>=vipGroupActivity.getStudentMaxUsedTimes()){
+					errStudentIds.add(Integer.valueOf(studentIdStr));
+				}
+			}
+			if(errStudentIds.size()>0){
+				List<SimpleUserDto> students = teacherDao.getUsersSimpleInfo(errStudentIds);
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+				String studentNames = StringUtils.join(students.stream().map(SimpleUserDto::getNickName).collect(Collectors.toList()), "、");
+				return BaseController.failed(HttpStatus.PARTIAL_CONTENT,"该活动"+studentNames+"学员创建及成课之和已达上限,是否继续创建该课程?");
+			}
+		}
 		//判断课程安排是否超出范围
 		if(Objects.nonNull(vipGroupActivity)&&(Objects.nonNull(vipGroupActivity.getCoursesEndTime())||Objects.nonNull(vipGroupActivity.getCoursesStartTime()))){
 			if(latestCourseSchedule.getEndClassTime().after(vipGroupActivity.getCoursesEndTime())
@@ -260,7 +280,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			}
 		}
 
-		if(Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getMinCourseNum())&&Objects.nonNull(vipGroupActivity.getMaxCourseNum())){
+		if(Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getMinCourseNum())&&vipGroupActivity.getMinCourseNum()!=-1&&Objects.nonNull(vipGroupActivity.getMaxCourseNum())&&vipGroupActivity.getMaxCourseNum()!=-1){
 			Integer requestCourseNum = vipGroupApplyBaseInfoDto.getOnlineClassesNum() + vipGroupApplyBaseInfoDto.getOfflineClassesNum();
 			if(requestCourseNum.compareTo(vipGroupActivity.getMinCourseNum())<0||requestCourseNum.compareTo(vipGroupActivity.getMaxCourseNum())>0){
 				throw new BizException("该活动课时数为{}节~{}节", vipGroupActivity.getMinCourseNum(), vipGroupActivity.getMaxCourseNum());
@@ -447,7 +467,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 //		}else {
 		sysMessageService.batchSeoMessage(userIds,MessageTypeEnum.BACKSTAGE_TEACHER_APPLY_VIP, JSONObject.toJSONString(memo),teacher.getRealName());
 //		}
-		return vipGroupApplyBaseInfoDto.getAuditStatus().getCode();
+		return BaseController.succeed(vipGroupApplyBaseInfoDto.getAuditStatus().getCode());
 	}
 
 	@Override
@@ -570,11 +590,11 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(teacher != null){
 			Map<Integer,String> map = new HashMap<>(1);
 			map.put(vipGroup.getUserId(),vipGroup.getUserId().toString());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.TEACHER_SMS_VIP_COURSE_APPLY_RESULT,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.TEACHER_SMS_PUSH_VIP_COURSE_APPLY_RESULT,
 					map,null,0,"7","TEACHER",vipGroup.getName(),vipGroup.getAuditStatus().getMsg());
 			Map<Integer,String> map1 = new HashMap<>(1);
 			map1.put(vipGroup.getUserId(),teacher.getPhone());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS,MessageTypeEnum.TEACHER_SMS_VIP_COURSE_APPLY_RESULT,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS,MessageTypeEnum.TEACHER_SMS_PUSH_VIP_COURSE_APPLY_RESULT,
 					map1,null,0,"7","",vipGroup.getName(),vipGroup.getAuditStatus().getMsg());
 		}
 	}
@@ -1492,7 +1512,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         VipGroup vipGroup = vipGroupDao.get(vipGroupBuyParams.getVipGroupId());
 
-
 		if(classGroup.getStudentNum()>0&&(VipGroupStatusEnum.APPLYING.equals(vipGroup.getStatus()))){
 			int i = studentPaymentOrderDao.countGroupOrderWithoutFailed(vipGroupBuyParams.getVipGroupId().toString(), GroupType.VIP);
 			if(i<=0){
@@ -1500,6 +1519,18 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			}
 		}
 
+		VipGroupActivity vipGroupActivity = null;
+		if(Objects.nonNull(vipGroup.getVipGroupActivityId())){
+			vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
+		}
+
+		if(Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes())&&vipGroupActivity.getStudentMaxUsedTimes()!=-1){
+			int useNum = vipGroupDao.countStudentUseingActivityNum(vipGroup.getVipGroupActivityId(), Integer.valueOf(user.getId()));
+			if(useNum>=vipGroupActivity.getStudentMaxUsedTimes()){
+				throw new BizException("您已超过该活动购买次数限制", vipGroupActivity.getStudentMaxUsedTimes());
+			}
+		}
+
 		if(vipGroup.getPaymentExpireDate().before(date)){
 			throw new BizException("该课程已结束报名!");
 		}
@@ -2578,13 +2609,13 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		String refundPeriod = sysConfigDao.findConfigValue(SysConfigService.REFUND_PERIOD);
 		Map<Integer,String> map1 = MapUtil.convertMybatisMap(classGroupStudentMapperDao.queryStudentIdMap(vipGroupId));
 		if(map1 != null && map1.size() > 0){
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.PUSH_STUDENT_VIP_STOP,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.STUDENT_PUSH_VIP_STOP,
 					map1,null,0,null,"STUDENT",vipGroupName,refundPeriod);
 		}
 //		老师推送消息
 		Map<Integer,String> map2 = MapUtil.convertMybatisMap(classGroupStudentMapperDao.queryTeacherIdMap(vipGroupId));
 		if(map2 != null && map2.size() > 0){
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.PUSH_TEACHER_VIP_STOP,
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.TEACHER_PUSH_VIP_STOP,
 					map2,null,0,null,"TEACHER",vipGroupName);
 		}
 	}
@@ -2885,6 +2916,25 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			throw new BizException("选择的学生中存在此课程中已存在的学生");
 		}
 
+		VipGroupActivity vipGroupActivity = null;
+		if(Objects.nonNull(vipGroup.getVipGroupActivityId())){
+			vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
+		}
+
+		if(Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes())&&vipGroupActivity.getStudentMaxUsedTimes()!=-1&&!CollectionUtils.isEmpty(studentIds)){
+			List<Integer> errStudentIds = new ArrayList<>();
+			for (Integer studentId : studentIds) {
+				int useNum = vipGroupDao.countStudentUseingActivityNum(vipGroup.getVipGroupActivityId(), Integer.valueOf(studentId));
+				if(useNum>=vipGroupActivity.getStudentMaxUsedTimes()){
+					errStudentIds.add(studentId);
+				}
+			}
+			if(errStudentIds.size()>0){
+				List<SimpleUserDto> students = teacherDao.getUsersSimpleInfo(errStudentIds);
+				throw new BizException("学员{}已超过该活动购买次数限制", StringUtils.join(students.stream().map(SimpleUserDto::getNickName).collect(Collectors.toList()), ","));
+			}
+		}
+
 		Date now=new Date();
         Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
 
@@ -2965,11 +3015,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			return;
 		}
 
-		VipGroupActivity vipGroupActivity = null;
-		if(Objects.nonNull(vipGroup.getVipGroupActivityId())){
-			vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
-		}
-
 		BigDecimal surplusCoursesPrice=new BigDecimal(0);
 		boolean hasGiveClass=false;
 		int onlineCourseTimes=0,

+ 4 - 6
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -2421,7 +2421,7 @@
             cs.organ_id_,
             s.name_ schoole_name_,
             o.name_ organ_name_,
-            CASE WHEN COUNT(sa.id_) > 0 THEN 1 ELSE 0 END isCallNames,
+            CASE WHEN COUNT(CASE WHEN sa.id_ IS NULL OR (sa.status_ = 'LEAVE' AND sa.remark_ IS NOT NULL) THEN NULL ELSE 1 END) > 0 THEN 1 ELSE 0 END isCallNames,
             CASE WHEN COUNT(CASE WHEN ta.is_complaints_ = 1 THEN 1 ELSE NULL END) > 0 THEN '1' ELSE '0' END is_complaints_
         FROM
             course_schedule cs
@@ -2584,9 +2584,9 @@
         <if test="searchType == 'ERR_ATTENDANCE'">
             AND ta.teacher_id_ = cs.actual_teacher_id_
             AND cs.status_ = 'OVER'
-            AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
+            AND (((ta.sign_in_status_ = 0 OR ta.sign_in_status_ IS NULL OR ta.sign_out_status_ = 0 OR ta.sign_out_status_ IS NULL) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ = 'TRUANT' AND sa.visit_flag_ = 0)))
+            AND ((ta.sign_in_status_ IS NULL AND ta.sign_out_status_ IS NOT NULL) OR (ta.sign_out_status_ IS NULL AND ta.sign_in_status_ IS NOT NULL) OR (ta.sign_out_status_ IS NOT NULL AND ta.sign_in_status_ IS NOT NULL))
             AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
-            AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
             AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cssp.id_ IS NOT NULL
         </if>
         <if test="searchType == 'NO_ATTENDANCE'">
@@ -3790,7 +3790,7 @@
                 AND cs.status_ = #{courseStatus, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
             <if test="teachIncomeType!=null and teachIncomeType=='SUBSIDY'">
-                AND IF(csts.settlement_time_ IS NULL, s.subsidy_ IS NOT NULL AND s.subsidy_>0, csts.subsidy_ IS NOT NULL AND csts.subsidy_>0)
+                AND csts.subsidy_!=0
             </if>
         </where>
     </sql>
@@ -3801,7 +3801,6 @@
         FROM
             course_schedule cs
             LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
-            LEFT JOIN school s ON cs.schoole_id_=s.id_
         <include refid="queryTeacherCourseCondition"></include>
         ORDER BY cs.class_date_ DESC,cs.start_class_time_ DESC,cs.id_ DESC
         <include refid="global.limit" />
@@ -3813,7 +3812,6 @@
         FROM
         course_schedule cs
         LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
-        LEFT JOIN school s ON cs.schoole_id_=s.id_
         <include refid="queryTeacherCourseCondition"></include>
     </select>
 

+ 10 - 1
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -481,7 +481,7 @@
     <select id="countStudentNotStartCourseNumWithCourseType" resultType="int">
 		SELECT COUNT(DISTINCT cssp.course_schedule_id_) FROM course_schedule_student_payment cssp
 		LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_
-		WHERE cssp.user_id_=#{studentId} 
+		WHERE cssp.user_id_=#{studentId}
 		<if test="courseScheduleType != null">
 		AND cs.type_= #{courseScheduleType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 		</if>
@@ -750,4 +750,13 @@
 			</foreach>
 		</if>
 	</select>
+
+	<select id="getStudentEduTeacher" resultType="string">
+		SELECT edut.real_name_ FROM course_schedule_student_payment cssp
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_ AND cssp.group_type_='VIP'
+		LEFT JOIN sys_user edut ON edut.id_ = vg.educational_teacher_id_
+		WHERE cssp.user_id_ = #{studentId}
+		AND vg.group_status_ IN (0,1,2)
+		ORDER BY vg.create_time_ DESC LIMIT 1
+	</select>
 </mapper>

+ 14 - 6
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -33,6 +33,7 @@
 		<result column="memo_" property="memo" />
 		<result column="deduction_reason_" property="deductionReason"/>
 		<result column="belong_to_daya_" property="belongToDaya" />
+		<result column="enable_change_salary_" property="enableChangeSalary" />
 	</resultMap>
 	
 	<resultMap type="com.ym.mec.biz.dal.dto.TeacherVipSalaryDto" id="teacherVipSalaryDto" extends="CourseScheduleTeacherSalary">
@@ -56,20 +57,21 @@
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO course_schedule_teacher_salary (id_,group_type_,music_group_id_,course_schedule_id_,teacher_role_,
 		user_id_,expect_salary_,create_time_,update_time_,subsidy_,actual_salary_,settlement_time_,class_group_id_,
-		reduce_salary,confirm_status_,memo_)
+		reduce_salary,confirm_status_,memo_,enable_change_salary_)
 		VALUES(#{id},#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{courseScheduleId},
 		#{teacherRole},#{userId},#{expectSalary},now(),now(),#{subsidy},#{actualSalary},#{settlementTime},#{classGroupId},
-		#{reduceSalary},#{confirmStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{memo})
+		#{reduceSalary},#{confirmStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{memo},#{enableChangeSalary})
 	</insert>
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
 		INSERT INTO course_schedule_teacher_salary (id_,group_type_,music_group_id_,course_schedule_id_,teacher_role_,
 		user_id_,expect_salary_,create_time_,update_time_,subsidy_,actual_salary_,settlement_time_,class_group_id_,
-		reduce_salary,confirm_status_,memo_)
+		reduce_salary,confirm_status_,memo_,enable_change_salary_)
 		VALUES
 		<foreach collection="list" item="data" separator=",">
 			(#{data.id},#{data.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{data.musicGroupId},#{data.courseScheduleId},
 			#{data.teacherRole},#{data.userId},#{data.expectSalary},now(),now(),#{data.subsidy},#{data.actualSalary},#{data.settlementTime},
-			#{data.classGroupId},#{data.reduceSalary},#{data.confirmStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{data.memo})
+			#{data.classGroupId},#{data.reduceSalary},#{data.confirmStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{data.memo},
+			#{data.enableChangeSalary})
 		</foreach>
     </insert>
 
@@ -125,6 +127,9 @@
 			<if test="belongToDaya != null">
 				belong_to_daya_ = #{belongToDaya},
 			</if>
+			<if test="enableChangeSalary != null">
+				enable_change_salary_ = #{enableChangeSalary},
+			</if>
 		</set> WHERE id_ = #{id} 
 	</update>
 
@@ -464,7 +469,10 @@
 		UPDATE course_schedule_teacher_salary csts left join course_schedule cs on csts.course_schedule_id_ = cs.id_ 
 		set
 			csts.subsidy_ = #{subsidy},
-			csts.expect_salary_ = #{salary},
+		    csts.enable_change_salary_ = IF(teacher_role_='BISHOP', 0, 1),
+		    <if test="salary!=null">
+				csts.expect_salary_ = #{salary},
+			</if>
 			csts.update_time_ = now()
 		WHERE csts.user_id_ = #{userId} and csts.class_group_id_ = #{classGroupId} and csts.settlement_time_ is null and CONCAT(cs.class_date_,' ',cs.start_class_time_) &gt;= #{startDateTime}
 	</update>
@@ -1121,7 +1129,7 @@
 				DATE_FORMAT( cs.class_date_, '%Y-%m-%d' ) dateStr,
 			</if>
 		    SUM(csts.subsidy_) subsidy,
-			SUM( csts.actual_salary_ - csts.subsidy_ ) amount
+			SUM( csts.actual_salary_) amount
 		FROM
 			course_schedule_teacher_salary csts
 				LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_

+ 124 - 4
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -947,8 +947,8 @@
 		LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
 		WHERE ta.teacher_id_ = cs.actual_teacher_id_
 		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_ >= '2021-02-01'
-		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
-		AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
+		AND (((ta.sign_in_status_ = 0 OR ta.sign_in_status_ IS NULL OR ta.sign_out_status_ = 0 OR ta.sign_out_status_ IS NULL) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ = 'TRUANT' AND sa.visit_flag_ = 0)))
+		AND ((ta.sign_in_status_ IS NULL AND ta.sign_out_status_ IS NOT NULL) OR (ta.sign_out_status_ IS NULL AND ta.sign_in_status_ IS NOT NULL) OR (ta.sign_out_status_ IS NOT NULL AND ta.sign_in_status_ IS NOT NULL))
 		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cssp.id_ IS NOT NULL
 		AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
 		<if test="classGroupIds != null and classGroupIds.size() > 0">
@@ -976,8 +976,8 @@
 		LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
 		WHERE ta.teacher_id_ = cs.actual_teacher_id_
 		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_ >= '2021-02-01'
-		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
-		AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
+		AND (((ta.sign_in_status_ = 0 OR ta.sign_in_status_ IS NULL OR ta.sign_out_status_ = 0 OR ta.sign_out_status_ IS NULL) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ = 'TRUANT' AND sa.visit_flag_ = 0)))
+		AND ((ta.sign_in_status_ IS NULL AND ta.sign_out_status_ IS NOT NULL) OR (ta.sign_out_status_ IS NULL AND ta.sign_in_status_ IS NOT NULL) OR (ta.sign_out_status_ IS NOT NULL AND ta.sign_in_status_ IS NOT NULL))
 		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cssp.id_ IS NOT NULL
 		AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
 		<if test="classGroupIds != null and classGroupIds.size() > 0">
@@ -1387,4 +1387,124 @@
 		ORDER BY sees.monday_,sees.sunday_,sees.teacher_id_
 		) e GROUP BY e.organ_id_
 	</select>
+	<select id="countStudentErrorLeave" resultType="java.lang.Integer">
+		SELECT COUNT(DISTINCT c.user_id_) FROM (
+		SELECT sa.user_id_ FROM student_attendance sa
+		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		WHERE DATE_FORMAT(cs.class_date_,'%Y-%m') >= #{format} AND sa.status_ = 'LEAVE'
+		<if test="organIdList != null and organIdList.size > 0">
+			AND cs.organ_id_ IN
+			<foreach collection="organIdList" open="(" close=")" item="item" separator=",">
+				#{item}
+			</foreach>
+		</if>
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m')
+		HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_)) c
+	</select>
+	<select id="countStudentErrorLeave1" resultType="java.lang.Integer">
+		SELECT COUNT(DISTINCT c.user_id_) FROM (
+		SELECT sa.user_id_ FROM student_attendance sa
+		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		LEFT JOIN sys_user su ON su.id_ = sa.user_id_
+		WHERE DATE_FORMAT(cs.class_date_,'%Y-%m') >= #{totalMonth} AND sa.status_ = 'LEAVE'
+		<if test="organId != null">
+			AND FIND_IN_SET(cs.organ_id_,#{organId})
+		</if>
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		<if test="search != null and search != ''">
+			AND (sa.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+		</if>
+		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m')
+		HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_)) c
+	</select>
+	<resultMap id="StudentErrorLeaveDto" type="com.ym.mec.biz.dal.dto.StudentErrorLeaveDto">
+		<result property="currentNum" column="current_num_"/>
+		<result property="totalNum" column="total_num_"/>
+		<result property="userId" column="user_id_"/>
+		<result property="studentName" column="username_"/>
+		<result property="phone" column="phone_"/>
+		<result property="organId" column="organ_id_"/>
+		<result property="organName" column="organ_name_"/>
+	</resultMap>
+	<select id="queryStudentErrorLeave" resultMap="StudentErrorLeaveDto">
+		SELECT organ_id_,organ_name_,user_id_,username_,phone_,SUM(total_num_) total_num_,current_num_,class_date_
+		FROM (SELECT cs.organ_id_,o.name_ organ_name_,sa.user_id_,su.username_,su.phone_,COUNT(sa.id_) total_num_,
+		COUNT(CASE WHEN DATE_FORMAT(cs.class_date_,'%Y-%m') = #{currentMonth} THEN 1 ELSE NULL END) current_num_,cs.class_date_
+		FROM student_attendance sa
+		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		LEFT JOIN organization o ON o.id_ = cs.organ_id_
+		LEFT JOIN sys_user su ON su.id_ = sa.user_id_
+		WHERE DATE_FORMAT(cs.class_date_,'%Y-%m') >= #{totalMonth} AND sa.status_ = 'LEAVE'
+		<if test="organId != null">
+			AND FIND_IN_SET(cs.organ_id_,#{organId})
+		</if>
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		<if test="search != null and search != ''">
+			AND (sa.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+		</if>
+		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m') HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_) ORDER BY cs.class_date_ DESC)c
+		GROUP BY c.user_id_
+		<include refid="global.limit"/>
+	</select>
+	<select id="countStudentLeaveCourseList" resultType="java.lang.Integer">
+		SELECT COUNT(sa.id_)
+		FROM student_attendance sa
+		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
+		<include refid="queryStudentLeaveCourseListSql"/>
+	</select>
+	<sql id="queryStudentLeaveCourseListSql">
+		<where>
+			sa.user_id_ = #{userId} AND sa.status_ = 'LEAVE'
+			<if test="search != null and search != ''">
+				AND (cs.id_ = #{search} OR cs.actual_teacher_id_ = #{search} OR su.real_name_ LIKE CONCAT('%',#{search},'%'))
+			</if>
+			<if test="leaveVisitFlag != null">
+				AND sa.leave_visit_flag_ = #{leaveVisitFlag}
+			</if>
+			<if test="courseType != null">
+				AND cs.type_ = #{courseType}
+			</if>
+		</where>
+	</sql>
+	<resultMap id="StudentLeaveCourseDto" type="com.ym.mec.biz.dal.dto.StudentLeaveCourseDto">
+		<result property="leaveVisitFlag" column="leave_visit_flag_"/>
+		<result property="classDate" column="class_date_"/>
+		<result property="startClassTime" column="start_class_time_"/>
+		<result property="endClassTime" column="end_class_time_"/>
+		<result property="teacherName" column="teacher_name_"/>
+		<result property="actualTeacherId" column="actual_teacher_id_"/>
+		<result property="courseScheduleId" column="course_schedule_id_"/>
+		<result property="groupType" column="group_type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+		<result property="courseScheduleType" column="type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+		<result property="courseName" column="name_"/>
+		<result property="groupId" column="music_group_id_"/>
+	</resultMap>
+	<select id="queryStudentLeaveCourseList" resultMap="StudentLeaveCourseDto">
+		SELECT sa.leave_visit_flag_,cs.class_date_,cs.start_class_time_,
+		       cs.end_class_time_,su.real_name_ teacher_name_,cs.actual_teacher_id_,
+		       sa.course_schedule_id_,cs.group_type_,cs.type_,cs.name_,cs.music_group_id_
+		FROM student_attendance sa
+		 LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		 LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
+		<include refid="queryStudentLeaveCourseListSql"/>
+		ORDER BY cs.class_date_ DESC,cs.start_class_time_ DESC
+		<include refid="global.limit"/>
+	</select>
 </mapper>

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

@@ -13,6 +13,7 @@
         <result column="expected_student_num_" property="expectedStudentNum"/>
         <result column="apply_student_num_" property="applyStudentNum"/>
         <result column="paid_student_num_" property="paidStudentNum"/>
+        <result column="paid_zero_num_" property="paidZeroNum"/>
         <result column="fee_" property="fee"/>
         <result column="kit_group_purchase_type_" property="kitGroupPurchaseType"
                 typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -81,6 +82,9 @@
             <if test="paidStudentNum != null">
                 paid_student_num_ = #{paidStudentNum},
             </if>
+            <if test="paidZeroNum != null">
+                paid_zero_num_ = #{paidZeroNum},
+            </if>
             <if test="updateTime != null">
                 update_time_ = NOW(),
             </if>

+ 12 - 0
mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml

@@ -287,6 +287,9 @@
             <if test="type != null and type == 0">
                 AND pg.be_renew_group_id_ IS NOT NULL AND pg.type_='CHARGE'
             </if>
+            <if test="type != null and type == 2">
+                AND pg.type_='FREE'
+            </if>
             <if test="practiceGroupType != null">
                 AND pg.type_=#{practiceGroupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
@@ -747,4 +750,13 @@
         </foreach>
         AND pg.educational_teacher_id_ IS NOT NULL
     </select>
+
+    <select id="getStudentEduTeacher" resultType="string">
+        SELECT edut.real_name_
+        FROM practice_group pg
+        LEFT JOIN sys_user edut ON edut.id_ = pg.educational_teacher_id_
+        WHERE pg.student_id_ = #{studentId}
+            AND pg.group_status_ IN ('NORMAL','FINISH')
+        ORDER BY pg.courses_start_date_ DESC LIMIT 1
+    </select>
 </mapper>

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

@@ -137,6 +137,9 @@
         SET sign_out_time_= NULL
     	WHERE course_schedule_id_=#{courseId} AND user_id_ = #{userId}
     </update>
+    <update id="updateLeaveVisitFlag">
+        UPDATE student_attendance SET leave_visit_flag_ = 1 WHERE user_id_ = #{userId} AND status_ = 'LEAVE'
+    </update>
 
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">

+ 18 - 6
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -290,6 +290,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND exercises_message_num_ &lt; exercises_reply_num_
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR exercises_message_num_ &lt; exercises_reply_num_)
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND exercises_message_num_ &gt;= exercises_reply_num_
 			</if>
@@ -310,6 +313,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_)
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
 			</if>
@@ -378,6 +384,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND exercises_message_num_ &lt; exercises_reply_num_
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR exercises_message_num_ &lt; exercises_reply_num_)
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND exercises_message_num_ &gt;= exercises_reply_num_
 			</if>
@@ -398,6 +407,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_)
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
 			</if>
@@ -564,9 +576,6 @@
 		FROM
 			student_extracurricular_exercises_situation_ sees
 			LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
-			<if test="unDone!=null and unDone==1">
-				LEFT JOIN teacher_remind tm ON sees.monday_=tm.monday_ AND sees.teacher_id_=tm.teacher_id_
-			</if>
 			LEFT JOIN organization organ ON organ.id_=tea.organ_id_
 			LEFT JOIN sys_user su ON tea.id_=su.id_
 		<include refid="queryTeacherServeInfoCondition" />
@@ -595,6 +604,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_)
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_) OR SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_))
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND SUM(exercises_message_num_) &gt;= SUM(exercises_reply_num_)
 			</if>
@@ -616,9 +628,6 @@
 			FROM
 				student_extracurricular_exercises_situation_ sees
 				LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
-				<if test="unDone!=null and unDone==1">
-					LEFT JOIN teacher_remind tm ON sees.monday_=tm.monday_ AND sees.teacher_id_=tm.teacher_id_
-				</if>
 			<include refid="queryTeacherServeInfoCondition" />
 			GROUP BY sees.monday_,sees.sunday_,sees.teacher_id_
 			<trim prefix="HAVING" prefixOverrides="AND">
@@ -645,6 +654,9 @@
 				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 					AND SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_)
 				</if>
+				<if test="serviceIsError!=null and serviceIsError">
+					AND (SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_) OR SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_))
+				</if>
 				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 					AND SUM(exercises_message_num_) &gt;= SUM(exercises_reply_num_)
 				</if>

+ 12 - 0
mec-biz/src/main/resources/config/mybatis/SysUserCashAccountDetailMapper.xml

@@ -9,6 +9,9 @@
     <resultMap type="com.ym.mec.biz.dal.entity.SysUserCashAccountDetail" id="SysUserCashAccountDetail">
         <result column="id_" property="id"/>
         <result column="user_id_" property="userId"/>
+        <result column="phone_" property="phone"/>
+        <result column="username_" property="username"/>
+        <result column="subject_name_" property="subjectName"/>
         <result column="trans_no_" property="transNo"/>
         <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="trans_type_" property="transType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -238,4 +241,13 @@
             <include refid="queryAccountDetailCondition"/>
         ) t
     </select>
+    <select id="exportDetail" resultMap="SysUserCashAccountDetail">
+        SELECT su.username_,su.phone_,GROUP_CONCAT(sb.name_ ORDER BY sb.name_) subject_name_,cad.* FROM sys_user_cash_account_detail cad
+        LEFT JOIN sys_user su ON su.id_ = cad.user_id_
+        LEFT JOIN student s ON s.user_id_ = su.id_
+        LEFT JOIN `subject` sb ON FIND_IN_SET(sb.id_,s.subject_id_list_)
+        WHERE cad.user_id_ = #{userId}
+        GROUP BY cad.id_
+        ORDER BY cad.id_ DESC
+    </select>
 </mapper>

+ 14 - 9
mec-biz/src/main/resources/config/mybatis/SysUserCoursesAccountDetailMapper.xml

@@ -9,6 +9,9 @@
 	<resultMap type="com.ym.mec.biz.dal.entity.SysUserCoursesAccountDetail" id="SysUserCoursesAccountDetail">
 		<result column="id_" property="id" />
 		<result column="user_id_" property="userId" />
+		<result column="phone_" property="phone"/>
+		<result column="username_" property="username"/>
+		<result column="subject_name_" property="subjectName"/>
 		<result column="trans_no_" property="transNo" />
 		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="trans_type_" property="transType"  typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -36,13 +39,9 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysUserCoursesAccountDetail" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!--
-		<selectKey resultClass="int" keyProperty="id" > 
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
-		</selectKey>
-		-->
 		INSERT INTO sys_user_courses_account_detail (id_,user_id_,trans_no_,type_,trans_type_,status_,amount_,balance_,description_,comment_,attribute1_,channel_,platform_account_no_,create_time_,update_time_)
-		VALUES(#{id},#{userId},#{transNo},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{transType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{amount},#{balance},#{description},#{comment},#{attribute1},#{channel},#{platformAccountNo},NOW(),NOW())
+		VALUES(#{id},#{userId},#{transNo},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{transType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		       #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{amount},#{balance},#{description},#{comment},#{attribute1},#{channel},#{platformAccountNo},NOW(),NOW())
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -52,9 +51,6 @@
 			<if test="status != null">
 				status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 			</if>
-			<if test="id != null">
-				id_ = #{id},
-			</if>
 			<if test="balance != null">
 				balance_ = #{balance},
 			</if>
@@ -118,4 +114,13 @@
 		SELECT COUNT(*) FROM sys_user_courses_account_detail
 		<include refid="queryPageCondition" />
 	</select>
+	<select id="exportDetail" resultMap="SysUserCoursesAccountDetail">
+		SELECT su.username_,su.phone_,GROUP_CONCAT(sb.name_ ORDER BY sb.name_) subject_name_,cad.* FROM sys_user_courses_account_detail cad
+		LEFT JOIN sys_user su ON su.id_ = cad.user_id_
+		LEFT JOIN student s ON s.user_id_ = su.id_
+		LEFT JOIN `subject` sb ON FIND_IN_SET(sb.id_,s.subject_id_list_)
+		WHERE cad.user_id_ = #{userId}
+		GROUP BY cad.id_
+		ORDER BY cad.id_ DESC
+	</select>
 </mapper>

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

@@ -33,6 +33,7 @@
 		<result property="offlineClassJoinGradientRewards" column="offline_class_join_gradient_rewards_"/>
 		<result property="minCourseNum" column="min_course_num_"/>
 		<result property="maxCourseNum" column="max_course_num_"/>
+		<result property="studentMaxUsedTimes" column="student_max_used_times_"/>
 	</resultMap>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -54,10 +55,11 @@
 		-->
 		INSERT INTO vip_group_activity (id_,name_,description_,vip_group_category_id_list_,start_time_,end_time_,organ_id_,courses_start_time_,courses_end_time_,type_,
 		                                attribute1_,attribute2_,attribute3_,salary_readonly_flag_,give_class_pay_salary_flag_,create_time_,update_time_,salary_settlement_json_,del_flag_,
-		                                payment_readonly_flag_,online_class_join_gradient_rewards_,offline_class_join_gradient_rewards_,min_course_num_,max_course_num_)
+		                                payment_readonly_flag_,online_class_join_gradient_rewards_,offline_class_join_gradient_rewards_,min_course_num_,max_course_num_,
+										student_max_used_times_)
 		VALUES(#{id},#{name},#{description},#{vipGroupCategoryIdList},#{startTime},#{endTime},#{organId},#{coursesStartTime},#{coursesEndTime},#{type},#{attribute1},#{attribute2},#{attribute3},
 		       #{salaryReadonlyFlag},#{giveClassPaySalaryFlag},now(),now(),#{salarySettlementJson},#{delFlag},#{paymentReadonlyFlag},#{onlineClassJoinGradientRewards},
-		       #{offlineClassJoinGradientRewards},#{minCourseNum},#{maxCourseNum})
+		       #{offlineClassJoinGradientRewards},#{minCourseNum},#{maxCourseNum},#{studentMaxUsedTimes})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -133,6 +135,9 @@
 			<if test="maxCourseNum!=null">
 				max_course_num_=#{maxCourseNum},
 			</if>
+			<if test="studentMaxUsedTimes!=null">
+				student_max_used_times_=#{studentMaxUsedTimes},
+			</if>
 			update_time_ = NOW(),
 		</set>WHERE id_ = #{id}
 	</update>

+ 15 - 0
mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml

@@ -1037,4 +1037,19 @@
         </foreach>
         AND vg.educational_teacher_id_ IS NOT NULL
     </select>
+    <select id="countStudentUserActivityNum" resultType="int">
+        SELECT COUNT(DISTINCT vg.id_)
+        FROM vip_group vg
+        LEFT JOIN class_group_student_mapper cgsm ON vg.id_=cgsm.music_group_id_ AND cgsm.group_type_='VIP'
+        WHERE vg.vip_group_activity_id_=#{vipGroupActivityId}
+            AND ((vg.group_status_ NOT IN (3, 7) AND FIND_IN_SET(#{studentId}, vg.student_id_list_)) OR cgsm.user_id_=#{studentId});
+    </select>
+
+    <select id="countStudentUseingActivityNum" resultType="int">
+        SELECT COUNT(DISTINCT vg.id_)
+        FROM vip_group vg
+                 LEFT JOIN class_group_student_mapper cgsm ON vg.id_=cgsm.music_group_id_ AND cgsm.group_type_='VIP'
+        WHERE vg.vip_group_activity_id_=#{vipGroupActivityId}
+          AND cgsm.user_id_=#{studentId}
+    </select>
 </mapper>

+ 6 - 0
mec-common/common-core/pom.xml

@@ -66,5 +66,11 @@
 			<artifactId>emoji-java</artifactId>
 		</dependency>
 
+
+		<dependency>
+			<groupId>com.github.dragoon000320</groupId>
+			<artifactId>tarsosdsp</artifactId>
+			<version>1.0</version>
+		</dependency>
 	</dependencies>
 </project>

+ 4 - 1
mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java

@@ -64,7 +64,7 @@ public class BaseController {
 
 	/**
 	 * 处理一般异常
-	 * 
+	 *
 	 * @param ex
 	 * @param request
 	 * @return
@@ -78,6 +78,9 @@ public class BaseController {
 		logger.error("System Error", ex);
 		// return failed(e.getMessage());
 		if (e instanceof BizException || e instanceof ThirdpartyException) {
+			if(e.getMessage().equals("205")){
+				return failed(HttpStatus.RESET_CONTENT,e.getMessage());
+			}
 			return failed(e.getMessage());
 		} else if (e instanceof AccessDeniedException) {
 			return failed("禁止访问");

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

@@ -230,7 +230,7 @@ public class MusicGroupController extends BaseController {
             throw new BizException("缴费暂未开始,如有问题请联系指导老师");
         }
         if (renew.containsKey("tradeState")) {
-            return failed(HttpStatus.CREATED, "恭喜您,缴费成功!");
+            return failed(HttpStatus.CREATED, renew,"恭喜您,缴费成功!");
         }
         return succeed(renew);
     }
@@ -299,7 +299,7 @@ public class MusicGroupController extends BaseController {
         }
         Map payMap = musicGroupService.pay(registerPayDto);
         if (payMap.containsKey("tradeState")) {
-            return failed(HttpStatus.CREATED, "恭喜您,报名成功!");
+            return failed(HttpStatus.CREATED, payMap,"恭喜您,报名成功!");
         }
         return succeed(payMap);
     }
@@ -325,7 +325,7 @@ public class MusicGroupController extends BaseController {
         }
         Map payMap = musicGroupService.rePay(registerPayDto);
         if (payMap.containsKey("tradeState")) {
-            return failed(HttpStatus.CREATED, "恭喜您,报名成功!");
+            return failed(HttpStatus.CREATED, payMap,"恭喜您,报名成功!");
         }
         return succeed(payMap);
     }

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

@@ -307,7 +307,7 @@ public class PracticeGroupController extends BaseController {
         if(pushType.equals("ALL")||pushType.equals("JIGUANG")){
             Map<Integer, String> userMap = new HashMap<>();
             userMap.put(userId, userId.toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.FREE_PRACTICE_APPLY_PUSH,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_FREE_PRACTICE_APPLY_PUSH,
                     userMap, null, 0, "5?" + pushUrl, "STUDENT");
         }
 
@@ -346,14 +346,14 @@ public class PracticeGroupController extends BaseController {
         if(pushType.equals("ALL")||pushType.equals("JIGUANG")){
             Map<Integer, String> userMap = new HashMap<>();
             userMap.put(userId, userId.toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_COMPLETED_STUDY_REPORT,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT,
                     userMap, null, 0, "5?" + pushUrl, "STUDENT", pushUrl);
         }
 
         if(pushType.equals("ALL")||pushType.equals("SMS")){
             Map<Integer, String> userPhoneMap = new HashMap<>();
             userPhoneMap.put(userId, student.getPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.PRACTICE_COMPLETED_STUDY_REPORT,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT,
                     userPhoneMap, null, 0, null, "STUDENT", HttpUtil.getSortUrl(smsUrl));
         }
 

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

@@ -74,7 +74,7 @@ public class RepairController extends BaseController {
         studentGoodsSell.setAuthorUser(studentGoodsSell.getUserId());
         Map map = studentRepairService.addGoodsSellOrder(studentGoodsSell);
         if(map.containsKey("tradeState")){
-            return failed(HttpStatus.CREATED, "恭喜您,购买成功!");
+            return failed(HttpStatus.CREATED, map,"恭喜您,购买成功!");
         }
         return succeed(map);
     }
@@ -84,7 +84,7 @@ public class RepairController extends BaseController {
     public HttpResponseResult studentPaymentGoodsOrder(Integer goodsSellId) throws Exception {
         Map map = studentRepairService.studentPaymentGoodsOrder(goodsSellId);
         if(map.containsKey("tradeState")){
-            return failed(HttpStatus.CREATED, "恭喜您,购买成功!");
+            return failed(HttpStatus.CREATED, map,"恭喜您,购买成功!");
         }
         return succeed(map);
     }

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

@@ -20,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Map;
+
 @RequestMapping("replacementInstrumentActivity")
 @Api(tags = "乐器置换调查问卷")
 @RestController
@@ -162,6 +164,10 @@ public class ReplacementInstrumentActivityController extends BaseController {
         if (replacementInstrumentActivity.getPayStatus().equals(1) && !replacementPayDto.getRePay()) {
             return failed(HttpStatus.CONTINUE, "您有待支付的订单");
         }
+        Map payMap = replacementInstrumentActivityService.pay(replacementPayDto);
+        if (payMap.containsKey("tradeState")) {
+            return failed(HttpStatus.CREATED, payMap, "恭喜您,支付成功!");
+        }
         return succeed(replacementInstrumentActivityService.pay(replacementPayDto));
     }
 }

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

@@ -78,7 +78,7 @@ public class SporadicChargeInfoController extends BaseController {
                 try {
                     Map payMap = musicGroupService.sporadicPay(sporadicPayDto);
                     if (payMap.containsKey("tradeState")) {
-                        return failed(HttpStatus.CREATED, "恭喜您,支付成功!");
+                        return failed(HttpStatus.CREATED, payMap,"恭喜您,支付成功!");
                     }
                     return succeed(payMap);
                 } catch (Exception e) {
@@ -97,7 +97,7 @@ public class SporadicChargeInfoController extends BaseController {
 
         Map payMap = musicGroupService.sporadicPay(sporadicPayDto);
         if (payMap.containsKey("tradeState")) {
-            return failed(HttpStatus.CREATED, "恭喜您,支付成功!");
+            return failed(HttpStatus.CREATED, payMap,"恭喜您,支付成功!");
         }
         return succeed(payMap);
     }

+ 6 - 1
mec-student/src/main/java/com/ym/mec/student/controller/StudentInstrumentController.java

@@ -23,6 +23,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
+import java.util.Map;
 
 @RequestMapping("studentInstrument")
 @Api(tags = "乐器与乐保服务")
@@ -51,6 +52,10 @@ public class StudentInstrumentController extends BaseController {
     @PostMapping("/pay")
     @ApiImplicitParams({@ApiImplicitParam(name = "maintenancePayDto", value = "支付参数", required = true, dataType = "MaintenancePayDto")})
     public HttpResponseResult pay(MaintenancePayDto maintenancePayDto) throws Exception {
-        return succeed(studentInstrumentService.pay(maintenancePayDto));
+        Map payMap = studentInstrumentService.pay(maintenancePayDto);
+        if (payMap.containsKey("tradeState")) {
+            return failed(HttpStatus.CREATED, payMap, "恭喜您,支付成功!");
+        }
+        return succeed(payMap);
     }
 }

+ 5 - 1
mec-student/src/main/java/com/ym/mec/student/controller/SubjectChangeController.java

@@ -53,7 +53,11 @@ public class SubjectChangeController extends BaseController {
         if (!isRepay && subjectChange.getStatus().equals(SubjectChangeStatusEnum.ING)) {
             return failed(HttpStatus.CONTINUE, "您有待支付的订单");
         }
-        return succeed(subjectChangeService.payChange(id, amount, isUseBalancePayment, isRepay));
+        Map payMap = subjectChangeService.payChange(id, amount, isUseBalancePayment, isRepay);
+        if (payMap.containsKey("tradeState")) {
+            return failed(HttpStatus.CREATED, payMap, "恭喜您,支付成功!");
+        }
+        return succeed(payMap);
     }
 
 

+ 32 - 0
mec-student/src/main/java/com/ym/mec/student/controller/SysMessageController.java

@@ -1,7 +1,10 @@
 package com.ym.mec.student.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.AppVersionInfoDao;
+import com.ym.mec.biz.dal.entity.AppVersionInfo;
 import com.ym.mec.biz.dal.enums.MessageSendMode;
 import com.ym.mec.biz.dal.page.SysMessageQueryInfo;
 import com.ym.mec.biz.service.SysMessageService;
@@ -20,6 +23,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 @RestController
@@ -33,6 +39,9 @@ public class SysMessageController extends BaseController {
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
 
+	@Autowired
+	private AppVersionInfoDao appVersionInfoDao;
+
 	@ApiOperation("获取所有消息列表")
 	@GetMapping(value = "list")
 	public Object list(SysMessageQueryInfo queryInfo){
@@ -46,6 +55,29 @@ public class SysMessageController extends BaseController {
 		return succeed(sysMessageService.queryPage(queryInfo));
 	}
 
+	@ApiOperation("获取消息分类类型")
+	@GetMapping(value = "typeList")
+	public Object typeList(String memo){
+		//如果用户使用的版本比当前版本号大,那么屏蔽缴费信息
+		if(StringUtils.isNotEmpty(memo)){
+			//获取当前使用的版本
+			AppVersionInfo appVersionInfo = appVersionInfoDao.queryNewestByPlatform("ios-student").get(0);
+			int defaultVersion = Integer.parseInt(appVersionInfo.getVersion().replaceAll("\\.",""));
+			int currentVersion = Integer.parseInt(memo.replaceAll("\\.",""));
+			if(currentVersion > defaultVersion){
+				return succeed(JSON.parseArray("[{\"value\":\"全部\",\"key\":\"ALL\"}," +
+						"{\"value\":\"课程信息\",\"key\":\"COURSE\"}," +
+						"{\"value\":\"作业信息\",\"key\":\"WORK\"}," +
+						"{\"value\":\"其他\",\"key\":\"DEFAULT\"}]"));
+			}
+		}
+		return succeed(JSON.parseArray("[{\"value\":\"全部\",\"key\":\"ALL\"}," +
+				"{\"value\":\"缴费信息\",\"key\":\"PAY\"}," +
+				"{\"value\":\"课程信息\",\"key\":\"COURSE\"}," +
+				"{\"value\":\"作业信息\",\"key\":\"WORK\"}," +
+				"{\"value\":\"其他\",\"key\":\"DEFAULT\"}]"));
+	}
+
 	@ApiOperation("一键已读")
 	@PostMapping("batchSetRead")
 	public Object batchSetRead() {

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

@@ -0,0 +1,35 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.biz.service.SoundService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/19 0019
+ */
+@Api(tags = "音频服务")
+@RequestMapping("sound")
+@RestController
+public class SoundController extends BaseController {
+
+    @Autowired
+    private SoundService soundService;
+
+    @ApiOperation(value = "评分")
+    @PostMapping("compare")
+    public HttpResponseResult compare(@RequestParam("record") MultipartFile record, Integer musicScoreId){
+        return soundService.compare(record, musicScoreId);
+    }
+
+}

+ 15 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMessageController.java

@@ -1,12 +1,17 @@
 package com.ym.mec.teacher.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
+import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -50,6 +55,16 @@ public class SysMessageController extends BaseController {
 		return succeed(sysMessageService.queryPage(queryInfo));
 	}
 
+	@ApiOperation("获取消息分类类型")
+	@GetMapping(value = "typeList")
+	public Object typeList(){
+		return succeed(JSON.parseArray("[{\"value\":\"全部\",\"key\":\"ALL\"}," +
+				"{\"value\":\"考勤信息\",\"key\":\"ATTENDANCE\"}," +
+				"{\"value\":\"课程信息\",\"key\":\"COURSE\"}," +
+				"{\"value\":\"作业信息\",\"key\":\"WORK\"}," +
+				"{\"value\":\"其他\",\"key\":\"DEFAULT\"}]"));
+	}
+
 	@ApiOperation("一键已读")
 	@PostMapping("batchSetRead")
 	public Object batchSetRead() {

+ 6 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMusicScoreController.java

@@ -3,6 +3,7 @@ package com.ym.mec.teacher.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.MusicScoreDto;
+import com.ym.mec.biz.dal.entity.SysMusicScore;
 import com.ym.mec.biz.dal.enums.ClientTypeEnum;
 import com.ym.mec.biz.dal.enums.ExamSongTypeEnum;
 import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
@@ -28,7 +29,11 @@ public class SysMusicScoreController extends BaseController {
     @ApiOperation(value = "新增")
     @PostMapping("/add")
     public Object add(@RequestBody MusicScoreDto musicScoreDto) {
-        musicScoreDto.getSysMusicScore().setType(ExamSongTypeEnum.PERSON);
+        SysMusicScore sysMusicScore = musicScoreDto.getSysMusicScore();
+        sysMusicScore.setType(ExamSongTypeEnum.PERSON);
+        if(sysMusicScore.getClientType() == null){
+            sysMusicScore.setClientType(ClientTypeEnum.NETWORK_ROOM);
+        }
         sysMusicScoreService.add(musicScoreDto);
         return succeed();
     }

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

@@ -180,12 +180,12 @@ public class TeacherCourseScheduleController extends BaseController {
         return succeed(studentAttendanceService.getCurrentCourseStudents(queryInfo));
     }
 
-    @ApiOperation(value = "课程批量调整")
-    @PostMapping("/batchUpdateCourseSchedule")
-    public Object batchUpdateCourseSchedule(@RequestBody BatchInsertCoursesDto batchInsertCoursesDto){
-        scheduleService.batchUpdateCourseSchedule(batchInsertCoursesDto);
-        return succeed();
-    }
+//    @ApiOperation(value = "课程批量调整")
+//    @PostMapping("/batchUpdateCourseSchedule")
+//    public Object batchUpdateCourseSchedule(@RequestBody BatchInsertCoursesDto batchInsertCoursesDto){
+//        scheduleService.batchUpdateCourseSchedule(batchInsertCoursesDto);
+//        return succeed();
+//    }
 
     @ApiOperation(value = "课时调整")
     @PostMapping(value = "/classStartDateAdjust",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

+ 6 - 5
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherVipGroupController.java

@@ -63,8 +63,7 @@ public class TeacherVipGroupController extends BaseController {
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setTeacherId(Long.valueOf(userId));
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganIdList(teacher.getTeacherOrganId().toString());
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(teacher.getTeacherOrganId());
-		vipGroupService.createVipGroup(vipGroupApplyDto);
-		return succeed();
+		return vipGroupService.createVipGroup(vipGroupApplyDto);
 	}
 
 	@ApiOperation("vip课申请-双11")
@@ -118,9 +117,11 @@ public class TeacherVipGroupController extends BaseController {
 			}
 		}
 
-		vipGroupService.createVipGroup(vipGroupApplyDto);
-		vipGroupService.addVipGroupStudents(vipGroupApplyDto.getVipGroupApplyBaseInfo().getId(), studentIds, new HashMap<>());
-		return succeed();
+		HttpResponseResult result = vipGroupService.createVipGroup(vipGroupApplyDto);
+		if(result.getCode()==200){
+			vipGroupService.addVipGroupStudents(vipGroupApplyDto.getVipGroupApplyBaseInfo().getId(), studentIds, new HashMap<>());
+		}
+		return result;
 	}
 
 	@ApiOperation("获取vip课课程和课酬总费用")

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

@@ -378,7 +378,7 @@ public class CourseScheduleController extends BaseController {
     	}
 		courseScheduleService.batchAddCourseSchedule(batchInsertCoursesDto.getClassGroupId(), batchInsertCoursesDto.getCoursesTimes(),
 				batchInsertCoursesDto.getStartDate(), null,null, batchInsertCoursesDto.getTeachingArrangementList(), batchInsertCoursesDto.getTeachMode(),
-				batchInsertCoursesDto.getType(), batchInsertCoursesDto.getSchoolId(), batchInsertCoursesDto.getIsJumpHoliday());
+				batchInsertCoursesDto.getType(), batchInsertCoursesDto.getSchoolId(), batchInsertCoursesDto.getIsJumpHoliday(), null);
         return succeed();
     }
 

+ 96 - 3
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -6,12 +6,15 @@ 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.common.constant.CommonConstants;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.service.IdGeneratorService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -130,9 +133,86 @@ public class ExportController extends BaseController {
     private MusicGroupQuitService musicGroupQuitService;
     @Autowired
     private IndexBaseMonthDataService indexService;
-
     @Autowired
     private TeacherCourseStatisticsService teacherCourseStatisticsService;
+    @Autowired
+    private SysUserCashAccountDetailDao sysUserCashAccountDetailDao;
+    @Autowired
+    private SysUserCoursesAccountDetailDao sysUserCoursesAccountDetailDao;
+
+    @ApiOperation(value = "学生个人账户余额导出")
+    @PostMapping("export/userCashAccountDetail")
+    @PreAuthorize("@pcs.hasPermissions('export/userCashAccountDetail')")
+    public void userCashAccountDetail(HttpServletResponse response, Integer userId) throws IOException {
+       List<SysUserCashAccountDetail> cashAccountDetails = sysUserCashAccountDetailDao.exportDetail(userId);
+       if(cashAccountDetails.size() < 1){
+           throw new BizException("没有可导出数据");
+       }
+       if(cashAccountDetails.size() > 49999){
+           throw new BizException("数据超长,请联系管理员");
+       }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学员编号", "姓名", "电话", "声部",
+                    "交易类型", "交易金额", "交易时间", "备注"}, new String[]{
+                    "userId", "username", "phone", "subjectName",
+                    "type.msg", "amount", "createTime", "comment"}, cashAccountDetails);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=classGroup-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @ApiOperation(value = "学生个人课程余额导出")
+    @PostMapping("export/userCoursesAccount")
+    @PreAuthorize("@pcs.hasPermissions('export/userCoursesAccount')")
+    public void userCoursesAccount(HttpServletResponse response, Integer userId) throws IOException {
+        List<SysUserCoursesAccountDetail> coursesAccountDetails = sysUserCoursesAccountDetailDao.exportDetail(userId);
+        if(coursesAccountDetails.size() < 1){
+            throw new BizException("没有可导出数据");
+        }
+        if(coursesAccountDetails.size() > 49999){
+            throw new BizException("数据超长,请联系管理员");
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学员编号", "姓名", "电话", "声部",
+                    "交易类型", "交易金额", "交易时间", "备注"}, new String[]{
+                    "userId", "username", "phone", "subjectName",
+                    "type.msg", "amount", "createTime", "comment"}, coursesAccountDetails);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=classGroup-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 
     @ApiOperation(value = "班级列表导出")
     @PostMapping("export/classGroup")
@@ -2525,13 +2605,26 @@ public class ExportController extends BaseController {
         }
         OutputStream outputStream = response.getOutputStream();
 
+        BigDecimal oneHundred = new BigDecimal(100);
+        BigDecimal zero = new BigDecimal("0.00");
+
         for (TeacherServeDto row : result.getRows()) {
             row.setDateRange(com.ym.mec.util.date.DateUtil.dateToString(row.getMonday(), "yyyy-MM-dd") + '~' + com.ym.mec.util.date.DateUtil.dateToString(row.getSunday(), "yyyy-MM-dd"));
+            if(row.getActualExercisesNum()<=0){
+                row.setSubmitRate(zero.toString()+"%");
+            }else{
+                BigDecimal submitRate = new BigDecimal(row.getExercisesReplyNum()).divide(new BigDecimal(row.getActualExercisesNum()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(oneHundred);
+                row.setSubmitRate(submitRate+"%");
+            }
         }
 
         try {
-            String[] header = {"分部", "老师编号", "老师姓名", "服务周期", "课后作业(节)", "课外作业(人)", "是否异常", "提醒时间", "操作人"};
-            String[] body = {"organName", "teacherId", "teacherName", "dateRange", "homeworkNum", "exerciseNum", "unDone==0?'否':'是'", "remindDate", "operatorName"};
+            String[] header = {"分部", "老师编号", "老师姓名", "服务周期", "课后作业(节)", "课外作业(人)",
+                    "作业布置", "作业点评", "作业提交率",
+                    "提醒时间", "操作人"};
+            String[] body = {"organName", "teacherId", "teacherName", "dateRange", "homeworkNum", "exerciseNum",
+                    "expectExercisesNum>actualExercisesNum?'异常':'正常'", "exercisesReplyNum>exercisesMessageNum?'异常':'正常'", "submitRate",
+                    "remindDate", "operatorName"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, result.getRows());
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=teacherDefaultSalary-" + DateUtil.getDate(new Date()) + ".xls");

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff