Browse Source

fix:merge

liujunchi 3 years ago
parent
commit
8224f39057
100 changed files with 2090 additions and 299 deletions
  1. 57 14
      audio-analysis/src/main/java/com/yonge/Main.java
  2. 8 4
      audio-analysis/src/main/java/com/yonge/netty/dto/NoteAnalysis.java
  3. 4 3
      audio-analysis/src/main/java/com/yonge/netty/dto/NotePlayResult.java
  4. 73 43
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  5. 119 0
      audio-analysis/src/test/java/com/yonge/netty/client/NettyClient.java
  6. 87 0
      audio-analysis/src/test/java/com/yonge/netty/handler/WebSocketClientHandler.java
  7. BIN
      audio-analysis/src/test/resources/huanlesong-16bit.wav
  8. 0 0
      audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.json
  9. BIN
      audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.wav
  10. 11 2
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  11. 18 2
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  12. 6 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/MallPortalFeignServiceFallback.java
  13. 5 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/SysUserFeignService.java
  14. 5 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/fallback/SysUserFeignServiceFallback.java
  15. 23 38
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserDeviceServiceImpl.java
  16. 10 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java
  17. 24 3
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java
  18. 1 1
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/queryinfo/NewsInformationQueryInfo.java
  19. 1 1
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/SysNewsInformation.java
  20. 11 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/AppParam.java
  21. 4 1
      cooleshow-cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  22. 31 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  23. 3 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsAdminServiceImpl.java
  24. 5 0
      cooleshow-mall/mall-portal/pom.xml
  25. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java
  26. 9 3
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PmsPortalProductController.java
  27. 51 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java
  28. 72 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ShareProductVo.java
  29. 34 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ShareProfitParam.java
  30. 10 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java
  31. 5 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java
  32. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  33. 23 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java
  34. 2 2
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderItemDao.xml
  35. 19 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/RefreshBlackListTask.java
  36. 2 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/AdminApplication.java
  37. 6 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java
  38. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
  39. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherStyleVideoController.java
  40. 13 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountRecordController.java
  41. 18 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  42. 5 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PlatformCashAccountRecordDao.java
  43. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java
  44. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetPayDto.java
  45. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ShareProfitParam.java
  46. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java
  47. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VideoLessonGroupSearch.java
  48. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  49. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPurchaseRecord.java
  50. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java
  51. 62 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java
  52. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherStyleVideo.java
  53. 16 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java
  54. 37 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TeacherTagEnum.java
  55. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  56. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java
  57. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java
  58. 10 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  59. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ScheduleManager.java
  60. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  61. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherStyleVideoService.java
  62. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountRecordService.java
  63. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupService.java
  64. 44 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  65. 7 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  66. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java
  67. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  68. 94 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  69. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java
  70. 55 20
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  71. 69 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PlatformCashAccountRecordServiceImpl.java
  72. 27 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  73. 16 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherStyleVideoServiceImpl.java
  74. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java
  75. 9 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  76. 13 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  77. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonEvaluateServiceImpl.java
  78. 48 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java
  79. 27 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  80. 38 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseGroupShareVo.java
  81. 114 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ShareProfitVo.java
  82. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java
  83. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java
  84. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountVo.java
  85. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java
  86. 109 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserVipInfoVo.java
  87. 42 62
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wordfilter/WordContext.java
  88. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wordfilter/WordFilter.java
  89. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  90. 2 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPurchaseRecordMapper.xml
  91. 146 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml
  92. 8 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  93. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherStyleVideoMapper.xml
  94. 33 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml
  95. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  96. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml
  97. 2 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/StudentApplication.java
  98. 6 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/ImGroupController.java
  99. 2 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  100. 2 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/TeacherApplication.java

+ 57 - 14
audio-analysis/src/main/java/com/yonge/Main.java

@@ -12,16 +12,18 @@ import be.tarsos.dsp.pitch.PitchProcessor;
 import com.yonge.audio.analysis.AudioFloatConverter;
 import com.yonge.audio.analysis.detector.YINPitchDetector;
 import com.yonge.audio.utils.ArrayUtil;
+import com.yonge.netty.server.processor.WaveformWriter;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.ArrayUtils;
 
 import javax.sound.sampled.AudioFormat;
 import javax.sound.sampled.AudioInputStream;
 import javax.sound.sampled.AudioSystem;
 import javax.sound.sampled.UnsupportedAudioFileException;
-import java.io.FileNotFoundException;
-import java.io.IOException;
+import java.io.*;
 import java.net.URL;
 import java.util.Arrays;
+import java.util.Date;
 
 /**
  * Description
@@ -44,32 +46,72 @@ public class Main {
     public static void main(String[] args){
         try{
             float sampleRate = 44100;
-            int audioBufferSize = 2048;
+            int audioBufferSize = 1024 *2;
             int bufferOverlap = 0;
             AudioFloatConverter converter = AudioFloatConverter.getConverter(audioFormat);
             //Create an AudioInputStream from my .wav file
-            URL soundURL = Main.class.getResource("/300.wav");
+            URL soundURL = Main.class.getResource("/WAV.wav");
             AudioInputStream stream = AudioSystem.getAudioInputStream(soundURL);
-            final MFCC mfccProcessor = new MFCC(audioBufferSize, stream.getFormat().getSampleRate(),
-                                                amountOfCepstrumCoef, amountOfMelFilters, lowerFilterFreq, upperFilterFreq);
+            // final MFCC mfccProcessor = new MFCC(audioBufferSize, stream.getFormat().getSampleRate(),
+            //                                     amountOfCepstrumCoef, amountOfMelFilters, lowerFilterFreq, upperFilterFreq);
 
-            FastYin detector = new FastYin(sampleRate, audioBufferSize );
+            FastYin detector = new FastYin(sampleRate, audioBufferSize *2);
             byte[] bytes = IOUtils.toByteArray(stream);
             AudioFormat format = stream.getFormat();
 
             int b = 0;
             int frequency = 0;
-            while (bytes.length > 2048 *2) {
+            File file = new File("D:\\project\\cooleshow\\audio-analysis\\target\\wav1.wav");
 
-                byte[] bufferData = ArrayUtil.extractByte(bytes, 0, 2048*2 - 1);
+            WaveformWriter waveFileProcessor = new WaveformWriter(file.getAbsolutePath());
+            byte[] bytes1 = new byte[0];
+            // for (int i = 0; i < bytes.length; i++) {
+            //     if (i%2 ==1) {
+            //         System.out.println(bytes[i] + "----------" + bytes[i-1]);
+            //     }
+            // }
+            while (bytes.length > audioBufferSize *2) {
+                byte[] bufferData = ArrayUtil.extractByte(bytes, 0, audioBufferSize*2 - 1);
+
+                bytes1 = ArrayUtil.mergeByte(bytes1, bufferData);
+                byte[] bytes2 = new byte[bytes1.length *2];
+                for (int i = 0; i < bytes1.length; i =i+2) {
+
+                    bytes2[(i+1) *2]  = bytes2[i*2] = bytes1[i];
+                    bytes2[(i+1) *2 +1] = bytes2[i*2 + 1] = bytes1[i +1];
+
+                }
+                // byte ff = bytes1[bytes1.length -1];
+                // for (int start = 0, end = bytes1.length - 2; start < end; start++, end--) {
+                //     byte temp = bytes1[end];
+                //     bytes1[end] = bytes1[start];
+                //     bytes1[start] = temp;
+                // }
+                // bytes1[bytes1.length -1] = ff;
+                //
+                // bytes1 = ArrayUtil.mergeByte(bufferData, bytes1);
+                if (bytes2.length == audioBufferSize *4) {
+                    waveFileProcessor.process(bytes2);
+
+
+                    float[] sampleFloats = new float[audioBufferSize *2];
+
+                    converter.toFloatArray(bytes2, sampleFloats);
+                    int playFrequency = (int) detector.getPitch(sampleFloats).getPitch();
+                    if (playFrequency != -1) {
+                        System.out.println("play frequency is " + playFrequency);
+                    }
+                    bytes1 = new byte[0];
+                }
 
-                float[] sampleFloats = new float[1024*2];
 
-                converter.toFloatArray(bufferData, sampleFloats);
-                int playFrequency = (int)detector.getPitch(sampleFloats).getPitch();
-                System.out.println("play frequency is " +playFrequency);
+                // YINPitchDetector frequencyDetector = new YINPitchDetector(sampleFloats.length, audioFormat.getSampleRate());
+                //
+                // playFrequency = (int) frequencyDetector.getFrequency(sampleFloats);
+                //
+                // System.out.println("frequencyDetector play frequency is " + playFrequency);
                 // ArrayUtil.extractByte(channelContext.getChannelBufferBytes(), bufferSize, totalLength - 1)
-                bytes  = ArrayUtil.extractByte(bytes, 2048*2, bytes.length - 1);
+                bytes  = ArrayUtil.extractByte(bytes, audioBufferSize, bytes.length - 1);
                 // if (b == 1) {
                 //     frequency += playFrequency;
                 //     System.out.println("play frequency is " +frequency/2);
@@ -80,6 +122,7 @@ public class Main {
                 //     b ++;
                 // }
             }
+            waveFileProcessor.processingFinished();
 
 
             //Convert into TarsosDSP API

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

@@ -5,7 +5,11 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public class NoteAnalysis {
 
 	public enum NoteErrorType implements BaseEnum<String, NoteErrorType> {
-		RIGHT("演奏正确"), CADENCE_WRONG("节奏错误"), INTONATION_WRONG("音准错误"), INTEGRITY_WRONG("完整度不足"), NOT_PLAY("未演奏");
+		RIGHT("演奏正确"), CADENCE_WRONG("节奏错误"), INTONATION_WRONG("音准错误"), INTEGRITY_WRONG("完整度不足"), NOT_PLAY("未演奏"),
+
+		CADENCE_FAST("节奏过快"),CADENCE_SLOW("节奏过慢"),
+		INTONATION_HIGH("音准过高"),INTONATION_LOW("音准过低"),
+		;
 
 		private String msg;
 
@@ -37,7 +41,7 @@ public class NoteAnalysis {
 
 	private int playFrequency = -1;
 
-	private boolean tempo = true;
+	private int tempo = 0;
 
 	private NoteErrorType noteErrorType = NoteErrorType.RIGHT;
 
@@ -116,11 +120,11 @@ public class NoteAnalysis {
 		this.frequency = frequency;
 	}
 
-	public boolean isTempo() {
+	public int getTempo() {
 		return tempo;
 	}
 
-	public void setTempo(boolean tempo) {
+	public void setTempo(int tempo) {
 		this.tempo = tempo;
 	}
 

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

@@ -2,7 +2,8 @@ package com.yonge.netty.dto;
 
 public class NotePlayResult {
 
-	private boolean status;
+	// 0:正确 1:音准过低 2:音准过高
+	private int status;
 	
 	private double migrationRate;
 	
@@ -10,11 +11,11 @@ public class NotePlayResult {
 		// TODO Auto-generated constructor stub
 	}
 
-	public boolean getStatus() {
+	public int getStatus() {
 		return status;
 	}
 
-	public void setStatus(boolean status) {
+	public void setStatus(int status) {
 		this.status = status;
 	}
 

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

@@ -15,6 +15,7 @@ import java.util.stream.Collectors;
 
 import javax.sound.sampled.AudioFormat;
 
+import com.yonge.audio.analysis.AudioFloatConverter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,6 +28,7 @@ import com.yonge.netty.entity.MusicXmlBasicInfo;
 import com.yonge.netty.entity.MusicXmlNote;
 import com.yonge.netty.entity.MusicXmlSection;
 import com.yonge.netty.server.processor.WaveformWriter;
+import org.springframework.util.CollectionUtils;
 
 /**
  * 用户通道上下文
@@ -89,20 +91,22 @@ public class UserChannelContext {
 
 		NotePlayResult result = new NotePlayResult();
 
-		boolean status = false;
+		int status;
 		double migrationRate = 0;
 
 		if (Math.round(xmlNote.getFrequency()) == Math.round(playFrequency)) {
-			status = true;
+			status = 0;
 			migrationRate = 0;
 		} else {
 			NoteFrequencyRange noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, xmlNote.getFrequency());
 
-			if (noteFrequencyRange.getMinFrequency() > playFrequency || playFrequency > noteFrequencyRange.getMaxFrequency()) {
-				status = false;
+			if (noteFrequencyRange.getMinFrequency() > playFrequency ) {
+				status = 1;
+			} else if( playFrequency > noteFrequencyRange.getMaxFrequency()){
+				status = 2;
 			} else {
 
-				status = true;
+				status = 0;
 
 				if (Math.round(playFrequency) < Math.round(xmlNote.getFrequency())) {
 					double min = Math.abs(xmlNote.getFrequency() - noteFrequencyRange.getMinFrequency()) / 2;
@@ -394,7 +398,8 @@ public class UserChannelContext {
 				}
 				
 				//判断节奏(音符持续时间内有不间断的音高,就节奏正确)
-				boolean tempo = true;
+				// 节奏  0:正常  1:错误 2:节奏慢 3:节奏快
+				int tempo = 0;
 				if (percussionList.contains(subjectId)) {
 					noteAnalysis.setPlayFrequency(-1);
 					tempo = computeTempoWithAmplitude2(musicXmlNote);
@@ -408,7 +413,7 @@ public class UserChannelContext {
 				evaluateForNote(musicXmlNote, noteAnalysis);//对当前音符评分
 
 				LOGGER.debug("当前音符下标[{}] 预计频率:{} 实际频率:{} 节奏:{}", noteAnalysis.getMusicalNotesIndex(), musicXmlNote.getFrequency(), noteAnalysis.getPlayFrequency(),
-						noteAnalysis.isTempo());
+						noteAnalysis.getTempo());
 				
 				doneNoteAnalysisList.add(noteAnalysis);
 				
@@ -540,9 +545,9 @@ public class UserChannelContext {
 		double playDurationTime = 0;
 		
 		if (percussionList.contains(subjectId)) {
-			if (noteAnalysis.getFrequency() == -1) {// 休止符
-				if (!noteAnalysis.isTempo()) {
-					noteAnalysis.setMusicalErrorType(NoteErrorType.CADENCE_WRONG);
+			if (noteAnalysis.getFrequency() == -1) { // 休止符
+				if (noteAnalysis.getTempo() != 0 ) {
+					noteAnalysis.setMusicalErrorType(setMusicalErrorTempo(noteAnalysis.getTempo()));
 				} else {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.RIGHT);
 				}
@@ -550,8 +555,8 @@ public class UserChannelContext {
 				int beatTimes = (int) chunkAnalysisList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).count();
 				if(beatTimes == 0){
 					noteAnalysis.setMusicalErrorType(NoteErrorType.NOT_PLAY);
-				}else if (!noteAnalysis.isTempo()) {
-					noteAnalysis.setMusicalErrorType(NoteErrorType.CADENCE_WRONG);
+				}else if (noteAnalysis.getTempo() != 0) {
+					noteAnalysis.setMusicalErrorType(setMusicalErrorTempo(noteAnalysis.getTempo()));
 				} else {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.RIGHT);
 				}
@@ -564,12 +569,12 @@ public class UserChannelContext {
 
 				playDurationTime = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= MIN_FREQUECY).mapToDouble(t -> t.getDurationTime()).sum();
 
-				if (!noteAnalysis.isTempo()) {
-					noteAnalysis.setMusicalErrorType(NoteErrorType.CADENCE_WRONG);
+				if (noteAnalysis.getTempo() != 0) {
+					noteAnalysis.setMusicalErrorType(setMusicalErrorTempo(noteAnalysis.getTempo()));
 				} else if (playDurationTime * 100 / durationTime < hardLevel.getIntegrityRange()) {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.INTEGRITY_WRONG);
-				} else if (notePlayResult.getStatus() == false) {
-					noteAnalysis.setMusicalErrorType(NoteErrorType.INTONATION_WRONG);
+				} else if (notePlayResult.getStatus() != 0) {
+					noteAnalysis.setMusicalErrorType(setMusicalErrorStatus(notePlayResult.getStatus()));
 				} else {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.RIGHT);
 				}
@@ -583,10 +588,10 @@ public class UserChannelContext {
 				} else if (playDurationTime * 100 / durationTime < hardLevel.getIntegrityRange()) {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.INTEGRITY_WRONG);
 					LOGGER.debug("完整度不足:{}", playDurationTime * 100 / durationTime);
-				} else if (!noteAnalysis.isTempo()) {
-					noteAnalysis.setMusicalErrorType(NoteErrorType.CADENCE_WRONG);
-				} else if (notePlayResult.getStatus() == false) {
-					noteAnalysis.setMusicalErrorType(NoteErrorType.INTONATION_WRONG);
+				} else if (noteAnalysis.getTempo() != 0) {
+					noteAnalysis.setMusicalErrorType(setMusicalErrorTempo(noteAnalysis.getTempo()));
+				} else if (notePlayResult.getStatus() != 0) {
+					noteAnalysis.setMusicalErrorType(setMusicalErrorStatus(notePlayResult.getStatus()));
 				} else {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.RIGHT);
 				}
@@ -610,7 +615,7 @@ public class UserChannelContext {
 			intonationScore = 0;
 		} else {
 
-			if (noteAnalysis.isTempo()) {
+			if (noteAnalysis.getTempo() == 0) {
 				tempoScore = 100;
 				noteAnalysis.setTempoScore(tempoScore);
 			}
@@ -629,7 +634,31 @@ public class UserChannelContext {
 					.intValue());
 		}
 	}
-	
+
+	// 设置 音高
+	private NoteErrorType setMusicalErrorStatus(int status) {
+		if (status == 1) {
+			return NoteErrorType.INTONATION_LOW;
+		} else if (status ==2) {
+			return NoteErrorType.INTONATION_HIGH;
+		}
+		return null;
+	}
+
+	// 设置节奏
+	private NoteErrorType setMusicalErrorTempo(int tempo) {
+		if (tempo == 1) {
+			return NoteErrorType.CADENCE_WRONG;
+		} else if (tempo == 2) {
+			return NoteErrorType.CADENCE_SLOW;
+		} else if (tempo ==3) {
+
+			return NoteErrorType.CADENCE_FAST;
+		} else {
+			return NoteErrorType.RIGHT;
+		}
+	}
+
 	private int computeFrequency(MusicXmlNote musicXmlNote) {
 		
 		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
@@ -680,7 +709,7 @@ public class UserChannelContext {
 	 * @param musicXmlNote
 	 * @return
 	 */
-	private boolean computeTempoWithFrequency(MusicXmlNote musicXmlNote){
+	private int computeTempoWithFrequency(MusicXmlNote musicXmlNote){
 		
 		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
 		
@@ -702,11 +731,11 @@ public class UserChannelContext {
 		List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(startIndex, elementSize + startIndex);
 		
 		if(chunkList == null || chunkList.size() == 0){
-			return false;
+			return 1;
 		}
 		
 		if (musicXmlNote.getFrequency() == -1) {// 休止符
-			return chunkList.stream().filter(t -> t.getFrequency() > MIN_FREQUECY).count() <= 1;
+			return chunkList.stream().filter(t -> t.getFrequency() > MIN_FREQUECY).count() <= 1? 0:1;
 		}
 
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
@@ -742,7 +771,7 @@ public class UserChannelContext {
 		
 		NoteFrequencyRange noteFrequencyRange = null;
 		ChunkAnalysis chunkAnalysis = null;
-		boolean tempo = true;
+		int tempo = 0;
 		//boolean isContinue = true;
 		//int unplayedSize = 0;
 		int firstPeakIndex = -1;
@@ -784,7 +813,7 @@ public class UserChannelContext {
 		}
 		
 		if (maxTimes * 100 / totalTimes < hardLevel.getIntegrityRange()) {
-			tempo = false;
+			tempo = 1;
 			LOGGER.debug("节奏错误原因:信号分堆后的最大数量不足指定的完成比例");
 		}
 		
@@ -827,16 +856,17 @@ public class UserChannelContext {
 		}
 		*/
 		
-		if (tempo) {
+		if (tempo == 0) {
 			// 判断进入时间点
 			if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())){
-				tempo = false;
+				// 节奏慢
+				tempo = 2;
 				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){
+					tempo = new NoteFrequencyRange(standardFrequecy, firstChunkAnalysis.getFrequency()).equals(new NoteFrequencyRange(standardFrequecy, lastChunkAnalysis.getFrequency())) == false?0:1;
+					if(tempo == 1){
 						LOGGER.debug("节奏错误原因:上一个音[{}]延续下来导致的", lastChunkAnalysis.getFrequency());
 					}
 				}
@@ -846,7 +876,7 @@ public class UserChannelContext {
 		return tempo;
 	}
 	
-	private boolean computeTempoWithAmplitude2(MusicXmlNote musicXmlNote) {
+	private int computeTempoWithAmplitude2(MusicXmlNote musicXmlNote) {
 
 		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
 		
@@ -867,7 +897,7 @@ public class UserChannelContext {
 		List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(0, elementSize);
 		
 		if(chunkList == null || chunkList.size() == 0){
-			return false;
+			return 1;
 		}
 		
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
@@ -878,7 +908,7 @@ public class UserChannelContext {
 		if (musicXmlNote.getFrequency() == -1) {// 休止符
 			
 			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;
+			return chunkList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).count() <= 0 ? 0:1;
 		}
 		
 		Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkAnalysis.getStartTime())).findFirst();
@@ -898,7 +928,7 @@ public class UserChannelContext {
 		LOGGER.debug("--Amplitude:{}  Denominator:{}",chunkAmplitudeList.stream().map(t -> t).collect(Collectors.toList()), musicXmlNote.getDenominator());
 		
 		// 检测是否有多个波峰
-		boolean tempo = false;
+		int tempo = 1;
 		boolean isContinue = true;
 		int firstPeakIndex = -1;
 		int peakSize = 0;
@@ -907,36 +937,36 @@ public class UserChannelContext {
 				continue;
 			}
 			if (chunkAmplitudeList.get(i) > hardLevel.getAmplitudeThreshold() && chunkAmplitudeList.get(i) > chunkAmplitudeList.get(i - 1)) {
-				tempo = true;
+				tempo = 0;
 				if(firstPeakIndex == -1){
 					firstPeakIndex = i;
 					peakSize++;
 				}
 				if (isContinue == false) {
-					tempo = false;
+					tempo = 1;
 					peakSize++;
 					break;
 				}
 			} else {
-				if (tempo == true) {
+				if (tempo == 0) {
 					isContinue = false;
 				}
 			}
 		}
 		
 		if(peakSize == 0){
-			tempo = lastChunkAnalysis.isPeak();
+			tempo = lastChunkAnalysis.isPeak() ?0:1;
 		}else if(peakSize == 1){
-			tempo = true;
+			tempo = 0;
 		}else{
-			tempo = false;
+			tempo = 1;
 		}
 		
-		if (tempo) {
+		if (tempo == 0) {
 			// 判断进入时间点
 			if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) * 2){
 				LOGGER.debug("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
-				tempo = false;
+				tempo = 1;
 			}
 		}
 		

+ 119 - 0
audio-analysis/src/test/java/com/yonge/netty/client/NettyClient.java

@@ -0,0 +1,119 @@
+package com.yonge.netty.client;
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.handler.codec.http.DefaultHttpHeaders;
+import io.netty.handler.codec.http.HttpClientCodec;
+import io.netty.handler.codec.http.HttpHeaders;
+import io.netty.handler.codec.http.HttpObjectAggregator;
+import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
+import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
+import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker;
+import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory;
+import io.netty.handler.codec.http.websocketx.WebSocketVersion;
+import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketServerCompressionHandler;
+import io.netty.handler.stream.ChunkedWriteHandler;
+
+import java.io.FileInputStream;
+import java.net.URI;
+
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+
+import com.yonge.netty.handler.WebSocketClientHandler;
+
+public class NettyClient {
+	
+	public static void main(String[] args) throws Exception {
+		NettyClient client = new NettyClient();
+		client.connect(new URI("ws://localhost:8090/audioAnalysis/123456"), "654321");
+	}
+
+	public void connect(URI websocketURI, String token) throws Exception {
+		EventLoopGroup worker = new NioEventLoopGroup();
+		try {
+			Bootstrap b = new Bootstrap();
+			/**
+			 *EventLoop的组
+			 */
+			b.group(worker);
+			/**
+			 * 用于构造socketchannel工厂
+			 */
+			b.channel(NioSocketChannel.class);
+			/**设置选项
+			 * 参数:Socket的标准参数(key,value),可自行百度
+			   保持呼吸,不要断气!
+			 * */
+			b.option(ChannelOption.SO_KEEPALIVE, true);
+			
+			HttpHeaders httpHeaders = new DefaultHttpHeaders();
+			httpHeaders.add("Authorization", token);
+            //进行握手
+            WebSocketClientHandshaker handshaker = WebSocketClientHandshakerFactory.newHandshaker(websocketURI, WebSocketVersion.V13, (String)null, true,httpHeaders);
+			
+			final WebSocketClientHandler handler = new WebSocketClientHandler(handshaker);
+			
+			/**
+			 * 自定义客户端Handle(客户端在这里搞事情)
+			 */
+			b.handler(new ChannelInitializer<SocketChannel>() {
+				@Override
+				public void initChannel(SocketChannel ch) throws Exception {
+					ch.pipeline().addLast(new HttpClientCodec());
+					ch.pipeline().addLast(new ChunkedWriteHandler());
+					ch.pipeline().addLast(new HttpObjectAggregator(1024 * 8));
+					ch.pipeline().addLast(new WebSocketServerCompressionHandler());
+					//ch.pipeline().addLast(new WebSocketclientProtocolHandler(webSocketPath, "WebSocket", true, 65536 * 1000, false, true))
+					ch.pipeline().addLast(handler);
+				}
+			});
+			
+			Channel channel = b.connect(websocketURI.getHost(), websocketURI.getPort()).sync().channel();
+	        handler.handshakeFuture().sync();
+	        
+			//step1发送xml
+			String step1 = FileUtils.readFileToString(FileUtils.toFile(WebSocketClientHandler.class.getResource("/悬崖上的金鱼姬1 速度160.json")));
+			channel.writeAndFlush(new TextWebSocketFrame(step1));
+			
+			String step2 = "{\"header\":{\"commond\":\"recordStart\",\"type\":\"SOUND_COMPARE\",\"status\":200}}";
+			channel.writeAndFlush(new TextWebSocketFrame(step2));
+			
+			String step3 = "{\"body\":{\"offsetTime\":1320},\"uuid\":\"1657779786620650261\",\"header\":{\"commond\":\"audioPlayStart\",\"type\":\"SOUND_COMPARE\"}}";
+			channel.writeAndFlush(new TextWebSocketFrame(step3));
+			
+			//step4 发送wav
+			String fileName = "/悬崖上的金鱼姬1 速度160.wav";
+			AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(FileUtils.toFile(WebSocketClientHandler.class.getResource(fileName)));
+			
+			AudioFormat baseFormat = audioInputStream.getFormat();
+
+			System.out.println(baseFormat.toString());
+
+			byte[] audio = IOUtils.toByteArray(audioInputStream);
+			
+			channel.writeAndFlush(new BinaryWebSocketFrame(Unpooled.wrappedBuffer(audio)));
+			audioInputStream.close();
+			
+			//step5 结束评测
+			String step5 = "{\"header\":{\"commond\":\"recordEnd\",\"type\":\"SOUND_COMPARE\",\"status\":200}}";
+			channel.writeAndFlush(new TextWebSocketFrame(step5));
+			
+			
+		} finally {
+			//worker.shutdownGracefully();
+		}
+	}
+
+}

+ 87 - 0
audio-analysis/src/test/java/com/yonge/netty/handler/WebSocketClientHandler.java

@@ -0,0 +1,87 @@
+package com.yonge.netty.handler;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelPromise;
+import io.netty.channel.SimpleChannelInboundHandler;
+import io.netty.handler.codec.http.FullHttpResponse;
+import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
+import io.netty.handler.codec.http.websocketx.PongWebSocketFrame;
+import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
+import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker;
+import io.netty.handler.codec.http.websocketx.WebSocketFrame;
+import io.netty.handler.codec.http.websocketx.WebSocketHandshakeException;
+import io.netty.util.CharsetUtil;
+
+public class WebSocketClientHandler extends SimpleChannelInboundHandler<Object> {
+
+    private final WebSocketClientHandshaker handshaker;
+    private ChannelPromise handshakeFuture;
+
+    public WebSocketClientHandler(WebSocketClientHandshaker handshaker) {
+        this.handshaker = handshaker;
+    }
+
+    public ChannelFuture handshakeFuture() {
+        return handshakeFuture;
+    }
+
+    @Override
+    public void handlerAdded(ChannelHandlerContext ctx) {
+        handshakeFuture = ctx.newPromise();
+    }
+
+    @Override
+    public void channelActive(ChannelHandlerContext ctx) {
+        handshaker.handshake(ctx.channel());
+    }
+
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) {
+        System.out.println("WebSocket Client disconnected!");
+    }
+
+    @Override
+    public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
+        Channel ch = ctx.channel();
+        if (!handshaker.isHandshakeComplete()) {
+            try {
+                handshaker.finishHandshake(ch, (FullHttpResponse) msg);
+                System.out.println("WebSocket Client connected!");
+                handshakeFuture.setSuccess();
+            } catch (WebSocketHandshakeException e) {
+                System.out.println("WebSocket Client failed to connect");
+                handshakeFuture.setFailure(e);
+            }
+            return;
+        }
+
+        if (msg instanceof FullHttpResponse) {
+            FullHttpResponse response = (FullHttpResponse) msg;
+            throw new IllegalStateException(
+                    "Unexpected FullHttpResponse (getStatus=" + response.status() +
+                            ", content=" + response.content().toString(CharsetUtil.UTF_8) + ')');
+        }
+
+        WebSocketFrame frame = (WebSocketFrame) msg;
+        if (frame instanceof TextWebSocketFrame) {
+            TextWebSocketFrame textFrame = (TextWebSocketFrame) frame;
+            System.out.println("WebSocket Client received message: " + textFrame.text());
+        } else if (frame instanceof PongWebSocketFrame) {
+            System.out.println("WebSocket Client received pong");
+        } else if (frame instanceof CloseWebSocketFrame) {
+            System.out.println("WebSocket Client received closing");
+            ch.close();
+        }
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
+        cause.printStackTrace();
+        if (!handshakeFuture.isDone()) {
+            handshakeFuture.setFailure(cause);
+        }
+        ctx.close();
+    }
+}

BIN
audio-analysis/src/test/resources/huanlesong-16bit.wav


File diff suppressed because it is too large
+ 0 - 0
audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.json


BIN
audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.wav


+ 11 - 2
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -53,12 +53,21 @@ public interface AdminFeignService {
     /**
      * 设置商城收入分润
      */
-    @PostMapping("/mallRecord")
+    @PostMapping("/userAccount/mallRecord")
     public HttpResponseResult<Boolean> mallRecord(@RequestBody List<MallOrderItemDto> shareDto ) ;
 
     /**
      * 设置商城收入状态
      */
-    @PostMapping("/mallRecordState")
+    @PostMapping("/userAccount/mallRecordState")
     public HttpResponseResult<Boolean> mallRecordState(@RequestBody  List<MallOrderItemDto> shareDto ) ;
+
+
+    //老师课酬
+    @PostMapping(value = "/task/refreshBlackList")
+    HttpResponseResult refreshBlackList();
+
+    @GetMapping(value = "/sysConfig/findConfigValue")
+    HttpResponseResult<String> findConfigValue(String paramName);
+
 }

+ 18 - 2
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java

@@ -4,6 +4,8 @@ import com.yonge.cooleshow.api.feign.AdminFeignService;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
 
+import java.util.List;
+
 /**
  * Description
  *
@@ -32,12 +34,26 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     }
 
     @Override
-    public HttpResponseResult<Boolean> mallTeacherRecordState(MallOrderItemDto shareDto) {
+    public HttpResponseResult<Boolean> mallRecord(List<MallOrderItemDto> shareDto) {
         return null;
     }
 
     @Override
-    public HttpResponseResult<Boolean> mallTeacherRecord(MallOrderItemDto shareDto) {
+    public HttpResponseResult<Boolean> mallRecordState(List<MallOrderItemDto> shareDto) {
+        return null;
+    }
+
+
+    @Override
+    public HttpResponseResult refreshBlackList() {
+
         return null;
     }
+
+    @Override
+    public HttpResponseResult<String> findConfigValue(String paramName) {
+
+        return null;
+    }
+
 }

+ 6 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/MallPortalFeignServiceFallback.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.api.feign.fallback;
 
 
 import com.yonge.cooleshow.api.feign.MallPortalFeignService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 /**
  * Description
@@ -14,4 +15,9 @@ public class MallPortalFeignServiceFallback implements MallPortalFeignService {
     public Object cancelTimeOutOrder() {
         return null;
     }
+
+    @Override
+    public HttpResponseResult autoReceive() {
+        return null;
+    }
 }

+ 5 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/SysUserFeignService.java

@@ -12,6 +12,7 @@ import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.IOException;
 import java.util.List;
 
 @FeignClient(contextId = "sysUserFeignService", name = "auth-server", configuration = { FeignConfiguration.class }, fallback = SysUserFeignServiceFallback.class)
@@ -60,4 +61,8 @@ public interface SysUserFeignService {
 	@PostMapping(value = "user/list")
 	HttpResponseResult<List<SysUser>> page(@RequestBody SysUserQueryInfo queryInfo);
 
+	@GetMapping("/client")
+	@ApiOperation(value = "获取登录用户client")
+	HttpResponseResult<String> client();
+
 }

+ 5 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/fallback/SysUserFeignServiceFallback.java

@@ -79,4 +79,9 @@ public class SysUserFeignServiceFallback implements SysUserFeignService {
 		return HttpResponseResult.failed("请求失败");
 	}
 
+	@Override
+	public HttpResponseResult<String> client() {
+		return null;
+	}
+
 }

+ 23 - 38
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserDeviceServiceImpl.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import com.yonge.cooleshow.auth.dal.dao.SysConfigDao;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,6 +22,8 @@ public class SysUserDeviceServiceImpl extends BaseServiceImpl<Long, SysUserDevic
 	
 	@Autowired
 	private SysUserDeviceDao sysUserDeviceDao;
+	@Autowired
+	private SysConfigDao sysConfigDao;
 
 	@Override
 	public BaseDAO<Long, SysUserDevice> getDAO() {
@@ -39,48 +42,31 @@ public class SysUserDeviceServiceImpl extends BaseServiceImpl<Long, SysUserDevic
 
 	@Override
 	public boolean bindDevice(String clientId, Long userId, String deviceNum) {
-
+		String paramName;
 		if (StringUtils.equals(clientId, "STUDENT")) {
-			// 检查学生是否绑定了多个设备号
-			List<SysUserDevice> studentDeviceList = queryByUserId(clientId, userId);
-
-			if (studentDeviceList == null) {
-				studentDeviceList = new ArrayList<SysUserDevice>();
-			}
-
-			List<String> deviceList = studentDeviceList.stream().map(t -> t.getDeviceNum()).collect(Collectors.toList());
-
-			if (!deviceList.contains(deviceNum)) {
-				if (deviceList.size() >= 5) {
-					throw new BadCredentialsException("登录失败,当前账号绑定设备过多");
-				}
-
-				SysUserDevice sysUserDevice = new SysUserDevice();
-				sysUserDevice.setUserId(userId);
-				sysUserDevice.setDeviceNum(deviceNum);
-				sysUserDevice.setBindTime(new Date());
-				sysUserDevice.setClientId(clientId);
-				sysUserDeviceDao.insert(sysUserDevice);
-			}
-		} else {
-			// 查询设备号是否已存在
-			List<SysUserDevice> sysUserDeviceList = sysUserDeviceDao.queryByDeviceNum(null, deviceNum);
-
-			if (sysUserDeviceList == null) {
-				sysUserDeviceList = new ArrayList<SysUserDevice>();
-			}
-
-			sysUserDeviceList = sysUserDeviceList.stream().filter(sud -> !StringUtils.equals(sud.getClientId(), "STUDENT")).collect(Collectors.toList());
+			paramName = "student_device_acc_num";
+		} else if (StringUtils.equals(clientId, "TEACHER")) {
+			paramName = "teacher_device_acc_num";
+		}else {
+			return true;
+		}
+		String configValue = sysConfigDao.findConfigValue(paramName);
+		if(StringUtils.isEmpty(configValue)){
+			return true;
+		}
+		// 检查学生是否绑定了多个设备号
+		List<SysUserDevice> studentDeviceList = queryByUserId(clientId, userId);
 
-			if (sysUserDeviceList != null && sysUserDeviceList.size() > 0) {
-				if (sysUserDeviceList.stream().filter(sud -> sud.getUserId().equals(userId)).count() > 0) {
+		if (studentDeviceList == null) {
+			studentDeviceList = new ArrayList<SysUserDevice>();
+		}
 
-					return true;
-				}
+		List<String> deviceList = studentDeviceList.stream().map(t -> t.getDeviceNum()).collect(Collectors.toList());
 
-				throw new BadCredentialsException("当前设备已绑定账号,请更换设备");
+		if (!deviceList.contains(deviceNum)) {
+			if (deviceList.size() >= Integer.parseInt(configValue)) {
+				throw new BadCredentialsException("登录失败:该账号已达到设备绑定数量上限");
 			}
-
 			SysUserDevice sysUserDevice = new SysUserDevice();
 			sysUserDevice.setUserId(userId);
 			sysUserDevice.setDeviceNum(deviceNum);
@@ -88,7 +74,6 @@ public class SysUserDeviceServiceImpl extends BaseServiceImpl<Long, SysUserDevic
 			sysUserDevice.setClientId(clientId);
 			sysUserDeviceDao.insert(sysUserDevice);
 		}
-
 		return true;
 	}
 

+ 10 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java

@@ -298,4 +298,14 @@ public class TokenController extends BaseController {
         redissonClient.getBucket(CacheNameEnum.QR_LOGIN_CODE.getRedisKey(code)).set(dto, 5, TimeUnit.MINUTES);
         return HttpResponseResult.succeed(dto);
     }
+
+    @GetMapping("/client")
+    @ApiOperation(value = "获取登录用户client")
+    public HttpResponseResult<String> client() throws IOException {
+        AuthUser authUser = SecurityUtils.getUser();
+        if (authUser == null) {
+            return HttpResponseResult.failed("请先登录");
+        }
+        return succeed(authUser.getClientId());
+    }
 }

+ 24 - 3
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java

@@ -109,7 +109,7 @@ public class NewsController extends BaseController {
 				}
 			}
 		}
-		if(newsInfo.getType() == 4) {
+		if(newsInfo.getType() == 4 ||newsInfo.getType() == 5) {
 			if (StringUtil.isEmpty(newsInfo.getClientType() )) {
 				return failed("平台不能为空");
 			}
@@ -215,7 +215,24 @@ public class NewsController extends BaseController {
 		return succeed(sysNewsInformationService.updateStatus(id));
 	}
 
-	@ApiOperation("app首页banner、按钮、资讯")
+	// @ApiOperation("老师手机app首页按钮")
+	// @GetMapping(value = "/app/home/teacher")
+	public HttpResponseResult<List<SysNewsInformationDto>> teacherMenu() {
+
+		NewsInformationQueryInfo queryInfo = new NewsInformationQueryInfo();
+		queryInfo.setStatus(NewsStatusEnum.SHOW.getCode().toString());
+		queryInfo.setPlatformType("TEACHER");
+		// 1热门资讯
+		queryInfo.setType(5);
+		queryInfo.setPage(1);
+		queryInfo.setRows(999);
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+		List<SysNewsInformationDto> rows = sysNewsInformationService.selectPage(queryInfo).getRows();
+		return succeed(rows);
+	}
+
+	@ApiOperation("学生/老师端 手机app首页banner、按钮、资讯")
 	@PostMapping(value = "/app/home")
 	public HttpResponseResult<AppHomeDto> appHome(@RequestBody AppParam param) {
 
@@ -230,7 +247,11 @@ public class NewsController extends BaseController {
 
 		AppHomeDto appHomeDto = new AppHomeDto();
 		queryInfo.setStatus(NewsStatusEnum.SHOW.getCode().toString());
-		queryInfo.setPlatformType("STUDENT");
+		if (StringUtil.isEmpty(param.getClientType())) {
+			queryInfo.setPlatformType("STUDENT");
+		} else {
+			queryInfo.setPlatformType(param.getClientType());
+		}
 		// 1热门资讯
 		queryInfo.setType(1);
 		queryInfo.setPage(1);

+ 1 - 1
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/queryinfo/NewsInformationQueryInfo.java

@@ -18,7 +18,7 @@ public class NewsInformationQueryInfo extends QueryInfo {
 	@NotBlank(message = "平台类型不能为空")
 	private String platformType;
 
-	@ApiModelProperty("轮播图客户端类型 STUDENT:学生端 WEBSITE:官网 ")
+	@ApiModelProperty("轮播图客户端类型 STUDENT:学生端 WEBSITE:官网 TEACHER :老师端")
 	private String clientType;
 
 	@ApiModelProperty(value = "子类型  章节id", required = false)

+ 1 - 1
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/SysNewsInformation.java

@@ -95,7 +95,7 @@ public class SysNewsInformation {
 	private String linkType;
 
 	// 平台类型  ADMIN:平台端  STUDENT:学生端  TEACHER:老师端 WEBSITE:官网
-	@ApiModelProperty(value = "客户端类型    STUDENT:学生端  WEBSITE:官网")
+	@ApiModelProperty(value = "客户端类型    STUDENT:学生端  WEBSITE:官网  TEACHER :老师端")
 	private String clientType;
 
 	public String getClientType() {

+ 11 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/AppParam.java

@@ -18,6 +18,17 @@ public class AppParam {
     @ApiModelProperty(value = "平台",required = true)
     private String platform;
 
+    @ApiModelProperty("老师端:TEACHER 学生端:STUDENT")
+    private String clientType;
+
+
+    public String getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(String clientType) {
+        this.clientType = clientType;
+    }
 
     public String getVersion() {
         return version;

+ 4 - 1
cooleshow-cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml

@@ -68,7 +68,7 @@
 						and if(sni.online_time_ is not null,sni.online_time_ &lt;= now(),1=1)
 						and if(sni.offline_time_ is not null,sni.offline_time_ &gt;= now(),1=1)
 					</if>
-					<if test="type == 4">
+					<if test="type == 4 or type == 5">
 						<choose>
 							<when test="platformType == 'WEBSITE'">
 								and sni.client_type_ = #{platformType}
@@ -76,6 +76,9 @@
 							<when test="platformType == 'STUDENT'">
 								and sni.client_type_ = #{platformType}
 							</when>
+							<when test="platformType == 'TEACHER'">
+								and sni.client_type_ = #{platformType}
+							</when>
 						</choose>
 					</if>
 				</if>

+ 31 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -220,12 +220,42 @@ public interface SysConfigConstant {
      * 敏感词-黑名单
      */
     String BLACK_LIST = "black_list";
+    /**
+     * 敏感词-黑名单
+     */
+    String BLACK_LIST_FILE_PATH = "/root/blacklist.txt";
+
+    /**
+     * 敏感词-黑名单-更新时间
+     */
+    String BLACK_LIST_UPDATE_TIME = "black_list_update_time";
 
     /**
      * 敏感词-白名单
      */
     String WHITE_LIST = "white_list";
 
+
+    /** 老师分享曲目二维码跳转链接 */
+    String TEACHER_MUSIC_SHEET_SHARE_PROFIT_URL = "teacher_music_sheet_share_profit_url";
+
+
+    /** 老师分享直播课二维码跳转链接 */
+    String TEACHER_LIVE_GROUP_SHARE_PROFIT_URL = "teacher_live_group_share_profit_url";
+
+
+    /** 老师分享视频课二维码跳转链接 */
+    String TEACHER_VIDEO_GROUP_SHARE_PROFIT_URL = "teacher_video_group_share_profit_url";
+
+
+    /** 老师分享VIP二维码跳转链接 */
+    String TEACHER_VIP_SHARE_PROFIT_URL = "teacher_vip_share_profit_url";
+
+
+
+    /** 老师分享商品二维码跳转链接 */
+    String TEACHER_PRODUCT_SHARE_PROFIT_URL = "teacher_product_share_profit_url";
+
     /**
      * 直播课推荐分润比例
      */
@@ -270,4 +300,5 @@ public interface SysConfigConstant {
      * 商品账期
      */
     String MALL_ACCOUNT_PERIOD = "mall_account_period";
+
 }

+ 3 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsAdminServiceImpl.java

@@ -272,6 +272,9 @@ public class UmsAdminServiceImpl implements UmsAdminService {
                                  .filter(id -> !finalHasRoleAdminIdList.contains(id))
                                  .collect(Collectors.toList());
 
+        if (CollectionUtils.isEmpty(adminIdList)) {
+            return true;
+        }
         // 设置权限
         List<UmsAdminRoleRelation> list = new ArrayList<>();
         for (Long adminId : adminIdList) {

+ 5 - 0
cooleshow-mall/mall-portal/pom.xml

@@ -40,6 +40,11 @@
             <groupId>com.yonge.cooleshow</groupId>
             <artifactId>auth-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.yonge.cooleshow</groupId>
+            <artifactId>cooleshow-api</artifactId>
+            <version>1.0</version>
+        </dependency>
 <!--        <dependency>-->
 <!--            <groupId>com.yonge.cooleshow</groupId>-->
 <!--            <artifactId>mall-pay</artifactId>-->

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java

@@ -28,7 +28,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 .and()
                 .authorizeRequests().antMatchers("/wechat/*","/v2/api-docs", "/code/*","/payment/callback/**",
                  "/order/paySuccess/test","/order/cancelUserOrder/test")
-            .permitAll().anyRequest().permitAll().and().httpBasic();
+            .permitAll().anyRequest().authenticated().and().httpBasic();
     }
 
     @Override

+ 9 - 3
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PmsPortalProductController.java

@@ -1,5 +1,10 @@
 package com.yonge.cooleshow.portal.controller;
 
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.security.AuthUser;
+import com.yonge.cooleshow.common.security.SecurityUtils;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mbg.mapper.OmsCartItemMapper;
@@ -12,6 +17,7 @@ import com.yonge.cooleshow.portal.dto.ProductSearch;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
 import com.yonge.cooleshow.portal.service.UmsMemberService;
+import com.yonge.toolset.base.util.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,7 +41,8 @@ public class PmsPortalProductController {
     private UmsMemberService umsMemberService;
     @Autowired
     private PmsPortalProductService portalProductService;
-
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
     @Autowired
     private OmsCartItemMapper omsCartItemMapper;
 
@@ -85,8 +92,7 @@ public class PmsPortalProductController {
         }catch (Exception e) {
             return CommonResult.success(0);
         }
+    }
 
 
-
-    }
 }

+ 51 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.portal.controller.open;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.portal.dto.ShareProfitParam;
+import com.yonge.cooleshow.portal.service.PmsPortalProductService;
+import com.yonge.toolset.base.util.StringUtil;
+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.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/open")
+@Api(value = "开放权限接口-分享", hidden = true)
+public class OpenShareController extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(OpenShareController.class);
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private PmsPortalProductService portalProductService;
+
+
+    @ApiOperation(value = "老师商品分享分润")
+    @PostMapping(value="/productProfit")
+    @ResponseBody
+    public CommonResult shareProductProfit(@RequestBody ShareProfitParam param) {
+        SysUser sysUser = sysUserFeignService.queryUserById(param.getUserId());
+        if (sysUser == null  || sysUser.getId() == null) {
+            return CommonResult.failed("用户信息获取失败");
+        }
+        HttpResponseResult<String> client = sysUserFeignService.client();
+        if (client.getStatus()) {
+            if (!StringUtil.isEmpty(client.getData()) && "teacher".equals(client.getData())) {
+                return CommonResult.success(portalProductService.shareProductProfit(sysUser, param.getBizId()));
+            }
+        } else {
+            return CommonResult.success(portalProductService.shareProductProfit(sysUser, param.getBizId()));
+        }
+        return CommonResult.failed("分享功能暂未开放");
+    }
+}

+ 72 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ShareProductVo.java

@@ -0,0 +1,72 @@
+package com.yonge.cooleshow.portal.dto;
+
+import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-07-21
+ */
+@ApiModel("分享商品信息")
+public class ShareProductVo implements Serializable {
+
+
+    @ApiModelProperty("老师id")
+    private Long teacherId;
+    @ApiModelProperty("推荐老师姓名")
+    private String name;
+
+    @ApiModelProperty("推荐老师头像")
+    private String avatar;
+
+    @ApiModelProperty("二维码链接")
+    private String url;
+
+    @ApiModelProperty("商品信息")
+    private PmsPortalProductDetail productDetail;
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public PmsPortalProductDetail getProductDetail() {
+        return productDetail;
+    }
+
+    public void setProductDetail(PmsPortalProductDetail productDetail) {
+        this.productDetail = productDetail;
+    }
+}

+ 34 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ShareProfitParam.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.portal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-07-22
+ */
+public class ShareProfitParam {
+
+    @ApiModelProperty("分享人id")
+    private Long userId;
+
+    @ApiModelProperty("曲目/直播课/视频课 id")
+    private Long bizId;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getBizId() {
+        return bizId;
+    }
+
+    public void setBizId(Long bizId) {
+        this.bizId = bizId;
+    }
+}

+ 10 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java

@@ -1,9 +1,11 @@
 package com.yonge.cooleshow.portal.service;
 
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.mbg.model.PmsProduct;
 import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
 import com.yonge.cooleshow.portal.domain.PmsProductCategoryNode;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
+import com.yonge.cooleshow.portal.dto.ShareProductVo;
 
 import java.util.List;
 
@@ -33,4 +35,12 @@ public interface PmsPortalProductService {
      * @return ProductSearchConditionVo
      */
     ProductSearchConditionVo searchCondition();
+
+    /**
+     * 老师分享商品分润
+     *
+     * @param sysUser 推荐人信息
+     * @param productId 商品id
+     */
+    ShareProductVo shareProductProfit(SysUser sysUser, Long productId);
 }

+ 5 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java

@@ -93,8 +93,12 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
             if (pmsSkuStock.getStock() - pmsSkuStock.getLockStock() < existCartItem.getQuantity() + cartItem.getQuantity()) {
                 throw new BizException("库存不足");
             }
+            if(existCartItem.getQuantity() + cartItem.getQuantity() > 200) {
+                existCartItem.setQuantity(200);
+            } else {
+                existCartItem.setQuantity(cartItem.getQuantity() + existCartItem.getQuantity());
+            }
             cartItem.setModifyDate(new Date());
-            existCartItem.setQuantity(cartItem.getQuantity());
             cartItemMapper.updateByPrimaryKey(existCartItem);
         }
         return existCartItem;

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -346,7 +346,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
         List<OmsOrderItem> orderItemList = detail.getOrderItemList();
 
-        orderItemList = orderItemList.stream().filter(omsOrderItem -> omsOrderItem.getPromoterId() != null).collect(Collectors.toList());
+        // orderItemList = orderItemList.stream().filter(omsOrderItem -> omsOrderItem.getPromoterId() != null).collect(Collectors.toList());
         if (CollectionUtils.isEmpty(orderItemList) ) {
             return;
         }

+ 23 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java

@@ -3,6 +3,9 @@ package com.yonge.cooleshow.portal.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.github.pagehelper.PageHelper;
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.mbg.mapper.*;
 import com.yonge.cooleshow.mbg.model.*;
 import com.yonge.cooleshow.portal.dao.PortalProductDao;
@@ -10,7 +13,9 @@ import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
 import com.yonge.cooleshow.portal.domain.PmsProductCategoryNode;
 import com.yonge.cooleshow.portal.dto.ProductCategorySmallVo;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
+import com.yonge.cooleshow.portal.dto.ShareProductVo;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
+import com.yonge.toolset.base.string.MessageFormatter;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -47,6 +52,9 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
     private PortalProductDao portalProductDao;
 
     @Autowired
+    private AdminFeignService adminFeignService;
+
+    @Autowired
     private PmsProductAttributeCategoryMapper productAttributeCategoryMapper;
 
     @Override
@@ -189,6 +197,21 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
         return result;
     }
 
+    @Override
+    public ShareProductVo shareProductProfit(SysUser sysUser, Long productId) {
+        PmsPortalProductDetail detail = detail(productId);
+        ShareProductVo  shareProductVo = new ShareProductVo();
+        shareProductVo.setProductDetail(detail);
+        shareProductVo.setAvatar(sysUser.getAvatar());
+        shareProductVo.setTeacherId(sysUser.getId());
+        shareProductVo.setName(sysUser.getUsername());
+        // String url = adminFeignService.findConfigValue(SysConfigConstant.TEACHER_PRODUCT_SHARE_PROFIT_URL).getData();
+
+        // shareProductVo.setUrl(MessageFormatter.arrayFormat(url, detail.getProduct().getId(), sysUser.getId()));
+
+        return shareProductVo;
+    }
+
 
     private  List<PmsProductAttributeCategory>  getHomeProductAttributeCategory() {
         PmsProductAttributeCategoryExample example = new PmsProductAttributeCategoryExample();

+ 2 - 2
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderItemDao.xml

@@ -7,7 +7,7 @@
         product_sn, product_price, product_quantity,
         product_sku_id, product_category_id, product_sku_code,promotion_name,
         promotion_amount, coupon_amount, integration_amount,
-        real_amount,product_attr) values
+        real_amount,product_attr,promoter_id,share_proportion_) values
         <foreach collection="list" item="item" separator="," index="index">
             (#{item.orderId,jdbcType=BIGINT}, #{item.orderSn,jdbcType=VARCHAR}, #{item.productId,jdbcType=BIGINT},
             #{item.productPic,jdbcType=VARCHAR}, #{item.productName,jdbcType=VARCHAR}, #{item.productBrand,jdbcType=VARCHAR},
@@ -16,7 +16,7 @@
             #{item.promotionName,jdbcType=VARCHAR},
             #{item.promotionAmount,jdbcType=DECIMAL}, #{item.couponAmount,jdbcType=DECIMAL},
             #{item.integrationAmount,jdbcType=DECIMAL},
-            #{item.realAmount,jdbcType=DECIMAL},#{item.productAttr,jdbcType=VARCHAR})
+            #{item.realAmount,jdbcType=DECIMAL},#{item.productAttr,jdbcType=VARCHAR},#{item.promoterId},#{item.shareProportion})
         </foreach>
     </insert>
 </mapper>

+ 19 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/RefreshBlackListTask.java

@@ -0,0 +1,19 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RefreshBlackListTask extends BaseTask {
+
+    @Autowired
+    private AdminFeignService adminFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        adminFeignService.refreshBlackList();
+    }
+}

+ 2 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/AdminApplication.java

@@ -11,6 +11,7 @@ import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 
 import com.spring4all.swagger.EnableSwagger2Doc;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
 @EnableDiscoveryClient
@@ -19,6 +20,7 @@ import com.spring4all.swagger.EnableSwagger2Doc;
 @ComponentScan(basePackages = {"com.yonge.cooleshow", "com.yonge.toolset"})
 @Configuration
 @EnableSwagger2Doc
+@EnableScheduling
 public class AdminApplication {
     public static void main(String[] args) {
         BaseApplication.run(AppConstant.APPLICATION_ADMIN, AdminApplication.class, args);

+ 6 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java

@@ -11,6 +11,7 @@ import com.yonge.toolset.utils.validator.ValidationKit;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
@@ -41,7 +42,11 @@ public class ImGroupController extends BaseController {
     @PostMapping(value = "/getDetail/{groupId}")
     @PreAuthorize("@pcs.hasPermissions('imGroup/detail')")
     public HttpResponseResult<ImGroup> getDetail(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId) throws Exception {
-        return succeed(imGroupService.getById(groupId));
+        ImGroup group = imGroupService.getById(groupId);
+        if (group == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        return succeed(group);
     }
 
     @ApiOperation("群列表")

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java

@@ -70,7 +70,7 @@ public class MusicSheetController extends BaseController {
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        return succeed(musicSheetService.detail(id, sysUser, SysUserType.SYSTEM));
+        return succeed(musicSheetService.detail(id, sysUser, ClientEnum.SYSTEM));
     }
 
 	@ApiOperation(value = "新增", httpMethod="POST", consumes="application/json", produces="application/json")

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherStyleVideoController.java

@@ -55,6 +55,6 @@ public class TeacherStyleVideoController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('teacherAuthMusicianRecord/doAuth')")
     public HttpResponseResult<Boolean> doAuth(@Valid @RequestBody AuthOperaReq authOperaReq) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        return teacherStyleVideoService.doAuth(authOperaReq, sysUser);
+        return succeed(teacherStyleVideoService.doAuth(authOperaReq, sysUser));
     }
 }

+ 13 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountRecordController.java

@@ -2,12 +2,17 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
+import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -15,6 +20,8 @@ import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
 
+import javax.validation.Valid;
+
 @RestController
 @RequestMapping("/userAccountRecord")
 @Api(value = "用户账户流水表", tags = "用户账户流水表")
@@ -44,4 +51,10 @@ public class UserAccountRecordController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
 	}
 
+    @ApiOperation(value = "收入数据统计")
+    @PostMapping("/accountTotal")
+    public HttpResponseResult<UserAccountVo> accountTotal(@RequestBody UserAccountRecordSearch query) {
+        return userAccountRecordService.accountTotal(query);
+    }
+
 }

+ 18 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -1,9 +1,14 @@
 package com.yonge.cooleshow.admin.task;
 
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.wordfilter.WordContext;
+import com.yonge.cooleshow.biz.dal.wordfilter.WordFilter;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -11,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
+import java.io.File;
+
 /**
  * @Author: liweifan
  * @Data: 2022/3/28 15:50
@@ -27,6 +34,8 @@ public class TaskController extends BaseController {
     private CourseScheduleService courseScheduleService;
     @Autowired
     private UserAccountRecordService userAccountRecordService;
+    @Autowired
+    private RedissonClient redissonClient;
 
     /***
      * 轮询用户订单
@@ -66,4 +75,13 @@ public class TaskController extends BaseController {
         userAccountRecordService.sendTeacherEarning();
         return HttpResponseResult.succeed();
     }
+
+    //刷新黑名单
+    @PostMapping(value = "/refreshBlackList")
+    public HttpResponseResult refreshBlackList() {
+        RBucket<Long> bucket = redissonClient.getBucket(SysConfigConstant.BLACK_LIST_UPDATE_TIME);
+        File file = new File(SysConfigConstant.BLACK_LIST_FILE_PATH);
+        bucket.set(file.lastModified());
+        return HttpResponseResult.succeed();
+    }
 }

+ 5 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PlatformCashAccountRecordDao.java

@@ -20,10 +20,13 @@ public interface PlatformCashAccountRecordDao extends BaseMapper<PlatformCashAcc
 
     int insertBatch(@Param("entities") List<PlatformCashAccountRecord> entities);
     
-    IPage<PlatformCashAccountRecord> queryPage(@Param("page") IPage<PlatformCashAccountRecord> page, @Param("param") PlatformCashAccountRecordSearch query);
+    int batchUpdate(List<PlatformCashAccountRecord> list);
     
+
+    IPage<PlatformCashAccountRecord> queryPage(@Param("page") IPage<PlatformCashAccountRecord> page, @Param("param") PlatformCashAccountRecordSearch query);
+
     PlatformCashAccountRecordSummaryVo querySummary(@Param("param") PlatformCashAccountRecordSearch query);
-    
+
     List<PlatformCashAccountRecord> queryByBizTypeAndPaymentDays(@Param("bizType")String bizType, @Param("paymentDays")int paymentDays);
 }
 

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
@@ -41,6 +42,8 @@ public interface UserAccountRecordDao extends BaseMapper<UserAccountRecord> {
 
     List<UserAccountRecordVo> selectAllPage(@Param("param") UserAccountRecordSearch userAccountRecord);
 
+
+    UserAccountVo accountTotal(@Param("param") UserAccountRecordSearch param);
     /**
      * app查询详情
      *
@@ -94,4 +97,6 @@ public interface UserAccountRecordDao extends BaseMapper<UserAccountRecord> {
     UserAccountRecordVo detailByBiz(@Param("orderNo") String orderNo,
                                     @Param("bizType") AccountBizTypeEnum bizType,
                                     @Param("bizId") Long bizId);
+
+
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetPayDto.java

@@ -20,6 +20,17 @@ public class MusicSheetPayDto {
     @ApiModelProperty("订单金额")
     private BigDecimal actualPrice;
 
+    @ApiModelProperty("老师端: TEACHER 学生端:STUDNET")
+    private String clientType;
+
+    public String getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(String clientType) {
+        this.clientType = clientType;
+    }
+
     public Long getMusicSheetId() {
         return musicSheetId;
     }

+ 34 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ShareProfitParam.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-07-22
+ */
+public class ShareProfitParam {
+
+    @ApiModelProperty("分享人id")
+    private Long userId;
+
+    @ApiModelProperty("曲目/直播课/视频课 id")
+    private Long bizId;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getBizId() {
+        return bizId;
+    }
+
+    public void setBizId(Long bizId) {
+        this.bizId = bizId;
+    }
+}

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java

@@ -31,6 +31,18 @@ public class StudentMusicSheetSearch  extends MusicSheetSearch{
     @ApiModelProperty(value = "平台")
     private String platform;
 
+
+    @ApiModelProperty(value = "查看我自己的曲目",required = true)
+    private Boolean myself = true;
+
+    public Boolean getMyself() {
+        return myself;
+    }
+
+    public void setMyself(Boolean myself) {
+        this.myself = myself;
+    }
+
     public YesOrNoEnum getAuditVersion() {
         return auditVersion;
     }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VideoLessonGroupSearch.java

@@ -39,6 +39,18 @@ public class VideoLessonGroupSearch extends QueryInfo {
     @ApiModelProperty(value = "平台",required = true)
     private String platform;
 
+
+    @ApiModelProperty(value = "查看我自己的视频课",required = true)
+    private Boolean myself = true;
+
+    public Boolean getMyself() {
+        return myself;
+    }
+
+    public void setMyself(Boolean myself) {
+        this.myself = myself;
+    }
+
     public Long getLessonSubject() {
         return lessonSubject;
     }

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java

@@ -170,10 +170,23 @@ public class MusicSheet implements Serializable {
     private String remark;  //备注,填写未通过审核的原因
 
 
+	@TableField("ext_config_json_")
+	@ApiModelProperty("曲目配置信息")
+	private String extConfigJson;
+
+
 	@TableField("del_flag_")
 	@ApiModelProperty(value = "假删除标识 0:未删除 1:已删除")
 	private Boolean delFlag;
 
+	public String getExtConfigJson() {
+		return extConfigJson;
+	}
+
+	public void setExtConfigJson(String extConfigJson) {
+		this.extConfigJson = extConfigJson;
+	}
+
 	public YesOrNoEnum getNotation() {
 		return notation;
 	}

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPurchaseRecord.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -36,6 +37,10 @@ public class MusicSheetPurchaseRecord extends BaseEntity {
     @ApiModelProperty(value = "订单流水号")
     private String orderNo;  //订单流水号
 
+	@TableField("client_type_")
+	@ApiModelProperty(value = "用户类型 TEACHER:老师,STUDENT:学生")
+	private ClientEnum clientType;
+
     @TableField("student_id_")
     @ApiModelProperty(value = "学生ID")
     private Long studentId;  //学生ID
@@ -62,6 +67,14 @@ public class MusicSheetPurchaseRecord extends BaseEntity {
     @ApiModelProperty(value = "订单状态(WAIT_PAY:待支付;PAYING:支付中,PAID:已付款)")
     private OrderStatusEnum orderStatus;  //订单状态(1:已完成;0:取消)
 
+	public ClientEnum getClientType() {
+		return clientType;
+	}
+
+	public void setClientType(ClientEnum clientType) {
+		this.clientType = clientType;
+	}
+
 	public BigDecimal getOriginalPrice() {
 		return originalPrice;
 	}

+ 12 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java

@@ -49,9 +49,12 @@ public class RoomInfoCache implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createRoomTime;
 
-    @ApiModelProperty(value = "结束时间后最多延迟分钟数")
+    @ApiModelProperty(value = "开始提前进入分钟数")
     private Integer expiredMinute;
 
+    @ApiModelProperty(value = "结束时间后最多延迟分钟数")
+    private Integer expiredCloseMinute;
+
     @ApiModelProperty(value = "主讲人进入房间时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date joinRoomTime;
@@ -69,6 +72,14 @@ public class RoomInfoCache implements Serializable {
     @ApiModelProperty(value = "当前观看人数")
     private Integer lookNum;
 
+    public Integer getExpiredCloseMinute() {
+        return expiredCloseMinute;
+    }
+
+    public void setExpiredCloseMinute(Integer expiredCloseMinute) {
+        this.expiredCloseMinute = expiredCloseMinute;
+    }
+
     public Long getCourseId() {
         return courseId;
     }

+ 62 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java

@@ -103,6 +103,11 @@ public class Teacher implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date entryAuthDate;
 
+
+    @ApiModelProperty("老师点亮图标 STYLE:个人风采 VIDEO:视频课 LIVE:直播课,MUSIC:曲目 ")
+    @TableField(value = "tag_")
+    private String tag;
+
     /** 
     * 音乐人  0 否 1 是
     */
@@ -125,6 +130,30 @@ public class Teacher implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date liveDate;
+
+    /**
+     * 会员等级
+     */
+    @ApiModelProperty("会员等级 ")
+    @TableField(value = "member_rank_setting_id_")
+    private Long memberRankSettingId;
+    /**
+     * 有效期开始时间
+     */
+    @ApiModelProperty("有效期开始时间 ")
+    @TableField(value = "membership_start_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date membershipStartTime;
+    /**
+     * 有效期结束时间
+     */
+    @ApiModelProperty("有效期结束时间 ")
+    @TableField(value = "membership_end_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date membershipEndTime;
+
     @ApiModelProperty("对应user表用户编号 ")
     @TableField(value = "browse_")
     private Integer browse;
@@ -140,6 +169,39 @@ public class Teacher implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
+    public String getTag() {
+        return tag;
+    }
+
+    public void setTag(String tag) {
+        this.tag = tag;
+    }
+
+    public Long getMemberRankSettingId() {
+        return memberRankSettingId;
+    }
+
+    public void setMemberRankSettingId(Long memberRankSettingId) {
+        this.memberRankSettingId = memberRankSettingId;
+    }
+
+    public Date getMembershipStartTime() {
+        return membershipStartTime;
+    }
+
+    public void setMembershipStartTime(Date membershipStartTime) {
+        this.membershipStartTime = membershipStartTime;
+    }
+
+    public Date getMembershipEndTime() {
+        return membershipEndTime;
+    }
+
+    public void setMembershipEndTime(Date membershipEndTime) {
+        this.membershipEndTime = membershipEndTime;
+
+    }
+
     public Long getUserId() {
         return userId;
     }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherStyleVideo.java

@@ -26,6 +26,9 @@ public class TeacherStyleVideo implements Serializable {
     @ApiModelProperty("老师编号 ")
     @TableField(value = "user_id_")
     private Long userId;
+    @ApiModelProperty("视频封面")
+    @TableField(value = "cover_")
+    private String cover;
     @ApiModelProperty("视频地址 ")
     @TableField(value = "video_url_")
     private String videoUrl;
@@ -59,6 +62,14 @@ public class TeacherStyleVideo implements Serializable {
     @TableField(value = "del_flag_")
     private Boolean delFlag = false;
 
+    public String getCover() {
+        return cover;
+    }
+
+    public void setCover(String cover) {
+        this.cover = cover;
+    }
+
     public Long getId() {
         return id;
     }

+ 16 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -34,6 +35,12 @@ public class VipCardRecord implements Serializable {
     @ApiModelProperty("会员卡id ")
 	@TableField(value = "vip_card_id_")
     private Long vipCardId;
+
+    @TableField(value = "client_type_")
+    @ApiModelProperty("用户类型 学生:STUDENT 老师 :TEACHER")
+    private ClientEnum clientType;
+
+
     @ApiModelProperty("会员卡开始时间 ")
 	@TableField(value = "start_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -62,7 +69,15 @@ public class VipCardRecord implements Serializable {
     @TableField(value = "msg_status_")
     private Integer msgStatus;
 
-	public Long getId() {
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
+    public Long getId() {
         return id;
     }
 

+ 37 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TeacherTagEnum.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.enums.BaseEnum;
+import com.yonge.toolset.base.util.StringUtil;
+
+/***
+ * 老师类型枚举
+ * @author liweifan
+ * @updateTime 2022/3/23 17:01
+ */
+
+public enum TeacherTagEnum implements BaseEnum<String, TeacherTagEnum> {
+    STYLE("个人风采"),
+    VIDEO("视频课"),
+    MUSIC("曲目"),
+    LIVE("直播课");
+    @EnumValue
+    private String code;
+    private String msg;
+
+    TeacherTagEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+}

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
@@ -320,5 +321,14 @@ public interface CourseGroupService extends IService<CourseGroup> {
      * @return
      */
     IPage<CourseGroupPianoDetailVo> selectPianoGroupTeacherDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search);
+
+    /**
+     * 直播课分享分润
+     *
+     * @param sysUser 推荐人
+     * @param liveGroupId 直播课程组id
+     * @return
+     */
+    ShareProfitVo shareLiveCourseProfit(SysUser sysUser, Long liveGroupId);
 }
 

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java

@@ -2,10 +2,12 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.vo.MemberPriceSettingsVo;
 import com.yonge.cooleshow.biz.dal.dto.search.MemberPriceSettingsSearch;
 import com.yonge.cooleshow.biz.dal.entity.MemberPriceSettings;
+import com.yonge.cooleshow.biz.dal.vo.ShareProfitVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -53,4 +55,13 @@ public interface MemberPriceSettingsService extends IService<MemberPriceSettings
      */
     void orderSuccess(UserOrderDetailVo orderDetailVo);
 
+    /**
+     * 老师分享VIP 分润
+     *
+     * @param sysUser 推荐人信息
+     * @param vipId 会员id
+     * @return
+     */
+    ShareProfitVo shareVipProfit(SysUser sysUser, Long vipId);
+
 }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 
 /**
  * MusicSheetPurchaseRecordService服务类
@@ -18,5 +19,5 @@ public interface MusicSheetPurchaseRecordService extends IService<MusicSheetPurc
      * @param musicSheetId 曲目id
      * @return boolean
      */
-    MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId);
+    MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType);
 }

+ 10 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetExport;
@@ -14,7 +15,6 @@ import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
-import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -68,7 +68,7 @@ public interface MusicSheetService extends IService<MusicSheet> {
      * @param sysUser 登录用户
      * @return 曲谱信息
      */
-    MusicSheetDetailVo detail(Long id, SysUser sysUser, SysUserType userType);
+    MusicSheetDetailVo detail(Long id, SysUser sysUser, ClientEnum userType);
 
     /**
      * 学生端 曲目分页查询
@@ -267,4 +267,12 @@ public interface MusicSheetService extends IService<MusicSheet> {
      * @param: userId
      */
     List<StudentTotalVo> queryStudentTotal(Long userId);
+
+    /**
+     * 老师乐谱分享分润
+     *
+     * @param sysUser 分享人
+     * @param musicSheetId 曲目id
+     */
+    ShareProfitVo shareMusicSheetProfit(SysUser sysUser, Long musicSheetId);
 }

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ScheduleManager.java

@@ -0,0 +1,19 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.wordfilter.WordContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ScheduleManager{
+
+    @Autowired
+    private WordContext wordContext;
+
+    @Scheduled(cron = "0 0/10 * * * ?")
+    public void refreshBlackList() {
+        if (wordContext.isInit())
+            wordContext.mapInit();
+    }
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
@@ -126,4 +127,11 @@ public interface TeacherService extends IService<Teacher> {
      */
     IPage<MyFens> queryMyFans(IPage<MyFens> page, Long teacherId);
 
+    /**
+     * 设置老师标签
+     *
+     * @param userId 老师id
+     * @param teacherTagEnum 标签
+     */
+    void setTeacherTag(Long userId, TeacherTagEnum teacherTagEnum);
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherStyleVideoService.java

@@ -42,7 +42,7 @@ public interface TeacherStyleVideoService extends IService<TeacherStyleVideo>  {
      * @updateTime 2022/3/22 20:06
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
      */
-    HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception;
+    Boolean doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception;
 
     /***
      * 查询用户的风采视频

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountRecordService.java

@@ -7,7 +7,10 @@ import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -73,4 +76,7 @@ public interface UserAccountRecordService extends IService<UserAccountRecord> {
      * 通过订单详情查询该详情对应的所有账户记录
      */
     List<UserAccountRecord> selectRecordByOrderDetail(UserOrderDetailVo userOrderDetailVo);
+
+
+    HttpResponseResult<UserAccountVo> accountTotal(UserAccountRecordSearch query);
 }

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupService.java

@@ -50,4 +50,13 @@ public interface VideoLessonGroupService extends IService<VideoLessonGroup> {
     IPage<LessonGroupVo> selectLessonGroupById(IPage<LessonGroupVo> page, VideoLessonGroupSearch query);
 
     CountVideoGroupVo countVideoGroup();
+
+    /**
+     * 视频课分享分润
+     *
+     * @param sysUser 推荐人信息
+     * @param videoGroupId 课程组id
+     * @return
+     */
+    ShareProfitVo shareVideoCourseProfit(SysUser sysUser, Long videoGroupId);
 }

+ 44 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -29,6 +29,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.base.string.MessageFormatter;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
@@ -38,7 +39,9 @@ import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -108,6 +111,16 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      */
     @Override
     public LiveCourseInfoVo queryLiveCourseInfo(Long groupId) {
+        return queryLiveCourseInfo(groupId,getSysUser());
+    }
+
+    /**
+     * 查询课程组详情-直播课详情
+     *
+     * @param groupId 课程组id
+     */
+
+    private LiveCourseInfoVo queryLiveCourseInfo(Long groupId,SysUser sysUser) {
         CourseGroup group = Optional.ofNullable(groupId).map(this::getById)
                 .orElseThrow(() -> new BizException("课程组信息不存在"));
 
@@ -127,12 +140,14 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         result.setSalesEndDate(group.getSalesEndDate());
         result.setMixStudentNum(group.getMixStudentNum());
         result.setImGroupId(group.getImGroupId());
-        Optional.ofNullable(group.getTeacherId()).map(this::getSysUser)
-                .ifPresent(sysUser -> {
-                    result.setTeacherName(sysUser.getRealName());
-                    result.setUserName(sysUser.getUsername());
-                    result.setAvatar(sysUser.getAvatar());
-                });
+        SysUser teacher = getSysUser(group.getTeacherId());
+        if (teacher == null) {
+            throw new BizException("用户不存在");
+        }
+
+        result.setTeacherName(teacher.getRealName());
+        result.setUserName(teacher.getUsername());
+        result.setAvatar(teacher.getAvatar());
         Optional.ofNullable(group.getSubjectId()).map(subjectService::get)
                 .ifPresent(subject -> result.setSubjectName(subject.getName()));
         //课程组计划
@@ -143,7 +158,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         param.put("orderState", OrderStatusEnum.PAID.getCode());
         result.setStudentList(courseScheduleStudentPaymentService.queryStudentInfoByGroupId(param));
         //查询是否购买过该课程组
-        Long id = getSysUser().getId();
+        Long id = sysUser.getId();
 
         //这里修改为,订单完成后才算购买过,待支付和支付中订单不算
         //因为页面再点击购买按钮时,会请求/userOrder/getPendingOrder接口,如果有支付中的订单,用户选择继续支付或取消订单
@@ -1215,5 +1230,27 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         }
         return detailPage;
     }
+
+    @Override
+    public ShareProfitVo shareLiveCourseProfit(SysUser sysUser, Long liveGroupId) {
+        LiveCourseInfoVo liveCourseInfoVo = queryLiveCourseInfo(liveGroupId, sysUser);
+        SysUser teacher = this.getSysUser(liveCourseInfoVo.getTeacherId());
+
+        LiveCourseGroupShareVo liveCourseGroupShareVo = new LiveCourseGroupShareVo();
+        BeanUtils.copyProperties(liveCourseInfoVo,liveCourseGroupShareVo);
+        liveCourseGroupShareVo.setShareTeacherAvatar(teacher.getAvatar());
+        liveCourseGroupShareVo.setShareTeacherName(teacher.getUsername());
+
+        String teacherLiveGroupShareProfitUrl= sysConfigService.findConfigValue(SysConfigConstant.TEACHER_LIVE_GROUP_SHARE_PROFIT_URL);
+
+        ShareProfitVo result = new ShareProfitVo();
+        result.setTeacherId(sysUser.getId());
+        result.setType("LIVE");
+        result.setLiveCourseGroup(liveCourseGroupShareVo);
+        result.setUrl(MessageFormatter.arrayFormat(teacherLiveGroupShareProfitUrl,liveGroupId, sysUser.getId()));
+        result.setName(sysUser.getUsername());
+        result.setAvatar(sysUser.getAvatar());
+        return result;
+    }
 }
 

+ 7 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java

@@ -19,6 +19,7 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.wordfilter.WordFilter;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.mybatis.support.PageUtil;
@@ -68,6 +69,9 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
     @Autowired
     private SysConfigService sysConfigService;
 
+    @Autowired
+    private WordFilter wordFilter;
+
 	@Override
     public CourseHomeworkVo detail(Long id) {
         return baseMapper.detail(id);
@@ -286,9 +290,11 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean reviewCourseHomework(CourseHomeworkReviewDto reviewDto) {
+        if (wordFilter.include(reviewDto.getReview(), 3)) {
+            throw new BizException("文本包含敏感信息:{}", wordFilter.wordList(reviewDto.getReview()));
+        }
         // 检查 老师 陪练课 课程状态为完成,有学生考勤记录 没有布置作业
         checkCourseSchedule(reviewDto.getCourseScheduleId());
-
         // 检查已经布置了课后作业
         if (checkHasHomework(reviewDto.getCourseScheduleId()) == null) {
             throw new BizException("没布置作业,不能点评");

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java

@@ -20,6 +20,8 @@ import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.CourseRepliedVo;
 import com.yonge.cooleshow.biz.dal.vo.MyRepliedVo;
 import com.yonge.cooleshow.biz.dal.vo.RepliedCountVo;
+import com.yonge.cooleshow.biz.dal.wordfilter.WordFilter;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,6 +53,8 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
     private CourseScheduleDao scheduleDao;
     @Autowired
     private CourseScheduleStudentPaymentDao paymentDao;
+    @Autowired
+    private WordFilter wordFilter;
 
     public CourseScheduleRepliedDao getDao() {
         return repliedDao;
@@ -64,6 +68,12 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void replied(CourseScheduleReplied replied, SysUser sysUser) {
+        if (wordFilter.include(replied.getStudentReplied(), 3)) {
+            throw new BizException("文本包含敏感信息:{}", wordFilter.wordList(replied.getStudentReplied()));
+        }
+        if (wordFilter.include(replied.getTeacherReplied(), 3)) {
+            throw new BizException("文本包含敏感信息:{}", wordFilter.wordList(replied.getTeacherReplied()));
+        }
         Long userId = sysUser.getId();
         Long scheduleId = replied.getCourseScheduleId();
         Long studentId = replied.getStudentId();

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -342,7 +342,9 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         roomCache.setLiveEndTime(room.getLiveEndTime());
         roomCache.setCreateRoomTime(new Date());
         String configValue = sysConfigService.findConfigValue(PRE_CREATE_LIVE_ROOM_MINUTE);
+        String expireCloseMinute = sysConfigService.findConfigValue(DESTROY_EXPIRED_LIVE_ROOM_MINUTE);
         roomCache.setExpiredMinute(Integer.parseInt(configValue));
+        roomCache.setExpiredCloseMinute(Integer.parseInt(expireCloseMinute));
         roomCache.setRoomType(room.getType());
         roomCache.setCourseId(room.getCourseId());
         roomCache.setCourseGroupId(room.getCourseGroupId());

+ 94 - 18
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java

@@ -2,27 +2,36 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
+
+import com.yonge.cooleshow.biz.dal.vo.ShareProfitVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+
+import com.yonge.cooleshow.biz.dal.vo.*;
+
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.string.MessageFormatter;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import com.yonge.cooleshow.biz.dal.entity.MemberPriceSettings;
-import com.yonge.cooleshow.biz.dal.vo.MemberPriceSettingsVo;
 import com.yonge.cooleshow.biz.dal.dto.search.MemberPriceSettingsSearch;
 import com.yonge.cooleshow.biz.dal.dao.MemberPriceSettingsDao;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
@@ -32,6 +41,10 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     private final static Logger log = LoggerFactory.getLogger(MemberPriceSettingsServiceImpl.class);
     @Autowired
     private StudentService studentService;
+
+    @Autowired
+    private TeacherService teacherService;
+
     @Autowired
     private VipCardRecordService vipCardRecordService;
     @Autowired
@@ -39,6 +52,8 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     @Autowired
     private PlatformCashAccountRecordService platformCashAccountRecordService;
 
+    @Autowired
+    private SysConfigService sysConfigService;
     @Override
     public MemberPriceSettingsVo detail(Long id) {
         return baseMapper.detail(id);
@@ -75,45 +90,106 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
     @Override
     public void orderSuccess(UserOrderDetailVo orderDetailVo) {
-        StudentVo studentVo = studentService.detail(orderDetailVo.getUserId());
-        if (null == studentVo) {
-            return;
-        }
+
         VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(orderDetailVo);
 
-        if (null == studentVo.getMembershipEndTime() || studentVo.getMembershipEndTime().before(new Date())) {
+        UserVipInfoVo userVipInfoVo = getVipInfo(orderDetailVo.getOrderClient(),orderDetailVo.getUserId());
+
+        if (userVipInfoVo == null) {
+            log.error("未找到用户信息");
+        }
+
+        if (null == userVipInfoVo.getMembershipEndTime() || userVipInfoVo.getMembershipEndTime().before(new Date())) {
             //没有会员、会员已过期 会员卡生效时间为当前时间
-            studentVo.setMembershipStartTime(vipCardRecord.getStartTime());
-            studentVo.setMembershipEndTime(vipCardRecord.getEndTime());
+            userVipInfoVo.setMembershipStartTime(vipCardRecord.getStartTime());
+            userVipInfoVo.setMembershipEndTime(vipCardRecord.getEndTime());
         } else {
-            studentVo.setMembershipEndTime(vipCardRecord.getEndTime());
+            userVipInfoVo.setMembershipEndTime(vipCardRecord.getEndTime());
         }
-        studentVo.setMemberRankSettingId(1l);
-        studentVo.setUpdateTime(new Date());
-        studentService.updateById(studentVo);
+        userVipInfoVo.setMemberRankSettingId(1l);
+        userVipInfoVo.setUpdateTime(new Date());
+
+        updateUser(userVipInfoVo);
+
         //会员购买记录入库
         vipCardRecordService.save(vipCardRecord);
         //会员购买消息推送
-        authSend(studentVo.getUserId(), studentVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN));
+        authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN),orderDetailVo.getOrderClient());
     }
 
+    private void updateUser(UserVipInfoVo userVipInfoVo) {
+        if (ClientEnum.STUDENT.equals(userVipInfoVo.getUserType())) {
+            studentService.lambdaUpdate()
+                    .eq(Student::getUserId,userVipInfoVo.getUserId())
+                    .set(Student::getMemberRankSettingId,userVipInfoVo.getMemberRankSettingId())
+                    .set(Student::getMembershipStartTime,userVipInfoVo.getMembershipStartTime())
+                    .set(Student::getMembershipEndTime,userVipInfoVo.getMembershipEndTime())
+                    .set(Student::getUpdateTime,userVipInfoVo.getUpdateTime())
+                    .update();
+        } else {
+            teacherService.lambdaUpdate()
+                          .eq(Teacher::getUserId, userVipInfoVo.getUserId())
+                          .set(Teacher::getMemberRankSettingId,userVipInfoVo.getMemberRankSettingId())
+                          .set(Teacher::getMembershipStartTime,userVipInfoVo.getMembershipStartTime())
+                          .set(Teacher::getMembershipEndTime,userVipInfoVo.getMembershipEndTime())
+                          .set(Teacher::getUpdateTime,userVipInfoVo.getUpdateTime())
+                          .update();
+        }
+    }
 
+    @Override
+    public ShareProfitVo shareVipProfit(SysUser sysUser, Long vipId) {
+        ShareProfitVo result = new ShareProfitVo();
+        MemberPriceSettingsVo detail = detail(vipId);
+        result.setVip(detail);
+        result.setAvatar(sysUser.getAvatar());
+        result.setName(sysUser.getUsername());
+        result.setTeacherId(sysUser.getId());
+
+        String teacherVipShareProfitUrl = sysConfigService.findConfigValue(SysConfigConstant.TEACHER_VIP_SHARE_PROFIT_URL);
+        result.setUrl(MessageFormatter.arrayFormat(teacherVipShareProfitUrl, detail.getId(), sysUser.getId()));
+        return result;
+    }
+
+    private UserVipInfoVo getVipInfo(ClientEnum userType, Long userId) {
+
+        UserVipInfoVo userVipInfoVo = new UserVipInfoVo();
+        userVipInfoVo.setUserType(userType);
+        if (userType.equals(ClientEnum.STUDENT)) {
+            StudentVo studentVo = studentService.detail(userId);
+            if (studentVo == null) {
+                return null;
+            }
+
+            BeanUtils.copyProperties(studentVo,userVipInfoVo);
+            return userVipInfoVo;
+        } else if (userType.equals(ClientEnum.TEACHER)) {
+            TeacherVo teacherVo = teacherService.detail(userId);
+            if (teacherVo == null) {
+                return null;
+            }
+
+            BeanUtils.copyProperties(teacherVo,userVipInfoVo);
+            return userVipInfoVo;
+        }
+        return null;
+    }
 
 
     // 发送会员购买消息推送
-    private void authSend(Long userId, String phone, String param1) {
+    private void authSend(Long userId, String phone, String param1,ClientEnum clientEnum) {
         Map<Long, String> receivers = new HashMap<>();
         receivers.put(userId, phone);
         try {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_BUY_SUCCESS,
-                    receivers, null, 0, null, ClientEnum.STUDENT.getCode(), param1);
+                    receivers, null, 0, null, clientEnum.getCode(), param1);
         } catch (Exception e) {
             log.error("会员购买极光消息推送异常,userId={}", userId);
         }
 
         try {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_BUY_SUCCESS,
-                    receivers, null, 0, null, ClientEnum.STUDENT.getCode(), param1);
+                    receivers, null, 0, null, clientEnum.getCode(), param1);
         } catch (Exception e) {
             log.error("会员购买短信消息推送异常,userId={}", userId);
         }

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetPurchaseRecordDao;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,10 +32,11 @@ public class MusicSheetPurchaseRecordServiceImpl extends ServiceImpl<MusicSheetP
     }
 
     @Override
-    public MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId) {
+    public MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType) {
         List<MusicSheetPurchaseRecord> list = this.lambdaQuery()
                                                   .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
                                                   .eq(MusicSheetPurchaseRecord::getStudentId, userId)
+                                                  .eq(MusicSheetPurchaseRecord::getClientType, clientType)
                                                   .list();
         if (CollectionUtils.isEmpty(list)) {
             return null;

+ 55 - 20
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
-import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetExport;
@@ -132,7 +131,6 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Override
     public IPage<MusicSheetVo> selectPage(IPage<MusicSheetVo> page, MusicSheetSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
-
     }
 
     @Override
@@ -181,7 +179,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     }
 
     @Override
-    public MusicSheetDetailVo detail(Long id, SysUser sysUser, SysUserType userType) {
+    public MusicSheetDetailVo detail(Long id, SysUser sysUser,ClientEnum userType) {
         MusicSheetDetailVo detail = baseMapper.detail(id);
         if (detail == null) {
             throw new BizException("未找到曲目信息");
@@ -195,12 +193,18 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         }
         if (ChargeTypeEnum.FREE.getCode().equals(detail.getChargeType().getCode())) {
             detail.setPlay(YesOrNoEnum.YES);
-        } else if (SysUserType.STUDENT.getCode().equals(userType.getCode())) {
-            setStudentMusicSheet(sysUser.getId(), detail);
+        }  else if (ClientEnum.STUDENT.getCode().equals(userType.getCode())
+                || ClientEnum.TEACHER.getCode().equals(userType.getCode())) {
+            // 2022 7 20  老师也能购买曲目
+            if (ClientEnum.TEACHER.getCode().equals(userType.getCode()) && detail.getUserId().equals(sysUser.getId())) {
+                detail.setPlay(YesOrNoEnum.YES);
+            } else {
+                setMusicSheetPlay(sysUser.getId(), detail,userType);
+            }
         } else {
             detail.setPlay(YesOrNoEnum.YES);
         }
-        if (SysUserType.STUDENT.getCode().equals(userType.getCode())) {
+        if (ClientEnum.STUDENT.getCode().equals(userType.getCode())) {
             // 学生进入小酷Ai练习,添加一条练习记录
             musicSheetPracticeRecordService.addRecord(id, sysUser.getId());
         }
@@ -210,16 +214,18 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     /**
      * 设置学生曲目信息
      *
-     * @param studentId 学生id
-     * @param detail    曲目详情
+     * 2022 7 20  老师也能购买曲目
+     *  @param studentId 学生id
+     * @param detail 曲目详情
+     * @param userType 用户类型
      */
-    private void setStudentMusicSheet(Long studentId, MusicSheetDetailVo detail) {
+    private void setMusicSheetPlay(Long studentId, MusicSheetDetailVo detail, ClientEnum userType) {
         detail.setPlay(YesOrNoEnum.NO);
         // 单曲购买 判断购买记录,有记录课播放
         if (ChargeTypeEnum.CHARGE.getCode().equals(detail.getChargeType().getCode())) {
             // 学生须判断是否能播放曲目
             MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
-                    studentId, detail.getId());
+                    studentId, detail.getId(),userType);
             if (musicSheetPurchaseRecord != null) {
                 detail.setOrderStatus(musicSheetPurchaseRecord.getOrderStatus());
                 detail.setOrderNo(musicSheetPurchaseRecord.getOrderNo());
@@ -229,9 +235,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             }
         } else if (ChargeTypeEnum.VIP.getCode().equals(detail.getChargeType().getCode())) {
             // 会员 判断是否为会员, 会员可播放
-            StudentVo studentVo = studentService.detail(studentId);
-            if (studentVo != null && YesOrNoEnum.YES.getCode().equals(studentVo.getIsVip().getCode())) {
-                detail.setPlay(YesOrNoEnum.YES);
+            if (userType.equals(ClientEnum.STUDENT)) {
+                StudentVo studentVo = studentService.detail(studentId);
+                if (studentVo != null && YesOrNoEnum.YES.getCode().equals(studentVo.getIsVip().getCode())) {
+                    detail.setPlay(YesOrNoEnum.YES);
+                }
+            } else if (userType.equals(ClientEnum.TEACHER)) {
+                TeacherVo teacher= teacherService.detail(studentId);
+                if (teacher != null && YesOrNoEnum.YES.getCode().equals(teacher.getIsVip().getCode())) {
+                    detail.setPlay(YesOrNoEnum.YES);
+                }
             }
         }
     }
@@ -335,6 +348,10 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             musicSheet.setUpdateTime(new Date());
             if (AuthStatusEnum.PASS.getCode().equals(param.getAuthStatus().getCode())) {
                 musicSheet.setState(YesOrNoEnum.YES);
+
+                // 修改老师标签
+                teacherService.setTeacherTag(musicSheet.getUserId(), TeacherTagEnum.MUSIC);
+
             }
             flag = this.updateById(musicSheet);
         }
@@ -460,7 +477,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         }
 
         // 检查已经购买
-        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId());
+        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId(),musicSheetPayDto.getClientType());
 
         orderCreateRes.setRes(true);
         if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
@@ -477,15 +494,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     /**
      * 检查是否已购买当前曲目
-     *
-     * @param userId       用户id
+     *  @param userId       用户id
      * @param musicSheetId 曲目id
+     * @param clientType
      */
-    private void checkoutPay(Long userId, Long musicSheetId) {
+    private void checkoutPay(Long userId, Long musicSheetId, String clientType) {
         List<MusicSheetPurchaseRecord> list = musicSheetPurchaseRecordService
                 .lambdaQuery()
                 .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
                 .eq(MusicSheetPurchaseRecord::getStudentId, userId)
+                .eq(MusicSheetPurchaseRecord::getClientType, clientType)
                 .eq(MusicSheetPurchaseRecord::getOrderStatus, OrderStatusEnum.PAID)
                 .list();
         if (!CollectionUtils.isEmpty(list)) {
@@ -577,10 +595,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      */
     private void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount) {
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId());
+                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(),userOrderDetailVo.getOrderClient());
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
+        musicSheetPurchaseRecord.setClientType(userOrderDetailVo.getOrderClient());
         musicSheetPurchaseRecord.setMusicSheetId(userOrderDetailVo.getBizId());
         musicSheetPurchaseRecord.setOrderNo(userOrderDetailVo.getOrderNo());
         musicSheetPurchaseRecord.setPurchasePrice(actualPrice);
@@ -615,7 +634,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     public void orderAfterSheet(UserOrderDetailVo userOrderDetailVo) {
         // 保存购买记录
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId());
+                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId(),userOrderDetailVo.getOrderClient());
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
@@ -632,7 +651,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Transactional(rollbackFor = Exception.class)
     public void buyMusicSheetCancel(UserOrderDetailVo userOrderDetailVo) {
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId());
+                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId(),userOrderDetailVo.getOrderClient());
+
         if (musicSheetPurchaseRecord == null) return;
         musicSheetPurchaseRecordService.removeById(musicSheetPurchaseRecord.getId());
     }
@@ -828,6 +848,21 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         return baseMapper.queryStudentTotal(userId);
     }
 
+    @Override
+    public ShareProfitVo shareMusicSheetProfit(SysUser sysUser, Long musicSheetId) {
+        ShareProfitVo result = new ShareProfitVo();
+        MusicSheetDetailVo musicSheet = detail(musicSheetId,null,null);
+
+        result.setTeacherId(sysUser.getId());
+        result.setType("MUSIC");
+        result.setMusicSheet(musicSheet);
+        result.setAvatar(sysUser.getAvatar());
+        result.setName(sysUser.getUsername());
+        String teacherMusicShareProfitUrl= sysConfigService.findConfigValue(SysConfigConstant.TEACHER_MUSIC_SHEET_SHARE_PROFIT_URL);
+        result.setUrl(MessageFormatter.arrayFormat(teacherMusicShareProfitUrl,musicSheetId, sysUser.getId()));
+        return result;
+    }
+
     private SysUser getSysUser(Long userId) {
         return Optional.ofNullable(userId)
                 .map(sysUserFeignService::queryUserById)

+ 69 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PlatformCashAccountRecordServiceImpl.java

@@ -1,18 +1,29 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+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 com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.PlatformCashAccountRecordDao;
 import com.yonge.cooleshow.biz.dal.dto.search.PlatformCashAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.SysConfig;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.PlatformCashAccountRecordService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountRecordSummaryVo;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 
 /**
  * 平台账户流水表(PlatformCashAccountRecord)表服务实现类
@@ -25,6 +36,9 @@ public class PlatformCashAccountRecordServiceImpl extends ServiceImpl<PlatformCa
 
     private final static Logger log = LoggerFactory.getLogger(PlatformCashAccountRecordServiceImpl.class);
 
+    @Autowired
+    private SysConfigService sysConfigService;
+
     @Override
     public PlatformCashAccountRecordDao getDao() {
         return this.baseMapper;
@@ -43,11 +57,57 @@ public class PlatformCashAccountRecordServiceImpl extends ServiceImpl<PlatformCa
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public boolean updateWaitRecord() {
+		List<String> paramNames = new ArrayList<String>();
+		paramNames.add(SysConfigConstant.MALL_ACCOUNT_PERIOD);
+		paramNames.add(SysConfigConstant.MUSIC_ACCOUNT_PERIOD);
+		paramNames.add(SysConfigConstant.VIP_ACCOUNT_PERIOD);
+		paramNames.add(SysConfigConstant.VIDEO_ACCOUNT_PERIOD);
+		paramNames.add(SysConfigConstant.LIVE_ACCOUNT_PERIOD);
+
+		List<SysConfig> sysConfigs = sysConfigService.findByParamName(paramNames);
+
+		Map<String,String> configMap = sysConfigs.stream().collect(Collectors.toMap(SysConfig :: getParamName, SysConfig :: getParamValue));
+
+		List<PlatformCashAccountRecord> list = new ArrayList<PlatformCashAccountRecord>();
 		//根据不同类型(业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱)查询超过账期待结算的记录
-		
-		//getDao().queryByBizTypeAndPaymentDays(bizType, paymentDays);
-		
-		return false;
+		List<PlatformCashAccountRecord> list1 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.MALL_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.MALL_ACCOUNT_PERIOD).toString()));
+		List<PlatformCashAccountRecord> list2 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.MUSIC_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.MUSIC_ACCOUNT_PERIOD).toString()));
+		List<PlatformCashAccountRecord> list3 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.VIP_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.VIP_ACCOUNT_PERIOD).toString()));
+		List<PlatformCashAccountRecord> list4 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.VIDEO_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.VIDEO_ACCOUNT_PERIOD).toString()));
+		List<PlatformCashAccountRecord> list5 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.LIVE_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.LIVE_ACCOUNT_PERIOD).toString()));
+
+		if(list1.size() > 0){
+			list.addAll(list1);
+		}
+		if(list2.size() > 0){
+			list.addAll(list2);
+		}
+		if(list3.size() > 0){
+			list.addAll(list3);
+		}
+		if(list4.size() > 0){
+			list.addAll(list4);
+		}
+		if(list5.size() > 0){
+			list.addAll(list5);
+		}
+
+		if(list.size() > 0){
+			Date date = new Date();
+			List<PlatformCashAccountRecord> batchUpdateList = new ArrayList<PlatformCashAccountRecord>();
+
+			for(PlatformCashAccountRecord pcar : list){
+				//预收改成实收
+				pcar.setPostStatus(PostStatusEnum.RECORDED);
+				pcar.setUpdateTime(date);
+				batchUpdateList.add(pcar);
+			}
+
+			if(batchUpdateList.size() > 0){
+				getDao().batchUpdate(batchUpdateList);
+			}
+		}
+		return true;
 	}
 
 }

+ 27 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
+import com.yonge.cooleshow.biz.dal.wordfilter.WordFilter;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.EmployeeDao;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
@@ -57,7 +58,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     @Autowired
     private SysConfigService sysConfigService;
     @Autowired
-    private LiveRoomService liveRoomService;
+    private WordFilter wordFilter;
     @Autowired
     private StudentStarService studentStarService;
     @Autowired
@@ -179,6 +180,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             teacher.setLiveDate(new Date());
             teacher.setUpdateTime(new Date());
             baseMapper.updateById(teacher);
+
+            // 添加标签
+            this.setTeacherTag(id,TeacherTagEnum.LIVE);
+
             return HttpResponseResult.status(true);
         } else {
             return HttpResponseResult.failed("不满足开通条件");
@@ -381,6 +386,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<TeacherVo> saveTeacherStyle(TeacherDto teacherDto) {
+        //校验敏感词
+        if (wordFilter.include(teacherDto.getIntroduction(), 3)) {
+            throw new BizException("文本包含敏感信息:{}", wordFilter.wordList(teacherDto.getIntroduction()));
+        }
         //修改老师信息
         int i = baseMapper.updateById(teacherDto);
         List<TeacherStyleVideo> styleVideo = teacherDto.getStyleVideo();
@@ -425,4 +434,21 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         return page.setRecords(teacherVos);
     }
 
+    @Override
+    public void setTeacherTag(Long userId, TeacherTagEnum teacherTagEnum) {
+        TeacherVo teacherVo = this.detail(userId);
+        if (teacherVo == null) {
+            return;
+        }
+        if (StringUtil.isEmpty(teacherVo.getTag())) {
+            teacherVo.setTag(teacherTagEnum.getCode());
+        } else  if (teacherVo.getTag().contains(teacherTagEnum.getCode())) {
+            return;
+        } else {
+            teacherVo.setTag(teacherVo.getTag() + "," + teacherTagEnum.getCode());
+        }
+
+        this.updateById(teacherVo);
+    }
+
 }

+ 16 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherStyleVideoServiceImpl.java

@@ -4,26 +4,28 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.TeacherStyleVideoDao;
 import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherStyleSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherStyleVideoSearch;
+import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.TeacherStyleVideoService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherStyleVideoVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.string.StringPool;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
-import com.yonge.toolset.utils.http.HttpUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
-import com.yonge.cooleshow.biz.dal.dao.TeacherStyleVideoDao;
-import com.yonge.cooleshow.biz.dal.service.TeacherStyleVideoService;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Date;
@@ -41,6 +43,9 @@ public class TeacherStyleVideoServiceImpl extends ServiceImpl<TeacherStyleVideoD
     private SysMessageService sysMessageService;
 
     @Autowired
+    private TeacherService teacherService;
+
+    @Autowired
     private SysUserFeignService sysUserFeignService;
 
     @Override
@@ -55,7 +60,7 @@ public class TeacherStyleVideoServiceImpl extends ServiceImpl<TeacherStyleVideoD
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception {
+    public Boolean doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception {
         Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
         for (Long id : ids) {
             TeacherStyleVideo build = baseMapper.selectById(id);
@@ -66,12 +71,15 @@ public class TeacherStyleVideoServiceImpl extends ServiceImpl<TeacherStyleVideoD
             build.setReason(authOperaReq.getReason());
             build.setVerifyUserId(sysUser.getId());
             build.setUpdateTime(new Date());
-            HttpResponseResult<Boolean> result = HttpResponseResult.succeed(baseMapper.updateById(build) > 0);
-            if (result.getStatus()) {
+            boolean b = baseMapper.updateById(build) > 0;
+            if (b) {
                 sendAuthMessage(authOperaReq.getPass(), build.getUserId(), authOperaReq.getReason());
+                if (authOperaReq.getPass()) {
+                    teacherService.setTeacherTag(build.getUserId(), TeacherTagEnum.STYLE);
+                }
             }
         }
-        return HttpResponseResult.succeed(true);
+        return true;
     }
 
     /**

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java

@@ -11,7 +11,9 @@ import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -67,6 +69,11 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
     }
 
     @Override
+    public HttpResponseResult<UserAccountVo> accountTotal(UserAccountRecordSearch query) {
+        return HttpResponseResult.succeed(baseMapper.accountTotal(query));
+    }
+
+    @Override
     public UserAccountRecordVo appDetail(Long id){
         UserAccountRecordVo detail = baseMapper.appDetail(id);
         return detail;
@@ -129,4 +136,6 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
         return baseMapper.selectRecordByOrderDetail(userOrderDetailVo, bizIds);
     }
 
+
+
 }

+ 9 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java

@@ -96,8 +96,14 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
                     || null == accountRecordDto.getBizType()) {
                 throw new BizException("记录入账-缺少入账参数: param is {}", JSONObject.toJSONString(accountRecordDto));
             }
-            if (BigDecimal.ZERO.compareTo(accountRecordDto.getTransAmount()) < 0) {
-                throw new BizException("记录入账-变动金额不能为负数: param is {}", JSONObject.toJSONString(accountRecordDto));
+            if (BigDecimal.ZERO.compareTo(accountRecordDto.getTransAmount()) > 0) {
+                if (null == accountRecordDto.getTransAmount() || null == accountRecordDto.getBizId()
+                        || null == accountRecordDto.getBizType()) {
+                    throw new BizException("记录入账-缺少入账参数: param is {}", JSONObject.toJSONString(accountRecordDto));
+                }
+                if (BigDecimal.ZERO.compareTo(accountRecordDto.getTransAmount()) < 0) {
+                    throw new BizException("记录入账-变动金额不能为负数: param is {}", JSONObject.toJSONString(accountRecordDto));
+                }
             }
         }
         //按照不同的账户分组
@@ -368,7 +374,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     private Boolean checkInOrderAmount(AccountBizTypeEnum bizType, String orderNo, BigDecimal transAmount) {
         BigDecimal orderExpectPrice = BigDecimal.ZERO;
         if (AccountBizTypeEnum.MALL_SHARE.equals(bizType)) {
-            //todo 查询商城订单价格
+            return true;
         } else {
             UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
                     .eq(UserOrder::getOrderNo, orderNo));

+ 13 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -2,46 +2,45 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
-import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
-import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
-import com.yonge.cooleshow.biz.dal.enums.*;
-import com.yonge.cooleshow.common.enums.PostStatusEnum;
-import com.yonge.toolset.payment.base.model.callback.ExecutePaymentCallBack;
-import com.yonge.toolset.payment.util.DistributedLock;
-import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
-import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
+import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
-import com.yonge.toolset.base.exception.BizException;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.Payment;
+import com.yonge.toolset.payment.base.model.callback.ExecutePaymentCallBack;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
+import com.yonge.toolset.payment.util.DistributedLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
-import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
@@ -852,7 +851,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @param goodType
      * @return
      */
-    @Autowired
+    @Override
     public BigDecimal getShareFreeByGoodType(GoodTypeEnum goodType) {
         if (GoodTypeEnum.VIP.equals(goodType)) {
             return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIP_SHARE_FEE))

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonEvaluateServiceImpl.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.entity.VideoLessonEvaluate;
 import com.yonge.cooleshow.biz.dal.dao.VideoLessonEvaluateDao;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonEvaluateService;
 import com.yonge.cooleshow.biz.dal.vo.VideoLessonEvaluateVo;
+import com.yonge.cooleshow.biz.dal.wordfilter.WordFilter;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import org.slf4j.Logger;
@@ -35,6 +36,8 @@ public class VideoLessonEvaluateServiceImpl extends ServiceImpl<VideoLessonEvalu
     private VideoLessonEvaluateDao videoLessonEvaluateDao;
     @Autowired
     private VideoLessonPurchaseRecordDao videoLessonPurchaseRecordDao;
+    @Autowired
+    private WordFilter wordFilter;
 
     public VideoLessonEvaluateDao getDao() {
         return videoLessonEvaluateDao;
@@ -48,6 +51,9 @@ public class VideoLessonEvaluateServiceImpl extends ServiceImpl<VideoLessonEvalu
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void evaluate(VideoLessonEvaluate evaluate, SysUser sysUser) {
+        if (wordFilter.include(evaluate.getContent(), 3)) {
+            throw new BizException("文本包含敏感信息:{}", wordFilter.wordList(evaluate.getContent()));
+        }
         Long userId = sysUser.getId();
 //        String userType = sysUser.getUserType();
         Long videoId = evaluate.getVideoId();

+ 48 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java

@@ -20,11 +20,16 @@ import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.string.MessageFormatter;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
@@ -61,9 +66,15 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
     private TeacherDao teacherDao;
     @Autowired
     private SysMessageService sysMessageService;
+
+    @Autowired
+    private TeacherService teacherService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private SysConfigService sysConfigService;
+
     public VideoLessonGroupDao getDao() {
         return videoLessonGroupDao;
     }
@@ -115,6 +126,7 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         //改主表
         videoLessonGroupDao.updateExamine(examineVo);
 
+        VideoLessonGroup lessonGroup = baseMapper.selectById(examineVo.getId());
         //插从表
         VideoLessonAuthRecord record = new VideoLessonAuthRecord();
         record.setAuditStatus(examineVo.getAuditStatus());
@@ -129,8 +141,12 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
                 .eq(VideoLessonAuthRecord::getVideoGroupId, examineVo.getId())
                 .eq(VideoLessonAuthRecord::getAuditStatus, AuthStatusEnum.DOING));
 
+        // 设置标签
+        if (AuthStatusEnum.PASS.getCode().equals(examineVo.getAuditStatus())) {
+            teacherService.setTeacherTag(lessonGroup.getTeacherId(), TeacherTagEnum.VIDEO);
+        }
+
         //推送
-        VideoLessonGroup lessonGroup = baseMapper.selectById(examineVo.getId());
         String status = examineVo.getAuditStatus();
         Map<Long, String> receivers = new HashMap<>();
         SysUser teacher = sysUserFeignService.queryUserById(lessonGroup.getTeacherId());
@@ -252,20 +268,26 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
     public VideoLessonStudentVo selectVideoLesson(Long groupId) {
         VideoLessonStudentVo lessonStudentVo = new VideoLessonStudentVo();
 
-        VideoLessonGroupSearch query = new VideoLessonGroupSearch();
-        query.setGroupId(groupId);
-        List<VideoLessonGroupVo> lessonGroup = videoLessonGroupDao.selectPage(null, query);
-        if (CollectionUtils.isEmpty(lessonGroup)) {
-            return lessonStudentVo;
-        }
-        lessonStudentVo.setLessonGroup(lessonGroup.get(0));
+        VideoLessonGroupVo videoLessonGroupVo = detail(groupId);
+        if (videoLessonGroupVo == null) return lessonStudentVo;
 
+        lessonStudentVo.setLessonGroup(videoLessonGroupVo);
         VideoLessonSearch search = new VideoLessonSearch();
         search.setVideoLessonGroupId(groupId);
         lessonStudentVo.setDetailList(videoLessonGroupDetailDao.selectPage(null, search));
         return lessonStudentVo;
     }
 
+    private VideoLessonGroupVo detail(Long groupId) {
+        VideoLessonGroupSearch query = new VideoLessonGroupSearch();
+        query.setGroupId(groupId);
+        List<VideoLessonGroupVo> lessonGroup = videoLessonGroupDao.selectPage(null, query);
+        if (CollectionUtils.isEmpty(lessonGroup)) {
+            return null;
+        }
+        return lessonGroup.get(0);
+    }
+
     /**
      * @Description: 修改视频课组&视频课
      * @Author: cy
@@ -352,4 +374,22 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         countVideoGroup.setVideoLessonList(baseMapper.selectVideoLesson());
         return countVideoGroup;
     }
+
+    @Override
+    public ShareProfitVo shareVideoCourseProfit(SysUser sysUser, Long videoGroupId) {
+
+        VideoLessonStudentVo videoLessonStudentVo = selectVideoLesson(videoGroupId);
+
+        String teacherVideoGroupShareProfitUrl= sysConfigService.findConfigValue(SysConfigConstant.TEACHER_VIDEO_GROUP_SHARE_PROFIT_URL);
+
+        ShareProfitVo result = new ShareProfitVo();
+        result.setType("VIDEO");
+        result.setTeacherId(sysUser.getId());
+        result.setVideoGroup(videoLessonStudentVo);
+        result.setUrl(MessageFormatter.arrayFormat(teacherVideoGroupShareProfitUrl, videoGroupId, sysUser.getId()));
+        result.setName(sysUser.getUsername());
+        result.setAvatar(sysUser.getAvatar());
+        return result;
+
+    }
 }

+ 27 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java

@@ -8,9 +8,7 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.vo.MemberPriceSettingsVo;
-import com.yonge.cooleshow.biz.dal.vo.StudentVo;
-import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,7 +16,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
-import com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.VipCardRecordSearch;
 import com.yonge.cooleshow.biz.dal.dao.VipCardRecordDao;
 
@@ -35,6 +32,11 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
     private MemberPriceSettingsDao memberPriceSettingsDao;
     @Autowired
     private StudentService studentService;
+
+
+    @Autowired
+    private TeacherService teacherService;
+
     @Autowired
     private MemberPriceSettingsService memberPriceSettingsService;
     @Autowired
@@ -74,12 +76,24 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         if (null == detail) {
             return null;
         }
-        StudentVo studentVo = studentService.detail(orderDetailVo.getUserId());
-        if (null == studentVo) {
+
+        //修改用户会员时长
+        Date membershipEndTime = null;
+        if (orderDetailVo.getOrderClient().equals(ClientEnum.STUDENT)) {
+            StudentVo studentVo = studentService.detail(orderDetailVo.getUserId());
+            if (null == studentVo) {
+                return null;
+            }
+            membershipEndTime = studentVo.getMembershipEndTime();
+        } else if (orderDetailVo.getOrderClient().equals(ClientEnum.TEACHER)){
+            TeacherVo teacherVo = teacherService.detail(orderDetailVo.getUserId());
+            if (null == teacherVo) {
+                return null;
+            }
+            membershipEndTime = teacherVo.getMembershipEndTime();
+        } else {
             return null;
         }
-        //修改用户会员时长
-        Date membershipEndTime = studentVo.getMembershipEndTime();
 
         VipCardRecord vipCardRecord = new VipCardRecord();
         vipCardRecord.setUserId(orderDetailVo.getUserId());
@@ -87,6 +101,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         vipCardRecord.setSubOrderNo(orderDetailVo.getSubOrderNo());
         vipCardRecord.setVipCardId(detail.getId());
         vipCardRecord.setMsgStatus(0);
+        vipCardRecord.setClientType(orderDetailVo.getOrderClient());
 
         if (null == membershipEndTime || membershipEndTime.before(new Date())) {
             //没有会员、会员已过期 会员卡生效时间为当前时间
@@ -148,7 +163,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             }
             expireFlagMap.put(record.getUserId(), record.getUserId());
             //发送消息
-            expireSend(record.getUserId(), record.getPhone());
+            expireSend(record.getUserId(), record.getPhone(),record.getClientType());
             record.setMsgStatus(2);
             record.setUpdateTime(new Date());
 
@@ -181,13 +196,13 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
     }
 
     // 发送会员到期消息推送
-    private void expireSend(Long userId, String phone) {
+    private void expireSend(Long userId, String phone,ClientEnum userType) {
         Map<Long, String> receivers = new HashMap<>();
         receivers.put(userId, phone);
         try {
             String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIP_EXPIRE.getCode());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_EXPIRE,
-                    receivers, null, 0, url, ClientEnum.STUDENT.getCode());
+                    receivers, null, 0, url, userType.getCode());
         } catch (Exception e) {
             log.error("会员到期3天极光消息推送异常,userId={}", userId);
         }
@@ -195,7 +210,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         try {
             String url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_VIP_EXPIRE.getCode());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_EXPIRE,
-                    receivers, null, 0, null, ClientEnum.STUDENT.getCode(), url);
+                    receivers, null, 0, null, userType.getCode(), url);
         } catch (Exception e) {
             log.error("会员到期3天短信消息推送异常,userId={}", userId);
         }

+ 38 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseGroupShareVo.java

@@ -0,0 +1,38 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-07-20
+ */
+@ApiModel("直播课分享")
+public class LiveCourseGroupShareVo extends LiveCourseInfoVo {
+
+
+    @ApiModelProperty("老师名称")
+    private String shareTeacherName;
+
+    @ApiModelProperty("老师头像")
+    private String shareTeacherAvatar;
+
+    public String getShareTeacherName() {
+        return shareTeacherName;
+    }
+
+    public void setShareTeacherName(String shareTeacherName) {
+        this.shareTeacherName = shareTeacherName;
+    }
+
+    public String getShareTeacherAvatar() {
+        return shareTeacherAvatar;
+    }
+
+    public void setShareTeacherAvatar(String shareTeacherAvatar) {
+        this.shareTeacherAvatar = shareTeacherAvatar;
+    }
+}

+ 114 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ShareProfitVo.java

@@ -0,0 +1,114 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description 老师乐谱分享信息
+ *
+ * @author liujunchi
+ * @date 2022-04-01
+ */
+@ApiModel( description = "老师分享分润信息")
+public class ShareProfitVo {
+
+    @ApiModelProperty("老师id")
+    private Long teacherId;
+
+    @ApiModelProperty("推荐老师姓名")
+    private String name;
+
+    @ApiModelProperty("推荐老师头像")
+    private String avatar;
+
+    @ApiModelProperty("二维码链接")
+    private String url;
+
+    @ApiModelProperty("曲目: MUSIC,直播课 :LIVE,视频课:VIDEO ,会员 :VIP")
+    private String type;
+
+    @ApiModelProperty("乐谱信息")
+    private MusicSheetDetailVo musicSheet;
+
+    @ApiModelProperty("直播课程组信息")
+    private LiveCourseGroupShareVo liveCourseGroup;
+
+    @ApiModelProperty("视频课信息")
+    private VideoLessonStudentVo videoGroup;
+
+    @ApiModelProperty("会员信息")
+    private MemberPriceSettingsVo vip;
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public MemberPriceSettingsVo getVip() {
+        return vip;
+    }
+
+    public void setVip(MemberPriceSettingsVo vip) {
+        this.vip = vip;
+    }
+
+    public VideoLessonStudentVo getVideoGroup() {
+        return videoGroup;
+    }
+
+    public void setVideoGroup(VideoLessonStudentVo videoGroup) {
+        this.videoGroup = videoGroup;
+    }
+
+    public LiveCourseGroupShareVo getLiveCourseGroup() {
+        return liveCourseGroup;
+    }
+
+    public void setLiveCourseGroup(LiveCourseGroupShareVo liveCourseGroup) {
+        this.liveCourseGroup = liveCourseGroup;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public MusicSheetDetailVo getMusicSheet() {
+        return musicSheet;
+    }
+
+    public void setMusicSheet(MusicSheetDetailVo musicSheet) {
+        this.musicSheet = musicSheet;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java

@@ -74,6 +74,17 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     @ApiModelProperty(value = "学生 STUDENT 老师 TEACHER 系统用户 STSTEM")
     private String userType;
 
+    @ApiModelProperty(value = "是否会员 0否 1是")
+    private YesOrNoEnum isVip;
+
+    public YesOrNoEnum getIsVip() {
+        return isVip;
+    }
+
+    public void setIsVip(YesOrNoEnum isVip) {
+        this.isVip = isVip;
+    }
+
     public String getHeardUrl() {
         return heardUrl;
     }

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java

@@ -54,6 +54,20 @@ public class TeacherVo extends Teacher {
     private List<TeacherStyleVideo> styleVideo;
     @ApiModelProperty(value = "学生 STUDENT 老师 TEACHER 系统用户 STSTEM")
     private String userType;
+    @ApiModelProperty(value = "是否会员 0否 1是")
+    private YesOrNoEnum isVip;
+
+    public YesOrNoEnum getIsVip() {
+        return isVip;
+    }
+
+    public void setIsVip(YesOrNoEnum isVip) {
+        this.isVip = isVip;
+    }
+
+    public void setGender(GenderEnum gender) {
+        this.gender = gender;
+    }
 
     public String getAvatar() {
         return avatar;

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountVo.java

@@ -18,6 +18,9 @@ public class UserAccountVo extends UserAccount{
 	@ApiModelProperty("待入账金额 ")
 	private BigDecimal amountUnrecorded;
 
+	@ApiModelProperty("已入账金额 ")
+	private BigDecimal amountRecorded;
+
 	public BigDecimal getAmountUnrecorded() {
 		return amountUnrecorded;
 	}
@@ -25,4 +28,12 @@ public class UserAccountVo extends UserAccount{
 	public void setAmountUnrecorded(BigDecimal amountUnrecorded) {
 		this.amountUnrecorded = amountUnrecorded;
 	}
+
+	public BigDecimal getAmountRecorded() {
+		return amountRecorded;
+	}
+
+	public void setAmountRecorded(BigDecimal amountRecorded) {
+		this.amountRecorded = amountRecorded;
+	}
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -18,6 +19,9 @@ public class UserOrderDetailVo extends UserOrderDetail {
     @ApiModelProperty("订单id ")
     private Long orderId;
 
+    @ApiModelProperty("用户类型 学生:STUDENT 老师 :TEACHER")
+    private ClientEnum orderClient;
+
     @ApiModelProperty("头像 ")
     private String avatar;
 
@@ -35,6 +39,14 @@ public class UserOrderDetailVo extends UserOrderDetail {
     @ApiModelProperty(value = "分润用户编号")
     private Long routeUserId;
 
+    public ClientEnum getOrderClient() {
+        return orderClient;
+    }
+
+    public void setOrderClient(ClientEnum orderClient) {
+        this.orderClient = orderClient;
+    }
+
     public Long getRouteUserId() {
         return routeUserId;
     }

+ 109 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserVipInfoVo.java

@@ -0,0 +1,109 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-07-21
+ */
+public class UserVipInfoVo {
+
+    /**
+     * 对应user表用户编号
+     */
+    @ApiModelProperty("对应user表用户编号 ")
+    private Long userId;
+
+    /**
+     * 会员等级
+     */
+    @ApiModelProperty("会员等级 ")
+    private Long memberRankSettingId;
+    /**
+     * 有效期开始时间
+     */
+    @ApiModelProperty("有效期开始时间 ")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
+    private Date membershipStartTime;
+    /**
+     * 有效期结束时间
+     */
+    @ApiModelProperty("有效期结束时间 ")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date membershipEndTime;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty("用户类型")
+    private ClientEnum userType;
+
+    private Date updateTime;
+
+    public ClientEnum getUserType() {
+        return userType;
+    }
+
+    public void setUserType(ClientEnum userType) {
+        this.userType = userType;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getMemberRankSettingId() {
+        return memberRankSettingId;
+    }
+
+    public void setMemberRankSettingId(Long memberRankSettingId) {
+        this.memberRankSettingId = memberRankSettingId;
+    }
+
+    public Date getMembershipStartTime() {
+        return membershipStartTime;
+    }
+
+    public void setMembershipStartTime(Date membershipStartTime) {
+        this.membershipStartTime = membershipStartTime;
+    }
+
+    public Date getMembershipEndTime() {
+        return membershipEndTime;
+    }
+
+    public void setMembershipEndTime(Date membershipEndTime) {
+        this.membershipEndTime = membershipEndTime;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+}

+ 42 - 62
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wordfilter/WordContext.java

@@ -3,7 +3,10 @@ package com.yonge.cooleshow.biz.dal.wordfilter;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.toolset.base.exception.BizException;
+import org.apache.commons.io.FileUtils;
 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;
@@ -11,6 +14,8 @@ import org.springframework.context.annotation.Configuration;
 
 import javax.annotation.PostConstruct;
 import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.*;
 
@@ -21,13 +26,14 @@ import java.util.*;
  *
  * @author minghu.zhang
  */
-@SuppressWarnings({"rawtypes", "unchecked"})
 @Configuration
 public class WordContext {
     private final static Logger log = LoggerFactory.getLogger(WordContext.class);
 
     @Autowired
     private SysConfigService sysConfigService;
+    @Autowired
+    private RedissonClient redissonClient;
 
     /**
      * 敏感词字典
@@ -47,11 +53,39 @@ public class WordContext {
      */
     private String whiteList;
 
+    //上传更新时间戳
+    private Long updateTime;
+
+    public boolean isInit(){
+        RBucket<Long> bucket = redissonClient.getBucket(SysConfigConstant.BLACK_LIST_UPDATE_TIME);
+        boolean exists = bucket.isExists();
+        if(!exists){
+            return true;
+        }else {
+            Long lastModified = bucket.get();
+            if(!Objects.equals(updateTime,lastModified)){
+                updateTime = lastModified;
+                return true;
+            }
+        }
+        return false;
+    }
+
     @PostConstruct
     public void init() {
-        this.blackList = sysConfigService.findConfigValue(SysConfigConstant.BLACK_LIST);
-        this.whiteList = sysConfigService.findConfigValue(SysConfigConstant.WHITE_LIST);
-        initKeyWord();
+        initKeyWord1();
+    }
+
+    private void initKeyWord1() {
+        try {
+            RBucket<Long> bucket = redissonClient.getBucket(SysConfigConstant.BLACK_LIST_UPDATE_TIME);
+            File file = new File(SysConfigConstant.BLACK_LIST_FILE_PATH);
+            this.blackList = FileUtils.readFileToString(file, "UTF-8");
+            bucket.set(file.lastModified());
+            initKeyWord();
+        } catch (IOException e) {
+            log.error("读取黑名单词库失败", e);
+        }
     }
 
     /**
@@ -124,65 +158,11 @@ public class WordContext {
      */
     public void mapInit() {
         init = false;
-        this.blackList = sysConfigService.findConfigValue(SysConfigConstant.BLACK_LIST);
-        this.whiteList = sysConfigService.findConfigValue(SysConfigConstant.WHITE_LIST);
         wordMap.clear();
-        initKeyWord();
-        /*Map nowMap;
-        for (String key : wordList) {
-            List<Map> cacheList = new ArrayList<>();
-            nowMap = wordMap;
-            for (int i = 0; i < key.length(); i++) {
-                char keyChar = key.charAt(i);
-
-                Object map = nowMap.get(keyChar);
-                if (map != null) {
-                    nowMap = (Map) map;
-                    cacheList.add(nowMap);
-                } else {
-                    return;
-                }
-
-                if (i == key.length() - 1) {
-                    char[] keys = key.toCharArray();
-                    boolean cleanable = false;
-                    char lastChar = 0;
-                    for (int j = cacheList.size() - 1; j >= 0; j--) {
-                        Map cacheMap = cacheList.get(j);
-                        if (j == cacheList.size() - 1) {
-                            if (String.valueOf(WordType.BLACK.ordinal()).equals(cacheMap.get("isWhiteWord"))) {
-                                if (wordType == WordType.WHITE) {
-                                    return;
-                                }
-                            }
-                            if (String.valueOf(WordType.WHITE.ordinal()).equals(cacheMap.get("isWhiteWord"))) {
-                                if (wordType == WordType.BLACK) {
-                                    return;
-                                }
-                            }
-                            cacheMap.remove("isWhiteWord");
-                            cacheMap.remove("isEnd");
-                            if (cacheMap.size() == 0) {
-                                cleanable = true;
-                                continue;
-                            }
-                        }
-                        if (cleanable) {
-                            Object isEnd = cacheMap.get("isEnd");
-                            if (String.valueOf(EndType.IS_END.ordinal()).equals(isEnd)) {
-                                cleanable = false;
-                            }
-                            cacheMap.remove(lastChar);
-                        }
-                        lastChar = keys[j];
-                    }
-
-                    if (cleanable) {
-                        wordMap.remove(lastChar);
-                    }
-                }
-            }
-        }*/
+        initKeyWord1();
+//        this.blackList = sysConfigService.findConfigValue(SysConfigConstant.BLACK_LIST);
+//        this.whiteList = sysConfigService.findConfigValue(SysConfigConstant.WHITE_LIST);
+//        initKeyWord();
     }
 
     /**

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wordfilter/WordFilter.java

@@ -76,6 +76,7 @@ public class WordFilter {
      * @param text 输入文本
      */
     public boolean include(final String text) {
+
         return include(text, 0);
     }
 

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -52,6 +52,7 @@
         t.xml_file_url_ as xmlFileUrl,
         t.has_beat_ as hasBeat,
         t.mp3_type_ as mp3Type,
+        t.ext_config_json_ as extConfigJson,
         t.create_time_ as createTime,
         t.create_by_ as createBy,
         t.update_time_ as updateTime,

+ 2 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPurchaseRecordMapper.xml

@@ -8,6 +8,7 @@
 		 <result column="music_sheet_id_" jdbcType="BIGINT" property="musicSheetId" />
 		 <result column="teacher_id_" jdbcType="BIGINT" property="teacherId" />
 		 <result column="order_no_" jdbcType="VARCHAR" property="orderNo" />
+		 <result column="client_type_" jdbcType="VARCHAR" property="clientType" />
 		 <result column="student_id_" jdbcType="BIGINT" property="studentId" />
 		 <result column="purchase_time_" jdbcType="TIMESTAMP" property="purchaseTime" />
 		 <result column="purchase_price_" jdbcType="DECIMAL" property="purchasePrice" />
@@ -15,7 +16,7 @@
 	</resultMap>
 
 	<sql id="Base_Column_List">
-		id_, music_sheet_id_, teacher_id_, order_no_, student_id_, purchase_time_, purchase_price_, order_status_
+		id_, music_sheet_id_, teacher_id_, order_no_, student_id_, purchase_time_, purchase_price_, order_status_,client_type_
 	</sql>
 
 

+ 146 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml

@@ -30,6 +30,151 @@
             #{entity.bizId}, #{entity.memo}, #{entity.orderNo}, #{entity.createTime}, #{entity.updateTime})
         </foreach>
     </insert>
+
+    <update id="batchUpdate">
+        <foreach collection="list" item="param" separator=";">
+            UPDATE platform_cash_account_record
+            <set>
+                <if test="param.accountId">
+    				account_id_ = #{param.accountId}
+	    		</if>
+                <if test="param.transAmount">
+    				trans_amount_ = #{param.transAmount}
+	    		</if>
+                <if test="param.memo">
+    				memo_ = #{param.memo}
+	    		</if>
+                <if test="param.orderNo">
+    				order_no_ = #{param.orderNo}
+	    		</if>
+	    		<if test="param.bizId">
+	    			biz_id_ = #{param.bizId}
+	    		</if>
+	    		<if test="param.inOrOut">
+	    			in_or_out_ = #{param.inOrOut}
+	    		</if>
+	    		<if test="param.bizType">
+	    			biz_type_ = #{param.bizType}
+	    		</if>
+	    		<if test="param.status">
+	    			post_status_ = #{param.status}
+	    		</if>
+	    		<if test="param.startDate">
+	    			update_time_ &gt;= #{param.startDate}
+	    		</if>
+	    		<if test="param.endDate">
+	    			update_time_ &lt;= #{param.endDate}
+	    		</if>
+                update_time_ = NOW()
+            </set>
+            WHERE
+            id_ = #{param.id}
+        </foreach>
+    </update>
+    
+    <select id="queryPage" resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
+    	select * from platform_cash_account_record
+    	<where>
+    		<if test="param.orderNo">
+    			and order_no_ = #{param.orderNo}
+    		</if>
+    		<if test="param.bizId">
+    			and biz_id_ = #{param.bizId}
+    		</if>
+    		<if test="param.inOrOut">
+    			and in_or_out_ = #{param.inOrOut}
+    		</if>
+    		<if test="param.bizType">
+    			and biz_type_ = #{param.bizType}
+    		</if>
+    		<if test="param.status">
+    			and post_status_ = #{param.status}
+    		</if>
+    		<if test="param.startDate">
+    			and update_time_ &gt;= #{param.startDate}
+    		</if>
+    		<if test="param.endDate">
+    			and update_time_ &lt;= #{param.endDate}
+    		</if>
+    	</where>
+    </select>
+    
+    <select id="querySummary" resultType="com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountRecordSummaryVo">
+    	select 
+    		sum(case when in_or_out_ = 'IN' and post_status_ = 'WAIT' then trans_amount_ else 0 end) advancesReceived,
+    		sum(case when in_or_out_ = 'IN' and post_status_ = 'RECORDED' then trans_amount_ else 0 end) settledReceived,
+    		sum(case when in_or_out_ = 'OUT' and post_status_ = 'WAIT' then trans_amount_ else 0 end) advancePayment,
+    		sum(case when in_or_out_ = 'OUT' and post_status_ = 'RECORDED' then trans_amount_ else 0 end) settledPayment 
+    	from platform_cash_account_record
+    	<where>
+    		<if test="param.orderNo">
+    			and order_no_ = #{param.orderNo}
+    		</if>
+    		<if test="param.bizId">
+    			and biz_id_ = #{param.bizId}
+    		</if>
+    		<if test="param.inOrOut">
+    			and in_or_out_ = #{param.inOrOut}
+    		</if>
+    		<if test="param.bizType">
+    			and biz_type_ = #{param.bizType}
+    		</if>
+    		<if test="param.status">
+    			and post_status_ = #{param.status}
+    		</if>
+    		<if test="param.startDate">
+    			and update_time_ &gt;= #{param.startDate}
+    		</if>
+    		<if test="param.endDate">
+    			and update_time_ &lt;= #{param.endDate}
+    		</if>
+    	</where>
+    </select>
+    
+    <select id="queryByBizTypeAndPaymentDays" resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
+    	select * from platform_cash_account_record where biz_type_ = #{bizType} and TIMESTAMPDIFF(HOUR, create_time_, now()) &gt;= ${24 * paymentDays} and post_status_ = 'WAIT'
+    </select>
+
+    <update id="batchUpdate">
+        <foreach collection="list" item="param" separator=";">
+            UPDATE platform_cash_account_record
+            <set>
+                <if test="param.accountId">
+    				account_id_ = #{param.accountId}
+	    		</if>
+                <if test="param.transAmount">
+    				trans_amount_ = #{param.transAmount}
+	    		</if>
+                <if test="param.memo">
+    				memo_ = #{param.memo}
+	    		</if>
+                <if test="param.orderNo">
+    				order_no_ = #{param.orderNo}
+	    		</if>
+	    		<if test="param.bizId">
+	    			biz_id_ = #{param.bizId}
+	    		</if>
+	    		<if test="param.inOrOut">
+	    			in_or_out_ = #{param.inOrOut}
+	    		</if>
+	    		<if test="param.bizType">
+	    			biz_type_ = #{param.bizType}
+	    		</if>
+	    		<if test="param.status">
+	    			post_status_ = #{param.status}
+	    		</if>
+	    		<if test="param.startDate">
+	    			update_time_ &gt;= #{param.startDate}
+	    		</if>
+	    		<if test="param.endDate">
+	    			update_time_ &lt;= #{param.endDate}
+	    		</if>
+                update_time_ = NOW()
+            </set>
+            WHERE
+            id_ = #{param.id}
+        </foreach>
+    </update>
     
     <select id="queryPage" resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
     	select * from platform_cash_account_record
@@ -91,7 +236,7 @@
     </select>
     
     <select id="queryByBizTypeAndPaymentDays" resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
-    	select * from platform_cash_account_record where biz_type_ = #{bizType} and TIMESTAMPDIFF(HOUR, create_time_, now()) &gt;= ${24 * paymentDays}
+    	select * from platform_cash_account_record where biz_type_ = #{bizType} and TIMESTAMPDIFF(HOUR, create_time_, now()) &gt;= ${24 * paymentDays} and post_status_ = 'WAIT'
     </select>
 
 </mapper>

+ 8 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -17,6 +17,9 @@
         <result column="entry_auth_date_" property="entryAuthDate" />
         <result column="musician_flag_" property="musicianFlag" />
         <result column="musician_date_" property="musicianDate" />
+        <result column="member_rank_setting_id_" property="memberRankSettingId"/>
+        <result column="membership_start_time_" property="membershipStartTime"/>
+        <result column="membership_end_time_" property="membershipEndTime"/>
         <result column="live_flag_" property="liveFlag" />
         <result column="live_date_" property="liveDate" />
         <result column="browse_" property="browse" />
@@ -44,8 +47,12 @@
         , t.musician_date_ as "musicianDate"
         , t.live_flag_ as "liveFlag"
         , t.live_date_ as "liveDate"
+        , t.member_rank_setting_id_ as "memberRankSettingId"
+        , t.membership_start_time_ as "membershipStartTime"
+        , t.membership_end_time_ as "membershipEndTime"
         , t.browse_ as "browse"
         , t.memo_ as "memo"
+        , t.tag_ as "tag"
         , t.create_time_ as "createTime"
         , t.update_time_ as "updateTime"
         </sql>
@@ -118,6 +125,7 @@
             u.birthdate_ as birthdate,
             u.phone_ as phone,
             (case when isnull(u.id_card_no_) then 0 else 1 end) as isReal,
+        (!isnull(membership_end_time_) and membership_end_time_ > now()) as isVip,
             u.real_name_ as realName,
             u.id_card_no_ as idCardNo,
             u.lock_flag_ as lockFlag,

+ 2 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherStyleVideoMapper.xml

@@ -5,6 +5,7 @@
 		<result column="id_" property="id" />
 		<result column="user_id_" property="userId" />
 		<result column="video_url_" property="videoUrl" />
+		<result column="cover_" property="cover" />
 		<result column="describe_" property="describe" />
 		<result column="browse_" property="browse" />
 		<result column="audit_version_" property="auditVersion" />
@@ -21,6 +22,7 @@
 		t.id_ as id
         , t.user_id_ as userId
         , t.video_url_ as videoUrl
+        , t.cover_ as cover
         , t.describe_ as `describe`
         , t.browse_ as browse
         , t.audit_version_ as auditVersion

+ 33 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml

@@ -99,6 +99,39 @@
         <include refid="selectSql"/>
     </select>
 
+    <select id="accountTotal" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountVo">
+        select
+            sum(
+                if(t.post_status_ = 'WAIT' and t.in_or_out_ = 'IN' ,abs(t.trans_amount_),0)
+            ) as amountUnrecorded,
+            sum(
+                if(t.post_status_ = 'RECORDED' and t.in_or_out_ = 'IN',abs(t.trans_amount_),0)
+            ) as amountRecorded,
+            sum(
+                if(t.post_status_ = 'RECORDED' ,if(t.in_or_out_ = 'IN',abs(t.trans_amount_),-abs(t.trans_amount_)),0)
+            ) as amountTotal,
+            sum(
+                if(t.post_status_ in ('FROZEN','RECORDED') ,if(t.in_or_out_ = 'IN',abs(t.trans_amount_),-abs(t.trans_amount_)),0)
+            ) as amountUsable,
+            sum(
+                if(t.post_status_ = 'FROZEN' ,if(t.in_or_out_ = 'IN',abs(t.trans_amount_),-abs(t.trans_amount_)),0)
+            ) as amountFrozen
+        from user_cash_account_record t
+        left join sys_user u on t.account_id_ = u.id_
+        <where>
+            <if test="null != param.search and '' != param.search">
+                AND (
+                u.id_ LIKE CONCAT('%', #{param.search}, '%') or
+                u.username_ LIKE CONCAT('%', #{param.search}, '%') or
+                u.phone_ LIKE CONCAT('%', #{param.search}, '%')
+                )
+            </if>
+            <include refid="selectCondition"/>
+        </where>
+        order by t.update_time_ desc
+    </select>
+
+
     <!-- 表字段 -->
     <sql id="appBaseColumns">
         t.id_ as id

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml

@@ -98,6 +98,7 @@
             o.recom_user_id_ as recomUserId,
             u.avatar_ as avatar,
             u.username_ as username,
+            u.order_client_ as orderClient,
             a.star_grade_ as starGrade
         FROM user_order_detail t
         left join user_order o on t.order_no_ = o.order_no_

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml

@@ -26,6 +26,7 @@
         , t.update_time_ as updateTime
         , t.end_time_ as endTime
         , t.msg_status_ as msgStatus
+        ,t.client_type_ as clientType
         </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo">

+ 2 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/StudentApplication.java

@@ -9,6 +9,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * @Author: liweifan
@@ -21,6 +22,7 @@ import org.springframework.context.annotation.Configuration;
 @ComponentScan(basePackages = {"com.yonge.cooleshow", "com.yonge.toolset"})
 @Configuration
 @EnableSwagger2Doc
+@EnableScheduling
 public class StudentApplication {
     public static void main(String[] args) {
         BaseApplication.run(AppConstant.APPLICATION_STUDENT, StudentApplication.class, args);

+ 6 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/ImGroupController.java

@@ -13,6 +13,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpStatus;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
@@ -41,7 +42,11 @@ public class ImGroupController extends BaseController {
     @ApiOperation("获取群详情")
     @PostMapping(value = "/getDetail/{groupId}")
     public HttpResponseResult<ImGroup> getDetail(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId) throws Exception {
-        return succeed(imGroupService.getById(groupId));
+        ImGroup group = imGroupService.getById(groupId);
+        if (group == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        return succeed(group);
     }
 
     @ApiOperation("群列表")

+ 2 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
@@ -66,7 +67,7 @@ public class MusicSheetController extends BaseController {
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        return succeed(musicSheetService.detail(id, sysUser, SysUserType.STUDENT));
+        return succeed(musicSheetService.detail(id, sysUser, ClientEnum.STUDENT));
     }
 
     @ApiOperation(value = "分页查询", httpMethod="POST", consumes="application/json", produces="application/json")

+ 2 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/TeacherApplication.java

@@ -10,6 +10,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * @Author: liweifan
@@ -22,6 +23,7 @@ import org.springframework.context.annotation.Configuration;
 @ComponentScan(basePackages = {"com.yonge.cooleshow","com.yonge.toolset"})
 @Configuration
 @EnableSwagger2Doc
+@EnableScheduling
 public class TeacherApplication {
     public static void main(String[] args) {
         BaseApplication.run(AppConstant.APPLICATION_TEACHER, TeacherApplication.class, args);

Some files were not shown because too many files changed in this diff