浏览代码

Merge branch 'online1' of http://git.dayaedu.com/yonge/mec into zx_2021-09-06

zouxuan 4 年之前
父节点
当前提交
cdd2cba787

+ 1 - 2
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> {
 

+ 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;
 	}

+ 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";
 
 }

+ 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);

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

@@ -8,9 +8,11 @@ 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;
@@ -21,7 +23,6 @@ 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;
@@ -67,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;
 	}
 
@@ -83,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<>();
@@ -102,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()));
 	}
@@ -133,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)){

+ 36 - 14
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" />
@@ -41,12 +44,12 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysMusicCompareRecord" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		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>
 
 	<!-- 根据主键查询一条记录 -->
@@ -55,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>
 
@@ -119,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
@@ -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>