Browse Source

Merge remote-tracking branch 'origin/master'

river 4 years ago
parent
commit
e6fa9b8293
37 changed files with 891 additions and 160 deletions
  1. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MemberRankPrivilegesDao.java
  2. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupSchoolTermStudentCourseDetailDao.java
  3. 18 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  4. 91 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java
  5. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java
  7. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MemberPrivilegesItemService.java
  8. 14 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  9. 52 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberPrivilegesItemServiceImpl.java
  10. 9 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankPrivilegesServiceImpl.java
  11. 15 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  12. 40 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  13. 10 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java
  14. 24 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  15. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  16. 2 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  17. 18 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  18. 3 0
      mec-biz/src/main/resources/config/mybatis/MemberRankPrivilegesMapper.xml
  19. 2 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderCourseSettingsMapper.xml
  20. 1 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupSchoolTermCourseDetailMapper.xml
  21. 6 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupSchoolTermStudentCourseDetailMapper.xml
  22. 10 1
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  23. 15 4
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  24. 12 10
      mec-biz/src/main/resources/config/mybatis/SysMusicScoreAccompanimentMapper.xml
  25. 0 6
      mec-gateway/mec-gateway-web/pom.xml
  26. 8 1
      mec-im/src/main/resources/logback-spring.xml
  27. 5 0
      mec-student/pom.xml
  28. 40 0
      mec-student/src/main/java/com/ym/mec/student/config/WebSocketConfig.java
  29. 18 6
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  30. 8 0
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupPaymentCalenderController.java
  31. 323 0
      mec-student/src/main/java/com/ym/mec/student/handler/WebSocketHandler.java
  32. 28 0
      mec-student/src/main/java/com/ym/mec/student/interceptor/WebSocketHandshakeInterceptor.java
  33. 8 1
      mec-student/src/main/resources/logback-spring.xml
  34. 57 59
      mec-teacher/src/main/java/com/ym/mec/teacher/handler/WebSocketHandler.java
  35. 8 1
      mec-teacher/src/main/resources/logback-spring.xml
  36. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/MemberPrivilegesItemController.java
  37. 8 1
      mec-web/src/main/resources/logback-spring.xml

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

@@ -14,4 +14,11 @@ public interface MemberRankPrivilegesDao extends BaseDAO<Integer, MemberRankPriv
     List<MemberRankPrivileges> findByRankSettingId(Integer memberRankSettingId);
     List<MemberRankPrivileges> findByRankSettingId(Integer memberRankSettingId);
 
 
     void deleteByRankSettingId(Integer memberRankSettingId);
     void deleteByRankSettingId(Integer memberRankSettingId);
+
+    /**
+     * 当前功能是否被会员使用
+     * @param parentId
+     * @return
+     */
+    boolean hasPrivileges(Integer parentId);
 }
 }

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

@@ -57,7 +57,7 @@ public interface MusicGroupSchoolTermStudentCourseDetailDao extends BaseDAO<Long
      * @param musicGroupSchoolTermCourseDetailId
      * @param musicGroupSchoolTermCourseDetailId
      * @return
      * @return
      */
      */
-    boolean checkNoCourse(Integer musicGroupSchoolTermCourseDetailId);
+    String getNoCourseStudentName(Integer musicGroupSchoolTermCourseDetailId);
 
 
     /**
     /**
      * 更新学员排课时长
      * 更新学员排课时长

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

@@ -293,6 +293,14 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<Integer> queryNormalUser(String musicGroupId);
     List<Integer> queryNormalUser(String musicGroupId);
 
 
     /**
     /**
+     * 获取乐团在读人数
+     *
+     * @param musicGroupId
+     * @return
+     */
+    List<Integer> queryNormalUserList(String musicGroupId);
+
+    /**
      * 获取学员基本信息
      * 获取学员基本信息
      *
      *
      * @param mobile
      * @param mobile
@@ -610,9 +618,17 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     int countPayAndCheckNum(@Param("musicGroupId") String musicGroupId);
     int countPayAndCheckNum(@Param("musicGroupId") String musicGroupId);
 
 
     /**
     /**
-     * 是否所有的学员都在班
+     * 获取不在班的学员列表
      * @param musicGroupId
      * @param musicGroupId
      * @return
      * @return
      */
      */
-    boolean checkHasNotClass(@Param("musicGroupId") String musicGroupId);
+    String getNotClassName(@Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 是否有其他会员收费团
+     * @param musicGroupId
+     * @param userId
+     * @return
+     */
+    boolean checkHasMemberGroup(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
 }
 }

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

@@ -0,0 +1,91 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.RandomAccessFile;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/22 0022
+ */
+public class SoundCompareHelper {
+
+    @ApiModelProperty(value = "伴奏编号")
+    private Integer musicScoreId;
+
+    @ApiModelProperty(value = "小节开始时间")
+    private double measureStartTime;
+
+    @ApiModelProperty
+    private RandomAccessFile accessFile;
+
+    @ApiModelProperty(value = "小节xml信息字典")
+    private Map<Integer, List<MusicPitchDetailDto>> measureXmlInfoMap = new HashMap<>();
+
+    @ApiModelProperty(value = "小节结束时间字典")
+    private Map<Integer, Integer> measureEndTime = new HashMap<>();
+
+    @ApiModelProperty(value = "录音音频信息")
+    private List<MusicPitchDetailDto> recordMeasurePithInfo = new ArrayList<>();
+
+    @ApiModelProperty(value = "小节分数记录")
+    private Map<String, BigDecimal> userScoreMap = new HashMap<>();
+
+    public Integer getMusicScoreId() {
+        return musicScoreId;
+    }
+
+    public void setMusicScoreId(Integer musicScoreId) {
+        this.musicScoreId = musicScoreId;
+    }
+
+    public RandomAccessFile getAccessFile() {
+        return accessFile;
+    }
+
+    public void setAccessFile(RandomAccessFile accessFile) {
+        this.accessFile = accessFile;
+    }
+
+    public double getMeasureStartTime() {
+        return measureStartTime;
+    }
+
+    public void setMeasureStartTime(double measureStartTime) {
+        this.measureStartTime = measureStartTime;
+    }
+
+    public Map<Integer, List<MusicPitchDetailDto>> getMeasureXmlInfoMap() {
+        return measureXmlInfoMap;
+    }
+
+    public void setMeasureXmlInfoMap(Map<Integer, List<MusicPitchDetailDto>> measureXmlInfoMap) {
+        this.measureXmlInfoMap = measureXmlInfoMap;
+    }
+
+    public Map<Integer, Integer> getMeasureEndTime() {
+        return measureEndTime;
+    }
+
+    public void setMeasureEndTime(Map<Integer, Integer> measureEndTime) {
+        this.measureEndTime = measureEndTime;
+    }
+
+    public List<MusicPitchDetailDto> getRecordMeasurePithInfo() {
+        return recordMeasurePithInfo;
+    }
+
+    public void setRecordMeasurePithInfo(List<MusicPitchDetailDto> recordMeasurePithInfo) {
+        this.recordMeasurePithInfo = recordMeasurePithInfo;
+    }
+
+    public Map<String, BigDecimal> getUserScoreMap() {
+        return userScoreMap;
+    }
+
+    public void setUserScoreMap(Map<String, BigDecimal> userScoreMap) {
+        this.userScoreMap = userScoreMap;
+    }
+}

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

@@ -102,6 +102,16 @@ public class StudentManageListDto {
 
 
     private String cooperationOrganName;
     private String cooperationOrganName;
 
 
+    private Integer memberRankSettingId;
+
+    public Integer getMemberRankSettingId() {
+        return memberRankSettingId;
+    }
+
+    public void setMemberRankSettingId(Integer memberRankSettingId) {
+        this.memberRankSettingId = memberRankSettingId;
+    }
+
     public Integer getCooperationOrganId() {
     public Integer getCooperationOrganId() {
         return cooperationOrganId;
         return cooperationOrganId;
     }
     }

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

@@ -74,6 +74,17 @@ public class StudentManageQueryInfo extends QueryInfo {
         this.activityCourseType = activityCourseType;
         this.activityCourseType = activityCourseType;
     }
     }
 
 
+    //是否有会员
+    private Integer hasMember;
+
+    public Integer getHasMember() {
+        return hasMember;
+    }
+
+    public void setHasMember(Integer hasMember) {
+        this.hasMember = hasMember;
+    }
+
     public Integer getCarePackage() {
     public Integer getCarePackage() {
         return carePackage;
         return carePackage;
     }
     }

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

@@ -14,4 +14,8 @@ public interface MemberPrivilegesItemService extends BaseService<Integer, Member
     PageInfo<MemberPrivilegesItem> queryItemPage(MemberPrivilegesItemQueryInfo queryInfo);
     PageInfo<MemberPrivilegesItem> queryItemPage(MemberPrivilegesItemQueryInfo queryInfo);
 
 
     List<MemberPrivilegesItem> findAllItem(MemberPrivilegesItemQueryInfo queryInfo);
     List<MemberPrivilegesItem> findAllItem(MemberPrivilegesItemQueryInfo queryInfo);
+
+    void updateItem(MemberPrivilegesItem memberPrivilegesItem);
+
+    void add(MemberPrivilegesItem memberPrivilegesItem);
 }
 }

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

@@ -136,8 +136,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     @Autowired
     private SysConfigService sysConfigService;
     private SysConfigService sysConfigService;
     @Autowired
     @Autowired
-//    private StudentDao studentDao;
-//    @Autowired
     private StudentService studentService;
     private StudentService studentService;
     @Autowired
     @Autowired
     private MusicGroupPaymentCalenderCourseSettingsService musicGroupPaymentCalenderCourseSettingsService;
     private MusicGroupPaymentCalenderCourseSettingsService musicGroupPaymentCalenderCourseSettingsService;
@@ -157,6 +155,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
     private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
     @Autowired
     @Autowired
     private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
     private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
+    @Autowired
+    private CloudTeacherOrderDao cloudTeacherOrderDao;
 
 
     @Override
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -1187,8 +1187,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         }
 
 
         Date date = new Date();
         Date date = new Date();
-        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
-        List<CourseScheduleStudentPayment> totalCourseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
 
 
         // 计算单价
         // 计算单价
         Map<CourseScheduleType, BigDecimal> unitPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
         Map<CourseScheduleType, BigDecimal> unitPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
@@ -1230,6 +1228,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         BigDecimal originUnitPrice = new BigDecimal(0);
         BigDecimal originUnitPrice = new BigDecimal(0);
         CourseScheduleType courseType = null;
         CourseScheduleType courseType = null;
         for (ClassGroup classGroup : classGroupList) {
         for (ClassGroup classGroup : classGroupList) {
+            List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
+            List<CourseScheduleStudentPayment> totalCourseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
+
             if(HIGH_ONLINE.equals(classGroup.getType())){
             if(HIGH_ONLINE.equals(classGroup.getType())){
                 Integer studentNum = classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId());
                 Integer studentNum = classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId());
                 if(Objects.nonNull(studentNum)&&studentNum>=6){
                 if(Objects.nonNull(studentNum)&&studentNum>=6){
@@ -1315,6 +1316,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                             List<CourseScheduleType> list = new ArrayList<CourseSchedule.CourseScheduleType>();
                             List<CourseScheduleType> list = new ArrayList<CourseSchedule.CourseScheduleType>();
                             for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
                             for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
                                 courseType = courseScheduleStudentPayment.getCourseSchedule().getType();
                                 courseType = courseScheduleStudentPayment.getCourseSchedule().getType();
+                                if(totalCurrentPriceMap.get(courseType) == null){
+                                    throw new BizException("该缴费项目有新增课时:请重新编辑");
+                                }
                                 if (!list.contains(courseType)) {
                                 if (!list.contains(courseType)) {
                                     list.add(courseType);
                                     list.add(courseType);
 
 
@@ -1326,7 +1330,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                                             totalOriginPriceMap.get(courseType).subtract(totalOrignPriceMap.get(courseType))));
                                             totalOriginPriceMap.get(courseType).subtract(totalOrignPriceMap.get(courseType))));
                                 }
                                 }
                             }
                             }
-                            totalCourseScheduleStudentPayments.addAll(courseScheduleStudentPayments);
                         }
                         }
                     }else {
                     }else {
                         for (CourseSchedule courseSchedule : courseSchedules) {
                         for (CourseSchedule courseSchedule : courseSchedules) {
@@ -1351,7 +1354,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     }
                     }
                 }
                 }
             }
             }
-            if(totalCourseScheduleStudentPayments.size() > 0){
+            if(totalCourseScheduleStudentPayments.size() > 0 || courseScheduleStudentPayments.size() > 0){
+                totalCourseScheduleStudentPayments.addAll(courseScheduleStudentPayments);
                 courseScheduleStudentPaymentService.batchInsert(totalCourseScheduleStudentPayments);
                 courseScheduleStudentPaymentService.batchInsert(totalCourseScheduleStudentPayments);
                 studentService.updateStudentServiceTag(studentId, null, YesOrNoEnum.YES.getCode());
                 studentService.updateStudentServiceTag(studentId, null, YesOrNoEnum.YES.getCode());
             }
             }
@@ -2623,8 +2627,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     public void confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
     public void confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
         MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
         MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
         //校验所有学员的课时都有消耗
         //校验所有学员的课时都有消耗
-        if(musicGroupSchoolTermStudentCourseDetailDao.checkNoCourse(musicGroupSchoolTermCourseDetailId)){
-            throw new BizException("操作失败:请确保所有学员都已排课");
+        String studentName = musicGroupSchoolTermStudentCourseDetailDao.getNoCourseStudentName(musicGroupSchoolTermCourseDetailId);
+        if(StringUtils.isNotEmpty(studentName)){
+            throw new BizException("操作失败:{} 学员未排课,请检查排课是否完整",studentName);
         }
         }
         //获取所有预排课课程列表
         //获取所有预排课课程列表
         List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
         List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
@@ -2678,12 +2683,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             teacherAttendanceDao.batchInsert(teacherAttendances);
             teacherAttendanceDao.batchInsert(teacherAttendances);
         }
         }
         imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(),MUSIC);
         imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(),MUSIC);
-        //是否是该乐团第一次会员排课
-        List<MusicGroupSchoolTermCourseDetail> termCourseDetails = musicGroupSchoolTermCourseDetailDao.findByMusicGroupId(termCourseDetail.getMusicGroupId());
-        if(termCourseDetails.size() == 1){
-            MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(termCourseDetail.getMusicGroupId());
-            studentService.batchUpdateMemberRank(studentIds,calender.getMemberRankSettingId(),PeriodEnum.MONTH,calender.getMemberValidDate());
-        }
     }
     }
 
 
     @Override
     @Override
@@ -2880,7 +2879,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     }
                     }
                     //排课开始时间不可小于预排课时间
                     //排课开始时间不可小于预排课时间
                     if(courseTimeDto.getStartDate().compareTo(schoolTermCourseDetail.getStartSchoolTerm()) < 0){
                     if(courseTimeDto.getStartDate().compareTo(schoolTermCourseDetail.getStartSchoolTerm()) < 0){
-                        throw new BizException("操作失败:排课开始时间不可小于预排课时间");
+                        throw new BizException("操作失败:排课开始时间不可小于开课日期");
                     }
                     }
 
 
                     //跳过节假日
                     //跳过节假日

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

@@ -1,10 +1,12 @@
 package com.ym.mec.biz.service.impl;
 package com.ym.mec.biz.service.impl;
 
 
 import com.ym.mec.biz.dal.dao.MemberPrivilegesItemDao;
 import com.ym.mec.biz.dal.dao.MemberPrivilegesItemDao;
+import com.ym.mec.biz.dal.dao.MemberRankPrivilegesDao;
 import com.ym.mec.biz.dal.entity.MemberPrivilegesItem;
 import com.ym.mec.biz.dal.entity.MemberPrivilegesItem;
 import com.ym.mec.biz.dal.page.MemberPrivilegesItemQueryInfo;
 import com.ym.mec.biz.dal.page.MemberPrivilegesItemQueryInfo;
 import com.ym.mec.biz.service.MemberPrivilegesItemService;
 import com.ym.mec.biz.service.MemberPrivilegesItemService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +21,8 @@ public class MemberPrivilegesItemServiceImpl extends BaseServiceImpl<Integer, Me
 	
 	
 	@Autowired
 	@Autowired
 	private MemberPrivilegesItemDao memberPrivilegesItemDao;
 	private MemberPrivilegesItemDao memberPrivilegesItemDao;
+	@Autowired
+	private MemberRankPrivilegesDao memberRankPrivilegesDao;
 
 
 	@Override
 	@Override
 	public BaseDAO<Integer, MemberPrivilegesItem> getDAO() {
 	public BaseDAO<Integer, MemberPrivilegesItem> getDAO() {
@@ -38,17 +42,26 @@ public class MemberPrivilegesItemServiceImpl extends BaseServiceImpl<Integer, Me
 
 
     @Override
     @Override
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
-    public void recursiveDel(Integer parentId) {
-		List<MemberPrivilegesItem> memberPrivilegesItems = memberPrivilegesItemDao.findList(parentId);
+    public void recursiveDel(Integer memberPrivilegesItemId) {
+//		MemberPrivilegesItem privilegesItem = memberPrivilegesItemDao.get(memberPrivilegesItemId);
+//		Integer parentId = privilegesItem.getParentId();
+		//当前功能原有父级是否被会员使用
+//		if(memberRankPrivilegesDao.hasPrivileges(parentId)){
+//			throw new BizException("修改失败:该功能已被使用");
+//		}
+		if(memberRankPrivilegesDao.hasPrivileges(memberPrivilegesItemId)){
+			throw new BizException("删除失败:该功能已被使用");
+		}
+		List<MemberPrivilegesItem> memberPrivilegesItems = memberPrivilegesItemDao.findList(memberPrivilegesItemId);
 		for (MemberPrivilegesItem item : memberPrivilegesItems) {
 		for (MemberPrivilegesItem item : memberPrivilegesItems) {
 			item = getTree(item);
 			item = getTree(item);
 		}
 		}
 		List<Integer> collect = memberPrivilegesItems.stream().map(e -> e.getId()).collect(Collectors.toList());
 		List<Integer> collect = memberPrivilegesItems.stream().map(e -> e.getId()).collect(Collectors.toList());
 		if(collect == null || collect.size() <= 0){
 		if(collect == null || collect.size() <= 0){
-			memberPrivilegesItemDao.delete(parentId);
+			memberPrivilegesItemDao.delete(memberPrivilegesItemId);
 			return;
 			return;
 		}
 		}
-		collect.add(parentId);
+		collect.add(memberPrivilegesItemId);
 		memberPrivilegesItemDao.batchDel(collect);
 		memberPrivilegesItemDao.batchDel(collect);
     }
     }
 
 
@@ -76,4 +89,39 @@ public class MemberPrivilegesItemServiceImpl extends BaseServiceImpl<Integer, Me
 		}
 		}
 		return rows;
 		return rows;
 	}
 	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateItem(MemberPrivilegesItem memberPrivilegesItem) {
+		List<MemberPrivilegesItem> itemList = memberPrivilegesItemDao.findList(memberPrivilegesItem.getParentId());
+		if(itemList.size() == 0){
+			if(memberRankPrivilegesDao.hasPrivileges(memberPrivilegesItem.getParentId())){
+				throw new BizException("修改失败:被关联的子集不能被添加子功能");
+			}
+		}
+//		MemberPrivilegesItem privilegesItem = memberPrivilegesItemDao.get(memberPrivilegesItem.getId());
+//		Integer parentId = memberPrivilegesItem.getParentId();
+//		if(privilegesItem.getParentId() != parentId){
+			//当前功能原有父级是否被会员使用
+//			if(memberRankPrivilegesDao.hasPrivileges(parentId)){
+//				throw new BizException("修改失败:该功能已被使用");
+//			}
+//		}
+		if(memberRankPrivilegesDao.hasPrivileges(memberPrivilegesItem.getId())){
+			throw new BizException("修改失败:被关联的功能不能修改");
+		}
+		memberPrivilegesItemDao.update(memberPrivilegesItem);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void add(MemberPrivilegesItem memberPrivilegesItem) {
+		List<MemberPrivilegesItem> itemList = memberPrivilegesItemDao.findList(memberPrivilegesItem.getParentId());
+		if(itemList.size() == 0){
+			if(memberRankPrivilegesDao.hasPrivileges(memberPrivilegesItem.getParentId())){
+				throw new BizException("修改失败:被关联的子集不能被添加子功能");
+			}
+		}
+		memberPrivilegesItemDao.insert(memberPrivilegesItem);
+	}
 }
 }

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

@@ -40,14 +40,16 @@ public class MemberRankPrivilegesServiceImpl extends BaseServiceImpl<Integer, Me
 		Map<Integer, MemberPrivilegesItem> map = new HashMap<Integer, MemberPrivilegesItem>();
 		Map<Integer, MemberPrivilegesItem> map = new HashMap<Integer, MemberPrivilegesItem>();
 
 
 		for (MemberPrivilegesItem item : memberPrivilegesItemList) {
 		for (MemberPrivilegesItem item : memberPrivilegesItemList) {
-
-			MemberPrivilegesItem memberPrivilegesItem = queryParentBysubId(item);
-
-			if (map.containsKey(memberPrivilegesItem.getId())) {
-
-				memberPrivilegesItem = addSubItemToParent(map.get(memberPrivilegesItem.getId()), memberPrivilegesItem);
+			
+			if(!map.containsKey(item.getId())){
+				MemberPrivilegesItem memberPrivilegesItem = queryParentBysubId(item);
+				
+				if (map.containsKey(memberPrivilegesItem.getId())) {
+
+					memberPrivilegesItem = addSubItemToParent(map.get(memberPrivilegesItem.getId()), item);
+				}
+				map.put(memberPrivilegesItem.getId(), memberPrivilegesItem);
 			}
 			}
-			map.put(memberPrivilegesItem.getId(), memberPrivilegesItem);
 		}
 		}
 
 
 		return map.values().stream().collect(Collectors.toList());
 		return map.values().stream().collect(Collectors.toList());

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

@@ -23,6 +23,7 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 
 
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.formula.functions.T;
 import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -70,6 +71,8 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 	private GroupEventSource groupEventSource;
 	private GroupEventSource groupEventSource;
 	@Autowired
 	@Autowired
 	private StudentService studentService;
 	private StudentService studentService;
+	@Autowired
+	private CloudTeacherOrderDao cloudTeacherOrderDao;
 
 
 	@Override
 	@Override
 	public BaseDAO<Long, MusicGroupPaymentCalenderDetail> getDAO() {
 	public BaseDAO<Long, MusicGroupPaymentCalenderDetail> getDAO() {
@@ -89,6 +92,7 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		}
 		}
 		Date date = new Date();
 		Date date = new Date();
 		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.get(calenderDetails.get(0).getMusicGroupPaymentCalenderId());
 		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.get(calenderDetails.get(0).getMusicGroupPaymentCalenderId());
+		MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 		//缴费项目已结束,并且没有单独开启缴费的学员,不能修改缴费金额
 		//缴费项目已结束,并且没有单独开启缴费的学员,不能修改缴费金额
 //		if(calender.getStatus() == OVER){
 //		if(calender.getStatus() == OVER){
 //			List<MusicGroupPaymentCalenderDetail> paymentCalenderDetails = calenderDetails.stream().filter(e -> e.getOpenFlag() == YesOrNoEnum.NO).collect(Collectors.toList());
 //			List<MusicGroupPaymentCalenderDetail> paymentCalenderDetails = calenderDetails.stream().filter(e -> e.getOpenFlag() == YesOrNoEnum.NO).collect(Collectors.toList());
@@ -111,7 +115,17 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 			}else {
 			}else {
 				// 添加会员有效时长
 				// 添加会员有效时长
 				if(calender.getMemberRankSettingId() != null){
 				if(calender.getMemberRankSettingId() != null){
-					studentService.updateMemberRank(e.getUserId(),calender.getMemberRankSettingId(),PeriodEnum.MONTH,6);
+					CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
+					cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
+					cloudTeacherOrder.setType(2);
+					cloudTeacherOrder.setTime(calender.getMemberValidDate());
+					cloudTeacherOrder.setAmount(expectAmount);
+					cloudTeacherOrder.setStatus(2);
+					cloudTeacherOrder.setStartTime(date);
+					cloudTeacherOrder.setEndTime(DateUtil.addMonths(date,calender.getMemberValidDate()));
+					cloudTeacherOrder.setRemark("进行中乐团加学生,缴费金额改为0元");
+					cloudTeacherOrderDao.insert(cloudTeacherOrder);
+					studentService.updateMemberRank(e.getUserId(),calender.getMemberRankSettingId(),PeriodEnum.MONTH,calender.getMemberValidDate());
 				}
 				}
 				calender.setActualNum((calender.getActualNum()==null?0:calender.getActualNum()) + 1);
 				calender.setActualNum((calender.getActualNum()==null?0:calender.getActualNum()) + 1);
 				e.setPaymentStatus(PAID_COMPLETED);
 				e.setPaymentStatus(PAID_COMPLETED);
@@ -139,12 +153,10 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
 		musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
 		//推送消息
 		//推送消息
 		if (calender.getPayUserType() == STUDENT && studentIds.size() > 0) {
 		if (calender.getPayUserType() == STUDENT && studentIds.size() > 0) {
-			String musicGroupId = calenderDetails.get(0).getMusicGroupId();
 			Map<Integer, String> push = new HashMap<>();
 			Map<Integer, String> push = new HashMap<>();
 			for (Integer userId : studentIds) {
 			for (Integer userId : studentIds) {
 				push.put(userId, userId + "");
 				push.put(userId, userId + "");
 			}
 			}
-			MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
 			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
 			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
 			String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId="+calender.getId()+"&id=" + calender.getMusicGroupId();
 			String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId="+calender.getId()+"&id=" + calender.getMusicGroupId();
 			// 发送续费通知
 			// 发送续费通知
@@ -507,10 +519,6 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 				musicGroupPaymentCalenderDetail.setCreateTime(date);
 				musicGroupPaymentCalenderDetail.setCreateTime(date);
 				musicGroupPaymentCalenderDetail.setExpectAmount(totalPrice);
 				musicGroupPaymentCalenderDetail.setExpectAmount(totalPrice);
 				if (musicGroupPaymentCalenderDetail.getExpectAmount().compareTo(new BigDecimal(0)) == 0) {
 				if (musicGroupPaymentCalenderDetail.getExpectAmount().compareTo(new BigDecimal(0)) == 0) {
-					// 添加会员有效时长
-					if(musicGroupPaymentCalender.getMemberRankSettingId() != null){
-						studentService.updateMemberRank(studentId,musicGroupPaymentCalender.getMemberRankSettingId(),PeriodEnum.MONTH,6);
-					}
 					musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
 					musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
 					paymentNum++;
 					paymentNum++;
 				} else {
 				} else {

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

@@ -76,6 +76,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
 
 	@Autowired
 	@Autowired
 	private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
 	private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
+
+	@Autowired
+	private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
 	
 	
 	@Autowired
 	@Autowired
 	private IdGeneratorService idGeneratorService;
 	private IdGeneratorService idGeneratorService;
@@ -129,6 +132,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	private MemberRankSettingDao memberRankSettingDao;
 	private MemberRankSettingDao memberRankSettingDao;
 	@Autowired
 	@Autowired
 	private StudentService studentService;
 	private StudentService studentService;
+	@Autowired
+	private CloudTeacherOrderDao cloudTeacherOrderDao;
 
 
 	@Override
 	@Override
 	public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
 	public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
@@ -162,6 +167,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		if (paymentType == PaymentType.ADD_STUDENT) {
 		if (paymentType == PaymentType.ADD_STUDENT) {
 			//获取缴费状态在审核中或者已拒绝的缴费项目的学员
 			//获取缴费状态在审核中或者已拒绝的缴费项目的学员
 			Integer userId = Integer.parseInt(musicGroupPaymentCalenderDto.getStudentIds());
 			Integer userId = Integer.parseInt(musicGroupPaymentCalenderDto.getStudentIds());
+			//该学员是否在其他的会员团
+			boolean hasMemberGroup = studentRegistrationDao.checkHasMemberGroup(musicGroupId,userId);
+			if(hasMemberGroup){
+				throw new BizException("操作失败:该学员已在其他系统收费团");
+			}
 			String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId,null);
 			String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId,null);
 			if(StringUtils.isNotEmpty(studentIds)){
 			if(StringUtils.isNotEmpty(studentIds)){
 				if(studentIds.contains(userId.toString())){
 				if(studentIds.contains(userId.toString())){
@@ -531,6 +541,10 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettings(id);
 		List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettings(id);
 		Map<String, Object> result = new HashMap<>(4);
 		Map<String, Object> result = new HashMap<>(4);
 		result.put("musicGroupPaymentCalenderCourseSettings", musicGroupPaymentCalenderCourseSettings);
 		result.put("musicGroupPaymentCalenderCourseSettings", musicGroupPaymentCalenderCourseSettings);
+		if(calender.getMemberRankSettingId() != null){
+			MemberRankSetting memberRankSetting = memberRankSettingDao.get(calender.getMemberRankSettingId());
+			calender.setMemberRankSettingName(memberRankSetting.getName());
+		}
 		result.put("calender", calender);
 		result.put("calender", calender);
 		result.put("calenderSettingsName", name);
 		result.put("calenderSettingsName", name);
 		result.put("sumActualAmount", sumActualAmount);
 		result.put("sumActualAmount", sumActualAmount);
@@ -958,11 +972,26 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 					totalPrice = totalPrice.add(musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice());
 					totalPrice = totalPrice.add(musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice());
 				}
 				}
 			}
 			}
+			//当前乐团是否有预排课计划
+			MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroup.getId(), null, 0);
 
 
 			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<MusicGroupPaymentStudentCourseDetail>();
 			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<MusicGroupPaymentStudentCourseDetail>();
 			MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
 			MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
 
 
 			for (String studentId : studentIdStr.split(",")) {
 			for (String studentId : studentIdStr.split(",")) {
+				if(termCourseDetail != null){
+					//是否已经预排部分课程
+					List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(musicGroup.getId());
+					if(courseSchedules.size() > 0){
+						throw new BizException("操作失败:该乐团存在预排课课程,请优先完成预排课");
+					}else {
+						MusicGroupSchoolTermStudentCourseDetail studentCourseDetail = new MusicGroupSchoolTermStudentCourseDetail();
+						studentCourseDetail.setMusicGroupSchoolTermCourseDetailId(termCourseDetail.getId());
+						studentCourseDetail.setUserId(Integer.parseInt(studentId));
+						studentCourseDetail.setMemberCourseMinutes(termCourseDetail.getTotalCourseTime());
+						musicGroupSchoolTermStudentCourseDetailDao.insert(studentCourseDetail);
+					}
+				}
 				// 学生加到calenderDetail
 				// 学生加到calenderDetail
 				MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
 				MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
 				musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
 				musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
@@ -979,7 +1008,17 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				if(totalPrice.doubleValue() == 0d){
 				if(totalPrice.doubleValue() == 0d){
 					// 添加会员有效时长
 					// 添加会员有效时长
 					if(musicGroupPaymentCalender.getMemberRankSettingId() != null){
 					if(musicGroupPaymentCalender.getMemberRankSettingId() != null){
-						studentService.updateMemberRank(Integer.parseInt(studentId),musicGroupPaymentCalender.getMemberRankSettingId(),PeriodEnum.MONTH,6);
+						CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
+						cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
+						cloudTeacherOrder.setType(2);
+						cloudTeacherOrder.setTime(musicGroupPaymentCalender.getMemberValidDate());
+						cloudTeacherOrder.setAmount(totalPrice);
+						cloudTeacherOrder.setStatus(2);
+						cloudTeacherOrder.setStartTime(date);
+						cloudTeacherOrder.setEndTime(DateUtil.addMonths(date,musicGroupPaymentCalender.getMemberValidDate()));
+						cloudTeacherOrder.setRemark("进行中乐团0元加学生");
+						cloudTeacherOrderDao.insert(cloudTeacherOrder);
+						studentService.updateMemberRank(Integer.parseInt(studentId),musicGroupPaymentCalender.getMemberRankSettingId(),PeriodEnum.MONTH,musicGroupPaymentCalender.getMemberValidDate());
 					}
 					}
 					MusicGroupStudentFee musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(Integer.parseInt(studentId), musicGroupPaymentCalender.getMusicGroupId());
 					MusicGroupStudentFee musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(Integer.parseInt(studentId), musicGroupPaymentCalender.getMusicGroupId());
 					if (musicGroupStudentFee != null) {
 					if (musicGroupStudentFee != null) {

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

@@ -13,6 +13,7 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -59,11 +60,12 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 			throw new BizException("操作失败:该功能只适用于系统收费团");
 			throw new BizException("操作失败:该功能只适用于系统收费团");
 		}
 		}
 		//校验当前乐团是否所有学员都在班
 		//校验当前乐团是否所有学员都在班
-		if(studentRegistrationDao.checkHasNotClass(musicGroupId)){
-			throw new BizException("操作失败:请确保所有在读学员都在班级");
+		String notClassName = studentRegistrationDao.getNotClassName(musicGroupId);
+		if(StringUtils.isNotEmpty(notClassName)){
+			throw new BizException("操作失败:{} 学员未在任何班级",notClassName);
 		}
 		}
 		MusicGroupSchoolTermCourseDetail courseDetail = musicGroupSchoolTermCourseDetailDao.
 		MusicGroupSchoolTermCourseDetail courseDetail = musicGroupSchoolTermCourseDetailDao.
-				findByCourseDateAndMusicGroupId(musicGroupId,startCourseDate,0);
+				findByCourseDateAndMusicGroupId(musicGroupId,null,0);
 		Date date = DateUtil.stringToDate(DateUtil.format(new Date(),DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT);
 		Date date = DateUtil.stringToDate(DateUtil.format(new Date(),DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT);
 		if(startCourseDate != null){
 		if(startCourseDate != null){
 			MusicGroupSchoolTermCourseDetail courseDetail1 = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId,startCourseDate,1);
 			MusicGroupSchoolTermCourseDetail courseDetail1 = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId,startCourseDate,1);
@@ -95,7 +97,7 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 						studentCourseDetail.setMusicGroupSchoolTermCourseDetailId(courseDetail.getId());
 						studentCourseDetail.setMusicGroupSchoolTermCourseDetailId(courseDetail.getId());
 						studentCourseDetail.setMemberCourseMinutes(courseDetail.getTotalCourseTime());
 						studentCourseDetail.setMemberCourseMinutes(courseDetail.getTotalCourseTime());
 						//获取乐团所有在读学员
 						//获取乐团所有在读学员
-						List<Integer> studentIds = studentRegistrationDao.queryNormalUser(musicGroupId);
+						List<Integer> studentIds = studentRegistrationDao.queryNormalUserList(musicGroupId);
 						if(studentIds == null || studentIds.size() == 0){
 						if(studentIds == null || studentIds.size() == 0){
 							throw new BizException("操作失败:该乐团没有在读学员");
 							throw new BizException("操作失败:该乐团没有在读学员");
 						}
 						}
@@ -138,11 +140,11 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 		//一个学期默认为6个月,9月1日—2月28、29日,3月1日—8月31日
 		//一个学期默认为6个月,9月1日—2月28、29日,3月1日—8月31日
 		Integer month = Integer.parseInt(DateUtil.getMonth(startCourseDate));
 		Integer month = Integer.parseInt(DateUtil.getMonth(startCourseDate));
 		String year = DateUtil.getYear(startCourseDate);
 		String year = DateUtil.getYear(startCourseDate);
-		if(month >= 9 && month <= 2){
+		if(month >= 9 || month <= 2){
 			if(month >= 9){
 			if(month >= 9){
 				year = DateUtil.getYear(DateUtil.addYears(startCourseDate, 1));
 				year = DateUtil.getYear(DateUtil.addYears(startCourseDate, 1));
 			}
 			}
-			courseDetail.setEndSchoolTerm(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(year + "-02-01")));
+			courseDetail.setEndSchoolTerm(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(year + "-02-01 00:00:00")));
 		}else {
 		}else {
 			courseDetail.setEndSchoolTerm(DateUtil.stringToDate(year + "-08-31 00:00:00"));
 			courseDetail.setEndSchoolTerm(DateUtil.stringToDate(year + "-08-31 00:00:00"));
 		}
 		}
@@ -151,7 +153,8 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 //		int week = LocalDateTime.ofInstant(startCourseDate.toInstant(),DateUtil.zoneId).getDayOfWeek().getValue();
 //		int week = LocalDateTime.ofInstant(startCourseDate.toInstant(),DateUtil.zoneId).getDayOfWeek().getValue();
 		int week = DateUtil.date2Week1(startCourseDate);
 		int week = DateUtil.date2Week1(startCourseDate);
 		int weekSize = DateUtil.getWeekDays(startCourseDate, courseDetail.getEndSchoolTerm(), week).size();
 		int weekSize = DateUtil.getWeekDays(startCourseDate, courseDetail.getEndSchoolTerm(), week).size();
-		courseDetail.setTotalCourseTime(weekSize * 4 * 45);
+		int i = weekSize * 4 * 45;
+		courseDetail.setTotalCourseTime(i > 3960?3960:i);
 		courseDetail.setStartCourseDate(startCourseDate);
 		courseDetail.setStartCourseDate(startCourseDate);
 		return courseDetail;
 		return courseDetail;
 	}
 	}

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

@@ -16,6 +16,7 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
@@ -696,8 +697,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
 
         //云教练/云教练+
         //云教练/云教练+
         if (registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) {
         if (registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) {
-            OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
-            BigDecimal cloudTeacherPrice = registerPayDto.getBuyCloudTeacher() ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
+            MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(studentRegistration.getMusicGroupId());
+            if(musicGroupRegCalender == null){
+            	throw new BizException("缴费信息不存在");
+            }
+            BigDecimal cloudTeacherPrice = musicGroupRegCalender.getMemberPaymentAmount();
+            //OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
+            //BigDecimal cloudTeacherPrice = registerPayDto.getBuyCloudTeacher() ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
+            
             orderAmount = orderAmount.add(cloudTeacherPrice);
             orderAmount = orderAmount.add(cloudTeacherPrice);
             studentRegistration.setHasCloudTeacher(1);
             studentRegistration.setHasCloudTeacher(1);
         }
         }
@@ -889,8 +896,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
 
         //云教练/云教练+
         //云教练/云教练+
         if (registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) {
         if (registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) {
-            OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
-            BigDecimal cloudTeacherPrice = registerPayDto.getBuyCloudTeacher() ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
+        	
+        	MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(studentRegistration.getMusicGroupId());
+            if(musicGroupRegCalender == null){
+            	throw new BizException("缴费信息不存在");
+            }
+            BigDecimal cloudTeacherPrice = musicGroupRegCalender.getMemberPaymentAmount();
+            //OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
+            //BigDecimal cloudTeacherPrice = registerPayDto.getBuyCloudTeacher() ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
+            
             orderAmount = orderAmount.add(cloudTeacherPrice);
             orderAmount = orderAmount.add(cloudTeacherPrice);
             studentRegistration.setHasCloudTeacher(1);
             studentRegistration.setHasCloudTeacher(1);
         }
         }
@@ -1986,9 +2000,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         //如果是会员团,并且有预排课计划
         //如果是会员团,并且有预排课计划
         MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null, 0);
         MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null, 0);
         if(termCourseDetail != null){
         if(termCourseDetail != null){
-            MusicGroupSchoolTermStudentCourseDetailDao studentCourseDetailDao = musicGroupSchoolTermStudentCourseDetailDao.findByDetailIdAndStudentId(termCourseDetail.getId(),userId);
-            if(studentCourseDetailDao != null){
-                throw new BizException("退团失败:该学员存在预排课安排,请先取消预排课");
+            //是否已经预排部分课程
+            List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(musicGroup.getId());
+            if(courseSchedules.size() > 0){
+                throw new BizException("退团失败:该乐团存在预排课课程,请优先完成预排课");
+            }else {
+                musicGroupSchoolTermStudentCourseDetailDao.deleteByDetailId(termCourseDetail.getId(),userId);
             }
             }
         }
         }
 
 

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

@@ -133,9 +133,9 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
         musicGroupSubjectGoodsAndInfo.setMusicGroupSubjectGoodsGroupList(goodsGroups);
         musicGroupSubjectGoodsAndInfo.setMusicGroupSubjectGoodsGroupList(goodsGroups);
         musicGroupSubjectGoodsAndInfo.setMusicGroup(musicGroup);
         musicGroupSubjectGoodsAndInfo.setMusicGroup(musicGroup);
         if (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.MEMBER_FEE)) {
         if (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.MEMBER_FEE)) {
-            OrganizationCloudTeacherFee cloudTeacherFee = organizationCloudTeacherFeeDao.getByOrganId(musicGroup.getOrganId());
-            musicGroupSubjectGoodsAndInfo.setCloudTeacherFee(cloudTeacherFee.getPrice());
-            musicGroupSubjectGoodsAndInfo.setCloudTeacherPlusFee(cloudTeacherFee.getPlusPrice());
+        	musicGroupSubjectGoodsAndInfo.setCloudTeacherFee(musicGroupRegCalender.getMemberPaymentAmount());
+            /*OrganizationCloudTeacherFee cloudTeacherFee = organizationCloudTeacherFeeDao.getByOrganId(musicGroup.getOrganId());
+            musicGroupSubjectGoodsAndInfo.setCloudTeacherPlusFee(cloudTeacherFee.getPlusPrice());*/
             if(musicGroupRegCalender != null) {
             if(musicGroupRegCalender != null) {
             	musicGroupSubjectGoodsAndInfo.setMemberPrivilegesItemList(memberRankPrivilegesService.queryByMemberRankId(musicGroupRegCalender.getMemberRankSettingId()));
             	musicGroupSubjectGoodsAndInfo.setMemberPrivilegesItemList(memberRankPrivilegesService.queryByMemberRankId(musicGroupRegCalender.getMemberRankSettingId()));
             }
             }

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

@@ -9,10 +9,7 @@ import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.StudentCourseHomeworkService;
-import com.ym.mec.biz.service.StudentServeService;
-import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
@@ -505,6 +502,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         int count = musicGroupDao.queryCount(params);
         int count = musicGroupDao.queryCount(params);
         pageInfo.setTotal(count);
         pageInfo.setTotal(count);
         params.put("offset", pageInfo.getOffset());
         params.put("offset", pageInfo.getOffset());
+//        StudentService
         List<MusicGroup> musicGroups = musicGroupDao.queryPage(params);
         List<MusicGroup> musicGroups = musicGroupDao.queryPage(params);
 
 
         List<EduHomeworkStatDto> dataList = new ArrayList<>();
         List<EduHomeworkStatDto> dataList = new ArrayList<>();

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

@@ -8,6 +8,7 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
+
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 
 
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dao.*;
@@ -17,6 +18,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
 import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
 import com.ym.mec.biz.dal.page.RegistrationOrPreQueryInfo;
 import com.ym.mec.biz.dal.page.RegistrationOrPreQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.biz.service.*;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
@@ -26,6 +28,7 @@ import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.CollectionUtils;
+
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUser;
@@ -480,8 +483,15 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
         }
         //云教练/云教练+
         //云教练/云教练+
         if (buyCloudTeacher || buyCloudTeacherPlus) {
         if (buyCloudTeacher || buyCloudTeacherPlus) {
-            OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
-            BigDecimal cloudTeacherPrice = buyCloudTeacher ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
+            // OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
+            // BigDecimal cloudTeacherPrice = buyCloudTeacher ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
+            
+            MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(studentRegistration.getMusicGroupId());
+            if(musicGroupRegCalender == null){
+            	throw new BizException("缴费信息不存在");
+            }
+            BigDecimal cloudTeacherPrice = musicGroupRegCalender.getMemberPaymentAmount();
+            
             OrderDetailTypeEnum orderDetailTypeEnum = buyCloudTeacher ? OrderDetailTypeEnum.CLOUD_TEACHER : OrderDetailTypeEnum.CLOUD_TEACHER_PLUS;
             OrderDetailTypeEnum orderDetailTypeEnum = buyCloudTeacher ? OrderDetailTypeEnum.CLOUD_TEACHER : OrderDetailTypeEnum.CLOUD_TEACHER_PLUS;
             StudentPaymentOrderDetail cloudTeacherOrderDetail = new StudentPaymentOrderDetail();
             StudentPaymentOrderDetail cloudTeacherOrderDetail = new StudentPaymentOrderDetail();
             cloudTeacherOrderDetail.setType(orderDetailTypeEnum);
             cloudTeacherOrderDetail.setType(orderDetailTypeEnum);
@@ -504,9 +514,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanService.getMusicOneSubjectClassPlan(studentRegistration.getMusicGroupId(), studentRegistration.getActualSubjectId());
         MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanService.getMusicOneSubjectClassPlan(studentRegistration.getMusicGroupId(), studentRegistration.getActualSubjectId());
         int paidNum = musicOneSubjectClassPlan.getPaidStudentNum() == null ? 0 : musicOneSubjectClassPlan.getPaidStudentNum();
         int paidNum = musicOneSubjectClassPlan.getPaidStudentNum() == null ? 0 : musicOneSubjectClassPlan.getPaidStudentNum();
         int paidZeroNum = musicOneSubjectClassPlan.getPaidZeroNum() == null ? 0 : musicOneSubjectClassPlan.getPaidZeroNum();
         int paidZeroNum = musicOneSubjectClassPlan.getPaidZeroNum() == null ? 0 : musicOneSubjectClassPlan.getPaidZeroNum();
-        if ((musicGroup.getCourseViewType().equals(CourseViewTypeEnum.MEMBER_FEE) && !buyCloudTeacher) ||
-                (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.MEMBER_FEE) && !buyCloudTeacherPlus)
-        ) {
+        if ((musicGroup.getCourseViewType().equals(CourseViewTypeEnum.MEMBER_FEE) && !buyCloudTeacher))
+        {
             paidZeroFlag = true;
             paidZeroFlag = true;
             if (studentRegistration.getNoneNeedCloudTeacher().equals(1)) {
             if (studentRegistration.getNoneNeedCloudTeacher().equals(1)) {
                 musicOneSubjectClassPlan.setPaidZeroNum(paidZeroNum + 1);
                 musicOneSubjectClassPlan.setPaidZeroNum(paidZeroNum + 1);
@@ -713,6 +722,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 sysUser.setImToken(register.getToken());
                 sysUser.setImToken(register.getToken());
                 teacherDao.updateUser(sysUser);
                 teacherDao.updateUser(sysUser);
             } else {
             } else {
+                boolean hasMemberGroup = studentRegistrationDao.checkHasMemberGroup(musicGroupId, sysUser.getId());
+                if(hasMemberGroup){
+                    throw new BizException("操作失败:该学员已在其他系统收费团");
+                }
                 StudentRegistration oldReg = studentRegistrationDao.getByUserIdAndMusicGroupId(musicGroupId, sysUser.getId());
                 StudentRegistration oldReg = studentRegistrationDao.getByUserIdAndMusicGroupId(musicGroupId, sysUser.getId());
                 if (oldReg != null && oldReg.getMusicGroupStatus() != StudentMusicGroupStatusEnum.QUIT && oldReg.getMusicGroupStatus() != StudentMusicGroupStatusEnum.APPLY) {
                 if (oldReg != null && oldReg.getMusicGroupStatus() != StudentMusicGroupStatusEnum.QUIT && oldReg.getMusicGroupStatus() != StudentMusicGroupStatusEnum.APPLY) {
                     throw new BizException("该学员已存在,原手机号为" + oldReg.getParentsPhone());
                     throw new BizException("该学员已存在,原手机号为" + oldReg.getParentsPhone());

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

@@ -60,4 +60,7 @@
 	<select id="findByRankSettingId" resultMap="MemberRankPrivileges">
 	<select id="findByRankSettingId" resultMap="MemberRankPrivileges">
 		SELECT * FROM member_rank_privileges WHERE member_rank_id_ = #{memberRankSettingId}
 		SELECT * FROM member_rank_privileges WHERE member_rank_id_ = #{memberRankSettingId}
 	</select>
 	</select>
+    <select id="hasPrivileges" resultType="java.lang.Boolean">
+		SELECT COUNT(member_privileges_id_) > 0 FROM member_rank_privileges WHERE member_privileges_id_ = #{parentId}
+	</select>
 </mapper>
 </mapper>

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

@@ -133,8 +133,8 @@
 
 
 	<select id="getMusicGroupRegCalenderCourseSettings" resultMap="MusicGroupPaymentCalenderCourseSettings">
 	<select id="getMusicGroupRegCalenderCourseSettings" resultMap="MusicGroupPaymentCalenderCourseSettings">
 		SELECT mgpccs.*
 		SELECT mgpccs.*
-		FROM music_group_payment_calender mgpc
-		LEFT JOIN music_group_payment_calender_course_settings mgpccs
+		FROM music_group_payment_calender_course_settings mgpccs 
+		LEFT JOIN music_group_payment_calender mgpc
 		ON mgpccs.music_group_payment_calender_id_ = mgpc.id_
 		ON mgpccs.music_group_payment_calender_id_ = mgpc.id_
 		WHERE mgpc.music_group_id_ = #{musicGroupId}
 		WHERE mgpc.music_group_id_ = #{musicGroupId}
 		AND mgpc.payment_type_ = 'MUSIC_APPLY'
 		AND mgpc.payment_type_ = 'MUSIC_APPLY'

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

@@ -82,7 +82,7 @@
 		SELECT * FROM music_group_school_term_course_detail
 		SELECT * FROM music_group_school_term_course_detail
 		WHERE music_group_id_ = #{musicGroupId}
 		WHERE music_group_id_ = #{musicGroupId}
 		<if test="startCourseDate != null">
 		<if test="startCourseDate != null">
-		  AND (#{startCourseDate} >= start_school_term_ OR #{startCourseDate} &lt;= end_school_term_)
+			AND (#{startCourseDate} BETWEEN start_school_term_ AND end_school_term_)
 		</if>
 		</if>
 		<if test="courseFlag != null">
 		<if test="courseFlag != null">
 			AND course_flag_ = #{courseFlag}
 			AND course_flag_ = #{courseFlag}

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

@@ -141,8 +141,12 @@
 		</foreach>
 		</foreach>
 		GROUP BY music_group_school_term_course_detail_id_
 		GROUP BY music_group_school_term_course_detail_id_
 	</select>
 	</select>
-	<select id="checkNoCourse" resultType="java.lang.Boolean">
-		SELECT COUNT(id_) > 0 FROM music_group_school_term_student_course_detail WHERE music_group_school_term_course_detail_id_ = #{musicGroupSchoolTermCourseDetailId} AND pre_member_course_minutes_ = 0
+	<select id="getNoCourseStudentName" resultType="java.lang.String">
+		SELECT COUNT(id_) > 0 FROM music_group_school_term_student_course_detail
+		WHERE music_group_school_term_course_detail_id_ = #{musicGroupSchoolTermCourseDetailId} AND pre_member_course_minutes_ = 0
+		SELECT GROUP_CONCAT(DISTINCT su.username_) FROM music_group_school_term_student_course_detail mgs
+															LEFT JOIN sys_user su ON su.id_ = mgs.user_id_
+		WHERE music_group_school_term_course_detail_id_ = #{musicGroupSchoolTermCourseDetailId} AND pre_member_course_minutes_ = 0
 	</select>
 	</select>
 	<select id="findByDetailId" resultMap="MusicGroupSchoolTermStudentCourseDetail">
 	<select id="findByDetailId" resultMap="MusicGroupSchoolTermStudentCourseDetail">
 		SELECT * FROM music_group_school_term_student_course_detail WHERE music_group_school_term_course_detail_id_ = #{courseDetailId}
 		SELECT * FROM music_group_school_term_student_course_detail WHERE music_group_school_term_course_detail_id_ = #{courseDetailId}

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

@@ -66,6 +66,7 @@
         <result property="subjectIdList" column="subject_id_list_"/>
         <result property="subjectIdList" column="subject_id_list_"/>
         <result property="isNewUser" column="is_new_user_"/>
         <result property="isNewUser" column="is_new_user_"/>
         <result property="isSignedContract" column="is_signed_contract_"/>
         <result property="isSignedContract" column="is_signed_contract_"/>
+        <result property="memberRankSettingId" column="member_rank_setting_id_"/>
         <result column="care_package_" property="carePackage"/>
         <result column="care_package_" property="carePackage"/>
         <result column="come_on_package_" property="comeOnPackage"/>
         <result column="come_on_package_" property="comeOnPackage"/>
         <result column="grade_type_" property="gradeType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="grade_type_" property="gradeType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -161,7 +162,7 @@
         sut.name_ real_name_,su.`gender_` , su.organ_id_,
         sut.name_ real_name_,su.`gender_` , su.organ_id_,
 		tu.`real_name_` teacher_name_,CASE s.service_tag_ WHEN 2 THEN 0 ELSE s.service_tag_ END service_tag_ ,s.`operating_tag_` ,
 		tu.`real_name_` teacher_name_,CASE s.service_tag_ WHEN 2 THEN 0 ELSE s.service_tag_ END service_tag_ ,s.`operating_tag_` ,
         s.care_package_, s.come_on_package_, suca.`course_balance_` ,suca.balance_,
         s.care_package_, s.come_on_package_, suca.`course_balance_` ,suca.balance_,
-		sub.`name_` music_group_subject_ ,su.birthdate_,s.subject_id_list_,s.teacher_id_,s.current_grade_num_,s.current_class_,
+		sub.`name_` music_group_subject_ ,su.birthdate_,s.subject_id_list_,s.teacher_id_,s.current_grade_num_,s.current_class_,s.member_rank_setting_id_,
         CASE WHEN su.password_ IS NULL THEN FALSE ELSE TRUE END isActive_,s.is_new_user_,CASE WHEN sut.user_id_ IS NULL THEN 0 ELSE 1 END is_signed_contract_,
         CASE WHEN su.password_ IS NULL THEN FALSE ELSE TRUE END isActive_,s.is_new_user_,CASE WHEN sut.user_id_ IS NULL THEN 0 ELSE 1 END is_signed_contract_,
         s.cooperation_organ_id_,co.name_ cooperation_organ_name_
         s.cooperation_organ_id_,co.name_ cooperation_organ_name_
 		FROM `student` s LEFT JOIN `sys_user` su ON s.`user_id_` = su.`id_`
 		FROM `student` s LEFT JOIN `sys_user` su ON s.`user_id_` = su.`id_`
@@ -204,6 +205,14 @@
                     AND s.service_tag_ = 1
                     AND s.service_tag_ = 1
                 </if>
                 </if>
             </if>
             </if>
+            <if test="hasMember != null">
+                <if test="hasMember == 0">
+                    AND s.member_rank_setting_id_ IS NULL
+                </if>
+                <if test="hasMember == 1">
+                    AND s.member_rank_setting_id_ IS NOT NULL
+                </if>
+            </if>
             <if test="teacherId != null">
             <if test="teacherId != null">
                 AND s.teacher_id_ = #{teacherId}
                 AND s.teacher_id_ = #{teacherId}
             </if>
             </if>

+ 15 - 4
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -857,6 +857,12 @@
         WHERE sr.music_group_status_ != 'QUIT'
         WHERE sr.music_group_status_ != 'QUIT'
         AND sr.music_group_id_ = #{musicGroupIds}
         AND sr.music_group_id_ = #{musicGroupIds}
     </select>
     </select>
+    <select id="queryNormalUserList" resultType="integer">
+        SELECT sr.user_id_
+        FROM student_registration sr
+        WHERE sr.music_group_status_ = 'NORMAL'
+        AND sr.music_group_id_ = #{musicGroupIds}
+    </select>
     <select id="queryUserByPhone" resultMap="StudentRegistration">
     <select id="queryUserByPhone" resultMap="StudentRegistration">
         SELECT su.id_,
         SELECT su.id_,
         CASE WHEN sut.name_ IS NULL THEN su.real_name_ ELSE sut.name_ END parents_name_,
         CASE WHEN sut.name_ IS NULL THEN su.real_name_ ELSE sut.name_ END parents_name_,
@@ -1492,11 +1498,11 @@
         </if>
         </if>
         AND sr.music_group_status_ != 'QUIT'
         AND sr.music_group_status_ != 'QUIT'
     </select>
     </select>
-    <select id="checkHasNotClass" resultType="java.lang.Boolean">
-        SELECT COUNT(DISTINCT sr.user_id_) = COUNT(DISTINCT cssm.user_id_) FROM student_registration sr
-        LEFT JOIN class_group_student_mapper cssm ON sr.music_group_id_ = cssm.music_group_id_
+    <select id="getNotClassName" resultType="java.lang.String">
+        SELECT GROUP_CONCAT(DISTINCT su.username_) FROM student_registration sr
+        LEFT JOIN sys_user su ON su.id_ = sr.user_id_
         WHERE sr.music_group_id_ = #{musicGroupId} AND sr.music_group_status_ = 'NORMAL'
         WHERE sr.music_group_id_ = #{musicGroupId} AND sr.music_group_status_ = 'NORMAL'
-        GROUP BY sr.music_group_id_
+        AND sr.user_id_ NOT IN (SELECT DISTINCT user_id_ FROM class_group_student_mapper WHERE music_group_id_ = #{musicGroupId} AND group_type_ = 'MUSIC' AND status_ != 'QUIT')
     </select>
     </select>
 
 
     <!-- 获取报名相关数据 -->
     <!-- 获取报名相关数据 -->
@@ -1520,4 +1526,9 @@
           AND paying_status_ = 2
           AND paying_status_ = 2
           AND music_group_status_ = 'NORMAL'
           AND music_group_status_ = 'NORMAL'
     </select>
     </select>
+    <select id="checkHasMemberGroup" resultType="java.lang.Boolean">
+        SELECT COUNT(sr.id_) > 0 FROM student_registration sr
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        WHERE sr.music_group_id_ != #{musicGroupId} AND sr.music_group_status_ != 'QUIT' AND sr.user_id_ = #{userId} AND mg.course_view_type_ = 1
+    </select>
 </mapper>
 </mapper>

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

@@ -34,8 +34,8 @@
 	<!-- 根据主键查询一条记录 -->
 	<!-- 根据主键查询一条记录 -->
 	<select id="get" resultMap="SysMusicScoreAccompaniment" >
 	<select id="get" resultMap="SysMusicScoreAccompaniment" >
 		SELECT sesa.*,ses.name_,ses.type_,ses.url_,sesc.name_ categories_name_,sesc.id_ categories_id_,ses.client_type_
 		SELECT sesa.*,ses.name_,ses.type_,ses.url_,sesc.name_ categories_name_,sesc.id_ categories_id_,ses.client_type_
-		FROM sys_music_score_accompaniment sesa
-		LEFT JOIN sys_music_score ses ON ses.id_ = sesa.exam_song_id_
+		FROM sys_music_score ses
+		LEFT JOIN sys_music_score_accompaniment sesa ON ses.id_ = sesa.exam_song_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		WHERE sesa.id_ = #{id}
 		WHERE sesa.id_ = #{id}
 	</select>
 	</select>
@@ -120,8 +120,8 @@
 	<!-- 分页查询 -->
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="SysMusicScoreAccompaniment" parameterType="map">
 	<select id="queryPage" resultMap="SysMusicScoreAccompaniment" parameterType="map">
 		SELECT sesa.*,ses.name_,ses.type_,ses.url_,s.name_ subject_name_,sesc.name_ categories_name_,sesc.id_ categories_id_,ses.client_type_
 		SELECT sesa.*,ses.name_,ses.type_,ses.url_,s.name_ subject_name_,sesc.name_ categories_name_,sesc.id_ categories_id_,ses.client_type_
-		FROM sys_music_score_accompaniment sesa
-		LEFT JOIN sys_music_score ses ON ses.id_ = sesa.exam_song_id_
+		FROM sys_music_score ses
+		LEFT JOIN sys_music_score_accompaniment sesa ON ses.id_ = sesa.exam_song_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		LEFT JOIN `subject` s ON s.id_ = sesa.subject_id_
 		LEFT JOIN `subject` s ON s.id_ = sesa.subject_id_
 		<include refid="queryPageSql"/>
 		<include refid="queryPageSql"/>
@@ -131,8 +131,9 @@
 	
 	
 	<!-- 查询当前表的总记录数 -->
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
 	<select id="queryCount" resultType="int">
-		SELECT COUNT(sesa.id_) FROM sys_music_score_accompaniment sesa
-		LEFT JOIN sys_music_score ses ON ses.id_ = sesa.exam_song_id_
+		SELECT COUNT(sesa.id_)
+		FROM sys_music_score ses
+		LEFT JOIN sys_music_score_accompaniment sesa ON ses.id_ = sesa.exam_song_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		<include refid="queryPageSql"/>
 		<include refid="queryPageSql"/>
 	</select>
 	</select>
@@ -154,8 +155,8 @@
 	</select>
 	</select>
 	<select id="queryAccPage" resultMap="SysMusicScoreAccompaniment">
 	<select id="queryAccPage" resultMap="SysMusicScoreAccompaniment">
 		SELECT sesa.*,ses.name_,ses.type_,ses.url_,s.name_ subject_name_,sesc.name_ categories_name_,sesc.id_ categories_id_,ses.client_type_
 		SELECT sesa.*,ses.name_,ses.type_,ses.url_,s.name_ subject_name_,sesc.name_ categories_name_,sesc.id_ categories_id_,ses.client_type_
-		FROM sys_music_score_accompaniment sesa
-		LEFT JOIN sys_music_score ses ON ses.id_ = sesa.exam_song_id_
+		FROM sys_music_score ses
+		LEFT JOIN sys_music_score_accompaniment sesa ON ses.id_ = sesa.exam_song_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		LEFT JOIN subject s ON s.id_ = sesa.subject_id_
 		LEFT JOIN subject s ON s.id_ = sesa.subject_id_
 		<include refid="queryPageSql"/>
 		<include refid="queryPageSql"/>
@@ -163,8 +164,9 @@
 	</select>
 	</select>
 
 
 	<select id="findAccCount" resultType="java.lang.Integer">
 	<select id="findAccCount" resultType="java.lang.Integer">
-		SELECT COUNT(DISTINCT sesa.id_) FROM sys_music_score_accompaniment sesa
-		LEFT JOIN sys_music_score ses ON ses.id_ = sesa.exam_song_id_
+		SELECT COUNT(DISTINCT sesa.id_)
+		FROM sys_music_score ses
+		LEFT JOIN sys_music_score_accompaniment sesa ON ses.id_ = sesa.exam_song_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
 		<include refid="queryPageSql"/>
 		<include refid="queryPageSql"/>
 	</select>
 	</select>

+ 0 - 6
mec-gateway/mec-gateway-web/pom.xml

@@ -60,12 +60,6 @@
 			<groupId>org.springframework.boot</groupId>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-security</artifactId>
 			<artifactId>spring-boot-starter-security</artifactId>
 		</dependency>
 		</dependency>
-
-		<dependency>
-			<groupId>com.github.mthizo247</groupId>
-			<artifactId>spring-cloud-netflix-zuul-websocket</artifactId>
-			<version>1.0.0-RELEASE</version>
-		</dependency>
     </dependencies>
     </dependencies>
 
 
 	<build>
 	<build>

+ 8 - 1
mec-im/src/main/resources/logback-spring.xml

@@ -44,6 +44,13 @@
 		</root>
 		</root>
 	</springProfile>
 	</springProfile>
 
 
+	<springProfile name="dev_server">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
 	<!--生产环境:输出到文件 -->
 	<!--生产环境:输出到文件 -->
 	<springProfile name="prod">
 	<springProfile name="prod">
 		<root level="INFO">
 		<root level="INFO">
@@ -52,4 +59,4 @@
 		</root>
 		</root>
 	</springProfile>
 	</springProfile>
 
 
-</configuration>
+</configuration>

+ 5 - 0
mec-student/pom.xml

@@ -32,6 +32,11 @@
 			<artifactId>spring-cloud-sleuth-zipkin</artifactId>
 			<artifactId>spring-cloud-sleuth-zipkin</artifactId>
 		</dependency>
 		</dependency>
 
 
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-websocket</artifactId>
+		</dependency>
+
 		<!-- swagger-spring-boot -->
 		<!-- swagger-spring-boot -->
 		<dependency>
 		<dependency>
 			<groupId>com.spring4all</groupId>
 			<groupId>com.spring4all</groupId>

+ 40 - 0
mec-student/src/main/java/com/ym/mec/student/config/WebSocketConfig.java

@@ -0,0 +1,40 @@
+package com.ym.mec.student.config;
+
+import com.ym.mec.student.handler.WebSocketHandler;
+import com.ym.mec.student.interceptor.WebSocketHandshakeInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/8 0008
+ */
+@Configuration
+@EnableWebSocket
+public class WebSocketConfig implements WebSocketConfigurer {
+
+    @Autowired
+    private WebSocketHandler webSocketHandler;
+    @Autowired
+    private WebSocketHandshakeInterceptor webSocketHandshakeInterceptor;
+
+    @Override
+    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
+        webSocketHandlerRegistry.addHandler(webSocketHandler, "/ws")
+                .addInterceptors(webSocketHandshakeInterceptor);
+    }
+
+    @Bean
+    public ServletServerContainerFactoryBean createWebSocketContainer() {
+        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
+        container.setMaxTextMessageBufferSize(8192*4);
+        container.setMaxBinaryMessageBufferSize(8192*4);
+        return container;
+    }
+
+}

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

@@ -1,15 +1,14 @@
 package com.ym.mec.student.controller;
 package com.ym.mec.student.controller;
 
 
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.service.*;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 
 
@@ -24,21 +23,34 @@ import org.springframework.web.bind.annotation.RestController;
 
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
 import com.ym.mec.biz.dal.dao.StudentPreRegistrationDao;
 import com.ym.mec.biz.dal.dao.StudentPreRegistrationDao;
 import com.ym.mec.biz.dal.dto.RegisterPayDto;
 import com.ym.mec.biz.dal.dto.RegisterPayDto;
+import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
-import com.ym.mec.util.date.DateUtil;
 
 
 @RequestMapping("musicGroup")
 @RequestMapping("musicGroup")
 @Api(tags = "乐团服务")
 @Api(tags = "乐团服务")

+ 8 - 0
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupPaymentCalenderController.java

@@ -12,15 +12,18 @@ import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.service.MemberRankPrivilegesService;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
 import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.ui.ModelMap;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -28,6 +31,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+
 import java.util.List;
 import java.util.List;
 
 
 @RequestMapping("musicGroupPaymentCalender")
 @RequestMapping("musicGroupPaymentCalender")
@@ -50,6 +54,9 @@ public class MusicGroupPaymentCalenderController extends BaseController {
     @Autowired
     @Autowired
     private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
     private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
 
 
+	@Autowired
+	private MemberRankPrivilegesService memberRankPrivilegesService;
+
 
 
     @ApiOperation(value = "查询学员缴费详情")
     @ApiOperation(value = "查询学员缴费详情")
     @GetMapping("/getCalenderInfo")
     @GetMapping("/getCalenderInfo")
@@ -87,6 +94,7 @@ public class MusicGroupPaymentCalenderController extends BaseController {
             model.put("calenderCourseSettings", calenderCourseSettings);
             model.put("calenderCourseSettings", calenderCourseSettings);
             model.put("balance",studentRegistration.getBalance());
             model.put("balance",studentRegistration.getBalance());
             model.put("calender",calender);
             model.put("calender",calender);
+            model.put("memberPrivilegesItemList", memberRankPrivilegesService.queryByMemberRankId(calender.getMemberRankSettingId()));
             return succeed(model);
             return succeed(model);
         }else if(calender.getStatus() == PaymentCalenderStatusEnum.OVER){
         }else if(calender.getStatus() == PaymentCalenderStatusEnum.OVER){
             throw new BizException("缴费已截止,如有问题请联系指导老师");
             throw new BizException("缴费已截止,如有问题请联系指导老师");

+ 323 - 0
mec-student/src/main/java/com/ym/mec/student/handler/WebSocketHandler.java

@@ -0,0 +1,323 @@
+package com.ym.mec.student.handler;
+
+import be.tarsos.dsp.AudioDispatcher;
+import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
+import be.tarsos.dsp.pitch.PitchProcessor;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
+import com.ym.mec.biz.dal.dto.SoundCompareHelper;
+import com.ym.mec.biz.dal.dto.WavHeader;
+import com.ym.mec.biz.dal.dto.WebSocketInfo;
+import com.ym.mec.biz.service.SoundSocketService;
+import com.ym.mec.common.constant.CommonConstants;
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.socket.*;
+import org.springframework.web.socket.handler.AbstractWebSocketHandler;
+
+import javax.sound.sampled.AudioFormat;
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/9 0009
+ */
+@Service
+public class WebSocketHandler extends AbstractWebSocketHandler {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketHandler.class);
+
+    public static final Map<String, WebSocketSession> WS_CLIENTS = new ConcurrentHashMap<>();
+
+    private BigDecimal oneHundred = new BigDecimal(100);
+
+    private static final AudioFormat audioFormat = new AudioFormat(44100, 16, 1, true, false);
+    private static final PitchProcessor.PitchEstimationAlgorithm algo = PitchProcessor.PitchEstimationAlgorithm.FFT_YIN;
+
+    private static final String tmpDir = FileUtils.getTempDirectoryPath() + "/soundCompare/";
+
+    private Map<String, SoundCompareHelper> userSoundInfoMap = new ConcurrentHashMap<>();
+
+    public WebSocketHandler() {
+        super();
+        File soundDir = new File(tmpDir);
+        if(!soundDir.exists()){
+            soundDir.mkdir();
+        }
+    }
+
+    @Override
+    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+        String phone = session.getPrincipal().getName().split(":")[1];
+        LOGGER.info("{}上线", phone);
+        WS_CLIENTS.put(phone, session);
+        super.afterConnectionEstablished(session);
+    }
+
+    @Override
+    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
+        super.handleMessage(session, message);
+    }
+
+    @Override
+    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+        super.handleTextMessage(session, message);
+        String phone = session.getPrincipal().getName().split(":")[1];
+        LOGGER.info("{}: {}", phone, message.getPayload());
+        WebSocketInfo webSocketInfo = JSON.parseObject(message.getPayload(), WebSocketInfo.class);
+        JSONObject bodyObject = (JSONObject) webSocketInfo.getBody();
+
+        String commond = "";
+        if(webSocketInfo.getHeader().containsKey(SoundSocketService.COMMOND)){
+            commond = webSocketInfo.getHeader().get(SoundSocketService.COMMOND);
+        }
+        switch (commond){
+            case SoundSocketService.MUSIC_XML:
+                userSoundInfoMap.put(phone, new SoundCompareHelper());
+                List<MusicPitchDetailDto> musicXmlInfos = JSON.parseArray(bodyObject.getString("musicXmlInfos"), MusicPitchDetailDto.class);
+                userSoundInfoMap.get(phone).setMusicScoreId(bodyObject.getInteger("id"));
+                userSoundInfoMap.get(phone).setMeasureXmlInfoMap(musicXmlInfos.stream().collect(Collectors.groupingBy(MusicPitchDetailDto::getMeasureIndex)));
+                for (Map.Entry<Integer, List<MusicPitchDetailDto>> userMeasureXmlInfoEntry : userSoundInfoMap.get(phone).getMeasureXmlInfoMap().entrySet()) {
+                    MusicPitchDetailDto musicPitchDetailDto = userMeasureXmlInfoEntry.getValue().stream().max(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
+                    userSoundInfoMap.get(phone).getMeasureEndTime().put(userMeasureXmlInfoEntry.getKey(), musicPitchDetailDto.getTimeStamp()+musicPitchDetailDto.getDuration());
+                }
+                break;
+            case SoundSocketService.RECORD_START:
+                File file = new File(tmpDir+phone + "_"+ userSoundInfoMap.get(phone).getMusicScoreId() +"_"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) +".wav");
+                userSoundInfoMap.get(phone).setAccessFile(new RandomAccessFile(file, "rw"));
+                break;
+            case SoundSocketService.RECORD_END:
+                if(!CollectionUtils.isEmpty(userSoundInfoMap.get(phone).getMeasureEndTime())){
+                    measureCompare(phone, userSoundInfoMap.get(phone).getMeasureEndTime().keySet().stream().max(Integer::compareTo).get());
+                }
+                calTotalScore(phone);
+                createHeader(phone);
+                break;
+            default:
+                break;
+        }
+    }
+
+    @Override
+    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
+        super.handleBinaryMessage(session, message);
+        String phone = session.getPrincipal().getName().split(":")[1];
+        if(Objects.nonNull(userSoundInfoMap.get(phone).getAccessFile())){
+            userSoundInfoMap.get(phone).getAccessFile().write(message.getPayload().array());
+        }
+        List<MusicPitchDetailDto> recordInfo = new ArrayList<>();
+        AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), audioFormat, 256, 128);
+        dispatcher.addAudioProcessor(new PitchProcessor(algo, 44100, 256, (pitchDetectionResult, audioEvent) -> {
+            int timeStamp = (int) (userSoundInfoMap.get(phone).getMeasureStartTime() + audioEvent.getTimeStamp()*1000);
+            float pitch = pitchDetectionResult.getPitch();
+            recordInfo.add(new MusicPitchDetailDto(timeStamp, pitch));
+        }));
+        dispatcher.run();
+        double recordTime = userSoundInfoMap.get(phone).getAccessFile().length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000;
+        userSoundInfoMap.get(phone).setMeasureStartTime(recordTime);
+        userSoundInfoMap.get(phone).getRecordMeasurePithInfo().addAll(recordInfo);
+        for (Map.Entry<Integer, Integer> userMeasureEndTimeMapEntry : userSoundInfoMap.get(phone).getMeasureEndTime().entrySet()) {
+            if(recordTime>userMeasureEndTimeMapEntry.getValue()){
+                measureCompare(phone, userMeasureEndTimeMapEntry.getKey());
+                userSoundInfoMap.get(phone).getMeasureEndTime().remove(userMeasureEndTimeMapEntry.getKey());
+                break;
+            }
+        }
+
+    }
+
+    @Override
+    protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
+        super.handlePongMessage(session, message);
+        LOGGER.info("心跳信息:{}", new String(message.getPayload().array(), "utf-8"));
+    }
+
+    @Override
+    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+        super.handleTransportError(session, exception);
+        exception.printStackTrace();
+        String phone = session.getPrincipal().getName().split(":")[1];
+        LOGGER.info("发生了错误,移除客户端: {}", phone);
+        session.close();
+        WS_CLIENTS.remove(phone);
+        createHeader(phone);
+    }
+
+    @Override
+    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
+        super.afterConnectionClosed(session, status);
+        String phone = session.getPrincipal().getName().split(":")[1];
+        LOGGER.info("{}离线", phone);
+        WS_CLIENTS.remove(phone);
+        createHeader(phone);
+    }
+
+    @Override
+    public boolean supportsPartialMessages() {
+        return super.supportsPartialMessages();
+    }
+
+    private void createHeader(String phone) throws IOException {
+        if(Objects.nonNull(userSoundInfoMap.get(phone).getAccessFile())){
+            return;
+        }
+        RandomAccessFile randomAccessFile = userSoundInfoMap.get(phone).getAccessFile();
+        LOGGER.info("音频时长:{}", randomAccessFile.length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000);
+        randomAccessFile.seek(0);
+        randomAccessFile.write(WavHeader.getWaveHeader(randomAccessFile.length(), (long) audioFormat.getFrameRate(), audioFormat.getSampleSizeInBits()));
+        randomAccessFile.close();
+        userSoundInfoMap.get(phone).setAccessFile(null);
+        userSoundInfoMap.remove(phone);
+    }
+
+    private void measureCompare(String phone, int measureIndex) throws IOException {
+        //总分
+        BigDecimal score = BigDecimal.ZERO;
+        //相似度
+        BigDecimal intonation = BigDecimal.ZERO;
+        //节奏
+        BigDecimal cadence = BigDecimal.ZERO;
+        //完整度
+        BigDecimal integrity = BigDecimal.ZERO;
+
+        try {
+            //最低有效频率
+            float minValidFrequency = 20;
+
+            //有效音频数量
+            float validNum = 0;
+            //音频有效阈值
+            float validDuty = 0.7f;
+
+            //音准匹配数量
+            float intonationNum = 0;
+            //音准匹配误差范围
+            float intonationErrRange = 70;
+            //音准有效阈值
+            float intonationValidDuty = 0.7f;
+
+            //节奏匹配数量
+            float cadenceNum = 0;
+            //节奏匹配误差范围
+            float cadenceErrRange = 130;
+            //节奏有效阈值
+            float cadenceValidDuty = 0.5f;
+
+            int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size();
+
+            for (MusicPitchDetailDto musicXmlInfo : userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex)) {
+                int startTimeStamp = musicXmlInfo.getTimeStamp();
+                int endTimeStamp = musicXmlInfo.getTimeStamp()+musicXmlInfo.getDuration();
+
+                //时间范围内有效音准数量
+                float recordValidIntonationNum = 0;
+                //时间范围内有效节奏数量
+                float cadenceValidNum = 0;
+                //时间范围内有效音频数量
+                float recordValidNum = 0;
+                //时间范围内匹配次数
+                float compareNum = 0;
+                for (MusicPitchDetailDto recordInfo : userSoundInfoMap.get(phone).getRecordMeasurePithInfo()) {
+                    //如果在时间范围之外直接跳过
+                    if(recordInfo.getTimeStamp()<startTimeStamp||recordInfo.getTimeStamp()>endTimeStamp){
+                        continue;
+                    }
+                    compareNum++;
+                    //如果在最低有效频率以下则跳过
+                    if(recordInfo.getFrequency()<minValidFrequency){
+                        continue;
+                    }
+                    recordValidNum++;
+                    //如果频率差值在节奏误差范围内
+                    if(recordInfo.getFrequency()-musicXmlInfo.getFrequency()<=cadenceErrRange){
+                        cadenceValidNum++;
+                    }
+                    //如果频率差值在音准误差范围内
+                    if(recordInfo.getFrequency()-musicXmlInfo.getFrequency()<=intonationErrRange){
+                        recordValidIntonationNum++;
+                    }
+                }
+                //有效音频占比
+                float recordValidDuty = recordValidNum/compareNum;
+                if(recordValidDuty<validDuty){
+                    continue;
+                }
+                validNum++;
+                //有效音高占比
+                float intonationDuty = recordValidIntonationNum/compareNum;
+                //有效节奏占比
+                float cadenceDuty = cadenceValidNum/compareNum;
+                if(intonationDuty>=intonationValidDuty){
+                    intonationNum++;
+                }
+                if(cadenceDuty>=cadenceValidDuty){
+                    cadenceNum++;
+                }
+            }
+
+            intonation = new BigDecimal(intonationNum).divide(new BigDecimal(totalCompareNum), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_HALF_UP);
+            cadence = new BigDecimal(cadenceNum).divide(new BigDecimal(totalCompareNum), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_HALF_UP);
+            integrity = new BigDecimal(validNum).divide(new BigDecimal(totalCompareNum), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_HALF_UP);
+        } catch (ArithmeticException e){
+            LOGGER.info("无musicXml信息");
+        }
+
+        if(userSoundInfoMap.get(phone).getUserScoreMap().containsKey("intonation")){
+            userSoundInfoMap.get(phone).getUserScoreMap().put("intonation", intonation.add(userSoundInfoMap.get(phone).getUserScoreMap().get("intonation")));
+        }else{
+            userSoundInfoMap.get(phone).getUserScoreMap().put("intonation", intonation);
+        }
+
+        if(userSoundInfoMap.get(phone).getUserScoreMap().containsKey("cadence")){
+            userSoundInfoMap.get(phone).getUserScoreMap().put("cadence", cadence.add(userSoundInfoMap.get(phone).getUserScoreMap().get("cadence")));
+        }else{
+            userSoundInfoMap.get(phone).getUserScoreMap().put("cadence", cadence);
+        }
+
+        if(userSoundInfoMap.get(phone).getUserScoreMap().containsKey("integrity")){
+            userSoundInfoMap.get(phone).getUserScoreMap().put("integrity", integrity.add(userSoundInfoMap.get(phone).getUserScoreMap().get("integrity")));
+        }else{
+            userSoundInfoMap.get(phone).getUserScoreMap().put("integrity", integrity);
+        }
+        WS_CLIENTS.get(phone).sendMessage(new TextMessage(JSON.toJSONString(createPushInfo("measureScore", measureIndex, intonation, cadence, integrity))));
+//                LOGGER.info("推送评分结果:{}", phone);
+    }
+
+    private void calTotalScore(String phone) throws IOException {
+        int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().keySet().size();
+        BigDecimal intonation = userSoundInfoMap.get(phone).getUserScoreMap().get("intonation").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
+        BigDecimal cadence = userSoundInfoMap.get(phone).getUserScoreMap().get("cadence").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
+        BigDecimal integrity = userSoundInfoMap.get(phone).getUserScoreMap().get("integrity").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
+
+        WS_CLIENTS.get(phone).sendMessage(new TextMessage(JSON.toJSONString(createPushInfo("overall", -1, intonation, cadence, integrity))));
+    }
+
+    private WebSocketInfo createPushInfo(String commond, Integer measureIndex,
+                                         BigDecimal intonation, BigDecimal cadence, BigDecimal integrity){
+        WebSocketInfo webSocketInfo = new WebSocketInfo();
+        HashMap<String, String> header = new HashMap<>();
+        header.put("commond", commond);
+        webSocketInfo.setHeader(header);
+        Map<String, Object> result = new HashMap<>();
+        BigDecimal score = intonation.multiply(new BigDecimal(0.45)).add(cadence.multiply(new BigDecimal(0.45))).add(integrity.multiply(new BigDecimal(0.1))).setScale(0, BigDecimal.ROUND_HALF_UP);
+        result.put("score", score);
+        result.put("intonation", intonation);
+        result.put("cadence", cadence);
+        result.put("integrity", integrity);
+        result.put("measureIndex", measureIndex);
+        webSocketInfo.setBody(result);
+        return webSocketInfo;
+    }
+}

+ 28 - 0
mec-student/src/main/java/com/ym/mec/student/interceptor/WebSocketHandshakeInterceptor.java

@@ -0,0 +1,28 @@
+package com.ym.mec.student.interceptor;
+
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.HandshakeInterceptor;
+
+import java.util.Map;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/9 0009
+ */
+@Component
+public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
+
+    @Override
+    public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
+        return true;
+    }
+
+    @Override
+    public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
+
+    }
+
+}

+ 8 - 1
mec-student/src/main/resources/logback-spring.xml

@@ -65,6 +65,13 @@
 		</root>
 		</root>
 	</springProfile>
 	</springProfile>
 
 
+	<springProfile name="dev_server">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
 	<!--生产环境:输出到文件 -->
 	<!--生产环境:输出到文件 -->
 	<springProfile name="prod">
 	<springProfile name="prod">
 		<root level="WARN">
 		<root level="WARN">
@@ -73,4 +80,4 @@
 		</root>
 		</root>
 	</springProfile>
 	</springProfile>
 
 
-</configuration>
+</configuration>

+ 57 - 59
mec-teacher/src/main/java/com/ym/mec/teacher/handler/WebSocketHandler.java

@@ -6,6 +6,7 @@ import be.tarsos.dsp.pitch.PitchProcessor;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
 import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
+import com.ym.mec.biz.dal.dto.SoundCompareHelper;
 import com.ym.mec.biz.dal.dto.WavHeader;
 import com.ym.mec.biz.dal.dto.WavHeader;
 import com.ym.mec.biz.dal.dto.WebSocketInfo;
 import com.ym.mec.biz.dal.dto.WebSocketInfo;
 import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.SoundSocketService;
@@ -42,19 +43,12 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
 
 
     private BigDecimal oneHundred = new BigDecimal(100);
     private BigDecimal oneHundred = new BigDecimal(100);
 
 
-    AudioFormat audioFormat = new AudioFormat(44100, 16, 1, true, false);
-    PitchProcessor.PitchEstimationAlgorithm algo = PitchProcessor.PitchEstimationAlgorithm.FFT_YIN;
+    private static final AudioFormat audioFormat = new AudioFormat(44100, 16, 1, true, false);
+    private static final PitchProcessor.PitchEstimationAlgorithm algo = PitchProcessor.PitchEstimationAlgorithm.FFT_YIN;
 
 
-    private String tmpDir = FileUtils.getTempDirectoryPath() + "/soundCompare/";
+    private static final String tmpDir = FileUtils.getTempDirectoryPath() + "/soundCompare/";
 
 
-    private Map<String, RandomAccessFile> userRandomAccessFileMap = new ConcurrentHashMap<>();
-    private Map<String, Map<Integer, List<MusicPitchDetailDto>>> userMeasureXmlInfoMap = new ConcurrentHashMap<>();
-    private Map<String, Map<Integer, Integer>> userMeasureEndTimeMap = new ConcurrentHashMap<>();
-    private Map<String, Set<Integer>> userMeasureMap = new ConcurrentHashMap<>();
-    private Map<String, Double> userMeasureStartTimeMap = new ConcurrentHashMap<>();
-    private Map<String, List<MusicPitchDetailDto>> userLastMeasurePithInfoMap = new ConcurrentHashMap<>();
-    private Map<String, Map<String, BigDecimal>> userTotalScoreMap = new ConcurrentHashMap<>();
-    private Map<String, Integer> userMusicIdMap = new ConcurrentHashMap<>();
+    private Map<String, SoundCompareHelper> userSoundInfoMap = new ConcurrentHashMap<>();
 
 
     public WebSocketHandler() {
     public WebSocketHandler() {
         super();
         super();
@@ -91,26 +85,22 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         }
         }
         switch (commond){
         switch (commond){
             case SoundSocketService.MUSIC_XML:
             case SoundSocketService.MUSIC_XML:
+                userSoundInfoMap.put(phone, new SoundCompareHelper());
                 List<MusicPitchDetailDto> musicXmlInfos = JSON.parseArray(bodyObject.getString("musicXmlInfos"), MusicPitchDetailDto.class);
                 List<MusicPitchDetailDto> musicXmlInfos = JSON.parseArray(bodyObject.getString("musicXmlInfos"), MusicPitchDetailDto.class);
-                userMusicIdMap.put(phone, bodyObject.getInteger("id"));
-                userLastMeasurePithInfoMap.put(phone, new ArrayList<>());
-                userTotalScoreMap.put(phone, new HashMap<>());
-                userMeasureXmlInfoMap.put(phone, musicXmlInfos.stream().collect(Collectors.groupingBy(MusicPitchDetailDto::getMeasureIndex)));
-                userMeasureEndTimeMap.put(phone, new HashMap<>());
-                for (Map.Entry<Integer, List<MusicPitchDetailDto>> userMeasureXmlInfoEntry : userMeasureXmlInfoMap.get(phone).entrySet()) {
+                userSoundInfoMap.get(phone).setMusicScoreId(bodyObject.getInteger("id"));
+                userSoundInfoMap.get(phone).setMeasureXmlInfoMap(musicXmlInfos.stream().collect(Collectors.groupingBy(MusicPitchDetailDto::getMeasureIndex)));
+                for (Map.Entry<Integer, List<MusicPitchDetailDto>> userMeasureXmlInfoEntry : userSoundInfoMap.get(phone).getMeasureXmlInfoMap().entrySet()) {
                     MusicPitchDetailDto musicPitchDetailDto = userMeasureXmlInfoEntry.getValue().stream().max(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
                     MusicPitchDetailDto musicPitchDetailDto = userMeasureXmlInfoEntry.getValue().stream().max(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
-                    userMeasureEndTimeMap.get(phone).put(userMeasureXmlInfoEntry.getKey(), musicPitchDetailDto.getTimeStamp()+musicPitchDetailDto.getDuration());
+                    userSoundInfoMap.get(phone).getMeasureEndTime().put(userMeasureXmlInfoEntry.getKey(), musicPitchDetailDto.getTimeStamp()+musicPitchDetailDto.getDuration());
                 }
                 }
                 break;
                 break;
             case SoundSocketService.RECORD_START:
             case SoundSocketService.RECORD_START:
-                File file = new File(tmpDir+phone + "_"+ userMusicIdMap.get(phone) +"_"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) +".wav");
-                userRandomAccessFileMap.put(phone, new RandomAccessFile(file, "rw"));
-                userMeasureMap.put(phone, new HashSet<>());
-                userMeasureStartTimeMap.put(phone, (double) 0);
+                File file = new File(tmpDir+phone + "_"+ userSoundInfoMap.get(phone).getMusicScoreId() +"_"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) +".wav");
+                userSoundInfoMap.get(phone).setAccessFile(new RandomAccessFile(file, "rw"));
                 break;
                 break;
             case SoundSocketService.RECORD_END:
             case SoundSocketService.RECORD_END:
-                if(!CollectionUtils.isEmpty(userMeasureEndTimeMap.get(phone))){
-                    measureCompare(phone, userMeasureEndTimeMap.get(phone).keySet().stream().max(Integer::compareTo).get());
+                if(!CollectionUtils.isEmpty(userSoundInfoMap.get(phone).getMeasureEndTime())){
+                    measureCompare(phone, userSoundInfoMap.get(phone).getMeasureEndTime().keySet().stream().max(Integer::compareTo).get());
                 }
                 }
                 calTotalScore(phone);
                 calTotalScore(phone);
                 createHeader(phone);
                 createHeader(phone);
@@ -124,24 +114,27 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
     protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
     protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
         super.handleBinaryMessage(session, message);
         super.handleBinaryMessage(session, message);
         String phone = session.getPrincipal().getName().split(":")[1];
         String phone = session.getPrincipal().getName().split(":")[1];
-        if(userRandomAccessFileMap.containsKey(phone)){
-            userRandomAccessFileMap.get(phone).write(message.getPayload().array());
+        if(Objects.nonNull(userSoundInfoMap.get(phone).getAccessFile())){
+            userSoundInfoMap.get(phone).getAccessFile().write(message.getPayload().array());
         }
         }
         List<MusicPitchDetailDto> recordInfo = new ArrayList<>();
         List<MusicPitchDetailDto> recordInfo = new ArrayList<>();
         AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), audioFormat, 256, 128);
         AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), audioFormat, 256, 128);
         dispatcher.addAudioProcessor(new PitchProcessor(algo, 44100, 256, (pitchDetectionResult, audioEvent) -> {
         dispatcher.addAudioProcessor(new PitchProcessor(algo, 44100, 256, (pitchDetectionResult, audioEvent) -> {
-            int timeStamp = (int) (userMeasureStartTimeMap.get(phone) + audioEvent.getTimeStamp()*1000);
+            int timeStamp = (int) (userSoundInfoMap.get(phone).getMeasureStartTime() + audioEvent.getTimeStamp()*1000);
             float pitch = pitchDetectionResult.getPitch();
             float pitch = pitchDetectionResult.getPitch();
             recordInfo.add(new MusicPitchDetailDto(timeStamp, pitch));
             recordInfo.add(new MusicPitchDetailDto(timeStamp, pitch));
         }));
         }));
         dispatcher.run();
         dispatcher.run();
-        double recordTime = userRandomAccessFileMap.get(phone).length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000;
-        userMeasureStartTimeMap.put(phone, recordTime);
-        userLastMeasurePithInfoMap.get(phone).addAll(recordInfo);
-        for (Map.Entry<Integer, Integer> userMeasureEndTimeMapEntry : userMeasureEndTimeMap.get(phone).entrySet()) {
+        if(Objects.isNull(userSoundInfoMap.get(phone).getAccessFile())){
+            return;
+        }
+        double recordTime = userSoundInfoMap.get(phone).getAccessFile().length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000;
+        userSoundInfoMap.get(phone).setMeasureStartTime(recordTime);
+        userSoundInfoMap.get(phone).getRecordMeasurePithInfo().addAll(recordInfo);
+        for (Map.Entry<Integer, Integer> userMeasureEndTimeMapEntry : userSoundInfoMap.get(phone).getMeasureEndTime().entrySet()) {
             if(recordTime>userMeasureEndTimeMapEntry.getValue()){
             if(recordTime>userMeasureEndTimeMapEntry.getValue()){
                 measureCompare(phone, userMeasureEndTimeMapEntry.getKey());
                 measureCompare(phone, userMeasureEndTimeMapEntry.getKey());
-                userMeasureEndTimeMap.get(phone).remove(userMeasureEndTimeMapEntry.getKey());
+                userSoundInfoMap.get(phone).getMeasureEndTime().remove(userMeasureEndTimeMapEntry.getKey());
                 break;
                 break;
             }
             }
         }
         }
@@ -180,15 +173,20 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
     }
     }
 
 
     private void createHeader(String phone) throws IOException {
     private void createHeader(String phone) throws IOException {
-        if(!userRandomAccessFileMap.containsKey(phone)){
+        if(!userSoundInfoMap.containsKey(phone)){
             return;
             return;
         }
         }
-        RandomAccessFile randomAccessFile = userRandomAccessFileMap.get(phone);
-        LOGGER.info("音频时长:{}", randomAccessFile.length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000);
-        randomAccessFile.seek(0);
-        randomAccessFile.write(WavHeader.getWaveHeader(randomAccessFile.length(), (long) audioFormat.getFrameRate(), audioFormat.getSampleSizeInBits()));
-        randomAccessFile.close();
-        userRandomAccessFileMap.remove(phone);
+        if(Objects.nonNull(userSoundInfoMap.get(phone).getAccessFile())){
+            RandomAccessFile randomAccessFile = userSoundInfoMap.get(phone).getAccessFile();
+            LOGGER.info("音频时长:{}", randomAccessFile.length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000);
+            randomAccessFile.seek(0);
+            randomAccessFile.write(WavHeader.getWaveHeader(randomAccessFile.length(), (long) audioFormat.getFrameRate(), audioFormat.getSampleSizeInBits()));
+            randomAccessFile.close();
+            userSoundInfoMap.get(phone).setAccessFile(null);
+        }
+        userSoundInfoMap.get(phone).setRecordMeasurePithInfo(null);
+        LOGGER.info("评分数据:{}", JSON.toJSONString(userSoundInfoMap.get(phone)));
+        userSoundInfoMap.remove(phone);
     }
     }
 
 
     private void measureCompare(String phone, int measureIndex) throws IOException {
     private void measureCompare(String phone, int measureIndex) throws IOException {
@@ -213,20 +211,20 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
             //音准匹配数量
             //音准匹配数量
             float intonationNum = 0;
             float intonationNum = 0;
             //音准匹配误差范围
             //音准匹配误差范围
-            float intonationErrRange = 100;
+            float intonationErrRange = 70;
             //音准有效阈值
             //音准有效阈值
-            float intonationValidDuty = 0.8f;
+            float intonationValidDuty = 0.7f;
 
 
             //节奏匹配数量
             //节奏匹配数量
             float cadenceNum = 0;
             float cadenceNum = 0;
             //节奏匹配误差范围
             //节奏匹配误差范围
-            float cadenceErrRange = 100;
+            float cadenceErrRange = 130;
             //节奏有效阈值
             //节奏有效阈值
-            float cadenceValidDuty = 0.7f;
+            float cadenceValidDuty = 0.5f;
 
 
-            int totalCompareNum = userMeasureXmlInfoMap.get(phone).get(measureIndex).size();
+            int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size();
 
 
-            for (MusicPitchDetailDto musicXmlInfo : userMeasureXmlInfoMap.get(phone).get(measureIndex)) {
+            for (MusicPitchDetailDto musicXmlInfo : userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex)) {
                 int startTimeStamp = musicXmlInfo.getTimeStamp();
                 int startTimeStamp = musicXmlInfo.getTimeStamp();
                 int endTimeStamp = musicXmlInfo.getTimeStamp()+musicXmlInfo.getDuration();
                 int endTimeStamp = musicXmlInfo.getTimeStamp()+musicXmlInfo.getDuration();
 
 
@@ -238,7 +236,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                 float recordValidNum = 0;
                 float recordValidNum = 0;
                 //时间范围内匹配次数
                 //时间范围内匹配次数
                 float compareNum = 0;
                 float compareNum = 0;
-                for (MusicPitchDetailDto recordInfo : userLastMeasurePithInfoMap.get(phone)) {
+                for (MusicPitchDetailDto recordInfo : userSoundInfoMap.get(phone).getRecordMeasurePithInfo()) {
                     //如果在时间范围之外直接跳过
                     //如果在时间范围之外直接跳过
                     if(recordInfo.getTimeStamp()<startTimeStamp||recordInfo.getTimeStamp()>endTimeStamp){
                     if(recordInfo.getTimeStamp()<startTimeStamp||recordInfo.getTimeStamp()>endTimeStamp){
                         continue;
                         continue;
@@ -283,32 +281,32 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
             LOGGER.info("无musicXml信息");
             LOGGER.info("无musicXml信息");
         }
         }
 
 
-        if(userTotalScoreMap.get(phone).containsKey("intonation")){
-            userTotalScoreMap.get(phone).put("intonation", intonation.add(userTotalScoreMap.get(phone).get("intonation")));
+        if(userSoundInfoMap.get(phone).getUserScoreMap().containsKey("intonation")){
+            userSoundInfoMap.get(phone).getUserScoreMap().put("intonation", intonation.add(userSoundInfoMap.get(phone).getUserScoreMap().get("intonation")));
         }else{
         }else{
-            userTotalScoreMap.get(phone).put("intonation", intonation);
+            userSoundInfoMap.get(phone).getUserScoreMap().put("intonation", intonation);
         }
         }
 
 
-        if(userTotalScoreMap.get(phone).containsKey("cadence")){
-            userTotalScoreMap.get(phone).put("cadence", cadence.add(userTotalScoreMap.get(phone).get("cadence")));
+        if(userSoundInfoMap.get(phone).getUserScoreMap().containsKey("cadence")){
+            userSoundInfoMap.get(phone).getUserScoreMap().put("cadence", cadence.add(userSoundInfoMap.get(phone).getUserScoreMap().get("cadence")));
         }else{
         }else{
-            userTotalScoreMap.get(phone).put("cadence", cadence);
+            userSoundInfoMap.get(phone).getUserScoreMap().put("cadence", cadence);
         }
         }
 
 
-        if(userTotalScoreMap.get(phone).containsKey("integrity")){
-            userTotalScoreMap.get(phone).put("integrity", integrity.add(userTotalScoreMap.get(phone).get("integrity")));
+        if(userSoundInfoMap.get(phone).getUserScoreMap().containsKey("integrity")){
+            userSoundInfoMap.get(phone).getUserScoreMap().put("integrity", integrity.add(userSoundInfoMap.get(phone).getUserScoreMap().get("integrity")));
         }else{
         }else{
-            userTotalScoreMap.get(phone).put("integrity", integrity);
+            userSoundInfoMap.get(phone).getUserScoreMap().put("integrity", integrity);
         }
         }
         WS_CLIENTS.get(phone).sendMessage(new TextMessage(JSON.toJSONString(createPushInfo("measureScore", measureIndex, intonation, cadence, integrity))));
         WS_CLIENTS.get(phone).sendMessage(new TextMessage(JSON.toJSONString(createPushInfo("measureScore", measureIndex, intonation, cadence, integrity))));
 //                LOGGER.info("推送评分结果:{}", phone);
 //                LOGGER.info("推送评分结果:{}", phone);
     }
     }
 
 
     private void calTotalScore(String phone) throws IOException {
     private void calTotalScore(String phone) throws IOException {
-        int totalCompareNum = userMeasureXmlInfoMap.get(phone).keySet().size();
-        BigDecimal intonation = userTotalScoreMap.get(phone).get("intonation").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
-        BigDecimal cadence = userTotalScoreMap.get(phone).get("cadence").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
-        BigDecimal integrity = userTotalScoreMap.get(phone).get("integrity").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
+        int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().keySet().size();
+        BigDecimal intonation = userSoundInfoMap.get(phone).getUserScoreMap().get("intonation").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
+        BigDecimal cadence = userSoundInfoMap.get(phone).getUserScoreMap().get("cadence").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
+        BigDecimal integrity = userSoundInfoMap.get(phone).getUserScoreMap().get("integrity").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
 
 
         WS_CLIENTS.get(phone).sendMessage(new TextMessage(JSON.toJSONString(createPushInfo("overall", -1, intonation, cadence, integrity))));
         WS_CLIENTS.get(phone).sendMessage(new TextMessage(JSON.toJSONString(createPushInfo("overall", -1, intonation, cadence, integrity))));
     }
     }

+ 8 - 1
mec-teacher/src/main/resources/logback-spring.xml

@@ -65,6 +65,13 @@
 		</root>
 		</root>
 	</springProfile>
 	</springProfile>
 
 
+	<springProfile name="dev_server">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
 	<!--生产环境:输出到文件 -->
 	<!--生产环境:输出到文件 -->
 	<springProfile name="prod">
 	<springProfile name="prod">
 		<root level="WARN">
 		<root level="WARN">
@@ -73,4 +80,4 @@
 		</root>
 		</root>
 	</springProfile>
 	</springProfile>
 
 
-</configuration>
+</configuration>

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

@@ -24,7 +24,7 @@ public class MemberPrivilegesItemController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('memberPrivilegesItem/add')")
     @PreAuthorize("@pcs.hasPermissions('memberPrivilegesItem/add')")
     @AuditLogAnnotation(operateName = "新增系统功能类型")
     @AuditLogAnnotation(operateName = "新增系统功能类型")
     public Object add(@RequestBody MemberPrivilegesItem memberPrivilegesItem) {
     public Object add(@RequestBody MemberPrivilegesItem memberPrivilegesItem) {
-        memberPrivilegesItemService.insert(memberPrivilegesItem);
+        memberPrivilegesItemService.add(memberPrivilegesItem);
         return succeed();
         return succeed();
     }
     }
 
 
@@ -40,7 +40,7 @@ public class MemberPrivilegesItemController extends BaseController {
     @PostMapping("/update")
     @PostMapping("/update")
     @PreAuthorize("@pcs.hasPermissions('memberPrivilegesItem/update')")
     @PreAuthorize("@pcs.hasPermissions('memberPrivilegesItem/update')")
     public Object update(@RequestBody MemberPrivilegesItem memberPrivilegesItem) {
     public Object update(@RequestBody MemberPrivilegesItem memberPrivilegesItem) {
-        memberPrivilegesItemService.update(memberPrivilegesItem);
+        memberPrivilegesItemService.updateItem(memberPrivilegesItem);
         return succeed();
         return succeed();
     }
     }
 
 

+ 8 - 1
mec-web/src/main/resources/logback-spring.xml

@@ -65,6 +65,13 @@
 		</root>
 		</root>
 	</springProfile>
 	</springProfile>
 
 
+	<springProfile name="dev_server">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
 	<!--生产环境:输出到文件 -->
 	<!--生产环境:输出到文件 -->
 	<springProfile name="prod">
 	<springProfile name="prod">
 		<root level="WARN">
 		<root level="WARN">
@@ -73,4 +80,4 @@
 		</root>
 		</root>
 	</springProfile>
 	</springProfile>
 
 
-</configuration>
+</configuration>