|
|
@@ -9,6 +9,7 @@ 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.entity.SysMusicCompareRecord;
|
|
|
import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
|
|
|
import com.ym.mec.biz.dal.enums.HeardLevelEnum;
|
|
|
import com.ym.mec.biz.dal.enums.MusicalErrorTypeEnum;
|
|
|
@@ -43,6 +44,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 +93,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);
|
|
|
@@ -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();
|
|
|
+ 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,14 @@ public class SoundCompareHandler implements WebSocketEventHandler {
|
|
|
calOffsetTime(phone, offsetTime);
|
|
|
}
|
|
|
break;
|
|
|
+ case VIDEO_UPDATE:
|
|
|
+ if(bodyObject.containsKey("filePath")){
|
|
|
+ SysMusicCompareRecord update = new SysMusicCompareRecord();
|
|
|
+ update.setId(userSoundInfoMap.get(phone).getRecordId());
|
|
|
+ update.setVideoFilePath(bodyObject.getString("filePath"));
|
|
|
+ sysMusicCompareRecordService.update(update);
|
|
|
+ }
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
@@ -218,7 +235,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 +264,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 +292,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 +445,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 +466,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;
|
|
|
}
|
|
|
@@ -548,6 +573,7 @@ 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);
|