Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

zouxuan 4 gadi atpakaļ
vecāks
revīzija
730ac76e90

+ 7 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/AuthorizationServerConfig.java

@@ -53,6 +53,11 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap
 	@Override
 	public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
 
+		clients.withClientDetails(jdbcClientDetailsService());
+	}
+
+	@Bean
+	public JdbcClientDetailsService jdbcClientDetailsService() {
 		JdbcClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource);
 
 		clientDetailsService
@@ -60,7 +65,7 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap
 		clientDetailsService
 				.setFindClientDetailsSql("select id_, CONCAT('{noop}',client_secret_) as client_secret, resource_ids_, scope_, authorized_grant_types_, web_server_redirect_uri_, authorities_, access_token_validity_, refresh_token_validity_, additional_information_, autoapprove_ from sys_oauth_client_details order by id_");
 
-		clients.withClientDetails(clientDetailsService);
+		return clientDetailsService;
 	}
 
 	@Bean
@@ -77,6 +82,7 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap
 		CustomTokenServices tokenServices = new CustomTokenServices();
 		tokenServices.setTokenStore(redisTokenStore());
 		tokenServices.setSupportRefreshToken(true);
+		tokenServices.setClientDetailsService(jdbcClientDetailsService());
 		//tokenServices.setAccessTokenValiditySeconds(60 * 60 * 24); // token有效期自定义设置,默认12小时
 		//tokenServices.setRefreshTokenValiditySeconds(60 * 60 * 24 * 30);// 默认30天,这里修改
 		return tokenServices;

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

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+
+public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareRecord> {
+
+	
+}

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

@@ -330,6 +330,8 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      */
     SysUser getUser(int userId);
 
+    SysUser getUserWithPhone(@Param("phone") String phone);
+
     /**
      * 获取教师基本信息
      *

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

@@ -33,6 +33,8 @@ public class SoundCompareHelper {
     @ApiModelProperty(value = "小节分数记录")
     private Map<String, BigDecimal> userScoreMap = new HashMap<>();
 
+    private Map<Integer, Map<String, BigDecimal>> userMeasureScoreMap = new HashMap<>();
+
     public Integer getMusicScoreId() {
         return musicScoreId;
     }
@@ -88,4 +90,12 @@ public class SoundCompareHelper {
     public void setUserScoreMap(Map<String, BigDecimal> userScoreMap) {
         this.userScoreMap = userScoreMap;
     }
+
+    public Map<Integer, Map<String, BigDecimal>> getUserMeasureScoreMap() {
+        return userMeasureScoreMap;
+    }
+
+    public void setUserMeasureScoreMap(Map<Integer, Map<String, BigDecimal>> userMeasureScoreMap) {
+        this.userMeasureScoreMap = userMeasureScoreMap;
+    }
 }

+ 70 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java

@@ -0,0 +1,70 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_music_compare_record):
+ */
+public class SysMusicCompareRecord {
+
+	/**  */
+	private Long id;
+	
+	/** 用户编号 */
+	private Integer userId;
+	
+	/** 教程编号 */
+	private Integer sysMusicScoreId;
+	
+	/** 评分数据 */
+	private String scoreData;
+	
+	/** 创建时间 */
+	private java.util.Date createTime;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setSysMusicScoreId(Integer sysMusicScoreId){
+		this.sysMusicScoreId = sysMusicScoreId;
+	}
+	
+	public Integer getSysMusicScoreId(){
+		return this.sysMusicScoreId;
+	}
+			
+	public void setScoreData(String scoreData){
+		this.scoreData = scoreData;
+	}
+	
+	public String getScoreData(){
+		return this.scoreData;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 45 - 17
mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java

@@ -10,10 +10,12 @@ 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.biz.service.SysMusicCompareRecordService;
 import com.ym.mec.common.constant.CommonConstants;
 import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.socket.*;
@@ -52,6 +54,9 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
 
     private Map<String, SoundCompareHelper> userSoundInfoMap = new ConcurrentHashMap<>();
 
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
     public WebSocketHandler() {
         super();
         File soundDir = new File(tmpDir);
@@ -106,9 +111,15 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                 if(!userSoundInfoMap.containsKey(phone)){
                     break;
                 }
-//                if(!CollectionUtils.isEmpty(userSoundInfoMap.get(phone).getMeasureEndTime())){
-//                    measureCompare(phone, userSoundInfoMap.get(phone).getMeasureEndTime().keySet().stream().max(Integer::compareTo).get());
-//                }
+                if(!CollectionUtils.isEmpty(userSoundInfoMap.get(phone).getMeasureEndTime())){
+                    Integer lastMeasureIndex = userSoundInfoMap.get(phone).getMeasureEndTime().keySet().stream().min(Integer::compareTo).get();
+                    double recordTime = userSoundInfoMap.get(phone).getAccessFile().length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000;
+                    //如果结束时时长大于某小节,则此小节需要评分
+                    if(recordTime>userSoundInfoMap.get(phone).getMeasureEndTime().get(lastMeasureIndex)){
+                        measureCompare(phone, lastMeasureIndex);
+                        userSoundInfoMap.get(phone).getMeasureEndTime().remove(lastMeasureIndex);
+                    }
+                }
                 calTotalScore(phone);
                 createHeader(phone);
                 break;
@@ -132,7 +143,6 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
             int timeStamp = (int) (userSoundInfoMap.get(phone).getMeasureStartTime() + audioEvent.getTimeStamp()*1000);
             float pitch = pitchDetectionResult.getPitch();
             recordInfo.add(new MusicPitchDetailDto(timeStamp, pitch));
-            LOGGER.info("频率:{}", pitch);
         }));
         dispatcher.run();
         if(Objects.isNull(userSoundInfoMap.get(phone).getAccessFile())){
@@ -218,21 +228,21 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
             //有效音频数量
             float validNum = 0;
             //音频有效阈值
-            float validDuty = 0.7f;
+            float validDuty = 0.5f;
 
             //音准匹配数量
             float intonationNum = 0;
             //音准匹配误差范围
-            float intonationErrRange = 70;
+            float intonationErrRange = 30;
             //音准有效阈值
-            float intonationValidDuty = 0.7f;
+            float intonationValidDuty = 0.5f;
 
             //节奏匹配数量
             float cadenceNum = 0;
             //节奏匹配误差范围
-            float cadenceErrRange = 130;
+            float cadenceErrRange = 100;
             //节奏有效阈值
-            float cadenceValidDuty = 0.5f;
+            float cadenceValidDuty = 0.7f;
 
             int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size();
 
@@ -249,6 +259,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                 //时间范围内匹配次数
                 float compareNum = 0;
                 for (MusicPitchDetailDto recordInfo : userSoundInfoMap.get(phone).getRecordMeasurePithInfo()) {
+                    LOGGER.info("频率:{}, {}", musicXmlInfo.getFrequency(), recordInfo.getFrequency());
                     //如果在时间范围之外直接跳过
                     if(recordInfo.getTimeStamp()<startTimeStamp||recordInfo.getTimeStamp()>endTimeStamp){
                         continue;
@@ -260,11 +271,11 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                     }
                     recordValidNum++;
                     //如果频率差值在节奏误差范围内
-                    if(recordInfo.getFrequency()-musicXmlInfo.getFrequency()<=cadenceErrRange){
+                    if(Math.abs(recordInfo.getFrequency()-musicXmlInfo.getFrequency())<=cadenceErrRange){
                         cadenceValidNum++;
                     }
                     //如果频率差值在音准误差范围内
-                    if(recordInfo.getFrequency()-musicXmlInfo.getFrequency()<=intonationErrRange){
+                    if(Math.abs(recordInfo.getFrequency()-musicXmlInfo.getFrequency())<=intonationErrRange){
                         recordValidIntonationNum++;
                     }
                 }
@@ -310,17 +321,33 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         }else{
             userSoundInfoMap.get(phone).getUserScoreMap().put("integrity", integrity);
         }
+
+        Map<String, BigDecimal> scoreData = new HashMap<>();
+        scoreData.put("intonation", intonation);
+        scoreData.put("cadence", cadence);
+        scoreData.put("integrity", integrity);
+
+        userSoundInfoMap.get(phone).getUserMeasureScoreMap().put(measureIndex, scoreData);
+
         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);
+        int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().keySet().size()-userSoundInfoMap.get(phone).getMeasureEndTime().keySet().size();
+        BigDecimal intonation = BigDecimal.ZERO;
+        BigDecimal cadence = BigDecimal.ZERO;
+        BigDecimal integrity = BigDecimal.ZERO;
+
+        if(totalCompareNum>0){
+            intonation = userSoundInfoMap.get(phone).getUserScoreMap().get("intonation").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
+            cadence = userSoundInfoMap.get(phone).getUserScoreMap().get("cadence").divide(new BigDecimal(totalCompareNum), 0, BigDecimal.ROUND_DOWN);
+            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))));
+
+        //存储评分数据
+        sysMusicCompareRecordService.saveMusicCompareData(phone, userSoundInfoMap.get(phone).getMusicScoreId(), userSoundInfoMap.get(phone).getUserMeasureScoreMap());
     }
 
     private WebSocketInfo createPushInfo(String commond, Integer measureIndex,
@@ -330,13 +357,14 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         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);
+        BigDecimal score = intonation.multiply(new BigDecimal(0.5)).add(cadence.multiply(new BigDecimal(0.5))).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);
+        LOGGER.info("小节频分:{}", JSON.toJSONString(webSocketInfo));
         return webSocketInfo;
     }
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java

@@ -0,0 +1,21 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.common.service.BaseService;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+public interface SysMusicCompareRecordService extends BaseService<Long, SysMusicCompareRecord> {
+
+    /**
+     * @describe 保存用户评测记录
+     * @author Joburgess
+     * @date 2021/6/25 0025
+     * @param phone:
+     * @param userMeasureScoreMap:
+     * @return void
+     */
+    void saveMusicCompareData(String phone, Integer sysMusicScoreId, Map<Integer, Map<String, BigDecimal>> userMeasureScoreMap);
+
+}

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -0,0 +1,43 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.common.dal.BaseDAO;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Map;
+import java.util.Objects;
+
+@Service
+public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysMusicCompareRecord>  implements SysMusicCompareRecordService {
+	
+	@Autowired
+	private SysMusicCompareRecordDao sysMusicCompareRecordDao;
+	@Autowired
+	private TeacherDao teacherDao;
+
+	@Override
+	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
+		return sysMusicCompareRecordDao;
+	}
+
+	@Override
+	public void saveMusicCompareData(String phone, Integer sysMusicScoreId, Map<Integer, Map<String, BigDecimal>> userMeasureScoreMap) {
+		SysUser user = teacherDao.getUserWithPhone(phone);
+		if(Objects.isNull(user)){
+			return;
+		}
+		SysMusicCompareRecord sysMusicCompareRecord = new SysMusicCompareRecord();
+		sysMusicCompareRecord.setUserId(user.getId());
+		sysMusicCompareRecord.setSysMusicScoreId(sysMusicScoreId);
+		sysMusicCompareRecord.setScoreData(JSON.toJSONString(userMeasureScoreMap));
+		sysMusicCompareRecordDao.insert(sysMusicCompareRecord);
+	}
+}

+ 73 - 0
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.SysMusicCompareRecord" id="SysMusicCompareRecord">
+		<result column="id_" property="id" />
+		<result column="user_id_" property="userId" />
+		<result column="sys_music_score_id_" property="sysMusicScoreId" />
+		<result column="score_data_" property="scoreData" />
+		<result column="create_time_" property="createTime" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysMusicCompareRecord" >
+		SELECT * FROM sys_music_compare_record WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysMusicCompareRecord">
+		SELECT * FROM sys_music_compare_record ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<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_,score_data_,create_time_)
+		VALUES(#{id},#{userId},#{sysMusicScoreId},#{scoreData},NOW())
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SysMusicCompareRecord">
+		UPDATE sys_music_compare_record <set>
+		<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="scoreData != null">
+			score_data_ = #{scoreData},
+		</if>
+		<if test="createTime != null">
+			create_time_ = #{createTime},
+		</if>
+	</set> WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_music_compare_record WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysMusicCompareRecord" parameterType="map">
+		SELECT * FROM sys_music_compare_record ORDER BY id_ <include refid="global.limit"/>
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_music_compare_record
+	</select>
+</mapper>

+ 7 - 0
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -1011,6 +1011,13 @@
         FROM sys_user su
         WHERE su.id_ = #{id} LIMIT 1
     </select>
+
+    <select id="getUserWithPhone" resultMap="SysUser">
+        SELECT su.*
+        FROM sys_user su
+        WHERE su.phone_ = #{phone} LIMIT 1
+    </select>
+
     <select id="queryTeacherBaseInfo"  resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
         SELECT
         CASE WHEN su.user_type_ LIKE '%TEACHER%' OR su.user_type_ LIKE '%SYSTEM%' THEN su.real_name_ ELSE su.username_ END username_,