Browse Source

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

 Conflicts:
	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
	mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
zouxuan 4 years ago
parent
commit
8f93a7ada0
23 changed files with 353 additions and 99 deletions
  1. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  2. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  3. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java
  4. 1 9
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java
  5. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CountStudentTrainDataDto.java
  6. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java
  7. 38 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java
  8. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMusicCompareRecordQueryInfo.java
  9. 5 11
      mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java
  10. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SoundSocketService.java
  11. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  12. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  13. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  14. 45 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java
  15. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  16. 80 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  17. 10 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  18. 15 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  19. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml
  20. 63 41
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  21. 2 2
      mec-common/common-core/src/main/java/com/ym/mec/common/page/QueryInfo.java
  22. 0 2
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  23. 0 2
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupPaymentCalenderController.java

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

@@ -469,4 +469,11 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
 	 * @return java.util.List<java.lang.String>
 	 */
     List<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverView(@Param("musicGroupIds") List<String> musicGroupIds);
+
+    /**
+     * 获取在读,进行中的乐团名称
+     * @param studentIds
+     * @return
+     */
+    List<Map<Integer, String>> queryNormalGroupName(@Param("studentIds") List<Integer> studentIds);
 }

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

@@ -386,4 +386,11 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return
      */
     List<Map<Long, String>> countCourseStudentSubjectName(@Param("courseIds") List<Long> courseIds);
+
+    /**
+     * 获取老师关联的有课的学员列表
+     * @param teacherId
+     * @return
+     */
+    List<Integer> getStudentByHasCourse(Integer teacherId);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java

@@ -64,4 +64,15 @@ public interface StudentVisitDao extends BaseDAO<Integer, StudentVisit> {
      * @return
      */
     List<TeacherVisitDto> getTeacherVisitCount(@Param("teacherIds") List<Integer> teacherIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+
+    /**
+     * 时间段内是否有训练统计的回访
+     * @param teacherId
+     * @param addDays1
+     * @param addDays3
+     * @return
+     */
+    List<Integer> queryRecordVisitStudentIds(@Param("teacherId") Integer teacherId,
+                                             @Param("addDays1") Date addDays1,
+                                             @Param("addDays3") Date addDays3);
 }

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

@@ -1,15 +1,14 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.dal.entity.SysMusicCompareWeekData;
 import com.ym.mec.biz.dal.enums.HeardLevelEnum;
 import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareRecord> {
 
@@ -66,13 +65,6 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
      * @param params
      * @return
      */
-    int countStudentTrain(Map<String, Object> params);
-
-    /**
-     * 老师端首页学员训练统计
-     * @param params
-     * @return
-     */
     List<CountStudentTrainDataDto> queryStudentTrain(Map<String, Object> params);
 
     /**

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

@@ -23,6 +23,16 @@ public class CountStudentTrainDataDto {
 
     private String musicGroupName;
 
+    private Integer visitFlag;
+
+    public Integer getVisitFlag() {
+        return visitFlag;
+    }
+
+    public void setVisitFlag(Integer visitFlag) {
+        this.visitFlag = visitFlag;
+    }
+
     public String getMusicGroupName() {
         return musicGroupName;
     }

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

@@ -36,6 +36,9 @@ public class SoundCompareHelper implements PitchDetectionHandler {
     @ApiModelProperty(value = "声部编号")
     private Integer subjectId;
 
+    @ApiModelProperty(value = "评测记录编号")
+    private Long recordId;
+
     @ApiModelProperty(value = "评测等级")
     private HeardLevelEnum heardLevel = HeardLevelEnum.ADVANCED;
 
@@ -50,6 +53,9 @@ public class SoundCompareHelper implements PitchDetectionHandler {
     @ApiModelProperty(value = "录音文件地址")
     private String recordFilePath;
 
+    @ApiModelProperty(value = "播放速度")
+    private int speed = 90;
+
     @ApiModelProperty(value = "小节xml信息字典")
     private Map<Integer, List<MusicPitchDetailDto>> measureXmlInfoMap = new HashMap<>();
 
@@ -104,6 +110,22 @@ public class SoundCompareHelper implements PitchDetectionHandler {
         this.musicalNotePitchMap = musicalNotePitchMap;
     }
 
+    public Long getRecordId() {
+        return recordId;
+    }
+
+    public void setRecordId(Long recordId) {
+        this.recordId = recordId;
+    }
+
+    public int getSpeed() {
+        return speed;
+    }
+
+    public void setSpeed(int speed) {
+        this.speed = speed;
+    }
+
     public String getBehaviorId() {
         return behaviorId;
     }

+ 38 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java

@@ -51,6 +51,8 @@ public class SysMusicCompareRecord {
 	/** 录音文件地址 */
 	private String recordFilePath;
 
+	private String videoFilePath;
+
 	/** 周一日期 */
 	private String monday = LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()).toString();
 
@@ -61,10 +63,21 @@ public class SysMusicCompareRecord {
 
 	private DeviceTypeEnum deviceType;
 
+	private float sourceTime = 0;
+
 	private float playTime = 0;
 
+	private int speed = 90;
+
 	private String clientId;
-	
+
+	public SysMusicCompareRecord() {
+	}
+
+	public SysMusicCompareRecord(FeatureType feature) {
+		this.feature = feature;
+	}
+
 	public void setId(Long id){
 		this.id = id;
 	}
@@ -177,6 +190,14 @@ public class SysMusicCompareRecord {
 		this.recordFilePath = recordFilePath;
 	}
 
+	public String getVideoFilePath() {
+		return videoFilePath;
+	}
+
+	public void setVideoFilePath(String videoFilePath) {
+		this.videoFilePath = videoFilePath;
+	}
+
 	public DeviceTypeEnum getDeviceType() {
 		return deviceType;
 	}
@@ -185,6 +206,14 @@ public class SysMusicCompareRecord {
 		this.deviceType = deviceType;
 	}
 
+	public float getSourceTime() {
+		return sourceTime;
+	}
+
+	public void setSourceTime(float sourceTime) {
+		this.sourceTime = sourceTime;
+	}
+
 	public float getPlayTime() {
 		return playTime;
 	}
@@ -193,6 +222,14 @@ public class SysMusicCompareRecord {
 		this.playTime = playTime;
 	}
 
+	public int getSpeed() {
+		return speed;
+	}
+
+	public void setSpeed(int speed) {
+		this.speed = speed;
+	}
+
 	public String getMonday() {
 		return monday;
 	}

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

@@ -31,6 +31,16 @@ public class SysMusicCompareRecordQueryInfo extends QueryInfo {
 
     private HeardLevelEnum heardLevel;
 
+    private Boolean visitFlag;
+
+    public Boolean getVisitFlag() {
+        return visitFlag;
+    }
+
+    public void setVisitFlag(Boolean visitFlag) {
+        this.visitFlag = visitFlag;
+    }
+
     public FeatureType getFeatureType() {
         return featureType;
     }

+ 5 - 11
mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java

@@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dto.WebSocketClientDetail;
 import com.ym.mec.biz.dal.dto.WebSocketInfo;
 import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
-import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.WebSocketEventHandler;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -16,7 +13,6 @@ import org.springframework.web.socket.*;
 import org.springframework.web.socket.handler.AbstractWebSocketHandler;
 
 import java.io.IOException;
-import java.util.Date;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
@@ -56,6 +52,9 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
     @Override
     public void afterConnectionEstablished(WebSocketSession session) throws Exception {
         String phone = session.getPrincipal().getName().split(":")[1];
+        if(WS_CLIENTS.containsKey(phone)){
+            WS_CLIENTS.get(phone).getSession().close();
+        }
         LOGGER.info("{}上线", phone);
         WS_CLIENTS.put(phone, new WebSocketClientDetail(session, System.currentTimeMillis()));
         appMap.values().forEach(e->e.afterConnectionEstablished(session, phone));
@@ -96,13 +95,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
     public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
         String phone = session.getPrincipal().getName().split(":")[1];
         session.close();
-        LOGGER.info("发生了错误,移除客户端: {}", phone, exception);
-        appMap.values().forEach(e->e.afterConnectionClosed(session, phone));
-        exception.printStackTrace();
-        if(!WS_CLIENTS.containsKey(phone)){
-            return;
-        }
-        WS_CLIENTS.remove(phone);
+        LOGGER.info("{}异常: {}", phone, exception);
     }
 
     @Override
@@ -111,6 +104,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         String phone = session.getPrincipal().getName().split(":")[1];
         LOGGER.info("{}离线: {}s", phone, (System.currentTimeMillis() - WS_CLIENTS.get(phone).getLoginTime())/1000);
         appMap.values().forEach(e->e.afterConnectionClosed(session, phone));
+        session.close();
         WS_CLIENTS.remove(phone);
     }
 

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

@@ -15,5 +15,6 @@ public interface SoundSocketService {
     String RECORD_CANCEL = "recordCancel";
     String PROXY_MESSAGE = "proxyMessage";
     String OFFSET_TIME = "offsetTime";
+    String VIDEO_UPDATE = "videoUpdate";
 
 }

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

@@ -245,6 +245,12 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     //云教练试用时间最晚截止时间
     String EXPERIENCE_MEMBERSHIP_END_TIME = "experience_membership_end_time";
 
+    //云教练训练时长小于80分钟需要回访
+    String STUDENT_CLOUD_TEACHER_TOTAL_PLAY_TIME = "student_cloud_teacher_total_play_time";
+
+    //云教练训练次数小于4次需要回访
+    String STUDENT_CLOUD_TEACHER_TRAIN_NUM = "student_cloud_teacher_train_num";
+
     /**
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @params paramName

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java

@@ -1,13 +1,14 @@
 package com.ym.mec.biz.service;
 
-import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.dto.CountStudentTrainDataDto;
+import com.ym.mec.biz.dal.dto.MusicCompareRankingDto;
+import com.ym.mec.biz.dal.dto.SoundCompareHelper;
+import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.List;
 import java.util.Map;
 
 public interface SysMusicCompareRecordService extends BaseService<Long, SysMusicCompareRecord> {

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

@@ -2747,9 +2747,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Map<Integer, String> push = new HashMap<>(1);
         push.put(userId, userId.toString());
         yimei.put(userId, studentRegistration.getParentsPhone());
+
+        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByOrderId(studentPaymentOrder.getId());
+        
         if (studentPaymentOrder.getStatus() == SUCCESS) {
             //当前乐团报名是否赠送乐团网管课
-            MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByOrderId(studentPaymentOrder.getId());
             MusicGroupStudentFee musicGroupStudentFee = musicGroupPaymentCalenderService.updateCalender(calenderDetail.getId(), studentRegistration.getUserId());
             if (musicGroupStudentFee != null) {
                 musicGroupStudentFee.setUpdateTime(date);
@@ -2919,6 +2921,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             }
             return true;
         } else {
+
+    		//更新学生的缴费记录状态
+    		calenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.NON_PAYMENT);
+    		calenderDetail.setUpdateTime(date);
+    		musicGroupPaymentCalenderDetailDao.update(calenderDetail);
+    		
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().doubleValue() > 0) {
                 sysUserCashAccountService.updateBalance(userId, studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS,
                         "乐团续费失败");

+ 45 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java

@@ -9,10 +9,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.config.SoundCompareConfig;
 import com.ym.mec.biz.dal.dao.SysMusicScoreAccompanimentDao;
 import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
-import com.ym.mec.biz.dal.enums.HeardLevelEnum;
-import com.ym.mec.biz.dal.enums.MusicalErrorTypeEnum;
-import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.handler.WebSocketHandler;
 import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
@@ -43,6 +41,8 @@ import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
+import static com.ym.mec.biz.service.SoundSocketService.VIDEO_UPDATE;
+
 /**
  * @Author Joburgess
  * @Date 2021/8/5 0005
@@ -90,6 +90,9 @@ public class SoundCompareHandler implements WebSocketEventHandler {
 
         switch (message.getHeader().getCommond()){
             case SoundSocketService.MUSIC_XML:
+                if(userSoundInfoMap.containsKey(phone)){
+                    createHeader(phone, false);
+                }
                 userSoundInfoMap.put(phone, new SoundCompareHelper());
                 userSoundInfoMap.get(phone).setClientId(((OAuth2Authentication)session.getPrincipal()).getOAuth2Request().getClientId());
                 List<MusicPitchDetailDto> musicXmlInfos = JSON.parseArray(bodyObject.getString("musicXmlInfos"), MusicPitchDetailDto.class);
@@ -114,6 +117,9 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                 if(bodyObject.containsKey("heardLevel")){
                     userSoundInfoMap.get(phone).setHeardLevel(HeardLevelEnum.valueOf(bodyObject.getString("heardLevel")));
                 }
+                if(bodyObject.containsKey("speed")){
+                    userSoundInfoMap.get(phone).setSpeed(bodyObject.getIntValue("speed"));
+                }
                 List<Integer> subjectIds = sysMusicScoreAccompanimentDao.findSubjectByMusicScoreId(userSoundInfoMap.get(phone).getMusicScoreId(), null);
                 if(!CollectionUtils.isEmpty(subjectIds)){
                     userSoundInfoMap.get(phone).setSubjectId(subjectIds.get(0));
@@ -129,7 +135,10 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                     musicPitchDetailDto.setDontEvaluating(dc == userMeasureXmlInfoEntry.getValue().size());
                     userSoundInfoMap.get(phone).getMeasureEndTime().put(userMeasureXmlInfoEntry.getKey(), musicPitchDetailDto);
                 }
-
+                SysMusicCompareRecord sysMusicCompareRecord = new SysMusicCompareRecord(FeatureType.CLOUD_STUDY_EVALUATION);
+                sysMusicCompareRecordService.insert(sysMusicCompareRecord);
+                LOGGER.info("评测记录编号:{}", sysMusicCompareRecord.getId());
+                userSoundInfoMap.get(phone).setRecordId(sysMusicCompareRecord.getId());
                 break;
             case SoundSocketService.RECORD_START:
                 if(!userSoundInfoMap.containsKey(phone)){
@@ -163,10 +172,10 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                 } finally {
                     calTotalScore(phone);
                 }
-                createHeader(phone);
+                createHeader(phone, true);
                 break;
             case SoundSocketService.RECORD_CANCEL:
-                createHeader(phone);
+                createHeader(phone, false);
                 break;
             case SoundSocketService.PROXY_MESSAGE:
                 if(DeviceTypeEnum.IOS.equals(userSoundInfoMap.get(phone).getDeviceType())&&bodyObject.containsKey(SoundSocketService.OFFSET_TIME)){
@@ -174,6 +183,16 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                     calOffsetTime(phone, offsetTime);
                 }
                 break;
+            case VIDEO_UPDATE:
+                SysMusicCompareRecord update = null;
+                if(bodyObject.containsKey("recordId")){
+                    update = sysMusicCompareRecordService.get(bodyObject.getLong("recordId"));
+                }
+                if(Objects.nonNull(update)&&bodyObject.containsKey("filePath")){
+                    update.setVideoFilePath(bodyObject.getString("filePath"));
+                    sysMusicCompareRecordService.update(update);
+                }
+                break;
             default:
                 break;
         }
@@ -218,7 +237,10 @@ public class SoundCompareHandler implements WebSocketEventHandler {
 
     @Override
     public void afterConnectionClosed(WebSocketSession session, String phone){
-        createHeader(phone);
+        if(userSoundInfoMap.containsKey(phone)&&Objects.nonNull(userSoundInfoMap.get(phone).getFile())){
+            createHeader(phone, false);
+        }
+        userSoundInfoMap.remove(phone);
     }
 
     /**
@@ -244,7 +266,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
      * @param phone:
      * @return void
      */
-    private void createHeader(String phone){
+    private void createHeader(String phone, boolean saveData){
         if(!userSoundInfoMap.containsKey(phone)){
             return;
         }
@@ -272,13 +294,18 @@ public class SoundCompareHandler implements WebSocketEventHandler {
             userSoundInfoMap.get(phone).setRecordFilePath(url);
         }
         //存储评分数据
-        sysMusicCompareRecordService.saveMusicCompareData(phone, userSoundInfoMap.get(phone));
+        if(saveData){
+            sysMusicCompareRecordService.saveMusicCompareData(phone, userSoundInfoMap.get(phone));
+            userSoundInfoMap.get(phone).setRecordId(null);
+        }else if(Objects.nonNull(userSoundInfoMap.get(phone).getRecordId())){
+            sysMusicCompareRecordService.delete(userSoundInfoMap.get(phone).getRecordId());
+        }
 
         if(Objects.nonNull(userSoundInfoMap.get(phone).getFile())){
             userSoundInfoMap.get(phone).getFile().delete();
+            userSoundInfoMap.get(phone).setFile(null);
+            userSoundInfoMap.get(phone).setAccessFile(null);
         }
-
-        userSoundInfoMap.remove(phone);
     }
 
     /**
@@ -420,7 +447,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                 //音准、完成度
                 if (cadenceRight && !CollectionUtils.isEmpty(measureSoundPitchInfos)){
                     //音准
-                    Double avgPitch = measureSoundPitchInfos.stream().filter(pitch -> Math.abs((pitch.getFrequency()-musicXmlInfo.getFrequency()))<5).collect(Collectors.averagingDouble(pitch -> pitch.getFrequency()));
+                    Double avgPitch = measureSoundPitchInfos.stream().filter(pitch -> Math.abs((pitch.getFrequency()-musicXmlInfo.getFrequency()))<15).collect(Collectors.averagingDouble(pitch -> pitch.getFrequency()));
                     //音分
                     double recordCents = 0;
                     if (avgPitch > 0){
@@ -441,7 +468,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                     intonationRight = score>70;
 
                     if(score>0){
-                        integrityValidNum = measureSoundPitchInfos.stream().filter(pitch -> Math.abs((pitch.getFrequency()-musicXmlInfo.getFrequency()))<5).count();
+                        integrityValidNum = measureSoundPitchInfos.stream().filter(pitch -> Math.abs((pitch.getFrequency()-musicXmlInfo.getFrequency()))<15).count();
                     }else{
                         integrityValidNum = 0;
                     }
@@ -539,7 +566,9 @@ public class SoundCompareHandler implements WebSocketEventHandler {
         WebSocketInfo webSocketInfo = new WebSocketInfo();
         webSocketInfo.setHeader(new WebSocketInfo.Head(command));
         Map<String, Object> result = new HashMap<>(5);
+        //打击乐只看节奏分
         BigDecimal score = cadence;
+        //非打击乐总分为平均分
         if(Objects.isNull(userSoundInfoMap.get(phone).getSubjectId())||userSoundInfoMap.get(phone).getSubjectId()!=23){
             score = intonation.add(cadence).add(integrity).divide(new BigDecimal(3), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).setScale(0, BigDecimal.ROUND_UP);
         }
@@ -548,11 +577,12 @@ public class SoundCompareHandler implements WebSocketEventHandler {
         result.put("cadence", cadence);
         result.put("integrity", integrity);
         result.put("measureIndex", measureIndex);
+        result.put("recordId", userSoundInfoMap.get(phone).getRecordId());
         webSocketInfo.setBody(result);
 
         userSoundInfoMap.get(phone).getUserMeasureScoreMap().put(measureIndex, result);
 
-        LOGGER.info("小节频分:{}", JSON.toJSONString(webSocketInfo));
+        LOGGER.info("{}小节评分:{}", phone, JSON.toJSONString(webSocketInfo));
 
         //推送结果
         WebSocketHandler.sendTextMessage(phone, webSocketInfo);

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

@@ -72,8 +72,8 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
         SporadicChargeInfo info = sporadicChargeInfoDao.get(Integer.parseInt(studentPaymentOrder.getMusicGroupId()));
 
         Map<Integer, String> map = new HashMap<>();
-        map.put(userId, sysUser.getPhone());
         Map<Integer, String> yimei = new HashMap<>();
+        yimei.put(userId, sysUser.getPhone());
         map.put(userId, userId.toString());
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
             try {

+ 80 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -8,19 +8,21 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.dal.entity.SysMusicScore;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.enums.FeatureType;
+import com.ym.mec.biz.dal.enums.HeardLevelEnum;
+import com.ym.mec.biz.dal.enums.IndexDataType;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
-import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
 import com.ym.mec.biz.service.SysMusicCompareWeekDataService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
-import io.swagger.models.auth.In;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -48,11 +50,16 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	@Autowired
 	private StudentDao studentDao;
 	@Autowired
+	private StudentVisitDao studentVisitDao;
+	@Autowired
 	private SysMessageService sysMessageService;
 
 	@Autowired
 	private SysConfigDao sysConfigDao;
 
+	@Autowired
+	private MusicGroupDao musicGroupDao;
+
 	@Override
 	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
 		return sysMusicCompareRecordDao;
@@ -61,8 +68,10 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	@Override
 	public long insert(SysMusicCompareRecord bean) {
 		long insert = super.insert(bean);
-		studentDao.addStudentCloudStudySequenceDays(bean.getUserId());
-		sysMusicCompareWeekDataService.updateUserWeekTrainData(bean.getUserId(), LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()));
+		if(Objects.nonNull(bean.getUserId())){
+			studentDao.addStudentCloudStudySequenceDays(bean.getUserId());
+			sysMusicCompareWeekDataService.updateUserWeekTrainData(bean.getUserId(), LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()));
+		}
 		return insert;
 	}
 
@@ -77,6 +86,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		sysMusicCompareRecord.setSysMusicScoreId(soundCompareInfo.getMusicScoreId());
 		sysMusicCompareRecord.setHeardLevel(soundCompareInfo.getHeardLevel());
 		sysMusicCompareRecord.setBehaviorId(soundCompareInfo.getBehaviorId());
+		sysMusicCompareRecord.setSpeed(soundCompareInfo.getSpeed());
 		Map<String, Object> scoreData = new HashMap<>();
 		scoreData.put("userMeasureScore", soundCompareInfo.getUserMeasureScoreMap());
 		Map<String, Object> musicalNotesPlayStats = new HashMap<>();
@@ -96,11 +106,20 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		sysMusicCompareRecord.setRecordFilePath(soundCompareInfo.getRecordFilePath());
 		sysMusicCompareRecord.setDeviceType(soundCompareInfo.getDeviceType());
 		sysMusicCompareRecord.setClientId(soundCompareInfo.getClientId());
+		if(!CollectionUtils.isEmpty(soundCompareInfo.getMusicXmlInfos())){
+			MusicPitchDetailDto lastMeasure = soundCompareInfo.getMusicXmlInfos().stream().max(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
+			sysMusicCompareRecord.setSourceTime((lastMeasure.getTimeStamp()+lastMeasure.getDuration())/1000);
+		}
 		if(Objects.nonNull(soundCompareInfo.getFile())){
 			sysMusicCompareRecord.setPlayTime(soundCompareInfo.getFile().length()/(SoundCompareHandler.soundCompareConfig.audioFormat.getFrameSize()*SoundCompareHandler.soundCompareConfig.audioFormat.getFrameRate()));
 		}
 		sysMusicCompareRecord.setFeature(FeatureType.CLOUD_STUDY_EVALUATION);
-		sysMusicCompareRecordDao.insert(sysMusicCompareRecord);
+		sysMusicCompareRecord.setId(soundCompareInfo.getRecordId());
+		if(Objects.nonNull(sysMusicCompareRecord.getId())){
+			sysMusicCompareRecordDao.update(sysMusicCompareRecord);
+		}else{
+			sysMusicCompareRecordDao.insert(sysMusicCompareRecord);
+		}
 		studentDao.addStudentCloudStudySequenceDays(user.getId());
 		sysMusicCompareWeekDataService.updateUserWeekTrainData(user.getId(), LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()));
 	}
@@ -127,6 +146,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		jsonObject.put("intonation", userLastEvaluationData.getIntonation());
 		jsonObject.put("integrity", userLastEvaluationData.getIntegrity());
 		jsonObject.put("heardLevel", userLastEvaluationData.getHeardLevel());
+		jsonObject.put("videoFilePath", userLastEvaluationData.getVideoFilePath());
 
 		SysMusicScore sysMusicScore = sysMusicScoreDao.get(userLastEvaluationData.getSysMusicScoreId());
 		if(Objects.nonNull(sysMusicScore)){
@@ -327,16 +347,65 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 
     @Override
     public PageInfo<CountStudentTrainDataDto> countStudentTrain(SysMusicCompareRecordQueryInfo queryInfo) {
+		if(queryInfo.getStartTime() == null || queryInfo.getEndTime() == null){
+			throw new BizException("请选择训练时间");
+		}
 		PageInfo<CountStudentTrainDataDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
 		Map<String, Object> params = new HashMap<String, Object>();
+		String sort = queryInfo.getSort();
+		if(StringUtils.isNotEmpty(sort)){
+			queryInfo.setSort(sort.equals("trainNum")?"train_num_":sort.equals("totalPlayTime")?"total_play_time_":sort.equals("recordNum")?"record_num_":"train_day_");
+		}
 		MapUtil.populateMap(params, queryInfo);
-
+		Integer visitFlag = 0;
+		if(queryInfo.getVisitFlag() != null && queryInfo.getVisitFlag()){
+			//获取乐团在读,有vip网管课的学员列表
+			List<Integer> hasCourseUserIds = studentDao.getStudentByHasCourse(queryInfo.getTeacherId());
+			if(hasCourseUserIds == null || hasCourseUserIds.size() == 0){
+				return pageInfo;
+			}
+			params.put("hasCourseUserIds",hasCourseUserIds);
+			//获取所选时间段下一周的日期
+			Date addDays1 = DateUtil.addDays(DateUtil.toDate(queryInfo.getEndTime()), 1);
+			Date addDays3 = DateUtil.addDays(DateUtil.toDate(queryInfo.getEndTime()), 3);
+			//有回访过的学员列表
+			List<Integer> studentIds = studentVisitDao.queryRecordVisitStudentIds(queryInfo.getTeacherId(),addDays1,addDays3);
+			if(studentIds != null && studentIds.size() > 0){
+				params.put("visitStudents",studentIds);
+			}
+			Date date = DateUtil.toDate(DateUtil.format(new Date(),DateUtil.ISO_EXPANDED_DATE_FORMAT));
+			int daysBetween = DateUtil.daysBetween(addDays1, date);
+			//每周只有前三天可以回访
+			if(daysBetween >= 0 && daysBetween <= 2){
+				visitFlag = 1;
+			}
+			params.put("having",1);
+		}
+		String totalTime = sysConfigDao.findConfigValue(SysConfigService.STUDENT_CLOUD_TEACHER_TOTAL_PLAY_TIME);
+		if(StringUtils.isEmpty(totalTime)){
+			totalTime = "80";
+		}
+		params.put("totalTime",Integer.parseInt(totalTime));
+		String trainNum = sysConfigDao.findConfigValue(SysConfigService.STUDENT_CLOUD_TEACHER_TRAIN_NUM);
+		if(StringUtils.isEmpty(trainNum)){
+			trainNum = "4";
+		}
+		params.put("trainNum",Integer.parseInt(trainNum));
+		int count = sysMusicCompareRecordDao.queryStudentTrain(params).size();
 		List<CountStudentTrainDataDto> dataList = new ArrayList<>();
-		int count = sysMusicCompareRecordDao.countStudentTrain(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
+		if(count > 0){
 			params.put("offset", pageInfo.getOffset());
-			dataList =sysMusicCompareRecordDao.queryStudentTrain(params);
+			dataList = sysMusicCompareRecordDao.queryStudentTrain(params);
+			List<Integer> studentIds = dataList.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+			//获取学员在读,进行中的乐团名称
+			Map<Integer,String> groupNameMap = MapUtil.convertMybatisMap(musicGroupDao.queryNormalGroupName(studentIds));
+			pageInfo.setTotal(count);
+			for (CountStudentTrainDataDto e : dataList) {
+				e.setMusicGroupName(groupNameMap.get(e.getUserId()));
+				if(visitFlag == 1){
+					e.setVisitFlag(visitFlag);
+				}
+			}
 		}
 		pageInfo.setRows(dataList);
 		return pageInfo;

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

@@ -964,4 +964,14 @@
         GROUP BY sr.music_group_id_
         ORDER BY mg.create_time_ DESC, mg.id_
     </select>
+    <select id="queryNormalGroupName" resultType="java.util.Map">
+        SELECT sr.user_id_ 'key',GROUP_CONCAT(mg.name_) 'value' FROM student_registration sr
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        WHERE mg.status_ = 'PROGRESS' AND sr.music_group_status_ = 'NORMAL'
+        AND sr.user_id_ IN
+        <foreach collection="studentIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+        GROUP BY sr.user_id_
+    </select>
 </mapper>

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

@@ -1241,6 +1241,21 @@
         </foreach>
         GROUP BY cssp.course_schedule_id_
     </select>
+    <select id="getStudentByHasCourse" resultType="java.lang.Integer">
+        SELECT s.user_id_ FROM student s WHERE s.teacher_id_ = #{teacherId} AND s.user_id_ IN (SELECT t.user_id_ FROM (
+        (SELECT sr.user_id_
+        FROM student_registration sr
+        LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+        WHERE mg.status_='PROGRESS'
+        AND sr.music_group_status_='NORMAL')
+        UNION ALL
+        (SELECT
+        cssp.user_id_
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+        WHERE cssp.group_type_ IN ('VIP', 'PRACTICE')
+        AND cs.status_='NOT_START'))t)
+    </select>
 
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1

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

@@ -195,4 +195,10 @@
         <![CDATA[ AND visit_time_ <= #{endTime} ]]>
         GROUP BY teacher_id_,date_format(visit_time_, '%Y-%m')
     </select>
+    <select id="queryRecordVisitStudentIds" resultType="java.lang.Integer">
+        SELECT DISTINCT st.user_id_ FROM student st
+        LEFT JOIN student_visit sv ON st.user_id_ = sv.student_id_
+        WHERE sv.type_ = '云教练' AND st.teacher_id_ = #{teacherId}
+        AND sv.visit_time_ BETWEEN DATE_FORMAT(#{addDays1}, '%Y%m%d') AND DATE_FORMAT(#{addDays3}, '%Y%m%d')
+    </select>
 </mapper>

+ 63 - 41
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -20,9 +20,12 @@
 		<result column="cadence_" property="cadence" />
 		<result column="integrity_" property="integrity" />
 		<result column="record_file_path_" property="recordFilePath" />
+		<result column="video_file_path_" property="videoFilePath" />
 		<result column="device_type_" property="deviceType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
 		<result column="client_id_" property="clientId" />
+		<result column="source_time_" property="sourceTime"/>
 		<result column="play_time_" property="playTime"/>
+		<result column="speed_" property="speed"/>
 		<result column="feature_" property="feature" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
 		<result column="monday_" property="monday"/>
 		<result column="create_time_" property="createTime" />
@@ -40,18 +43,13 @@
 
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysMusicCompareRecord" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!--
-		<selectKey resultClass="int" keyProperty="id" > 
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
-		</selectKey>
-		-->
 		INSERT INTO sys_music_compare_record (id_,user_id_,sys_music_score_id_,heard_level_,behavior_id_,score_data_,score_,intonation_,cadence_,integrity_,
-		                                      record_file_path_,device_type_,client_id_,play_time_,monday_,
-											feature_,create_time_)
+		                                      record_file_path_,video_file_path_,device_type_,client_id_,play_time_,speed_,monday_,
+												source_time_,feature_,create_time_,update_time_)
 		VALUES(#{id},#{userId},#{sysMusicScoreId},#{heardLevel,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{behaviorId},#{scoreData},
 		       #{score},#{intonation},#{cadence},#{integrity},
-		       #{recordFilePath},#{deviceType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{clientId},#{playTime},#{monday},
-		       #{feature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, NOW())
+		       #{recordFilePath},#{videoFilePath},#{deviceType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{clientId},#{playTime},#{speed},#{monday},
+		       #{sourceTime},#{feature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, NOW(), NOW())
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -60,39 +58,58 @@
 		<if test="userId != null">
 			user_id_ = #{userId},
 		</if>
-		<if test="id != null">
-			id_ = #{id},
-		</if>
 		<if test="sysMusicScoreId != null">
 			sys_music_score_id_ = #{sysMusicScoreId},
 		</if>
+		<if test="behaviorId!=null">
+			behavior_id_ = #{behaviorId},
+		</if>
 		<if test="scoreData != null">
 			score_data_ = #{scoreData},
 		</if>
 		<if test="score != null">
 			score_ = #{score},
 		</if>
+		<if test="intonation!=null">
+			intonation_ = #{intonation},
+		</if>
 		<if test="integrity != null">
 			integrity_ = #{integrity},
 		</if>
 		<if test="cadence != null">
 			cadence_ = #{cadence},
 		</if>
-		<if test="sysMusicScoreId != null">
-			sys_music_score_id_ = #{sysMusicScoreId},
-		</if>
 		<if test="recordFilePath != null">
 			record_file_path_ = #{recordFilePath},
 		</if>
+		<if test="videoFilePath != null">
+			video_file_path_ = #{videoFilePath},
+		</if>
 		<if test="clientId != null">
 			client_id_ = #{clientId},
 		</if>
+		<if test="deviceType!=null">
+			device_type_ = #{deviceType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		</if>
+		<if test="sourceTime != null">
+			source_time_ = #{sourceTime},
+		</if>
 		<if test="playTime != null">
 			play_time_ = #{playTime},
 		</if>
+		<if test="speed != null">
+			speed_ = #{speed},
+		</if>
 		<if test="monday != null">
 			monday_ = #{monday},
 		</if>
+		<if test="feature!=null">
+			feature_ = #{feature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		</if>
+		<if test="heardLevel!=null">
+			heard_level_ = #{heardLevel,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		</if>
+		update_time_ = NOW()
 	</set> WHERE id_ = #{id}
 	</update>
 
@@ -124,7 +141,7 @@
 			smcr.id_, smcr.user_id_, smcr.sys_music_score_id_, smcr.heard_level_,
 			LOCATE('musicalNotesPlayStats', smcr.score_data_) notes_data_index_,
 		       smcr.score_, smcr.intonation_, smcr.cadence_,
-		       smcr.integrity_, smcr.record_file_path_, smcr.client_id_, smcr.device_type_, smcr.play_time_,
+		       smcr.integrity_, smcr.record_file_path_, smcr.video_file_path_, smcr.client_id_, smcr.device_type_, smcr.play_time_,
 		       smcr.monday_, smcr.create_time_,
 			sms.name_ sys_music_score_name_
 		FROM sys_music_compare_record smcr
@@ -250,23 +267,6 @@
 		GROUP BY
 			user_id_
 	</select>
-    <select id="countStudentTrain" resultType="java.lang.Integer">
-		SELECT COUNT(DISTINCT s.user_id_)
-		FROM teacher t
-				 LEFT JOIN student s ON t.id_ = s.teacher_id_
-				 LEFT JOIN sys_user su ON su.id_ = s.user_id_
-				 LEFT JOIN sys_music_compare_record mcr ON mcr.user_id_ = s.user_id_
-		<if test="startTime != null and startTime != ''">
-			AND (DATE_FORMAT(mcr.create_time_, '%Y-%m-%d') >= #{startTime} OR mcr.id_ IS NULL)
-		</if>
-		<if test="endTime != null and endTime != ''">
-			AND (DATE_FORMAT(mcr.create_time_, '%Y-%m-%d') &lt;= #{endTime} OR mcr.id_ IS NULL)
-		</if>
-		WHERE s.teacher_id_ = #{teacherId}
-		<if test="search != null and search != ''">
-			AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
-		</if>
-	</select>
 	<resultMap id="CountStudentTrainDataDto" type="com.ym.mec.biz.dal.dto.CountStudentTrainDataDto">
 		<result property="trainNum" column="train_num_"/>
 		<result property="recordNum" column="record_num_"/>
@@ -276,17 +276,14 @@
 		<result property="phone" column="phone_"/>
 		<result property="totalPlayTime" column="total_play_time_"/>
 		<result property="trainDay" column="train_day_"/>
-		<result property="musicGroupName" column="music_group_name_"/>
 	</resultMap>
 	<select id="queryStudentTrain" resultMap="CountStudentTrainDataDto">
 		SELECT s.user_id_,su.avatar_,su.phone_,su.username_,ROUND(SUM(mcr.play_time_) / 60) total_play_time_,
 			   COUNT(DISTINCT DATE_FORMAT(mcr.create_time_,"%Y-%m-%d")) train_day_,
 			   COUNT(DISTINCT mcr.behavior_id_) train_num_,
-		COUNT(CASE WHEN mcr.feature_ = 'CLOUD_STUDY_EVALUATION' THEN mcr.behavior_id_ ELSE NULL END) record_num_,GROUP_CONCAT(DISTINCT mg.name_) music_group_name_
+		COUNT(CASE WHEN mcr.feature_ = 'CLOUD_STUDY_EVALUATION' THEN mcr.behavior_id_ ELSE NULL END) record_num_
 		FROM teacher t
 				 LEFT JOIN student s ON t.id_ = s.teacher_id_
-				 LEFT JOIN student_registration sr ON sr.user_id_ = s.user_id_ AND sr.music_group_status_ = 'NORMAL'
-				 LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_ AND mg.status_ = 'PROGRESS'
 				 LEFT JOIN sys_user su ON su.id_ = s.user_id_
 				 LEFT JOIN sys_music_compare_record mcr ON mcr.user_id_ = s.user_id_
 		<if test="startTime != null and startTime != ''">
@@ -299,8 +296,33 @@
 		<if test="search != null and search != ''">
 			AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
 		</if>
+		<if test="visitStudents != null and visitStudents.size > 0">
+			AND s.user_id_ NOT IN
+			<foreach collection="visitStudents" open="(" close=")" item="userId" separator=",">
+				#{userId}
+			</foreach>
+		</if>
+		<if test="hasCourseUserIds != null and hasCourseUserIds.size > 0">
+			AND s.user_id_ IN
+			<foreach collection="hasCourseUserIds" open="(" close=")" item="userId" separator=",">
+				#{userId}
+			</foreach>
+		</if>
 		GROUP BY s.user_id_
-		ORDER BY total_play_time_ DESC
+		<if test="having == 1">
+			HAVING total_play_time_ &lt; ${totalTime} OR train_num_ &lt; ${trainNum}
+		</if>
+		ORDER BY
+		<if test="sort != null and sort != ''">
+			${sort}
+			<if test="order != null and order != ''">
+				${order}
+			</if>
+		</if>
+		<if test="sort == null or sort == ''">
+			total_play_time_ DESC
+		</if>
+		,s.user_id_
 		<include refid="global.limit"/>
 	</select>
 
@@ -390,9 +412,9 @@
 			COUNT(smcr.id_) trainNum,
 			COUNT(DISTINCT DATE(smcr.create_time_)) trainDays,
 			SUM(smcr.play_time_) trainTime,
-			MAX(IF(heard_level_='BEGINNER', smcr.score_, 0)) beginnerMaxScore,
-			MAX(IF(heard_level_='ADVANCED', smcr.score_, 0)) advancedMaxScore,
-			MAX(IF(heard_level_='PERFORMER', smcr.score_, 0)) performerMaxScore
+			MAX(IF(heard_level_='BEGINNER' AND source_time_ &lt;= play_time_, smcr.score_, 0)) beginnerMaxScore,
+			MAX(IF(heard_level_='ADVANCED' AND source_time_ &lt;= play_time_, smcr.score_, 0)) advancedMaxScore,
+			MAX(IF(heard_level_='PERFORMER' AND source_time_ &lt;= play_time_, smcr.score_, 0)) performerMaxScore
 		FROM sys_music_compare_record smcr
 		WHERE user_id_=#{userId} AND monday_ = #{monday}
 	</select>

+ 2 - 2
mec-common/common-core/src/main/java/com/ym/mec/common/page/QueryInfo.java

@@ -22,11 +22,11 @@ public class QueryInfo {
 	/**
 	 * 默认排序列
 	 */
-	private String sort = "create_time_";
+	private String sort;
 	/**
 	 * 默认排序方向
 	 */
-	private String order = "desc";
+	private String order = "DESC";
 	
 	private String search;
 	

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

@@ -270,8 +270,6 @@ public class MusicGroupController extends BaseController {
         }
         if (calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED) {
             throw new BizException("您已缴费,请勿重复提交");
-        } else if (calenderDetail.getPaymentStatus() == PaymentStatus.PROCESSING) {
-            throw new BizException("存在待处理的订单,请稍候尝试");
         }
         //缴费项目已开启或者单独开启
         Map renew;

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

@@ -69,8 +69,6 @@ public class MusicGroupPaymentCalenderController extends BaseController {
         }
         if(calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED){
             throw new BizException("您已缴费,请勿重复提交");
-        }else if(calenderDetail.getPaymentStatus() == PaymentStatus.PROCESSING){
-            throw new BizException("存在待处理的订单,请稍候尝试");
         }
         if(calender.getStatus() == PaymentCalenderStatusEnum.OPEN || calenderDetail.getOpen() == 1){
             StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId,musicGroupId);