Jelajahi Sumber

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

yonge 3 tahun lalu
induk
melakukan
01036c58ad
22 mengubah file dengan 404 tambahan dan 514 penghapusan
  1. 30 25
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  2. 20 0
      audio-analysis/src/main/java/com/yonge/netty/entity/MusicXmlBasicInfo.java
  3. 4 3
      audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java
  4. 2 2
      audio-analysis/src/main/resources/logback-spring.xml
  5. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java
  6. 20 12
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java
  7. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  8. 12 5
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserCashAccountDetailService.java
  9. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantOrderRecordService.java
  10. 41 82
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  11. 28 81
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java
  12. 5 40
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  13. 71 147
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java
  14. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  15. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  16. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountDetailServiceImpl.java
  17. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java
  18. 68 105
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java
  19. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  20. 20 2
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  21. 1 1
      mec-common/common-core/src/main/java/com/ym/mec/common/page/WrapperUtil.java
  22. 1 6
      mec-web/src/main/java/com/ym/mec/web/controller/CloudTeacherOrderController.java

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

+ 20 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java

@@ -6,9 +6,9 @@ import com.ym.mec.biz.dal.page.CloudTeacherAddQueryInfo;
 import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
-import com.ym.mec.thirdparty.yqpay.Msg;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -39,6 +39,8 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
      */
     CloudTeacher addStudentCloudTeacher(CloudTeacherOrder cloudTeacherOrder);
 
+    Date calcCloudTeacherOrderTime(CloudTeacherOrder cloudTeacherOrder, Date startTime, Date endTime);
+
     /**
      * 获取乐团云教练订单
      *
@@ -54,10 +56,11 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
      * @param studentId
      * @return
      */
-    List<CloudTeacherOrder> getStudentCloudTeacherOrder(Integer studentId,String musicGroupId);
+    List<CloudTeacherOrder> getStudentCloudTeacherOrder(Integer studentId, String musicGroupId);
 
     /**
      * 退云教练
+     *
      * @param cloudTeacherOrders
      * @param refundAmount
      * @return
@@ -66,30 +69,34 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
 
     /**
      * 退云教练
+     *
      * @param order
      * @param refundAmount
      * @return
      */
     Boolean quitCloudTeacherOrder(CloudTeacherOrder order, BigDecimal refundAmount);
-	
-	/**
-	 * 根据studentPaymentOrder表id查询对象
-	 * @param orderId
-	 * @return
-	 */
-	CloudTeacherOrder queryByOrderId(Long orderId);
-    
+
+    /**
+     * 根据studentPaymentOrder表id查询对象
+     *
+     * @param orderId
+     * @return
+     */
+    CloudTeacherOrder queryByOrderId(Long orderId);
+
     /**
      * 根据订单编号查询订单详情
+     *
      * @param orderId
      * @return
      */
     CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId);
 
-    List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds,Boolean isMusicMember);
+    List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds, Boolean isMusicMember);
 
     /**
      * 获取学员购买的云教练活动订单
+     *
      * @param userId
      * @param activeRemark
      * @param remark
@@ -99,12 +106,13 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
 
     /**
      * 支付未激活用户
+     *
      * @param cloudTeacherStudents 选择中用户清单
      * @return 是否成功
      */
     Map<String, Object> pay(List<CloudTeacherStudent> cloudTeacherStudents) throws Exception;
 
-    Boolean payCheck(String orderNo) throws Exception;
+    Boolean payCheck(String orderNo);
 
     PageInfo<CloudTeacherStudent> queryRecord(CloudTeacherOrderQueryInfo cloudTeacherOrderQueryInfo);
 

+ 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 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/TenantOrderRecordService.java

@@ -23,6 +23,9 @@ public interface TenantOrderRecordService extends IService<TenantOrderRecord> {
 
     void checkTenantOrder();
 
-    Boolean rechargeCheck(TenantOrderRecord record, int i);
+    void activeCloudTeacher(TenantOrderRecord record);
+
+    void rechargeSuccess(TenantOrderRecord record);
+
 }
 

+ 41 - 82
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java

@@ -3,8 +3,6 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.CloudTeacherDao;
 import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
@@ -22,15 +20,10 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.thirdparty.adapay.Payment;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
-import com.ym.mec.thirdparty.yqpay.Msg;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import jodd.util.StringUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.redisson.api.RBucket;
-import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,15 +32,12 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.enums.PeriodEnum.*;
 
 @Service
 public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTeacherOrder> implements CloudTeacherOrderService {
-    //订单不存在
-    public static final String PAYMENT_ID_NOT_EXISTS = "payment_id_not_exists";
 
     private static final Logger log = LoggerFactory.getLogger(CloudTeacherOrderServiceImpl.class);
     @Autowired
@@ -66,18 +56,16 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     private IdGeneratorService idGenerator;
     @Autowired
     private TenantOrderRecordService tenantOrderRecordService;
+
     @Override
     public BaseDAO<Long, CloudTeacherOrder> getDAO() {
         return cloudTeacherOrderDao;
     }
-    @Autowired
-    private RedissonClient redissonClient;
+
     @Autowired
     private SysMessageService sysMessageService;
     @Autowired
     private TenantInfoService tenantInfoService;
-    @Autowired
-    private SysUserFeignService sysUserFeignService;
 
     @Override
     public boolean addStudents(CloudTeacherAddQueryInfo cloudTeacherAddQueryInfo) {
@@ -136,7 +124,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
             return pageInfo;
         }
         assert dataList != null;
-        for (CloudTeacherStudent cst: dataList) {
+        for (CloudTeacherStudent cst : dataList) {
             TenantConfig tenantConfig = tenantConfigService.getOne(new QueryWrapper<TenantConfig>().eq("tenant_id_", cst.getTenantId()));
             if (tenantConfig == null) {
                 throw new Exception("未找到组织Id " + cst.getTenantId().toString() + "在 TenantConfig 表");
@@ -186,7 +174,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         }
         Integer tenantId = null;
         BigDecimal sumAmount = new BigDecimal(0);
-        for (CloudTeacherStudent cts: cloudTeacherStudents) {
+        for (CloudTeacherStudent cts : cloudTeacherStudents) {
             if (cts.getAmount() == null) {
                 throw new Exception("支付金额异常, 请按规定操作 ");
             }
@@ -200,8 +188,9 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
 
     /**
      * 团练宝支付
+     *
      * @param payAmount 金额
-     * @param tenantId 分部
+     * @param tenantId  分部
      * @return 支付结果
      */
     private Map<String, Object> payExec(BigDecimal payAmount, Integer tenantId, List<CloudTeacherStudent> cloudTeacherStudents) throws Exception {
@@ -226,14 +215,17 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         } else { // 消费大于 0 元 已支付 直接激活
             orderState = 1;
         }
+        payMap.put("amount", payAmount);
+        payMap.put("orderNo", orderNo);
         TenantOrderRecord record = tenantInfoService.createOrderRecord(tenantId, payAmount, orderNo, tenantEnum, orderState, WrapperUtil.toStr(payMap, "routingMerNos"));
         for (CloudTeacherStudent cts : cloudTeacherStudents) {
             if (cloudTeacherOrderDao.updateOrderId(cts.getCloudTeacherOrderId(), cts.getAmount(), record.getId()) <= 0) {
                 throw new Exception("更新订单失败");
             }
         }
-        if (orderState == 1) { // 成功手直接成功
-            //this.paySuccess(record);
+        //0元直接成功
+        if (orderState == 1) {
+            tenantOrderRecordService.activeCloudTeacher(record);
         }
         log.info("tenant pay >>>>> " + JSON.toJSONString(payMap));
         return payMap;
@@ -250,48 +242,14 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         return 0;
     }
 
-    //主动去第三方查询订单状态
-    private void checkTransOrderState(TenantOrderRecord orderRecord) {
-        if (StringUtils.equals(orderRecord.getPaymentChannel(), PaymentChannelEnum.ADAPAY.getCode())) {
-            Map<String, Object> payment;
-            try {
-                payment = Payment.queryPayment(orderRecord.getTransNo());
-                log.info("    >>>>> payment 团练宝 payment query start");
-                String status = (String) payment.get("status");
-                //判断状态是成功还是失败
-                if (status.equals("succeeded")) {
-                    orderRecord.setOrderState(1);
-                } else if (Objects.nonNull(payment.get("error_code"))) {
-                    //若状态是失败则判断code
-                    if (!PAYMENT_ID_NOT_EXISTS.equals(payment.get("error_code"))) {
-                        //不等于这个异常都是失败
-                        orderRecord.setOrderState(2);
-                    } else {
-                        long orderTime = orderRecord.getCreatedTime().getTime();//订单创建时间
-                        long nowTime = new Date().getTime();
-                        //丢弃5分钟之前的订单 300000 = 5 * 60秒 * 1000
-                        long exTime = 300000L;
-                        if (nowTime - orderTime > exTime) {
-                            orderRecord.setOrderState(2);
-                        }
-                    }
-                }
-                log.info("     >>>>> payment 团练宝  >>>>> {}", payment);
-                log.info("     >>>>> payment 团练宝  >>>>> {}", JSON.toJSONString(orderRecord));
-            } catch (Exception e) {
-                log.error("     >>>>> payment 团练宝  >>>>> {}", JSON.toJSONString(orderRecord));
-            }
-        }
-    }
-
-    public Boolean payCheck(String orderNo) throws Exception {
+    public Boolean payCheck(String orderNo) {
         TenantOrderRecord record = tenantOrderRecordService.getOne(new QueryWrapper<TenantOrderRecord>().eq("order_no_", orderNo));
         return record.getOrderState() == 1;
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-	public void addOrderDetail2CloudTeacher(StudentPaymentOrder order,BigDecimal cloudTeacherFee) {
+    public void addOrderDetail2CloudTeacher(StudentPaymentOrder order, BigDecimal cloudTeacherFee) {
         CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
         cloudTeacherOrder.setTenantId(order.getTenantId());
         cloudTeacherOrder.setOrganId(order.getOrganId());
@@ -303,21 +261,21 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         cloudTeacherOrder.setAmount(cloudTeacherFee);
         cloudTeacherOrder.setStudentId(order.getUserId());
         cloudTeacherOrder.setStatus(1);
-		cloudTeacherOrderDao.insert(cloudTeacherOrder);
-	}
+        cloudTeacherOrderDao.insert(cloudTeacherOrder);
+    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public CloudTeacher addStudentCloudTeacher(CloudTeacherOrder cloudTeacherOrder) {
         Date nowDate = new Date();
         CloudTeacher cloudTeacher = cloudTeacherDao.getByStudentId(cloudTeacherOrder.getStudentId());
-        Date startTime = null;
+        Date startTime;
         Date endTime = null;
-        Date endBaseTime = null;
-        
+        Date endBaseTime;
+
         //更新student表信息
         studentService.updateMemberRank(cloudTeacherOrder);
-        
+
         if (cloudTeacher == null) {
             cloudTeacher = new CloudTeacher();
             startTime = DateUtil.trunc(nowDate);
@@ -352,7 +310,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         return cloudTeacher;
     }
 
-    private Date calcCloudTeacherOrderTime(CloudTeacherOrder cloudTeacherOrder, Date startTime, Date endTime) {
+    public Date calcCloudTeacherOrderTime(CloudTeacherOrder cloudTeacherOrder, Date startTime, Date endTime) {
         if (cloudTeacherOrder.getType() == DAY) { // 日
             endTime = DateUtil.addDays(startTime, cloudTeacherOrder.getTime());
         } else if (cloudTeacherOrder.getType() == MONTH) { // 月
@@ -373,8 +331,8 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     }
 
     @Override
-    public List<CloudTeacherOrder> getStudentCloudTeacherOrder(Integer studentId,String musicGroupId) {
-        return cloudTeacherOrderDao.getStudentCloudTeacherOrder(studentId,musicGroupId);
+    public List<CloudTeacherOrder> getStudentCloudTeacherOrder(Integer studentId, String musicGroupId) {
+        return cloudTeacherOrderDao.getStudentCloudTeacherOrder(studentId, musicGroupId);
     }
 
     @Override
@@ -386,15 +344,15 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
             if (cloudTeacherOrder.getStatus().equals(3)) {
                 throw new BizException("团练宝已退,请勿重复退");
             }
-            if (cloudTeacherOrder.getStatus().equals(2) && DateUtil.stringToDate(DateUtil.format(cloudTeacherOrder.getEndTime(),DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
-                    DateUtil.stringToDate(DateUtil.format(nowDate,DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT)) < 0) {
+            if (cloudTeacherOrder.getStatus().equals(2) && DateUtil.stringToDate(DateUtil.format(cloudTeacherOrder.getEndTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
+                    DateUtil.stringToDate(DateUtil.format(nowDate, DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT)) < 0) {
                 throw new BizException("团练宝已过服务期,不可退费");
             }
             Integer oldStatus = cloudTeacherOrder.getStatus();
             cloudTeacherOrder.setStatus(3);
-            if(i == 0){
+            if (i == 0) {
                 cloudTeacherOrder.setRefundAmount(refundAmount);
-            }else {
+            } else {
                 cloudTeacherOrder.setRefundAmount(BigDecimal.ZERO);
             }
             cloudTeacherOrder.setUpdateTime(nowDate);
@@ -407,7 +365,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
             }
             int days = DateUtil.daysBetween(DateUtil.trunc(nowDate), cloudTeacherOrder.getEndTime());
             CloudTeacher cloudTeacher = cloudTeacherDao.getByStudentId(cloudTeacherOrder.getStudentId());
-            if(cloudTeacher != null){
+            if (cloudTeacher != null) {
                 Date endDate = DateUtil.addDays(cloudTeacherOrder.getEndTime(), -days);
                 cloudTeacher.setEndTime(endDate);
                 cloudTeacher.setUpdateTime(nowDate);
@@ -418,6 +376,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         }
         return true;
     }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean quitCloudTeacherOrder(CloudTeacherOrder cloudOrder, BigDecimal refundAmount) {
@@ -425,8 +384,8 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         if (cloudOrder.getStatus().equals(3)) {
             throw new BizException("团练宝已退,请勿重复退");
         }
-        if (cloudOrder.getStatus().equals(2) && DateUtil.stringToDate(DateUtil.format(cloudOrder.getEndTime(),DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
-                DateUtil.stringToDate(DateUtil.format(nowDate,DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT)) < 0) {
+        if (cloudOrder.getStatus().equals(2) && DateUtil.stringToDate(DateUtil.format(cloudOrder.getEndTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
+                DateUtil.stringToDate(DateUtil.format(nowDate, DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT)) < 0) {
             throw new BizException("团练宝已过服务期,不可退费");
         }
         Integer oldStatus = cloudOrder.getStatus();
@@ -451,23 +410,23 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         return true;
     }
 
-	@Override
-	public CloudTeacherOrder queryByOrderId(Long orderId) {
-		return cloudTeacherOrderDao.queryByOrderId(orderId);
-	}
+    @Override
+    public CloudTeacherOrder queryByOrderId(Long orderId) {
+        return cloudTeacherOrderDao.queryByOrderId(orderId);
+    }
 
-	@Override
-	public CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId) {
-		return cloudTeacherOrderDao.queryOrderInfoByOrderId(orderId);
-	}
+    @Override
+    public CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId) {
+        return cloudTeacherOrderDao.queryOrderInfoByOrderId(orderId);
+    }
 
     @Override
-    public List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds,Boolean isMusicMember) {
-        return cloudTeacherOrderDao.queryNoStartByUserIds(userIds,isMusicMember);
+    public List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds, Boolean isMusicMember) {
+        return cloudTeacherOrderDao.queryNoStartByUserIds(userIds, isMusicMember);
     }
 
     @Override
     public String queryActiveOrderPage(Integer userId, Integer activeRemark, String remark) {
-        return cloudTeacherOrderDao.queryActiveOrderPage(userId,activeRemark,remark);
+        return cloudTeacherOrderDao.queryActiveOrderPage(userId, activeRemark, remark);
     }
 }

+ 28 - 81
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java

@@ -4,6 +4,7 @@ import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 import com.ym.mec.biz.dal.dao.*;
@@ -173,8 +174,8 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void refreshGroupImUserFriend(String musicGroupId,GroupType groupType) {
-		ExecutorService executor = Executors.newCachedThreadPool();
-		CompletableFuture.runAsync(()->{
+//		ExecutorService executor = Executors.newCachedThreadPool();
+//		CompletableFuture.runAsync(()->{
 			List<ClassGroup> classGroups = classGroupDao.queryClassGroups(musicGroupId, groupType.getCode());
 			List<ImUserFriend> imUserFriends = new ArrayList<>();
 			classGroups.forEach(e->{
@@ -189,8 +190,8 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 			}
 			//更新用户朋友昵称是空的历史数据(线上没有发现这种问题)
 			imUserFriendDao.updateNullNickName();
-		},executor);
-		executor.shutdown();
+//		},executor);
+//		executor.shutdown();
 	}
 
 	public List<ImUserFriend> saveImUserFriends(Set<Integer> studentIds,Set<Integer> teacherIds,GroupType groupType,String musicGroupId){
@@ -243,86 +244,23 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 		//老师关联教务、学员
 		for (Integer teacherId : teacherIds) {
 			//老师关联学员
-			for (Integer studentId : studentIds) {
-				if(teacherId == studentId){
-					continue;
-				}
-				//学员、教务关联的老师
-				ImUserFriend imUserFriend = new ImUserFriend();
-				imUserFriend.setUserId(teacherId);
-				imUserFriend.setFriendId(studentId);
-				imUserFriend.setFriendNickname(usernameMap.get(studentId));
-				imUserFriend.setMemo(musicGroup.getName());
-				imUserFriend.setTags(studentSubjectName.get(studentId));
-				imUserFriends.add(imUserFriend);
-			}
+			this.addImUserFriend(studentIds,studentSubjectName,usernameMap,musicGroup.getName(),teacherId,imUserFriends);
 			//老师关联教务
-			for (Integer educationId : educationIds) {
-				if(teacherId == educationId){
-					continue;
-				}
-				ImUserFriend imUserFriend = new ImUserFriend();
-				imUserFriend.setUserId(teacherId);
-				imUserFriend.setFriendId(educationId);
-				imUserFriend.setFriendNickname(educationRealNameMap.get(educationId));
-				imUserFriends.add(imUserFriend);
-			}
+			this.addImUserFriend(educationIds,null,educationRealNameMap,null,teacherId,imUserFriends);
 		}
 		//教务关联的老师、学员
 		for (Integer educationId : educationIds) {
 			//教务关联学员
-			for (Integer studentId : studentIds) {
-				if(educationId == studentId){
-					continue;
-				}
-				ImUserFriend imUserFriend = new ImUserFriend();
-				imUserFriend.setUserId(educationId);
-				imUserFriend.setFriendId(studentId);
-				imUserFriend.setFriendNickname(usernameMap.get(studentId));
-				imUserFriend.setMemo(musicGroup.getName());
-				imUserFriend.setTags(studentSubjectName.get(studentId));
-				imUserFriends.add(imUserFriend);
-			}
+			this.addImUserFriend(studentIds,studentSubjectName,usernameMap,musicGroup.getName(),educationId,imUserFriends);
 			//教务关联老师
-			for (Integer teacher : teacherIds) {
-				if(educationId == teacher){
-					continue;
-				}
-				ImUserFriend imUserFriend = new ImUserFriend();
-				imUserFriend.setUserId(educationId);
-				imUserFriend.setFriendId(teacher);
-				imUserFriend.setFriendNickname(teacherRealNameMap.get(teacher));
-				imUserFriend.setMemo(musicGroup.getName());
-				imUserFriend.setTags(teacherSubjectNameMap.get(teacher));
-				imUserFriends.add(imUserFriend);
-			}
+			this.addImUserFriend(teacherIds,teacherSubjectNameMap,teacherRealNameMap,musicGroup.getName(),educationId,imUserFriends);
 		}
 		//学员关联的老师、教务、维修技师
 		for (Integer studentId : studentIds) {
 			//学员关联的老师
-			for (Integer teacher : teacherIds) {
-				if(teacher == studentId){
-					continue;
-				}
-				ImUserFriend imUserFriend = new ImUserFriend();
-				imUserFriend.setUserId(studentId);
-				imUserFriend.setFriendId(teacher);
-				imUserFriend.setFriendNickname(teacherRealNameMap.get(teacher));
-				imUserFriend.setMemo(musicGroup.getName());
-				imUserFriend.setTags(teacherSubjectNameMap.get(teacher));
-				imUserFriends.add(imUserFriend);
-			}
+			this.addImUserFriend(teacherIds,teacherSubjectNameMap,teacherRealNameMap,musicGroup.getName(),studentId,imUserFriends);
 			//学员关联的教务
-			for (Integer education : educationIds) {
-				if(education == studentId){
-					continue;
-				}
-				ImUserFriend imUserFriend = new ImUserFriend();
-				imUserFriend.setUserId(studentId);
-				imUserFriend.setFriendId(education);
-				imUserFriend.setFriendNickname(educationRealNameMap.get(education));
-				imUserFriends.add(imUserFriend);
-			}
+			this.addImUserFriend(educationIds,null,educationRealNameMap,null,studentId,imUserFriends);
 			//学员关联维修技师
 			if(repairUserId != null){
 				if(repairUserId == studentId){
@@ -339,19 +277,28 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 		}
 		//维修技师关联学员
 		if(repairUserId != null){
-			for (Integer studentId : studentIds) {
-				if(repairUserId == studentId){
+			this.addImUserFriend(studentIds,studentSubjectName,usernameMap,musicGroup.getName(),repairUserId,imUserFriends);
+		}
+		return imUserFriends;
+	}
+
+	public void addImUserFriend(Set<Integer> friendUserIds,Map<Integer,String> tagsMap,
+								Map<Integer,String> nameMap,String memo,Integer userId,List<ImUserFriend> imUserFriends){
+		if(friendUserIds != null && friendUserIds.size() > 0){
+			for (Integer friendId : friendUserIds) {
+				if(userId == friendId){
 					continue;
 				}
 				ImUserFriend imUserFriend = new ImUserFriend();
-				imUserFriend.setUserId(repairUserId);
-				imUserFriend.setFriendId(studentId);
-				imUserFriend.setFriendNickname(usernameMap.get(studentId));
-				imUserFriend.setMemo(musicGroup.getName());
-				imUserFriend.setTags(studentSubjectName.get(studentId));
+				imUserFriend.setUserId(userId);
+				imUserFriend.setFriendId(friendId);
+				imUserFriend.setFriendNickname(nameMap.get(friendId));
+				imUserFriend.setMemo(memo);
+				if(tagsMap != null){
+					imUserFriend.setTags(tagsMap.get(friendId));
+				}
 				imUserFriends.add(imUserFriend);
 			}
 		}
-		return imUserFriends;
 	}
 }

+ 5 - 40
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;
 		}
 
@@ -250,7 +246,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 			cloudTeacherOrder.setTime(cloudCoachPaymentProgram.getMemberNum().intValue());
 			cloudTeacherOrder.setStudentId(coachPaymentDetails.getUserId());
 			cloudTeacherOrder.setOrganId(studentPaymentOrder.getOrganId());
-			cloudTeacherOrder.setAmount(studentPaymentOrder.getActualAmount());
+			cloudTeacherOrder.setAmount(studentPaymentOrder.getExpectAmount());
 			cloudTeacherOrderService.insert(cloudTeacherOrder);
 
 			//修改缴费状态
@@ -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 {

+ 71 - 147
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java

@@ -52,32 +52,14 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     @Autowired
     private RedissonClient redissonClient;
     @Autowired
-    private CloudTeacherOrderService cloudTeacherOrderService;
-    @Autowired
     private TenantConfigService tenantConfigService;
-
-    @Autowired
-    private SysConfigService sysConfigService;
-
     @Autowired
     private SysConfigDao sysConfigDao;
 
-    @Autowired
-    private SysPaymentConfigService sysPaymentConfigService;
-
-    //支付类型
-    private static final Map<String, Function<PaymentParam, Map<String, Object>>> checkOrderType = new HashMap<>();
-
-    {
-        //开通缴费/续费
-        checkOrderType.put("tenant", this::openOrRenew);
-        //团练宝激活支付
-        checkOrderType.put("cloudTeacherOrder", this::cloudTeacherOrder);
-        //机构充值
-        checkOrderType.put("tenantRecharge", this::tenantRecharge);
-        //teacher
-        checkOrderType.put("teacher", this::teacher);
-    }
+    //tenant 机构开通、续费付款、 cloudTeacherOrder 团练宝激活支付、tenantRecharge 机构充值
+    private static final String[] tenantPlatform = {"tenant", "cloudTeacherOrder", "tenantRecharge"};
+    //校验订单状态
+    private static final BiPredicate<Object, DealStatusEnum> predicate = (o, s) -> Objects.nonNull(o) && !DealStatusEnum.ING.equals(s);
 
     @Override
     public Map<String, Object> executePayment(BigDecimal amount, String orderNo, String payChannel, String returnUrl, String orderSubject, String orderBody, String sign, String code, String platform) throws Exception {
@@ -91,37 +73,63 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         checkSing(payParam);
         //返回值
         Map<String, Object> payment;
-        //如果platform is null 则应该是这一个,因为老代码就是这样写的。
-        if (StringUtils.isBlank(platform)) {
-            payment = student(payParam);
+
+        if (WrapperUtil.checkStr(platform, tenantPlatform)) {
+            //tenant 机构开通、续费付款、 cloudTeacherOrder 团练宝激活支付、tenantRecharge 机构充值
+            payment = tenantPlatformOrder(payParam);
+            //主动延迟检查订单
+            delayCheckTenant();
+        } else if (platform.equals("teacher")) {
+            payment = teacher(payParam);
         } else {
-            //根据传入platform 来判断执行哪个操作
-            Function<PaymentParam, Map<String, Object>> function = checkOrderType.get(platform);
             //如果以上操作都没有 则应该是这一个,因为老代码就是这样写的。
-            if (Objects.isNull(function)) {
-                payment = student(payParam);
-            } else {
-                payment = function.apply(payParam);
-            }
+            payment = student(payParam);
         }
+
         return payment;
     }
 
-    //platform is null 或者 student
-    private Map<String, Object> student(PaymentParam payParam) throws Exception {
-        Map<String, Object> payment;
-        StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(payParam.getOrderNo());
-        if (Objects.isNull(studentPaymentOrder)) {
+    private void checkSing(PaymentParam param) {
+        Map<String, Object> signParams = new LinkedHashMap<>();
+        signParams.put("appId", ConfigInit.appId);
+        signParams.put("amount", param.getAmount().setScale(2, RoundingMode.HALF_UP));
+        signParams.put("orderNo", param.getOrderNo());
+        signParams.put("orderSubject", param.getOrderSubject());
+        signParams.put("orderBody", param.getOrderBody());
+        signParams.put("wxAppId", ConfigInit.wxAppId);
+        String originalStr = JSONObject.toJSONString(signParams);
+        String newSign = DigestUtils.md5DigestAsHex(originalStr.getBytes());
+        if (!newSign.equals(param.getSign())) {
+            log.info("executePayment >>>>>> checkSing : {}", newSign);
+            throw new BizException("请勿非法请求");
+        }
+    }
+
+    //机构开通、续费付款、 团练宝激活支付、机构充值
+    private Map<String, Object> tenantPlatformOrder(PaymentParam payParam) {
+        //查询订单
+        TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
+                .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
+        if (Objects.isNull(tenantOrderRecord)) {
             throw new BizException("订单不存在");
         }
-        payParam.setTenantId(studentPaymentOrder.getTenantId());
-        payment = checkOrderAndGetParam(payParam,
-                studentPaymentOrder,
-                StudentPaymentOrder::getStatus,
-                StudentPaymentOrder::getCreateTime,
-                studentPaymentOrder::setTransNo,
-                studentPaymentOrderService::update
-        );
+        if (tenantOrderRecord.getOrderState() != 0) {
+            throw new BizException("订单已处理!");
+        }
+        //获取支付数据
+        Map<String, Object> payment;
+        payParam.setTenantId(tenantOrderRecord.getTenantId());
+        try {
+            payment = checkOrderAndGetParam(payParam,
+                    tenantOrderRecord,
+                    TenantOrderRecord::getEnumOrderState,
+                    TenantOrderRecord::getCreatedTime,
+                    tenantOrderRecord::setTransNo,
+                    tenantOrderRecordService::updateById
+            );
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        }
         return payment;
     }
 
@@ -147,81 +155,24 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         return payment;
     }
 
-    // 机构充值
-    private Map<String, Object> tenantRecharge(PaymentParam payParam) {
-        TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
-        Map<String, Object> payment = checkOrderGetPayment(payParam, tenantOrderRecord);
-        //主动延迟检查订单
-        log.info("executePayment delayCheckTenantRecharge >>>>> ");
-        delayCheckTenantRecharge(tenantOrderRecord);
-        return payment;
-    }
-
-    // 团练宝激活支付
-    private Map<String, Object> cloudTeacherOrder(PaymentParam payParam) {
-        TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
-        if (tenantOrderRecord.getOrderState() != 0) {
-            throw new BizException("订单已处理");
-        }
-        Map<String, Object> payment = checkOrderGetPayment(payParam, tenantOrderRecord);
-        // 团练宝激活支付 主动延迟检查订单
-        log.info("executePayment delayCheckCloudTeacherOrder >>>>> ");
-        return payment;
-    }
-
-    //机构开通、续费付款
-    private Map<String, Object> openOrRenew(PaymentParam payParam) {
-        TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
-        Map<String, Object> payment = checkOrderGetPayment(payParam, tenantOrderRecord);
-        //主动延迟检查订单
-        delayCheckTenant();
-        return payment;
-    }
-
-    //查询订单
-    private TenantOrderRecord getTenantOrderRecord(String orderNo) {
-        TenantOrderRecord orderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
-                .hasEq("order_no_", orderNo).queryWrapper());
-        if (Objects.isNull(orderRecord)) {
-            throw new BizException("订单不存在");
-        }
-        return orderRecord;
-    }
-
-    //获取支付数据
-    private Map<String, Object> checkOrderGetPayment(PaymentParam payParam, TenantOrderRecord tenantOrderRecord) {
+    //platform is null 或者 student
+    private Map<String, Object> student(PaymentParam payParam) throws Exception {
         Map<String, Object> payment;
-        payParam.setTenantId(tenantOrderRecord.getTenantId());
-        try {
-            payment = checkOrderAndGetParam(payParam,
-                    tenantOrderRecord,
-                    TenantOrderRecord::getEnumOrderState,
-                    TenantOrderRecord::getCreatedTime,
-                    tenantOrderRecord::setTransNo,
-                    tenantOrderRecordService::updateById
-            );
-        } catch (Exception e) {
-            throw new BizException(e.getMessage());
+        StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(payParam.getOrderNo());
+        if (Objects.isNull(studentPaymentOrder)) {
+            throw new BizException("订单不存在");
         }
+        payParam.setTenantId(studentPaymentOrder.getTenantId());
+        payment = checkOrderAndGetParam(payParam,
+                studentPaymentOrder,
+                StudentPaymentOrder::getStatus,
+                StudentPaymentOrder::getCreateTime,
+                studentPaymentOrder::setTransNo,
+                studentPaymentOrderService::update
+        );
         return payment;
     }
 
-    private void checkSing(PaymentParam param) {
-        Map<String, Object> signParams = new LinkedHashMap<>();
-        signParams.put("appId", ConfigInit.appId);
-        signParams.put("amount", param.getAmount().setScale(2, RoundingMode.HALF_UP));
-        signParams.put("orderNo", param.getOrderNo());
-        signParams.put("orderSubject", param.getOrderSubject());
-        signParams.put("orderBody", param.getOrderBody());
-        signParams.put("wxAppId", ConfigInit.wxAppId);
-        String originalStr = JSONObject.toJSONString(signParams);
-        String newSign = DigestUtils.md5DigestAsHex(originalStr.getBytes());
-        if (!newSign.equals(param.getSign())) {
-            log.info("executePayment >>>>>> checkSing : {}", newSign);
-            throw new BizException("请勿非法请求");
-        }
-    }
-
     private <T> Map<String, Object> checkOrderAndGetParam(PaymentParam payParam, T clazz,
                                                           Function<T, DealStatusEnum> enumFunc, Function<T, Date> dateFunc,
                                                           Consumer<String> setOption, Consumer<T> action) throws Exception {
@@ -249,7 +200,6 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     }
 
     private <T> void checkOrderState(T obj, Function<T, DealStatusEnum> func) {
-        BiPredicate<Object, DealStatusEnum> predicate = (o, s) -> Objects.nonNull(o) && !DealStatusEnum.ING.equals(s);
         DealStatusEnum em = func.apply(obj);
         if (predicate.test(obj, em)) {
             String msg = em.equals(DealStatusEnum.SUCCESS) ? "订单已支付,请勿重复支付" : "订单已关闭,不能支付";
@@ -321,25 +271,24 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
                 // 延时分账
                 paymentParams.put("pay_mode", "delay");
             } else {
-
                 Function<BigDecimal, BigDecimal> amountTo = (a) -> a
                         .multiply(tenantConfig.getChargeRate())
                         .divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
 
                 StudentPaymentOrder st = (StudentPaymentOrder) clazz;
-                BigDecimal amount = amountTo.apply(st.getActualAmount()).setScale(2, RoundingMode.HALF_UP);
+                BigDecimal amount = amountTo.apply(st.getActualAmount());
 
                 List<Map<String, Object>> divMemberList = new ArrayList<>();
                 // 实时分账
                 if (amount.doubleValue() > 0) {
-    				
+
     				/*SysConfig config = sysConfigService.findByParamName("platform_collection_organ");
     		        if (Objects.isNull(config)) {
     		            throw new BizException("平台收款账户没有设置[platform_collection_organ]");
     		        }
-    	        	
+
     	        	SysPaymentConfig sysPaymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(Integer.parseInt(config.getParanValue()));
-    	        	
+
     	        	if(sysPaymentConfig == null || StringUtils.isBlank(sysPaymentConfig.getHfMerNo())){
     	        		throw new BizException("分部[{}]没有设置收款账号", config.getParanValue());
     	        	}*/
@@ -397,7 +346,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     //锁的时间
     private static final int lockTime = (int) (times * sleepTime / 1000 - 1);
 
-    //主动检查订单状态
+    //主动检查机构像平台支付的订单状态
     private void delayCheckTenant() {
         RBucket<Object> bucket = redissonClient.getBucket("delay_check_tenant");
         if (!bucket.trySet(1, lockTime, TimeUnit.SECONDS)) {
@@ -419,31 +368,6 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         });
     }
 
-    // 检查机构充值
-    private void delayCheckTenantRecharge(TenantOrderRecord record) {
-        RBucket<Object> bucket = redissonClient.getBucket("delay_check_recharge_tenant");
-        if (!bucket.trySet(1, 15L, TimeUnit.SECONDS)) {
-            log.info("executePayment bucket retryset >>>>> ");
-            return;
-        }
-        //异步
-        CompletableFuture.runAsync(() -> {
-            //检查5次
-            for (int i = 0; i <= 20; i++) { // 检查5分钟
-                try {
-                    Boolean ret = tenantOrderRecordService.rechargeCheck(record, i);
-                    if (ret) break;
-                    Thread.sleep(3000); // 每3秒触发一次
-                    log.info("机构充值 重试 >>>>>  start {}", i);
-                } catch (InterruptedException e) {
-                    log.info("机构充值 异常 >>>>>  start {}", e.toString());
-                    return;
-                }
-            }
-            bucket.delete();
-        });
-    }
-
     static class PaymentParam {
         private BigDecimal amount;
         private String orderNo;

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

+ 5 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -771,7 +771,11 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         }
         result.put("amount", amount);
         result.put("orderNo", orderNo);
-        createOrderRecord(tenantId, amount, orderNo, tenantEnum, orderState, WrapperUtil.toStr(result, "routingMerNos"));
+        TenantOrderRecord orderRecord = createOrderRecord(tenantId, amount, orderNo, tenantEnum, orderState, WrapperUtil.toStr(result, "routingMerNos"));
+        if (orderState == 1) {
+            //0元支付成功后直接成功
+            tenantOrderRecordService.rechargeSuccess(orderRecord);
+        }
         log.info("tenant pay >>>>> {} ", result);
         return result;
     }

+ 68 - 105
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java

@@ -1,18 +1,11 @@
 package com.ym.mec.biz.service.impl;
 
-import static com.ym.mec.biz.dal.enums.PeriodEnum.DAY;
-import static com.ym.mec.biz.dal.enums.PeriodEnum.MONTH;
-import static com.ym.mec.biz.dal.enums.PeriodEnum.QUARTERLY;
-import static com.ym.mec.biz.dal.enums.PeriodEnum.YEAR;
-import static com.ym.mec.biz.dal.enums.PeriodEnum.YEAR_HALF;
-
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dao.TenantOrderRecordDao;
-import com.ym.mec.biz.dal.dto.Mapper;
 import com.ym.mec.biz.dal.dto.TenantOrderRecordDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -28,7 +21,6 @@ import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.adapay.Payment;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.date.DateUtil;
-
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.LocalDateTime;
@@ -38,6 +30,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -72,6 +65,8 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
     @Autowired
     private CloudTeacherOrderDao cloudTeacherOrderDao;
     @Autowired
+    private CloudTeacherOrderService cloudTeacherOrderService;
+    @Autowired
     private StudentService studentService;
     //订单不存在
     private static final String PAYMENT_ID_NOT_EXISTS = "payment_id_not_exists";
@@ -108,6 +103,7 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
      * @param orderNo 我方订单编号
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Map<String, Object> checkTenantOrder(String orderNo) {
         TenantOrderRecord orderRecord = this.getOne(new WrapperUtil<TenantOrderRecord>()
                 .hasEq("order_no_", orderNo).queryWrapper());
@@ -115,6 +111,7 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Map<String, Object> checkTenantOrder(TenantOrderRecord orderRecord) {
         return getTenantOrderState(orderRecord);
     }
@@ -122,7 +119,6 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
     private Map<String, Object> getTenantOrderState(TenantOrderRecord orderRecord) {
         //主动去第三方查询订单状态
         checkTransOrderState(orderRecord);
-
         //返回
         Map<String, Object> result = new HashMap<>();
         result.put("groupType", orderRecord.getOrderType());
@@ -138,7 +134,7 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         //查询该机构的财务公章
         TenantConfig tenantConfig = tenantConfigService.getOne(new QueryWrapper<TenantConfig>()
                 .eq("tenant_id_", orderRecord.getTenantId()));
-        result.put("financeChops",tenantConfig.getCorporateFinanceChops());
+        result.put("financeChops", tenantConfig.getCorporateFinanceChops());
 
         log.info("checkTenantOrder  getOrderState>>>>> {}", JSON.toJSONString(orderRecord));
         getOrderState(orderRecord, result);
@@ -147,6 +143,7 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void checkTenantOrder() {
         RBucket<Object> bucket = redissonClient.getBucket("tenant_check_order");
         if (!bucket.trySet(1, 3L, TimeUnit.SECONDS)) {
@@ -176,6 +173,7 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         bucket.delete();
     }
 
+    //开通成功
     private void open(TenantOrderRecord record) {
         //机构产品信息
         TenantProductInfo productInfo = tenantProductInfoService.getOne(new WrapperUtil<TenantProductInfo>()
@@ -191,6 +189,7 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         tenantProductInfoService.updateById(productInfo);
     }
 
+    //续费成功
     private void renew(TenantOrderRecord record) {
         //机构产品信息
         TenantProductInfo productInfo = tenantProductInfoService.getOne(new WrapperUtil<TenantProductInfo>()
@@ -200,39 +199,68 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         Integer val = bucket.get();
         //修改产品信息
         tenantInfoService.renewSuccess(val, productInfo, record.getActualAmount());
-        //删除订单数据及订单缓存
     }
 
-    private boolean activeCloudTeacher(TenantOrderRecord record) {
+    //激活团练宝成功
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void activeCloudTeacher(TenantOrderRecord record) {
         if (record.getId() == null) {
             throw new BizException("订单未找到");
         }
         record.setPayDate(new Date());
         record.setPayTime(new Date());
-		updateById(record);
-		// cloudTeacherOrderDao.updateOrderStatusOK(record.getId()
-		List<CloudTeacherOrder> cloudTeacherOrders = cloudTeacherOrderDao.findByPlatformOrderId(record.getId());
-		Date startTime = DateUtil.trunc(new Date());
-		Date endTime = new Date();
-		for (CloudTeacherOrder cto : cloudTeacherOrders) {
-			endTime = calcCloudTeacherOrderTime(cto, startTime, endTime);
-			cto.setStartTime(startTime);
-			cto.setEndTime(endTime);
-			cto.setStatus(2);
-			cloudTeacherOrderDao.update(cto);
-			studentService.updateMemberRank(cto.getStudentId(), cto.getType(), cto.getTime(), 1);
-		}
+        updateById(record);
+        List<CloudTeacherOrder> cloudTeacherOrders = cloudTeacherOrderDao.findByPlatformOrderId(record.getId());
+        Date startTime = DateUtil.trunc(new Date());
+        Date endTime = new Date();
+        for (CloudTeacherOrder cto : cloudTeacherOrders) {
+            endTime = cloudTeacherOrderService.calcCloudTeacherOrderTime(cto, startTime, endTime);
+            cto.setStartTime(startTime);
+            cto.setEndTime(endTime);
+            cto.setStatus(2);
+            cloudTeacherOrderDao.update(cto);
+            studentService.updateMemberRank(cto.getStudentId(), cto.getType(), cto.getTime(), 1);
+        }
+        //发信息
+        cloudTeacherOrderService.sendSms(record);
+    }
+
+    //充值成功
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void rechargeSuccess(TenantOrderRecord record) {
+        // 更新 tenantAssetsInfo
+        log.info("checkRechargeCheck  updateAmount>>>>>");
+        int ret = assetsInfoService.updateAmount(record.getTenantId(), record.getExpectAmount());
+        if (ret != 1) {
+            throw new BizException("更新支付失败");
+        }
+        record.setPayDate(new Date());
+        record.setPayTime(new Date());
+        baseMapper.updateById(record); // 添加支付时间
+        // 取余额
+        TenantAssetsInfo assets = assetsInfoService.getOne(new WrapperUtil<TenantAssetsInfo>()
+                .hasEq("tenant_id_", record.getTenantId()).queryWrapper());
+        TenantInfo tenantInfo = tenantInfoService.getOne(new WrapperUtil<TenantInfo>()
+                .hasEq("id_", record.getTenantId()).queryWrapper());
+        Integer receiveUserId = tenantInfo.getUserId();
+        String email = tenantInfo.getEmail();
 
-		List<Mapper> orderUsers = cloudTeacherOrderDao.findUserNameByOrderId(record.getId());
-		Map<Integer, String> userPhones = new HashMap<>();
-		for (Mapper mapper : orderUsers) {
-			userPhones.put((Integer) mapper.getKey(), mapper.getValue().toString());
-		}
-		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.CLOUD_TEACHER_ORDER_SUCCESS, userPhones, null,
-				0, null, null);
+        Object[] objs = {tenantInfo.getName(), record.getActualAmount(), assets.getBalance()};
+
+        // 发邮件, 发短信
+        Map<Integer, String> sendPar = new HashMap<>();
+        sendPar.put(receiveUserId, email);
+        log.info("platformSendToAll 充值成功发送邮件  >>> receiveUserId {} email {} objs {} sendPar {}", receiveUserId, email, objs, sendPar);
+        sysMessageService.batchSendMessage(-1, MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_TENANT_RECHARGE, sendPar, null, 0, null, "SYSTEM", objs);
 
-		return true;
+        Map<Integer, String> sendPar2 = new HashMap<>();
+        sendPar2.put(receiveUserId, email);
+        log.info("platformSendToAll 充值成功发送邮件分发器  >>> receiveUserId {} email {} objs {} sendPar {}", receiveUserId, email, objs, sendPar2);
+        sysMessageService.batchSendMessage(-1, MessageSenderPluginContext.MessageSender.EMAIL, MessageTypeEnum.EMAIL_TENANT_RECHARGE, sendPar2, null, 0, null, "SYSTEM", objs);
     }
+
     //主动去第三方查询订单状态
     private void checkTransOrderState(TenantOrderRecord orderRecord) {
         if (StringUtils.equals(orderRecord.getPaymentChannel(), PaymentChannelEnum.ADAPAY.getCode())) {
@@ -259,7 +287,7 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
                         }
                     }
                 }
-                log.info("    >>>>> checkTenantOrder  payment >>>>> {}", payment);
+                log.info("    >>>>> checkTenantOrder orderType {} payment >>>>> {}", orderRecord.getOrderType(), payment);
                 log.info("    >>>>> checkTenantOrder  orderRecord >>>>> {}", JSON.toJSONString(orderRecord));
             } catch (Exception e) {
                 log.error("    >>>>> checkTenantOrder  payment error>>>>> {}", JSON.toJSONString(orderRecord));
@@ -275,9 +303,12 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         switch (orderRecord.getOrderState()) {
             case 1:
                 tenantOrderSuccess(orderRecord, detail);
-
-                checkOrder.get(orderRecord.getOrderType()).accept(orderRecord);
-
+                Consumer<TenantOrderRecord> consumer = checkOrder.get(orderRecord.getOrderType());
+                if (Objects.isNull(consumer)) {
+                    code = DealStatusEnum.ING.getCode();
+                    break;
+                }
+                consumer.accept(orderRecord);
                 code = DealStatusEnum.SUCCESS.getCode();
                 LocalDateTime now = LocalDateTime.now();
                 orderRecord.setPayDate(now.toLocalDate().toDate());
@@ -311,74 +342,6 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         detail.put("num", productInfo.getExpiryCount());
     }
 
-    private void rechargeSuccess(TenantOrderRecord record) {
-        // 更新 tenantAssetsInfo
-        log.info("checkRechargeCheck  updateAmount>>>>>");
-        int ret = assetsInfoService.updateAmount(record.getTenantId(), record.getExpectAmount());
-        if (ret != 1) {
-            throw new BizException("更新支付失败");
-        }
-        record.setPayDate(new Date());
-        record.setPayTime(new Date());
-        baseMapper.updateById(record); // 添加支付时间
-        // 取余额
-        TenantAssetsInfo assets = assetsInfoService.getOne(new WrapperUtil<TenantAssetsInfo>().hasEq("tenant_id_", record.getTenantId()).queryWrapper());
-        TenantInfo tenantInfo = tenantInfoService.getOne(new WrapperUtil<TenantInfo>().hasEq("id_", record.getTenantId()).queryWrapper());
-        Integer receiveUserId = tenantInfo.getUserId();
-        String email = tenantInfo.getEmail();
-
-        Object[] objs = {tenantInfo.getName(), record.getActualAmount(), assets.getBalance()};
-
-        // 发邮件, 发短信
-        Map<Integer, String> sendPar = new HashMap<>();
-        sendPar.put(receiveUserId, email);
-        log.info("platformSendToAll 充值成功发送邮件  >>> receiveUserId {} email {} objs {} sendPar {}", receiveUserId, email, objs, sendPar);
-        sysMessageService.batchSendMessage(-1, MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_TENANT_RECHARGE, sendPar, null, 0, null, "SYSTEM", objs);
-
-        Map<Integer, String> sendPar2 = new HashMap<>();
-        sendPar2.put(receiveUserId, email);
-        log.info("platformSendToAll 充值成功发送邮件分发器  >>> receiveUserId {} email {} objs {} sendPar {}", receiveUserId, email, objs, sendPar2);
-        sysMessageService.batchSendMessage(-1, MessageSenderPluginContext.MessageSender.EMAIL, MessageTypeEnum.EMAIL_TENANT_RECHARGE, sendPar2, null, 0, null, "SYSTEM", objs);
-
-
-    }
-
-    private Date calcCloudTeacherOrderTime(CloudTeacherOrder cloudTeacherOrder, Date startTime, Date endTime) {
-        if (cloudTeacherOrder.getType() == DAY) { // 日
-            endTime = DateUtil.addDays(startTime, cloudTeacherOrder.getTime());
-        } else if (cloudTeacherOrder.getType() == MONTH) { // 月
-            endTime = DateUtil.addMonths(startTime, cloudTeacherOrder.getTime());
-        } else if (cloudTeacherOrder.getType() == QUARTERLY) { // 季
-            endTime = DateUtil.addMonths(startTime, cloudTeacherOrder.getTime() * 3);
-        } else if (cloudTeacherOrder.getType() == YEAR_HALF) { // 半年
-            endTime = DateUtil.addMonths(startTime, cloudTeacherOrder.getTime() * 6);
-        } else if (cloudTeacherOrder.getType() == YEAR) { // 年
-            endTime = DateUtil.addYears(startTime, cloudTeacherOrder.getTime());
-        }
-        return endTime;
-    }
 
-    @Override
-    public Boolean rechargeCheck(TenantOrderRecord record, int i) {
-        RBucket<Object> bucket = redissonClient.getBucket("tenant_check_recharge");
-        if (!bucket.trySet(1, 3L, TimeUnit.SECONDS)) {
-            return false;
-        }
-        log.info("    机构充值 {} rechargeCheck>>>>>", i);
-        checkTransOrderState(record);
-        if (record.getOrderState() == 1) {
-            baseMapper.updateById(record);
-            try {
-                log.info("    机构充值 {} rechargeSuccess>>>>>", i);
-                this.rechargeSuccess(record); // 充值成功
-                return true;
-            } catch (Exception e) {
-                e.printStackTrace();
-                return false;
-            }
-        }
-        bucket.delete();
-        return false;
-    }
 }
 

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

@@ -643,7 +643,7 @@
             AND mg.status_ = 'PROGRESS'
             AND sr.music_group_status_ = 'NORMAL'
             <if test="studentIds!=null and studentIds.size()>0">
-                AND cssp.user_id_ IN
+                AND sr.user_id_ IN
                 <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
                     #{studentId}
                 </foreach>

+ 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

+ 1 - 1
mec-common/common-core/src/main/java/com/ym/mec/common/page/WrapperUtil.java

@@ -168,7 +168,7 @@ public class WrapperUtil<T> {
      * 包含返回true
      */
     public static boolean checkStr(String o, String... str) {
-        if (ObjPredicate.test(str)) {
+        if (StrPredicate.test(o) && ObjPredicate.test(str)) {
             return Arrays.asList(str).contains(o);
         } else {
             return false;

+ 1 - 6
mec-web/src/main/java/com/ym/mec/web/controller/CloudTeacherOrderController.java

@@ -1,12 +1,10 @@
 package com.ym.mec.web.controller;
 
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.ym.mec.biz.dal.entity.CloudTeacherStudent;
 import com.ym.mec.biz.dal.entity.TenantOrderRecord;
 import com.ym.mec.biz.dal.page.CloudTeacherAddQueryInfo;
 import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
 import com.ym.mec.biz.service.CloudTeacherOrderService;
-import com.ym.mec.biz.service.OrderPayOpsService;
 import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.TenantOrderRecordService;
 import com.ym.mec.common.controller.BaseController;
@@ -16,13 +14,10 @@ import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -94,7 +89,7 @@ public class CloudTeacherOrderController extends BaseController {
     @ApiOperation(value = "轮询查询订单状态")
     @GetMapping("/payCheck")
     @PreAuthorize("@pcs.hasPermissions('cloudTeacherOrder/payCheck')")
-    public HttpResponseResult<Boolean> payCheck(@RequestParam String orderNo) throws Exception {
+    public HttpResponseResult<Boolean> payCheck(@RequestParam String orderNo) {
         return succeed(cloudTeacherOrderService.payCheck(orderNo));
     }