Bläddra i källkod

Merge remote-tracking branch 'origin/saas' into saas

hgw 3 år sedan
förälder
incheckning
f3d5aba0fb

+ 30 - 25
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -356,7 +356,7 @@ public class UserChannelContext {
 		
 		if (noteAnalysis.getMusicalNotesIndex() >= 0 && noteAnalysis.getMusicalNotesIndex() <= getTotalMusicNoteIndex(null)) {
 			
-			LOGGER.info("user:{}  delayProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  amplitude:{}  time:{}", user, delayProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
+			LOGGER.debug("user:{}  delayProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  amplitude:{}  time:{}", user, delayProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
 			
 			ChunkAnalysis chunkAnalysis = new ChunkAnalysis(playTime - durationTime, playTime, playFrequency, splDb, power, amplitude);
 			
@@ -406,7 +406,7 @@ public class UserChannelContext {
 				
 				evaluateForNote(musicXmlNote, noteAnalysis);
 
-				LOGGER.info("当前音符下标[{}] 预计频率:{} 实际频率:{} 节奏:{}", noteAnalysis.getMusicalNotesIndex(), musicXmlNote.getFrequency(), noteAnalysis.getPlayFrequency(),
+				LOGGER.debug("当前音符下标[{}] 预计频率:{} 实际频率:{} 节奏:{}", noteAnalysis.getMusicalNotesIndex(), musicXmlNote.getFrequency(), noteAnalysis.getPlayFrequency(),
 						noteAnalysis.isTempo());
 				
 				doneNoteAnalysisList.add(noteAnalysis);
@@ -462,7 +462,7 @@ public class UserChannelContext {
 			sectionAnalysis.setDurationTime(noteAnalysisList.stream().mapToDouble(t -> t.getDurationTime()).sum());
 			sectionAnalysis.setScore(score);
 
-			LOGGER.info("小节评分:{}",sectionAnalysis);
+			LOGGER.debug("小节评分:{}",sectionAnalysis);
 			doneSectionAnalysisList.add(sectionAnalysis);
 		}
 		
@@ -474,6 +474,7 @@ public class UserChannelContext {
 		Map<String, Integer> result = new HashMap<String, Integer>();
 		
 		result.put("playTime", (int) doneNoteAnalysisList.stream().mapToDouble(t -> t.getDurationTime()).sum());
+        result.put("recordId", recordId.intValue());
 		
 		// 取出需要评测的音符
 		List<NoteAnalysis> noteAnalysisList = doneNoteAnalysisList.stream().filter(t -> t.isIgnore() == false).collect(Collectors.toList());
@@ -498,7 +499,6 @@ public class UserChannelContext {
 			result.put("cadence", tempoScore);
 			result.put("intonation", intonationScore);
 			result.put("integrity", integrityScore);
-	        result.put("recordId", recordId.intValue());
 
 			int score = socre / noteAnalysisList.size();
 
@@ -507,6 +507,11 @@ public class UserChannelContext {
 				score = tempoScore;
 			}
 			result.put("score", score);
+		} else {
+			result.put("cadence", 0);
+			result.put("intonation", 0);
+			result.put("integrity", 0);
+			result.put("score", 0);
 		}
 		return result;
 	}
@@ -570,10 +575,10 @@ public class UserChannelContext {
 
 				if (playDurationTime * 100 / durationTime < hardLevel.getNotPlayRange()) {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.NOT_PLAY);
-					LOGGER.info("未演奏:{}", playDurationTime * 100 / durationTime);
+					LOGGER.debug("未演奏:{}", playDurationTime * 100 / durationTime);
 				} else if (playDurationTime * 100 / durationTime < hardLevel.getIntegrityRange()) {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.INTEGRITY_WRONG);
-					LOGGER.info("完整度不足:{}", playDurationTime * 100 / durationTime);
+					LOGGER.debug("完整度不足:{}", playDurationTime * 100 / durationTime);
 				} else if (!noteAnalysis.isTempo()) {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.CADENCE_WRONG);
 				} else if (notePlayResult.getStatus() == false) {
@@ -628,7 +633,7 @@ public class UserChannelContext {
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 		
-		LOGGER.info("------------TimeStamp:{}  Duration:{}  floatingRange:{}  StartTime:{}  EndTime:{}------------", musicXmlNote.getTimeStamp(), musicXmlNote.getDuration(), floatingRange, startTime, endTime);
+		LOGGER.debug("------------TimeStamp:{}  Duration:{}  floatingRange:{}  StartTime:{}  EndTime:{}------------", musicXmlNote.getTimeStamp(), musicXmlNote.getDuration(), floatingRange, startTime, endTime);
 		
 		List<ChunkAnalysis> chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(startTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(endTime)).collect(Collectors.toList());
 		
@@ -637,7 +642,7 @@ public class UserChannelContext {
 		
 		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 
-		LOGGER.info("------------ correctedStartTime:{}  correctedEndTime:{}------------", correctedStartTime, correctedEndTime);
+		LOGGER.debug("------------ correctedStartTime:{}  correctedEndTime:{}------------", correctedStartTime, correctedEndTime);
 		
 		//根据完整度取部分有效信号
 		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
@@ -648,7 +653,7 @@ public class UserChannelContext {
 		
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
 		
-		LOGGER.info("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkAnalysisList.get(chunkAnalysisList.size() - 1)
+		LOGGER.debug("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkAnalysisList.get(chunkAnalysisList.size() - 1)
 				.getEndTime());
 		
 		List<ChunkAnalysis> chunkList = new ArrayList<ChunkAnalysis>(chunkAnalysisList);
@@ -737,7 +742,7 @@ public class UserChannelContext {
 						if(!((noteFrequencyRange.getMinFrequency() < chunkAnalysis.getFrequency() * 2 && chunkAnalysis.getFrequency() * 2 < noteFrequencyRange.getMaxFrequency())
 								|| (noteFrequencyRange.getMinFrequency() < chunkAnalysis.getFrequency() / 2 && chunkAnalysis.getFrequency() / 2 < noteFrequencyRange.getMaxFrequency()))){
 							tempo = false;
-							LOGGER.info("节奏错误原因:不是同一个音[{}]:{}-{}", chunkAnalysis.getFrequency(), noteFrequencyRange.getMinFrequency(), noteFrequencyRange.getMaxFrequency());
+							LOGGER.debug("节奏错误原因:不是同一个音[{}]:{}-{}", chunkAnalysis.getFrequency(), noteFrequencyRange.getMinFrequency(), noteFrequencyRange.getMaxFrequency());
 							break;
 						}
 					}
@@ -745,7 +750,7 @@ public class UserChannelContext {
 						if ((i + 1) / chunkAnalysisList.size() < hardLevel.getIntegrityRange()) {
 							if (unplayedSize > 0) {
 								tempo = false;
-								LOGGER.info("节奏错误原因:信号不连续");
+								LOGGER.debug("节奏错误原因:信号不连续");
 								break;
 							}
 						}
@@ -763,13 +768,13 @@ public class UserChannelContext {
 			// 判断进入时间点
 			if(firstPeakIndex * 100 /chunkAnalysisList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())){
 				tempo = false;
-				LOGGER.info("节奏错误原因:进入时间点太晚");
+				LOGGER.debug("节奏错误原因:进入时间点太晚");
 			}else{
 				//判断是否与上一个音延续下来的
 				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.info("节奏错误原因:上一个音[{}]延续下来导致的", lastChunkAnalysis.getFrequency());
+						LOGGER.debug("节奏错误原因:上一个音[{}]延续下来导致的", lastChunkAnalysis.getFrequency());
 					}
 				}
 			}
@@ -785,7 +790,7 @@ public class UserChannelContext {
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 		
-		LOGGER.info("------------TimeStamp:{}  floatingRange:{}  StartTime:{}  EndTime:{}------------", musicXmlNote.getTimeStamp(), floatingRange, startTime, endTime);
+		LOGGER.debug("------------TimeStamp:{}  floatingRange:{}  StartTime:{}  EndTime:{}------------", musicXmlNote.getTimeStamp(), floatingRange, startTime, endTime);
 		
 		List<ChunkAnalysis> chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(startTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(endTime)).collect(Collectors.toList());
 		
@@ -804,12 +809,12 @@ public class UserChannelContext {
 		
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
 		
-		LOGGER.info("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkList.get(chunkList.size() - 1)
+		LOGGER.debug("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkList.get(chunkList.size() - 1)
 				.getEndTime());
 
 		if (musicXmlNote.getFrequency() == -1) {// 休止符
 			
-			LOGGER.info("--Amplitude:{}  Denominator:{}",chunkList.stream().map(t -> t).collect(Collectors.toList()), musicXmlNote.getDenominator());
+			LOGGER.debug("--Amplitude:{}  Denominator:{}",chunkList.stream().map(t -> t).collect(Collectors.toList()), musicXmlNote.getDenominator());
 			return chunkList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).count() <= 0;
 		}
 		
@@ -827,7 +832,7 @@ public class UserChannelContext {
 
 		chunkAmplitudeList.add(0, lastChunkAnalysis.getAmplitude());
 		
-		LOGGER.info("--Amplitude:{}  Denominator:{}",chunkAmplitudeList.stream().map(t -> t).collect(Collectors.toList()), musicXmlNote.getDenominator());
+		LOGGER.debug("--Amplitude:{}  Denominator:{}",chunkAmplitudeList.stream().map(t -> t).collect(Collectors.toList()), musicXmlNote.getDenominator());
 		
 		// 检测是否有多个波峰
 		boolean tempo = false;
@@ -867,7 +872,7 @@ public class UserChannelContext {
 		if (tempo) {
 			// 判断进入时间点
 			if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) * 2){
-				LOGGER.info("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
+				LOGGER.debug("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
 				tempo = false;
 			}
 		}
@@ -878,17 +883,17 @@ public class UserChannelContext {
 	private double queryFirstNoteStartTime(List<ChunkAnalysis> chunkAnalysisList, MusicXmlNote musicXmlNote) {
 		
 		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
-			LOGGER.info("找不到数据,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+			LOGGER.debug("找不到数据,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
 			return musicXmlNote.getTimeStamp() + dynamicOffset;
 		}
 		
 		if (percussionList.contains(subjectId)) {
 			Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).findFirst();
 			if(optional.isPresent()){
-				LOGGER.info("范围内查询到信号,correctedStartTime:{}", optional.get().getStartTime());
+				LOGGER.debug("范围内查询到信号,correctedStartTime:{}", optional.get().getStartTime());
 				return optional.get().getStartTime();
 			}else{
-				LOGGER.info("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+				LOGGER.debug("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
 				return musicXmlNote.getTimeStamp() + dynamicOffset;
 			}
 		}
@@ -899,10 +904,10 @@ public class UserChannelContext {
 			if((int)preMusicXmlNote.getFrequency() == (int)musicXmlNote.getFrequency()){
 				Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= MIN_FREQUECY).findFirst();
 				if(optional.isPresent()){
-					LOGGER.info("与上一个音同音,有断开,correctedStartTime:{}", optional.get().getStartTime());
+					LOGGER.debug("与上一个音同音,有断开,correctedStartTime:{}", optional.get().getStartTime());
 					return optional.get().getEndTime();
 				}else{
-					LOGGER.info("与上一个音同音,未断开,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+					LOGGER.debug("与上一个音同音,未断开,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
 					return musicXmlNote.getTimeStamp() + dynamicOffset;
 				}
 			}
@@ -915,12 +920,12 @@ public class UserChannelContext {
 		for (ChunkAnalysis ca : chunkAnalysisList) {
 			noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, ca.getFrequency());
 			if (standardNote.equals(noteFrequencyRange)) {
-				LOGGER.info("范围内查询到信号,correctedStartTime:{}", ca.getStartTime());
+				LOGGER.debug("范围内查询到信号,correctedStartTime:{}", ca.getStartTime());
 				return ca.getStartTime();
 			}
 		}
 		
-		LOGGER.info("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+		LOGGER.debug("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
 
 		//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
 		return musicXmlNote.getTimeStamp() + dynamicOffset;

+ 20 - 0
audio-analysis/src/main/java/com/yonge/netty/entity/MusicXmlBasicInfo.java

@@ -12,6 +12,8 @@ public class MusicXmlBasicInfo {
 	private Integer id;
 
 	private Integer subjectId;
+	
+	private String clientId;
 
 	private Integer detailId;
 
@@ -22,6 +24,8 @@ public class MusicXmlBasicInfo {
 	private String behaviorId;
 
 	private String platform;
+	
+	private String partIndex;
 
 	private int speed;
 
@@ -51,6 +55,14 @@ public class MusicXmlBasicInfo {
 		this.subjectId = subjectId;
 	}
 
+	public String getClientId() {
+		return clientId;
+	}
+
+	public void setClientId(String clientId) {
+		this.clientId = clientId;
+	}
+
 	public Integer getDetailId() {
 		return detailId;
 	}
@@ -91,6 +103,14 @@ public class MusicXmlBasicInfo {
 		this.platform = platform;
 	}
 
+	public void setPartIndex(String partIndex) {
+		this.partIndex = partIndex;
+	}
+
+	public String getPartIndex() {
+		return partIndex;
+	}
+
 	public int getSpeed() {
 		return speed;
 	}

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

@@ -144,9 +144,10 @@ public class AudioCompareHandler implements MessageHandler {
 				sysMusicCompareRecord.setUserId(Integer.parseInt(user));
 				sysMusicCompareRecord.setSysMusicScoreId(musicXmlBasicInfo.getExamSongId());
 				sysMusicCompareRecord.setBehaviorId(musicXmlBasicInfo.getBehaviorId());
-				//sysMusicCompareRecord.setClientId();
+				sysMusicCompareRecord.setClientId(musicXmlBasicInfo.getClientId());
 				sysMusicCompareRecord.setDeviceType(DeviceTypeEnum.valueOf(musicXmlBasicInfo.getPlatform()));
 				sysMusicCompareRecord.setSpeed(musicXmlBasicInfo.getSpeed());
+				sysMusicCompareRecord.setPartIndex(musicXmlBasicInfo.getPartIndex());
 				
 				MusicXmlNote musicXmlNote = musicXmlBasicInfo.getMusicXmlInfos().stream().max(Comparator.comparing(MusicXmlNote::getTimeStamp)).get();
 				sysMusicCompareRecord.setSourceTime((float) ((musicXmlNote.getTimeStamp()+musicXmlNote.getDuration())/1000));
@@ -300,12 +301,12 @@ public class AudioCompareHandler implements MessageHandler {
 			
 			if(totalLength > beatByteLength){
 				if(beatByteLength % 2 != 0){
-					LOGGER.info("**************奇数*****************");
+					LOGGER.debug("**************奇数*****************");
 					beatByteLength--;
 				}
 				channelContext.setChannelBufferBytes(ArrayUtil.extractByte(channelContext.getChannelBufferBytes(), beatByteLength, totalLength - 1));
 				
-				LOGGER.info("--------Length:{}  Times[{} + {}]:{}--------", waveFileProcessor.getFile().length() - channelContext.getChannelBufferBytes().length, channelContext.getOffsetMS() , channelContext.getBeatDuration(),(waveFileProcessor.getFile().length() - channelContext.getChannelBufferBytes().length) * 1000 /audioFormat.getSampleRate()/2);
+				LOGGER.debug("--------Length:{}  Times[{} + {}]:{}--------", waveFileProcessor.getFile().length() - channelContext.getChannelBufferBytes().length, channelContext.getOffsetMS() , channelContext.getBeatDuration(),(waveFileProcessor.getFile().length() - channelContext.getChannelBufferBytes().length) * 1000 /audioFormat.getSampleRate()/2);
 				
 				channelContext.setOffsetMS(0);
 				channelContext.setBeatDuration(0);

+ 2 - 2
audio-analysis/src/main/resources/logback-spring.xml

@@ -31,14 +31,14 @@
 
 	<!--开发环境:打印控制台 -->
 	<springProfile name="dev">
-		<root level="INFO">
+		<root level="dev">
 			<appender-ref ref="stdout" />
 			<appender-ref ref="file" />
 		</root>
 	</springProfile>
 	
 	<springProfile name="test">
-		<root level="INFO">
+		<root level="dev">
 			<appender-ref ref="stdout" />
 			<appender-ref ref="file" />
 		</root>

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

@@ -72,6 +72,8 @@ public class SysMusicCompareRecord extends BaseEntity {
 	private int speed = 90;
 
 	private String clientId;
+	
+	private String partIndex;
 
 	public SysMusicCompareRecord() {
 	}
@@ -256,6 +258,14 @@ public class SysMusicCompareRecord extends BaseEntity {
 		return this.createTime;
 	}
 			
+	public String getPartIndex() {
+		return partIndex;
+	}
+
+	public void setPartIndex(String partIndex) {
+		this.partIndex = partIndex;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -214,4 +214,14 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
     List<StudentPaymentOrder> queryByDealStatus(String musicGroupId, OrderTypeEnum orderType, DealStatusEnum status);
 
     StudentPaymentOrder lockOrder(Long paymentOrderId);
+
+    /**
+    * @description: 退还账户余额和优惠券
+     * @param studentPaymentOrder
+     * @param memo
+    * @return void
+    * @author zx
+    * @date 2022/1/20 16:23
+    */
+    void returnBalanceAndCoupon(StudentPaymentOrder studentPaymentOrder,String memo);
 }

+ 12 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserCashAccountDetailService.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service;
 import java.math.BigDecimal;
 
 import com.ym.mec.biz.dal.dto.CashAccountDetail;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
@@ -13,11 +14,7 @@ import com.ym.mec.common.service.BaseService;
 
 public interface SysUserCashAccountDetailService extends BaseService<Long, SysUserCashAccountDetail> {
 	
-	final static String MUSIC_GROUP = "group";
-	
-	final static String ORGAN = "organ";
-	
-	final static String COURSE_SCHEDULE = "cs";
+	String ORGAN = "organ";
 
 	SysUserCashAccountDetail queryDetailByTransNo(String transNo);
 
@@ -44,4 +41,14 @@ public interface SysUserCashAccountDetailService extends BaseService<Long, SysUs
 	 */
 	PageInfo<SysUserCashAccountDetail> queryAccountDetail(CashAccountDetail queryInfo);
 
+	/**
+	* @description: 付款成功后插入交易明细
+	 * @param studentPaymentOrder
+	 * @param comment
+	* @return void
+	* @author zx
+	* @date 2022/1/20 16:14
+	*/
+	void saveSysUserCashAccountDetail(StudentPaymentOrder studentPaymentOrder, String comment);
+
 }

+ 4 - 39
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java

@@ -228,12 +228,8 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 		studentPaymentOrderService.update(studentPaymentOrder);
 
 		if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
-
-			if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
-				sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(),
-						PlatformCashAccountDetailTypeEnum.REFUNDS, "购买会员支付失败");
-			}
-			sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
+			//退还优惠券和余额
+			studentPaymentOrderService.returnBalanceAndCoupon(studentPaymentOrder,"购买会员支付失败");
 			return true;
 		}
 
@@ -261,40 +257,8 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 			cloudCoachPaymentProgram.setPaymentUserNum(cloudCoachPaymentProgram.getPaymentUserNum() + 1);
 			cloudCoachPaymentProgramService.update(cloudCoachPaymentProgram);
 			// 插入交易明细
-			BigDecimal amount = studentPaymentOrder.getActualAmount();
-			if (amount.compareTo(BigDecimal.ZERO) > 0) {
-				SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
-				// 充值
-				SysUserCashAccountDetail rechargeDetail = new SysUserCashAccountDetail();
-				rechargeDetail.setAmount(amount);
-				rechargeDetail.setBalance(cashAccount.getBalance().add(amount));
-				rechargeDetail.setComment("缴费前充值");
-				rechargeDetail.setCreateTime(nowDate);
-				rechargeDetail.setStatus(DealStatusEnum.SUCCESS);
-				rechargeDetail.setTransNo(studentPaymentOrder.getTransNo());
-				rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
-				rechargeDetail.setUpdateTime(nowDate);
-				rechargeDetail.setUserId(userId);
-				rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
-				rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
-				rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
-				sysUserCashAccountDetailService.insert(rechargeDetail);
+			sysUserCashAccountDetailService.saveSysUserCashAccountDetail(studentPaymentOrder,"购买会员");
 
-				// 缴费
-				SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
-				paymentDetail.setAmount(amount.negate());
-				paymentDetail.setBalance(cashAccount.getBalance());
-				paymentDetail.setComment("购买会员");
-				paymentDetail.setCreateTime(nowDate);
-				paymentDetail.setStatus(DealStatusEnum.SUCCESS);
-				paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
-				paymentDetail.setType(PlatformCashAccountDetailTypeEnum.PAY_FEE);
-				paymentDetail.setUpdateTime(nowDate);
-				paymentDetail.setUserId(userId);
-				rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
-				sysUserCashAccountDetailService.insert(paymentDetail);
-			}
-//
 			try {
 				contractService.transferProduceContract(userId, null, CourseViewTypeEnum.MEMBER_FEE);
 			} catch (Exception e) {
@@ -304,6 +268,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 		return true;
 	}
 
+
 	@Override
 	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
 	public HttpResponseResult ActiveBuy(Integer userId, Integer memberRankId, PeriodEnum month, BigDecimal amount, boolean isUseBalance, Integer buyNum, int giveNum, int activeRemark, String remark,boolean repay) throws Exception {

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -894,5 +894,15 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         return studentPaymentOrderDao.lockOrder(paymentOrderId);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void returnBalanceAndCoupon(StudentPaymentOrder studentPaymentOrder,String memo){
+        if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+            sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(),
+                    PlatformCashAccountDetailTypeEnum.REFUNDS, memo);
+        }
+        sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
+    }
+
 
 }

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

@@ -166,6 +166,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		jsonObject.put("integrity", userLastEvaluationData.getIntegrity());
 		jsonObject.put("heardLevel", userLastEvaluationData.getHeardLevel());
 		jsonObject.put("videoFilePath", userLastEvaluationData.getVideoFilePath());
+		jsonObject.put("partIndex", userLastEvaluationData.getPartIndex());
 
 		SysMusicScore sysMusicScore = sysMusicScoreDao.get(userLastEvaluationData.getSysMusicScoreId());
 		if(Objects.nonNull(sysMusicScore)){

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountDetailServiceImpl.java

@@ -4,6 +4,7 @@ import java.math.BigDecimal;
 import java.util.*;
 
 import com.ym.mec.biz.dal.dto.CashAccountDetail;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.util.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -100,4 +101,43 @@ public class SysUserCashAccountDetailServiceImpl extends BaseServiceImpl<Long, S
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+	public void saveSysUserCashAccountDetail(StudentPaymentOrder studentPaymentOrder,String comment){
+		BigDecimal amount = studentPaymentOrder.getActualAmount();
+		if (amount.compareTo(BigDecimal.ZERO) > 0) {
+			Date nowDate = new Date();
+			SysUserCashAccount cashAccount = sysUserCashAccountService.get(studentPaymentOrder.getUserId());
+			// 充值
+			SysUserCashAccountDetail rechargeDetail = new SysUserCashAccountDetail();
+			rechargeDetail.setAmount(amount);
+			rechargeDetail.setBalance(cashAccount.getBalance().add(amount));
+			rechargeDetail.setComment("缴费前充值");
+			rechargeDetail.setCreateTime(nowDate);
+			rechargeDetail.setStatus(DealStatusEnum.SUCCESS);
+			rechargeDetail.setTransNo(studentPaymentOrder.getTransNo());
+			rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
+			rechargeDetail.setUpdateTime(nowDate);
+			rechargeDetail.setUserId(studentPaymentOrder.getUserId());
+			rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+			rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
+			rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
+			this.insert(rechargeDetail);
+
+			// 缴费
+			SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
+			paymentDetail.setAmount(amount.negate());
+			paymentDetail.setBalance(cashAccount.getBalance());
+			paymentDetail.setComment(comment);
+			paymentDetail.setCreateTime(nowDate);
+			paymentDetail.setStatus(DealStatusEnum.SUCCESS);
+			paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
+			paymentDetail.setType(PlatformCashAccountDetailTypeEnum.PAY_FEE);
+			paymentDetail.setUpdateTime(nowDate);
+			paymentDetail.setUserId(studentPaymentOrder.getUserId());
+			rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+			this.insert(paymentDetail);
+		}
+	}
 }

+ 20 - 2
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -29,6 +29,7 @@
 		<result column="feature_" property="feature" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
 		<result column="monday_" property="monday"/>
 		<result column="create_time_" property="createTime" />
+		<result column="part_index_" property="partIndex" />
         <result column="tenant_id_" property="tenantId"/>
 	</resultMap>
 
@@ -46,11 +47,11 @@
 	<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_,update_time_,tenant_id_)
+												source_time_,feature_,create_time_,update_time_,part_index_,tenant_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}, NOW(), NOW(),#{tenantId})
+		       #{sourceTime},#{feature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, NOW(), NOW(),#{partIndex},#{tenantId})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -104,6 +105,9 @@
 		<if test="monday != null">
 			monday_ = #{monday},
 		</if>
+		<if test="partIndex != null">
+			part_index_ = #{partIndex},
+		</if>
 		<if test="feature!=null">
 			feature_ = #{feature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 		</if>
@@ -259,6 +263,16 @@
 		<include refid="queryMusicGroupStudentTrainDataConditon"/>
 	</select>
 
+	<select id="queryStudentTrainData" resultType="com.ym.mec.biz.dal.dto.EduOrganStudentListDto">
+		SELECT
+			user_id_ studentId,
+			COUNT(DISTINCT behavior_id_) cloudStudyUseNum,
+			SUM(play_time_) cloudStudyUseTime
+		FROM
+			sys_music_compare_record
+		GROUP BY
+			user_id_
+	</select>
 	<resultMap id="CountStudentTrainDataDto" type="com.ym.mec.biz.dal.dto.CountStudentTrainDataDto">
 		<result property="trainNum" column="train_num_"/>
 		<result property="recordNum" column="record_num_"/>
@@ -352,10 +366,12 @@
 						LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
 				WHERE
 					su.del_flag_ = 0
+					<if test="organIds!=null and organIds.size()>0">
 						AND su.organ_id_ IN
 						<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
 							#{organId}
 						</foreach>
+					</if>
 				GROUP BY
 					user_id_
 				HAVING
@@ -377,10 +393,12 @@
 						LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
 				WHERE
 					su.del_flag_ = 0
+					<if test="organIds!=null and organIds.size()>0">
 						AND su.organ_id_ IN
 						<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
 							#{organId}
 						</foreach>
+					</if>
 				GROUP BY
 					user_id_
 				HAVING