Browse Source

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into zx_saas_imGroup

zouxuan 1 year ago
parent
commit
58160f34a7
20 changed files with 299 additions and 90 deletions
  1. 4 4
      audio-analysis/src/main/java/com/yonge/netty/dto/ChunkAnalysis.java
  2. 1 1
      audio-analysis/src/main/java/com/yonge/netty/dto/HardLevelEnum.java
  3. 73 58
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  4. 4 4
      audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java
  5. 1 1
      cms/src/main/java/com/ym/mec/cms/dal/dao/SysNewsInformationDao.java
  6. 18 7
      cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsTypeServiceImpl.java
  7. 3 0
      cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  8. 3 1
      mec-application/src/main/java/com/ym/mec/student/controller/CloudStudyController.java
  9. 2 1
      mec-application/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java
  10. 104 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysConfig.java
  11. 24 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysConfigDao.java
  12. 9 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/CbsQrCodeScanServiceImpl.java
  13. 21 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysConfigMapper.xml
  14. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java
  15. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  16. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java
  17. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  18. 5 4
      mec-biz/src/main/resources/config/mybatis/LessonExaminationMapper.xml
  19. 3 1
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  20. 12 4
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

+ 4 - 4
audio-analysis/src/main/java/com/yonge/netty/dto/ChunkAnalysis.java

@@ -12,13 +12,13 @@ public class ChunkAnalysis {
 
 	private int splDb;
 
-	private int power;
+	private float power;
 	
 	private int amplitude;
 	
 	private boolean isPeak;
 
-	public ChunkAnalysis(double startTime, double endTime, int frequency, int splDb, int power, int amplitude) {
+	public ChunkAnalysis(double startTime, double endTime, int frequency, int splDb, float power, int amplitude) {
 		this.startTime = startTime;
 		this.endTime = endTime;
 		this.frequency = frequency;
@@ -74,11 +74,11 @@ public class ChunkAnalysis {
 		this.splDb = splDb;
 	}
 
-	public int getPower() {
+	public float getPower() {
 		return power;
 	}
 
-	public void setPower(int power) {
+	public void setPower(float power) {
 		this.power = power;
 	}
 

+ 1 - 1
audio-analysis/src/main/java/com/yonge/netty/dto/HardLevelEnum.java

@@ -9,7 +9,7 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	 * 完成度范围, 未演奏的范围
 	 */
 	//BEGINNER("入门级", 3, 5, 5, 5, 10, 10, 13, 15, 60, 10), 
-	BEGINNER("入门级", 3, 5, 10, 10, 15, 15, 22, 22, 75, 25), 
+	BEGINNER("入门级", 3, 5, 10, 10, 15, 15, 22, 22, 75, 10), 
 	/**
 	 * 进阶级, 振幅阈值, 频率阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>

+ 73 - 58
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -346,8 +346,10 @@ public class UserChannelContext {
 		}
 		
 		int splDb = (int) Signals.soundPressureLevel(samples);
-		int power = (int) Signals.power(samples);
-		int amplitude = 0;
+		float power = Signals.power(samples);
+		int amplitude = (int) Signals.norm(samples);
+		
+		int decibels = (int) Signals.decibels(samples);
 		if(StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.AMPLITUDE.getCode())) {
 			amplitude = (int) Signals.norm(samples);
 		}else if(StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.DECIBELS.getCode())){
@@ -377,7 +379,7 @@ public class UserChannelContext {
 		
 		if (noteAnalysis.getMusicalNotesIndex() >= 0 && noteAnalysis.getMusicalNotesIndex() <= getTotalMusicNoteIndex(null)) {
 			
-			LOGGER.debug("user:{}  delayProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  amplitude:{}  time:{}", user, delayProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
+			LOGGER.debug("user:{}  delayProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  power:{}  amplitude:{} decibels:{}  time:{}", user, delayProcessed, dynamicOffset, playFrequency, splDb, power, amplitude, decibels, playTime);
 			
 			ChunkAnalysis chunkAnalysis = new ChunkAnalysis(playTime - durationTime, playTime, playFrequency, splDb, power, amplitude);
 			
@@ -792,66 +794,56 @@ public class UserChannelContext {
 			totalTimes = chunkList.size();
 		}
 		
+		/**
 		if (maxTimes * 100 / totalTimes < hardLevel.getIntegrityRange()) {
-			tempo = false;
 			LOGGER.debug("节奏错误原因:信号分堆后的最大数量不足指定的完成比例");
-		}
-		
-		/**
-		for (int i = 0; i < chunkList.size(); i++) {
-			chunkAnalysis = chunkList.get(i);
-			if (chunkAnalysis != null) {
-				if (chunkAnalysis.getFrequency() > MIN_FREQUECY) {
-					
-					tempo = true;
-					if (firstPeakIndex == -1) {
-						firstPeakIndex = i;
-						noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, chunkAnalysis.getFrequency());
-					} else if (noteFrequencyRange.getMinFrequency() > chunkAnalysis.getFrequency()
-							|| chunkAnalysis.getFrequency() > noteFrequencyRange.getMaxFrequency()) {// 判断是否是同一个音
-						//是否是低八度或高八度
-						if(!((noteFrequencyRange.getMinFrequency() < chunkAnalysis.getFrequency() * 2 && chunkAnalysis.getFrequency() * 2 < noteFrequencyRange.getMaxFrequency())
-								|| (noteFrequencyRange.getMinFrequency() < chunkAnalysis.getFrequency() / 2 && chunkAnalysis.getFrequency() / 2 < noteFrequencyRange.getMaxFrequency()))){
-							tempo = false;
-							LOGGER.debug("节奏错误原因:不是同一个音[{}]:{}-{}", chunkAnalysis.getFrequency(), noteFrequencyRange.getMinFrequency(), noteFrequencyRange.getMaxFrequency());
-							break;
-						}
-					}
-					if (isContinue == false) {
-						if ((i + 1) / chunkAnalysisList.size() < hardLevel.getIntegrityRange()) {
-							if (unplayedSize > 0) {
-								tempo = false;
-								LOGGER.debug("节奏错误原因:信号不连续");
-								break;
-							}
-						}
-					}
-				} else {
-					if (tempo == true) {
-						isContinue = false;
-						unplayedSize++;
-					}
-				}
-			}
+			return false;
 		}
 		*/
 		
-		if (tempo) {
-			// 判断进入时间点
-			if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())){
-				tempo = false;
-				LOGGER.debug("节奏错误原因:进入时间点太晚");
-			}else{
-				//判断是否与上一个音延续下来的
+		// 判断进入时间点
+		if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())){
+			LOGGER.debug("节奏错误原因:进入时间点太晚");
+			return false;
+		}else{
+			//判断是否与上一个音延续下来的
+			if(correctedStartTime == musicXmlNote.getTimeStamp() + dynamicOffset) {
 				if(firstChunkAnalysis.getFrequency() > MIN_FREQUECY && lastChunkAnalysis.getFrequency() > MIN_FREQUECY){
 					tempo = new NoteFrequencyRange(standardFrequecy, firstChunkAnalysis.getFrequency()).equals(new NoteFrequencyRange(standardFrequecy, lastChunkAnalysis.getFrequency())) == false;
 					if(tempo == false){
 						LOGGER.debug("节奏错误原因:上一个音[{}]延续下来导致的", lastChunkAnalysis.getFrequency());
+						return false;
 					}
 				}
 			}
 		}
 		
+		//判断过程中声音是否有起伏
+		float minValue = 0;
+		int depth = 0;
+		
+		for (int i = 1; i < chunkList.size(); i++) {
+			
+			if(i == 1) {
+				minValue = chunkList.get(i - 1).getSplDb();
+			}
+			if (Math.abs(minValue - chunkList.get(i).getSplDb()) >= 6) {
+				LOGGER.debug("范围内查询到音波信号,correctedStartTime:{}", chunkList.get(i).getStartTime());
+				break;
+			}
+			
+			minValue = Math.min(minValue , chunkList.get(i).getSplDb());
+			
+			/**
+			if (depth >= 2 && Math.max(chunkList.get(i - 1).getPower(), chunkList.get(i).getPower()) / Math.min(chunkList.get(i - 1).getPower(), chunkList.get(i).getPower()) >= 2) {
+				tempo = false;
+				depth++;
+				LOGGER.debug("节奏错误原因:声波不稳定[{}]", chunkList.get(i).getEndTime());
+				break;
+			}
+			*/
+		}
+		
 		return tempo;
 	}
 	
@@ -999,17 +991,38 @@ public class UserChannelContext {
 			}
 		}
 		
+		double startTime = 0;
+		float minValue = 0;
+		for (int i = 1; i < chunkAnalysisList.size(); i++) {
+			
+			if(i == 1) {
+				minValue = chunkAnalysisList.get(i - 1).getSplDb();
+			}
+			if (Math.abs(minValue - chunkAnalysisList.get(i).getSplDb()) >= 6) {
+				LOGGER.debug("范围内查询到音波信号,correctedStartTime:{}", chunkAnalysisList.get(i).getStartTime());
+				startTime = chunkAnalysisList.get(i).getStartTime();
+				break;
+			}
+			
+			minValue = Math.min(minValue , chunkAnalysisList.get(i).getSplDb());
+			
+			/**
+			if (Math.max(chunkAnalysisList.get(i - 1).getPower(), chunkAnalysisList.get(i).getPower()) / Math.min(chunkAnalysisList.get(i - 1).getPower(), chunkAnalysisList.get(i).getPower()) >= 2) {
+				LOGGER.debug("范围内查询到音波信号,correctedStartTime:{}", chunkAnalysisList.get(i).getStartTime());
+				startTime = chunkAnalysisList.get(i).getStartTime();
+				break;
+			}
+			*/
+		}
+		
 		//判断是否与上一个音是同一个音符
 		if(musicXmlNote.getMusicalNotesIndex() > 0){
 			MusicXmlNote preMusicXmlNote = getCurrentMusicNote(null, musicXmlNote.getMusicalNotesIndex() - 1);
 			if((int)preMusicXmlNote.getFrequency() == (int)musicXmlNote.getFrequency()){
 				Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= MIN_FREQUECY).findFirst();
 				if(optional.isPresent()){
-					LOGGER.debug("与上一个音同音,有断开,correctedStartTime:{}", optional.get().getStartTime());
-					return optional.get().getEndTime();
-				}else{
-					LOGGER.debug("与上一个音同音,未断开,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
-					return musicXmlNote.getTimeStamp() + dynamicOffset;
+					LOGGER.debug("与上一个音同音,有断开,correctedStartTime:{}", optional.get().getEndTime());
+					return Math.max(optional.get().getEndTime(), startTime);
 				}
 			}
 		}
@@ -1021,15 +1034,17 @@ public class UserChannelContext {
 		for (ChunkAnalysis ca : chunkAnalysisList) {
 			noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, ca.getFrequency());
 			if (standardNote.equals(noteFrequencyRange)) {
-				LOGGER.debug("范围内查询到信号,correctedStartTime:{}", ca.getStartTime());
-				return ca.getStartTime();
+				LOGGER.debug("范围内查询到音高信号,correctedStartTime:{}", ca.getStartTime());
+				return Math.max(ca.getStartTime(), startTime);
 			}
 		}
 		
-		LOGGER.debug("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+		if(startTime  == 0) {
+			LOGGER.debug("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+		}
 
 		//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
-		return musicXmlNote.getTimeStamp() + dynamicOffset;
+		return Math.max(musicXmlNote.getTimeStamp() + dynamicOffset, startTime);
 	}
 
 	private void reduceNoise(List<ChunkAnalysis> chunkAnalysisList, EvaluationCriteriaEnum criteria) {

+ 4 - 4
audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java

@@ -73,7 +73,7 @@ public class AudioCompareHandler implements MessageHandler {
 	/**
 	 * @describe 采样大小
 	 */
-	private int bufferSize = 1024 * 1;
+	private int bufferSize = 1024 * 2;
 
 	private boolean signed = true;
 
@@ -141,7 +141,7 @@ public class AudioCompareHandler implements MessageHandler {
 				sysMusicCompareRecord.setDeviceType(DeviceTypeEnum.valueOf(musicXmlBasicInfo.getPlatform()));
 				sysMusicCompareRecord.setSpeed(musicXmlBasicInfo.getSpeed());
 				sysMusicCompareRecord.setPartIndex(musicXmlBasicInfo.getPartIndex());
-				
+				sysMusicCompareRecord.setSubjectId(musicXmlBasicInfo.getSubjectId());
 				//SysUser sysUser = sysUserFeignService.queryUserById(sysMusicCompareRecord.getUserId());
 				sysMusicCompareRecord.setTenantId(musicXmlBasicInfo.getTenantId());
 				
@@ -238,8 +238,8 @@ public class AudioCompareHandler implements MessageHandler {
 
 			Integer offsetTime = dataObj.getInteger("offsetTime");
 			Integer micDelay = dataObj.getInteger("micDelay");
-			channelContext.setMicDelayMS(micDelay + offsetTime);
-			channelContext.setOffsetMS(0);
+			channelContext.setMicDelayMS(0);
+			channelContext.setOffsetMS(micDelay + offsetTime);
 			channelContext.setHandlerSwitch(true);
 
 			break;

+ 1 - 1
cms/src/main/java/com/ym/mec/cms/dal/dao/SysNewsInformationDao.java

@@ -31,7 +31,7 @@ public interface SysNewsInformationDao extends BaseDAO<Long, SysNewsInformation>
 	
 	SysNewsInformationDto queryById(Long id);
 
-	List<SysNewsInformation> queryBySubType(@Param("subType") Integer subType, @Param("memo") String memo, @Param("organIds") String organIds);
+	List<SysNewsInformation> queryBySubType(@Param("subType") Integer subType, @Param("memo") String memo, @Param("organIds") String organIds, @Param("excludeFunctionIds") String excludeFunctionIds);
 
     Boolean countStudentAttendanceError(@Param("startTime") String startTime, @Param("userId") Integer userId);
 

+ 18 - 7
cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsTypeServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.cms.service.impl;
 
+import com.ym.mec.cms.dal.dao.SysConfigDao;
 import com.ym.mec.cms.dal.dao.SysNewsInformationDao;
 import com.ym.mec.cms.dal.dao.SysNewsTypeDao;
 import com.ym.mec.cms.dal.entity.SysNewsInformation;
@@ -17,6 +18,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -24,12 +26,14 @@ import java.util.stream.Collectors;
 
 @Service
 public class SysNewsTypeServiceImpl extends BaseServiceImpl<Integer, SysNewsType> implements SysNewsTypeService {
-    @Autowired
+    @Resource
     private SysNewsTypeDao sysNewsTypeDao;
-    @Autowired
+    @Resource
     private SysNewsInformationDao informationDao;
-    @Autowired
+    @Resource
     private WebFeignService webFeignService;
+    @Resource
+    private SysConfigDao sysConfigDao;
 
     @Override
     public BaseDAO<Integer, SysNewsType> getDAO() {
@@ -61,12 +65,19 @@ public class SysNewsTypeServiceImpl extends BaseServiceImpl<Integer, SysNewsType
 
     public List<SysNewsType> listWithTree(Integer id, String memo,Integer userId,String organIds) {
         SysNewsType newsType = sysNewsTypeDao.get(id);
+        //获取需要排除的用户编号
+        String excludeUserIds = sysConfigDao.findConfigValue("exclude_user_ids");
+        String excludeFunctionIds = null;
+        if(StringUtils.isNotEmpty(excludeUserIds) && excludeUserIds.contains(userId.toString())){
+            //获取需要排除的功能点编号
+            excludeFunctionIds = sysConfigDao.findConfigValue("exclude_function_ids");
+        }
         List<SysNewsType> all = sysNewsTypeDao.findAll(null);
         String startTime = DateUtil.format(DateUtil.getFirstDayOfMonth(DateUtil.addMonths(new Date(), -1)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-        all.forEach(e -> {
-            List<SysNewsInformation> list = informationDao.queryBySubType(e.getId(), memo,organIds);
+        for (SysNewsType e : all) {
+            List<SysNewsInformation> list = informationDao.queryBySubType(e.getId(), memo,organIds,excludeFunctionIds);
             if (CollectionUtils.isEmpty(list)) {
-            	list = informationDao.queryBySubType(e.getId(), null,organIds);
+            	list = informationDao.queryBySubType(e.getId(), null,organIds,excludeFunctionIds);
             }
             Iterator<SysNewsInformation> iterator = list.iterator();
 			SysNewsInformation sni = null;
@@ -86,7 +97,7 @@ public class SysNewsTypeServiceImpl extends BaseServiceImpl<Integer, SysNewsType
                 }
     		}
             e.setInformationList(list);
-        });
+        }
         List<SysNewsType> treeMenus = all.stream()
                 .filter((e) -> e.getParentId().equals(newsType.getParentId()))
                 .map((menu) -> menu.setChildren(getChildren(menu, all)))

+ 3 - 0
cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml

@@ -313,6 +313,9 @@
 		<if test="memo != null and memo !=''">
 			AND memo_ = #{memo}
 		</if>
+		<if test="excludeFunctionIds != null and excludeFunctionIds !=''">
+			AND NOT FIND_IN_SET(id_,#{excludeFunctionIds})
+		</if>
 		<if test="organIds != null and organIds !=''">
 			AND (INTE_ARRAY(#{organIds},organ_id_list_) OR organ_id_list_ IS NULL OR organ_id_list_ = '')
 		</if>

+ 3 - 1
mec-application/src/main/java/com/ym/mec/student/controller/CloudStudyController.java

@@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Map;
+
 /**
  * @Author Joburgess
  * @Date 2021/8/11 0011
@@ -38,7 +40,7 @@ public class CloudStudyController extends BaseController {
 
     @ApiOperation("学员训练数据统计")
     @GetMapping("studentTrainData")
-    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+    public HttpResponseResult<Map<String, Object>> studentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
         queryInfo.setUserId(sysUserService.getUserId());
         return succeed(sysMusicCompareRecordService.studentTrainData(queryInfo));
     }

+ 2 - 1
mec-application/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.student.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
 import com.ym.mec.biz.service.SysUserService;
@@ -58,7 +59,7 @@ public class SysMusicCompareRecordController extends BaseController {
 
     @ApiOperation(value = "用户最后一次评测数据")
     @GetMapping("getLastEvaluationMusicalNotesPlayStats")
-    public HttpResponseResult getLastEvaluationMusicalNotesPlayStats(Long recordId){
+    public HttpResponseResult<JSONObject> getLastEvaluationMusicalNotesPlayStats(Long recordId){
         return succeed(sysMusicCompareRecordService.getLastEvaluationMusicalNotesPlayStats(sysUserService.getUserId(), recordId));
     }
 

+ 104 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysConfig.java

@@ -0,0 +1,104 @@
+package com.ym.mec.auth.api.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_config):
+ */
+public class SysConfig {
+
+	/**  */
+	private Long id;
+	
+	/** 参数名称 */
+	@ApiModelProperty(value = "参数名称", required = true)
+	private String paramName;
+	
+	/** 参数值 */
+	@ApiModelProperty(value = "参数值", required = true)
+	private String paranValue;
+	
+	/** 描述 */
+	@ApiModelProperty(value = "描述", required = true)
+	private String description;
+	
+	/** 创建时间 */
+	private java.util.Date createOn;
+	
+	/** 修改时间 */
+	private java.util.Date modifyOn;
+	
+	@ApiModelProperty(value = "消息组", required = true)
+	private String group;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setParamName(String paramName){
+		this.paramName = paramName;
+	}
+	
+	public String getParamName(){
+		return this.paramName;
+	}
+			
+	public void setParanValue(String paranValue){
+		this.paranValue = paranValue;
+	}
+	
+	public String getParanValue(){
+		return this.paranValue;
+	}
+
+	public <T> T getParanValue(Class<T> cla){
+		try {
+			return cla.cast(cla.getMethod("valueOf", String.class).invoke(cla.getInterfaces(),this.paranValue));
+		} catch (Exception e) {
+			return (T)this.paranValue.getClass();
+		}
+	}
+			
+	public void setDescription(String description){
+		this.description = description;
+	}
+	
+	public String getDescription(){
+		return this.description;
+	}
+			
+	public void setCreateOn(java.util.Date createOn){
+		this.createOn = createOn;
+	}
+	
+	public java.util.Date getCreateOn(){
+		return this.createOn;
+	}
+			
+	public void setModifyOn(java.util.Date modifyOn){
+		this.modifyOn = modifyOn;
+	}
+	
+	public java.util.Date getModifyOn(){
+		return this.modifyOn;
+	}
+			
+	public String getGroup() {
+		return group;
+	}
+
+	public void setGroup(String group) {
+		this.group = group;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 24 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysConfigDao.java

@@ -0,0 +1,24 @@
+package com.ym.mec.auth.dal.dao;
+
+import com.ym.mec.auth.api.entity.SysConfig;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysConfigDao extends BaseDAO<Long, SysConfig> {
+
+    /**
+     * @Author: Joburgess
+     * @Date: 2019/10/9
+     * @params [paramName]
+     * @return com.ym.mec.biz.dal.entity.SysConfig
+     * @describe 根据配置名称获取配置信息
+     */
+    SysConfig findByParamName(String paramName);
+
+    /**
+     * 获取value
+     * @param paramName
+     * @return
+     */
+    String findConfigValue(String paramName);
+	
+}

+ 9 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/CbsQrCodeScanServiceImpl.java

@@ -5,9 +5,11 @@ import com.dayaedu.cbs.openfeign.wrapper.qrcode.CbsQrCodeScanWrapper;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.core.service.CustomTokenServices;
+import com.ym.mec.auth.dal.dao.SysConfigDao;
 import com.ym.mec.auth.service.SysUserService;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.oauth2.provider.OAuth2Authentication;
 import org.springframework.stereotype.Service;
@@ -25,6 +27,8 @@ public class CbsQrCodeScanServiceImpl{
     private SysUserService sysUserService;
     @Resource
     private SysUserFeignService sysUserFeignService;
+    @Resource
+    private SysConfigDao sysConfigDao;
 
     public CbsQrCodeScanWrapper.UserInfo userInfo(CbsQrCodeScanWrapper.QrCodeScanUserInfoReq req) {
         CbsQrCodeScanWrapper.UserInfo userInfo = new CbsQrCodeScanWrapper.UserInfo();
@@ -41,6 +45,11 @@ public class CbsQrCodeScanServiceImpl{
         if (sysUser == null) {
             throw new BizException(HttpStatus.UNAUTHORIZED.value(), "用户不存在");
         }
+        //获取需要排除的用户编号
+        String excludeUserIds = sysConfigDao.findConfigValue("exclude_user_ids");
+        if(StringUtils.isNotEmpty(excludeUserIds) && excludeUserIds.contains(sysUser.getId().toString())){
+            throw new BizException("扫码登陆失败: 用户已锁定");
+        }
         //调用登陆接口
         HttpResponseResult<Map<String,Object>> result = sysUserFeignService.smsLogin(phone, "qr_teacher", UUID.randomUUID().toString(), "qr_teacher");
         if (result != null){

+ 21 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysConfigMapper.xml

@@ -0,0 +1,21 @@
+<?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.auth.dal.dao.SysConfigDao">
+
+	<resultMap type="com.ym.mec.auth.api.entity.SysConfig" id="SysConfig">
+		<result column="id_" property="id" />
+		<result column="param_name_" property="paramName" />
+		<result column="paran_value_" property="paranValue" />
+		<result column="description_" property="description" />
+		<result column="create_on_" property="createOn" />
+		<result column="modify_on_" property="modifyOn" />
+		<result column="group_" property="group" />
+	</resultMap>
+	<select id="findByParamName" resultMap="SysConfig">
+		SELECT * FROM sys_config WHERE param_name_ = #{paramName}
+	</select>
+    <select id="findConfigValue" resultType="java.lang.String">
+		SELECT paran_value_ FROM sys_config WHERE param_name_ = #{paramName}
+	</select>
+</mapper>

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

@@ -85,6 +85,8 @@ public class SysMusicCompareRecord extends BaseEntity {
 	//文件是否过期
 	private boolean expire;
 
+	private Integer subjectId;
+
 	public SysMusicCompareRecord(FeatureType feature) {
 		this.feature = feature;
 	}

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
@@ -41,7 +42,7 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
      * @param userId:
      * @return java.util.List<com.ym.mec.biz.dal.dto.MusicalNotesPlayStatDto>
      */
-    Object getLastEvaluationMusicalNotesPlayStats(Integer userId, Long recordId);
+    JSONObject getLastEvaluationMusicalNotesPlayStats(Integer userId, Long recordId);
 
     /**
      * @describe 云教练排行榜

+ 5 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java

@@ -120,10 +120,13 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                 if(bodyObject.containsKey("speed")){
                     userSoundInfoMap.get(phone).setSpeed(bodyObject.getIntValue("speed"));
                 }
-                List<Integer> subjectIds = sysMusicScoreAccompanimentDao.findSubjectByMusicScoreId(userSoundInfoMap.get(phone).getMusicScoreId(), null);
+                if(bodyObject.containsKey("subjectId")){
+                    userSoundInfoMap.get(phone).setSubjectId(bodyObject.getIntValue("subjectId"));
+                }
+                /*List<Integer> subjectIds = sysMusicScoreAccompanimentDao.findSubjectByMusicScoreId(userSoundInfoMap.get(phone).getMusicScoreId(), null);
                 if(!CollectionUtils.isEmpty(subjectIds)){
                     userSoundInfoMap.get(phone).setSubjectId(subjectIds.get(0));
-                }
+                }*/
                 userSoundInfoMap.get(phone).setMeasureXmlInfoMap(musicXmlInfos.stream().collect(Collectors.groupingBy(MusicPitchDetailDto::getMeasureIndex)));
                 musicXmlInfos.forEach(e->userSoundInfoMap.get(phone).getMusicalNotePitchMap().put(e.getMusicalNotesIndex(), e.getFrequency()));
                 for (Map.Entry<Integer, List<MusicPitchDetailDto>> userMeasureXmlInfoEntry : userSoundInfoMap.get(phone).getMeasureXmlInfoMap().entrySet()) {

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

@@ -108,6 +108,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 			return;
 		}
 		SysMusicCompareRecord sysMusicCompareRecord = new SysMusicCompareRecord();
+		sysMusicCompareRecord.setSubjectId(soundCompareInfo.getSubjectId());
 		sysMusicCompareRecord.setUserId(user.getId());
 		sysMusicCompareRecord.setSysMusicScoreId(soundCompareInfo.getMusicScoreId());
 		sysMusicCompareRecord.setHeardLevel(soundCompareInfo.getHeardLevel());
@@ -165,7 +166,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	}
 
 	@Override
-	public Object getLastEvaluationMusicalNotesPlayStats(Integer userId, Long recordId) {
+	public JSONObject getLastEvaluationMusicalNotesPlayStats(Integer userId, Long recordId) {
 		SysMusicCompareRecord userLastEvaluationData;
 		if(Objects.nonNull(recordId)){
 			userLastEvaluationData = sysMusicCompareRecordDao.get(recordId);
@@ -181,6 +182,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 
 		JSONObject jsonObject = JSON.parseObject(userLastEvaluationData.getScoreData());
 		jsonObject.put("recordId", userLastEvaluationData.getId());
+		jsonObject.put("subjectId", userLastEvaluationData.getSubjectId());
 		jsonObject.put("score", userLastEvaluationData.getScore());
 		jsonObject.put("cadence", userLastEvaluationData.getCadence());
 		jsonObject.put("intonation", userLastEvaluationData.getIntonation());

+ 5 - 4
mec-biz/src/main/resources/config/mybatis/LessonExaminationMapper.xml

@@ -32,10 +32,11 @@
     </update>
     <update id="updateStandardNum">
         update lesson_examination le
-            left join (
-                select lesson_examination_id_,COUNT(distinct user_id_) num from student_lesson_examination_detail
-                where lesson_examination_id_ = #{lessonExaminationId}
-                group by user_id_ HAVING SUM(actual_avg_score_) >= 60) sle ON sle.lesson_examination_id_ = le.id_
+            left join (select lesson_examination_id_,COUNT(user_id_) num from (
+            select lesson_examination_id_,user_id_ from student_lesson_examination_detail
+            where lesson_examination_id_ = #{lessonExaminationId}
+            group by user_id_ HAVING SUM(actual_avg_score_) >= 60) le
+            group by lesson_examination_id_) sle ON sle.lesson_examination_id_ = le.id_
         set le.standard_num_ = sle.num
         where le.id_ = #{lessonExaminationId} AND num > 0
     </update>

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

@@ -297,7 +297,9 @@
         student_course_homework sch
         LEFT JOIN sys_user su ON sch.user_id_=su.id_
         <where>
-                sch.course_schedule_id_=#{courseScheduleId}
+            <if test="courseScheduleId != null">
+                AND sch.course_schedule_id_=#{courseScheduleId}
+            </if>
             <if test="homeworkId!=null">
                 AND sch.course_homework_id_=#{homeworkId}
             </if>

+ 12 - 4
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -31,6 +31,7 @@
 		<result column="create_time_" property="createTime" />
 		<result column="part_index_" property="partIndex" />
         <result column="tenant_id_" property="tenantId"/>
+        <result column="subject_id_" property="subjectId"/>
 	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->
@@ -47,15 +48,16 @@
 	<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_,video_file_path_,device_type_,client_id_,play_time_,speed_,monday_,
-												source_time_,feature_,create_time_,create_date_,update_time_,part_index_,tenant_id_)
+												source_time_,feature_,create_time_,create_date_,update_time_,part_index_,tenant_id_,subject_id_)
 		VALUES(#{id},#{userId},#{sysMusicScoreId},#{heardLevel,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{behaviorId},#{scoreData},
 		       #{score},#{intonation},#{cadence},#{integrity},
 		       #{recordFilePath},#{videoFilePath},#{deviceType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{clientId},#{playTime},#{speed},#{monday},
-		       #{sourceTime},#{feature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{createTime}, #{createDate}, NOW(),#{partIndex},#{tenantId})
+		       #{sourceTime},#{feature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{createTime}, #{createDate}, NOW(),#{partIndex},#{tenantId},#{subjectId})
 	</insert>
 	<insert id="init">
 		insert into sys_music_compare_day_data (user_id_, day_, train_num_, train_time_, tenant_id_)
-		select smcr.user_id_,DATE_FORMAT(smcr.create_time_,'%Y-%m-%d'),COUNT(smcr.id_),SUM(smcr.play_time_),smcr.tenant_id_ from sys_music_compare_record smcr
+		select smcr.user_id_,DATE_FORMAT(smcr.create_time_,'%Y-%m-%d'),COUNT(smcr.id_),SUM(smcr.play_time_),smcr.tenant_id_
+		from sys_music_compare_record smcr
 		where smcr.create_date_ = #{date}
 		group by smcr.create_date_,smcr.user_id_;
 	</insert>
@@ -63,6 +65,9 @@
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SysMusicCompareRecord">
 		UPDATE sys_music_compare_record <set>
+		<if test="subjectId != null">
+			subject_id_ = #{subjectId},
+		</if>
 		<if test="userId != null">
 			user_id_ = #{userId},
 		</if>
@@ -138,6 +143,9 @@
 			<if test="userId!=null">
 				AND smcr.user_id_=#{userId}
 			</if>
+			<if test="subjectId != null">
+				AND smcr.subject_id_=#{subjectId}
+			</if>
 			<if test="featureType != null">
 				AND smcr.feature_ = #{featureType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 			</if>
@@ -157,7 +165,7 @@
 			LOCATE('musicalNotesPlayStats', smcr.score_data_) notes_data_index_,
 		       smcr.score_, smcr.intonation_, smcr.cadence_,
 		       smcr.integrity_, smcr.record_file_path_, smcr.video_file_path_, smcr.client_id_, smcr.device_type_, smcr.play_time_,
-		       smcr.monday_, smcr.create_time_,
+		       smcr.monday_, smcr.create_time_,smcr.subject_id_,
 			sms.name_ sys_music_score_name_
 		FROM sys_music_compare_record smcr
 		LEFT JOIN sys_music_score sms on smcr.sys_music_score_id_ = sms.id_