Browse Source

Merge remote-tracking branch 'origin/master'

zouxuan 3 năm trước cách đây
mục cha
commit
900999fc1a
93 tập tin đã thay đổi với 1601 bổ sung480 xóa
  1. 18 15
      audio-analysis/src/main/java/com/yonge/netty/dto/HardLevelEnum.java
  2. 60 0
      audio-analysis/src/main/java/com/yonge/netty/dto/MusicalInstrumentsPitchRange.java
  3. 4 3
      audio-analysis/src/main/java/com/yonge/netty/dto/NoteFrequencyRange.java
  4. 25 5
      audio-analysis/src/main/java/com/yonge/netty/dto/NotePlayResult.java
  5. 94 86
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  6. 21 1
      audio-analysis/src/main/java/com/yonge/netty/entity/MusicXmlBasicInfo.java
  7. 6 11
      audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java
  8. 3 3
      audio-analysis/src/test/java/com/yonge/netty/client/NettyClient.java
  9. BIN
      audio-analysis/src/test/resources/160悬崖上的金鱼姬 修节.wav
  10. BIN
      audio-analysis/src/test/resources/160悬崖上的金鱼姬 修节奏2.wav
  11. BIN
      audio-analysis/src/test/resources/160悬崖上的金鱼姬 修音.wav
  12. 0 0
      audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.json
  13. 0 0
      audio-analysis/src/test/resources/扬基歌88.json
  14. BIN
      audio-analysis/src/test/resources/扬基歌_速度88.wav
  15. 2 2
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  16. 0 5
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  17. 2 2
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/PostStatusEnum.java
  18. 5 3
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/MallAdminApplication.java
  19. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java
  20. 2 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderReturnApplyController.java
  21. 71 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java
  22. 3 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderReturnApplyService.java
  23. 17 2
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java
  24. 9 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java
  25. 12 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/api/CommonResult.java
  26. 88 2
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/domain/WebLog.java
  27. 5 3
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/MallPortalApplication.java
  28. 5 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderReceiver.java
  29. 12 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  30. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java
  31. 19 6
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  32. 1 5
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  33. 2 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
  34. 34 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PlatformCashAccountRecordController.java
  35. 0 18
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountController.java
  36. 42 6
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountRecordController.java
  37. 13 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserOrderRefundController.java
  38. 48 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenUserAccountController.java
  39. 24 3
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java
  40. 42 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/AccountBizTypeEnumConvert.java
  41. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/InOrOutEnumConvert.java
  42. 42 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/PostStatusConvert.java
  43. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PlatformCashAccountRecordDao.java
  44. 4 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java
  45. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserAccountRecordDto.java
  46. 89 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/excel/PlatformCashAccountRecordExport.java
  47. 85 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/excel/UserAccountRecordExport.java
  48. 16 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PlatformCashAccountRecordSearch.java
  49. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserAccountRecordSearch.java
  50. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VideoLessonGroupSearch.java
  51. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java
  52. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserAccountRecord.java
  53. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  54. 9 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java
  55. 3 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  56. 5 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PlatformCashAccountRecordService.java
  57. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountRecordService.java
  58. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountService.java
  59. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  60. 4 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  61. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  62. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  63. 52 36
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  64. 7 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PlatformCashAccountRecordServiceImpl.java
  65. 38 20
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java
  66. 75 39
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  67. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  68. 106 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  69. 37 44
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  70. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  71. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java
  72. 6 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  73. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetVo.java
  74. 10 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFens.java
  75. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java
  76. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountVo.java
  77. 1 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java
  78. 5 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  79. 24 9
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml
  80. 2 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  81. 8 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml
  82. 8 23
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml
  83. 5 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  84. 3 5
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  85. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/PianoRoomBuyRecordController.java
  86. 2 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java
  87. 15 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserAccountController.java
  88. 7 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java
  89. 56 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VipCardRecordController.java
  90. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/open/OpenShareController.java
  91. 21 3
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicAlbumController.java
  92. 25 0
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenSubjectController.java
  93. 5 5
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/util/DistributedLock.java

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

@@ -9,20 +9,20 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	 * 完成度范围, 未演奏的范围
 	 */
 	//BEGINNER("入门级", 3, 5, 5, 5, 10, 10, 13, 15, 60, 10), 
-	BEGINNER("入门级", 3, 5, 10, 10, 15, 15, 22, 22, 75, 25), 
+	BEGINNER("入门级", 3, 5, 12, 18, 23, 28, 75, 25), 
 	/**
 	 * 进阶级, 振幅阈值, 频率阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>
 	 * 完成度范围, 未演奏的范围
 	 */
-	ADVANCED("进阶级", 3, 5, 8, 8, 12, 12, 20, 20, 85, 15),
+	ADVANCED("进阶级", 3, 5, 10, 15, 20, 25, 85, 15),
 	//ADVANCED("进阶级", 3, 5, 50, 50, 50, 50, 50, 5, 80, 10),
 	/**
 	 * 大师级, 振幅阈值, 频率阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>
 	 * 完成度范围, 未演奏的范围
 	 */
-	PERFORMER("大师级", 3, 3, 5, 5, 10, 10, 13, 15, 95, 10);
+	PERFORMER("大师级", 3, 3, 5, 10, 13, 15, 95, 10);
 
 	private String msg;
 
@@ -38,9 +38,6 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 
 	private int tempoEffectiveRangeOf8;
 
-	private int tempoEffectiveRangeOf16;
-
-	private int tempoEffectiveRangeOf32;
 
 	private int integrityRange;
 
@@ -55,13 +52,11 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	 * @param tempoEffectiveRangeOf2 节奏偏移量百分比(在当前范围内节奏才算正确)
 	 * @param tempoEffectiveRangeOf4 节奏偏移量百分比(在当前范围内节奏才算正确)
 	 * @param tempoEffectiveRangeOf8 节奏偏移量百分比(在当前范围内节奏才算正确)
-	 * @param tempoEffectiveRangeOf16 节奏偏移量百分比(在当前范围内节奏才算正确)
-	 * @param tempoEffectiveRangeOf32 节奏偏移量百分比(在当前范围内节奏才算正确)
 	 * @param integrityRange 完成度范围
 	 * @param notPlayRange 未演奏的范围
 	 */
 	HardLevelEnum(String msg, int amplitudeThreshold, int frequencyThreshold, int tempoEffectiveRangeOf1, int tempoEffectiveRangeOf2,
-			int tempoEffectiveRangeOf4, int tempoEffectiveRangeOf8, int tempoEffectiveRangeOf16, int tempoEffectiveRangeOf32, int integrityRange,
+			int tempoEffectiveRangeOf4, int tempoEffectiveRangeOf8, int integrityRange,
 			int notPlayRange) {
 		this.msg = msg;
 		this.amplitudeThreshold = amplitudeThreshold;
@@ -70,8 +65,6 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 		this.tempoEffectiveRangeOf2 = tempoEffectiveRangeOf2;
 		this.tempoEffectiveRangeOf4 = tempoEffectiveRangeOf4;
 		this.tempoEffectiveRangeOf8 = tempoEffectiveRangeOf8;
-		this.tempoEffectiveRangeOf16 = tempoEffectiveRangeOf16;
-		this.tempoEffectiveRangeOf32 = tempoEffectiveRangeOf32;
 		this.integrityRange = integrityRange;
 		this.notPlayRange = notPlayRange;
 	}
@@ -87,12 +80,22 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	public int getFrequencyThreshold() {
 		return frequencyThreshold;
 	}
-
-	public int getTempoEffectiveRange(int denominator) {
+	
+	public int getTempoEffectiveRange(int denominator, double duration) {
 		
 		int tempoEffectiveRange = 0;
 		
-		switch (denominator) {
+		if(duration >= 1000){
+			tempoEffectiveRange = tempoEffectiveRangeOf1;
+		}else if(duration >= 500){
+			tempoEffectiveRange = tempoEffectiveRangeOf2;
+		}else if(duration >= 200){
+			tempoEffectiveRange = tempoEffectiveRangeOf4;
+		}else{
+			tempoEffectiveRange = tempoEffectiveRangeOf8;
+		}
+		
+		/*switch (denominator) {
 		case 1:
 			tempoEffectiveRange = tempoEffectiveRangeOf1;
 			break;
@@ -114,7 +117,7 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 
 		default:
 			break;
-		}
+		}*/
 		return tempoEffectiveRange;
 	}
 

+ 60 - 0
audio-analysis/src/main/java/com/yonge/netty/dto/MusicalInstrumentsPitchRange.java

@@ -0,0 +1,60 @@
+package com.yonge.netty.dto;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 不同乐器对应的音域范围
+ */
+public class MusicalInstrumentsPitchRange {
+
+	private final static double STANDARD_PITCH = 440;
+
+	private double minPitch;
+
+	private double maxPitch;
+
+	private MusicalInstrumentsPitchRange(double minPitch, double maxPitch) {
+		this.maxPitch = maxPitch;
+		this.minPitch = minPitch;
+	}
+
+	private static Map<Integer, MusicalInstrumentsPitchRange> map = new HashMap<Integer, MusicalInstrumentsPitchRange>() {
+
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 7551297824160987438L;
+
+		{
+			// 以下是以440hz 作为标准音
+			put(3, new MusicalInstrumentsPitchRange(261.632, 2093.056));// 长笛 c4-c7
+			put(4, new MusicalInstrumentsPitchRange(138.595, 1661.258));// 中音萨克斯 #c3-#g6
+			put(7, new MusicalInstrumentsPitchRange(164.818, 2637.084));// 单簧管 e3-e7
+			put(5, new MusicalInstrumentsPitchRange(523.264, 2349.376));// 竖笛 c5-d7
+			put(12, new MusicalInstrumentsPitchRange(196.002, 1174.688));// 小号 g3-d6
+			put(13, new MusicalInstrumentsPitchRange(87.309, 698.473));// 圆号 f2-f5
+			put(14, new MusicalInstrumentsPitchRange(49.001, 587.344));// 长号 g1-d5
+			put(15, new MusicalInstrumentsPitchRange(82.409, 349.237));// 上低音号 e2-f4
+			put(17, new MusicalInstrumentsPitchRange(41.204, 174.618));// 大号 e1-f3
+		}
+	};
+
+	public static MusicalInstrumentsPitchRange get(Integer musicalInstrument, double standPitch) {
+		MusicalInstrumentsPitchRange pitchRange = map.get(musicalInstrument);
+		if (pitchRange != null) {
+			pitchRange = new MusicalInstrumentsPitchRange(pitchRange.getMinPitch() / STANDARD_PITCH * standPitch * 2, pitchRange.getMaxPitch() / STANDARD_PITCH
+					* standPitch / 2);
+		}
+		return pitchRange == null ? new MusicalInstrumentsPitchRange(20, 20000) : pitchRange;
+	}
+
+	public double getMinPitch() {
+		return minPitch / 2;
+	}
+
+	public double getMaxPitch() {
+		return maxPitch * 2;
+	}
+
+}

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

@@ -13,12 +13,12 @@ public class NoteFrequencyRange {
 
 	private double maxFrequency;
 
-	public NoteFrequencyRange(double standardFrequecy, double frequency) {
+	public NoteFrequencyRange(double standardPitch, double frequency) {
 		int midiNoteSize = 128;
 		double[] midiNoteFrequencies = new double[midiNoteSize];
 
 		for (int x = 0; x < midiNoteSize; ++x) {
-			midiNoteFrequencies[x] = new BigDecimal(standardFrequecy).multiply(
+			midiNoteFrequencies[x] = new BigDecimal(standardPitch).multiply(
 					new BigDecimal(Math.pow(2, new BigDecimal(x - 69).divide(new BigDecimal(12), 6, BigDecimal.ROUND_HALF_UP).doubleValue()))).doubleValue();
 
 			if(frequency <= 0){
@@ -32,7 +32,7 @@ public class NoteFrequencyRange {
 					minFrequency = midiNoteFrequencies[x - 1] - (midiNoteFrequencies[x - 1] - midiNoteFrequencies[x - 2]) / 2;
 				} else {
 					// frequency演奏的是当前音符
-					midiNoteFrequencies[x + 1] = new BigDecimal(standardFrequecy).multiply(
+					midiNoteFrequencies[x + 1] = new BigDecimal(standardPitch).multiply(
 							new BigDecimal(Math.pow(2, new BigDecimal((x + 1) - 69).divide(new BigDecimal(12), 6, BigDecimal.ROUND_HALF_UP).doubleValue())))
 							.doubleValue();
 					maxFrequency = midiNoteFrequencies[x] + (midiNoteFrequencies[x + 1] - midiNoteFrequencies[x]) / 2;
@@ -102,6 +102,7 @@ public class NoteFrequencyRange {
 		
 		System.out.println(nfr.equals(nfr1));
 		System.out.println(map.size());
+		
 	}
 
 }

+ 25 - 5
audio-analysis/src/main/java/com/yonge/netty/dto/NotePlayResult.java

@@ -5,7 +5,11 @@ public class NotePlayResult {
 	// 0:正确 1:音准过低 2:音准过高
 	private int status;
 	
-	private double migrationRate;
+	private double deviationRate;//偏移比例
+	
+	private double deviationCentValue;//偏移音分值
+	
+	private double deviationHertzValue;//偏移的赫兹值
 	
 	public NotePlayResult() {
 		// TODO Auto-generated constructor stub
@@ -19,11 +23,27 @@ public class NotePlayResult {
 		this.status = status;
 	}
 
-	public double getMigrationRate() {
-		return migrationRate;
+	public double getDeviationRate() {
+		return deviationRate;
+	}
+
+	public void setDeviationRate(double deviationRate) {
+		this.deviationRate = deviationRate;
+	}
+
+	public double getDeviationCentValue() {
+		return deviationCentValue;
+	}
+
+	public void setDeviationCentValue(double deviationCentValue) {
+		this.deviationCentValue = deviationCentValue;
+	}
+
+	public double getDeviationHertzValue() {
+		return deviationHertzValue;
 	}
 
-	public void setMigrationRate(double migrationRate) {
-		this.migrationRate = migrationRate;
+	public void setDeviationHertzValue(double deviationHertzValue) {
+		this.deviationHertzValue = deviationHertzValue;
 	}
 }

+ 94 - 86
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -15,20 +15,17 @@ import java.util.stream.Collectors;
 
 import javax.sound.sampled.AudioFormat;
 
-import com.yonge.audio.analysis.AudioFloatConverter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import be.tarsos.dsp.pitch.FastYin;
 
 import com.yonge.audio.analysis.Signals;
-import com.yonge.audio.analysis.detector.YINPitchDetector;
 import com.yonge.netty.dto.NoteAnalysis.NoteErrorType;
 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;
 
 /**
  * 用户通道上下文
@@ -40,17 +37,13 @@ public class UserChannelContext {
 	//打击乐
 	private final static List<Integer> percussionList = Arrays.asList(23, 113);
 	
-	private final static int MIN_FREQUECY = 100;
-	
-	private final static int MAX_FREQUECY = 2000;
-	
 	private FastYin detector;
 	
 	private String user;
 	
-	private double standardFrequecy = 442;
+	private double standardFrequecy = 440;
 	
-	private float offsetMS;
+	private float deviceDelayTimeMS;
 	
 	private double dynamicOffset;
 	
@@ -62,7 +55,7 @@ public class UserChannelContext {
 	
 	private float beatDuration;
 	
-	private boolean delayProcessed;
+	private boolean startProcessed;
 	
 	// 曲目与musicxml对应关系
 	private ConcurrentHashMap<Long, MusicXmlBasicInfo> songMusicXmlMap = new ConcurrentHashMap<Long, MusicXmlBasicInfo>();
@@ -91,47 +84,57 @@ public class UserChannelContext {
 
 		NotePlayResult result = new NotePlayResult();
 
-		int status;
-		double migrationRate = 0;
-
 		if (Math.round(xmlNote.getFrequency()) == Math.round(playFrequency)) {
-			status = 0;
-			migrationRate = 0;
-		} else {
-			NoteFrequencyRange noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, xmlNote.getFrequency());
-
-			if (noteFrequencyRange.getMinFrequency() > playFrequency ) {
-				status = 1;
-			} else if( playFrequency > noteFrequencyRange.getMaxFrequency()){
-				status = 2;
-			} else {
+			result.setStatus(0);
+			result.setDeviationRate(0);
+			result.setDeviationCentValue(0);
+			
+			return result;
+		}
 
-				status = 0;
+		int status = 0;
+		
+		NoteFrequencyRange noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, xmlNote.getFrequency());
 
-				if (Math.round(playFrequency) < Math.round(xmlNote.getFrequency())) {
-					double min = Math.abs(xmlNote.getFrequency() - noteFrequencyRange.getMinFrequency()) / 2;
-					migrationRate = Math.abs(playFrequency - xmlNote.getFrequency()) / min;
-				} else {
-					double max = Math.abs(xmlNote.getFrequency() - noteFrequencyRange.getMaxFrequency()) / 2;
-					migrationRate = Math.abs(playFrequency - xmlNote.getFrequency()) / max;
-				}
-			}
+		if (noteFrequencyRange.getMinFrequency() > playFrequency ) {
+			status = 1;//偏低
+		} else if( playFrequency > noteFrequencyRange.getMaxFrequency()){
+			status = 2;//偏高
 		}
 
 		result.setStatus(status);
-		result.setMigrationRate(migrationRate);
+		result.setDeviationCentValue(getCents(playFrequency, xmlNote.getFrequency()));
+		result.setDeviationHertzValue(playFrequency - xmlNote.getFrequency());
+		result.setDeviationRate(result.getDeviationCentValue()/(17*100));
 
 		return result;
 	}
 	
-	public void init(String platform, String heardLevel, int subjectId, float beatDuration,float sampleRate, int bufferSize) {
-		this.platform = platform;
-		this.subjectId = subjectId;
-		this.beatDuration = beatDuration;
-		hardLevel = HardLevelEnum.valueOf(heardLevel);
+	/**
+	 * 获取2个频率之间的音分差值
+	 * @param srcFrequency
+	 * @param targetFrequency
+	 * @return
+	 */
+	private double getCents(double srcFrequency, double targetFrequency) {
+		if (targetFrequency < 0) {
+			return 0;
+		}
+		if(srcFrequency < 0){
+			return 17 * 10;
+		}
+		return Math.log(srcFrequency / targetFrequency) / Math.log(2) * 1200;
+	}
+	
+	public void init(MusicXmlBasicInfo musicXmlBasicInfo,float sampleRate, int bufferSize) {
+		this.platform = musicXmlBasicInfo.getPlatform();
+		this.subjectId = musicXmlBasicInfo.getSubjectId();
+		this.beatDuration = musicXmlBasicInfo.getBeatLength() + musicXmlBasicInfo.getReactionTimeMs();
+		hardLevel = HardLevelEnum.valueOf(musicXmlBasicInfo.getHeardLevel());
 		if(detector == null){
 			detector = new FastYin(sampleRate, bufferSize);
 		}
+		this.standardFrequecy = musicXmlBasicInfo.getHertz();
 	}
 	
 	public void setUser(String user) {
@@ -154,12 +157,12 @@ public class UserChannelContext {
 		this.handlerSwitch = handlerSwitch;
 	}
 
-	public float getOffsetMS() {
-		return offsetMS;
+	public float getDeviceDelayTimeMS() {
+		return deviceDelayTimeMS;
 	}
 
-	public void setOffsetMS(float offsetMS) {
-		this.offsetMS = offsetMS;
+	public void setDeviceDelayTimeMS(float deviceDelayTimeMS) {
+		this.deviceDelayTimeMS = deviceDelayTimeMS;
 	}
 
 	public float getBeatDuration() {
@@ -212,10 +215,11 @@ public class UserChannelContext {
 		totalChunkAnalysisList = new ArrayList<ChunkAnalysis>();
 		recordId = null;
 		playTime = 0;
-		delayProcessed = false;
-		offsetMS = 0;
+		startProcessed = false;
+		deviceDelayTimeMS = 0;
 		dynamicOffset = 0;
 		handlerSwitch = false;
+		standardFrequecy = 440;
 	}
 	
 	public MusicXmlBasicInfo getMusicXmlBasicInfo(Integer songId){
@@ -361,8 +365,6 @@ public class UserChannelContext {
 		
 		if (noteAnalysis.getMusicalNotesIndex() >= 0 && noteAnalysis.getMusicalNotesIndex() <= getTotalMusicNoteIndex(null)) {
 			
-			LOGGER.debug("user:{}  delayProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  amplitude:{}  time:{}", user, delayProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
-			
 			ChunkAnalysis chunkAnalysis = new ChunkAnalysis(playTime - durationTime, playTime, playFrequency, splDb, power, amplitude);
 			
 			if(totalChunkAnalysisList.size() > 0){
@@ -376,21 +378,23 @@ public class UserChannelContext {
 			if(percussionList.contains(subjectId)){
 				flag = chunkAnalysis.getAmplitude() > hardLevel.getAmplitudeThreshold();
 			}else{
-				flag = chunkAnalysis.getFrequency() > MIN_FREQUECY && chunkAnalysis.getFrequency() < MAX_FREQUECY;
+				flag = chunkAnalysis.getFrequency() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch() && chunkAnalysis.getFrequency() < MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMaxPitch();
 			}
 			
-			if(delayProcessed == false && flag){
+			if(startProcessed == false && flag){
 				
-				delayProcessed = true;
+				startProcessed = true;
 				
 				//计算延迟偏移值
 				//playTime = musicXmlNote.getTimeStamp() + durationTime;
 				dynamicOffset = chunkAnalysis.getStartTime() - musicXmlNote.getTimeStamp();
-				if(100 * dynamicOffset / musicXmlNote.getDuration() > (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()))){
+				if(100 * dynamicOffset / musicXmlNote.getDuration() > hardLevel.getIntegrityRange()){
 					dynamicOffset = 0;
 				}
 			}
 			
+			LOGGER.debug("user:{}  startProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  amplitude:{}  time:{}", user, startProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
+			
 			if (playTime >= (musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset)) {
 
 				if (musicXmlNote.getDontEvaluating()) {
@@ -528,7 +532,7 @@ public class UserChannelContext {
 
 	public void evaluateForNote(MusicXmlNote musicXmlNote, NoteAnalysis noteAnalysis) {
 		
-		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
+		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
 		
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
@@ -567,7 +571,7 @@ public class UserChannelContext {
 			
 			if (noteAnalysis.getFrequency() == -1) {// 休止符
 
-				playDurationTime = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= MIN_FREQUECY).mapToDouble(t -> t.getDurationTime()).sum();
+				playDurationTime = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch()).mapToDouble(t -> t.getDurationTime()).sum();
 
 				if (noteAnalysis.getTempo() != 0) {
 					noteAnalysis.setMusicalErrorType(setMusicalErrorTempo(noteAnalysis.getTempo()));
@@ -579,7 +583,7 @@ public class UserChannelContext {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.RIGHT);
 				}
 			} else {
-				playDurationTime = chunkAnalysisList.stream().filter(t -> t.getFrequency() > MIN_FREQUECY && t.getFrequency() < MAX_FREQUECY)
+				playDurationTime = chunkAnalysisList.stream().filter(t -> t.getFrequency() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch() && t.getFrequency() < MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMaxPitch())
 						.mapToDouble(t -> t.getDurationTime()).sum();
 
 				if (playDurationTime * 100 / durationTime < hardLevel.getNotPlayRange()) {
@@ -602,8 +606,8 @@ public class UserChannelContext {
 		// 计算音分
 		int tempoScore = 0;
 		int integrityScore = 0;
-		int intonationScore = 100 - new BigDecimal(Math.abs(YINPitchDetector.hertzToAbsoluteCent(noteAnalysis.getPlayFrequency())
-				- YINPitchDetector.hertzToAbsoluteCent(noteAnalysis.getFrequency()))).multiply(new BigDecimal(20)).divide(new BigDecimal(17), BigDecimal.ROUND_UP)
+		double cents = getCents(noteAnalysis.getPlayFrequency(), noteAnalysis.getFrequency());
+		int intonationScore = 100 - new BigDecimal(Math.abs(cents)).multiply(new BigDecimal(10)).divide(new BigDecimal(17), BigDecimal.ROUND_UP)
 				.setScale(0, BigDecimal.ROUND_UP).intValue();
 		if (intonationScore < 0) {
 			intonationScore = 0;
@@ -661,22 +665,24 @@ public class UserChannelContext {
 
 	private int computeFrequency(MusicXmlNote musicXmlNote) {
 		
-		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
+		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
 		
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 		
-		LOGGER.debug("------------TimeStamp:{}  Duration:{}  floatingRange:{}  StartTime:{}  EndTime:{}------------", musicXmlNote.getTimeStamp(), musicXmlNote.getDuration(), floatingRange, startTime, endTime);
+		LOGGER.debug("------Pitch------standard start time:{}  floatingRange:{}  modified [ {} - {} ]------------", musicXmlNote.getTimeStamp() + dynamicOffset, floatingRange, startTime, endTime);
 		
 		List<ChunkAnalysis> chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(startTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(endTime)).collect(Collectors.toList());
 		
 		double correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote);
 		double correctedEndTime = correctedStartTime + musicXmlNote.getDuration();
 		
+		//重新计算延迟
+		dynamicOffset = correctedStartTime - musicXmlNote.getTimeStamp();
+		dynamicOffset = dynamicOffset < 0 ? 0 : dynamicOffset;
+		
 		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 
-		LOGGER.debug("------------ correctedStartTime:{}  correctedEndTime:{}------------", correctedStartTime, correctedEndTime);
-		
 		//根据完整度取部分有效信号
 		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
 		chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
@@ -686,12 +692,12 @@ public class UserChannelContext {
 		
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
 		
-		LOGGER.debug("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkAnalysisList.get(chunkAnalysisList.size() - 1)
+		LOGGER.debug("------Pitch------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkAnalysisList.get(chunkAnalysisList.size() - 1)
 				.getEndTime());
 		
 		List<ChunkAnalysis> chunkList = new ArrayList<ChunkAnalysis>(chunkAnalysisList);
 		
-		List<Integer> chunkFrequencyList = chunkList.stream().map(t -> t.getFrequency()).filter(t -> t.doubleValue() > MIN_FREQUECY && t.doubleValue() < MAX_FREQUECY)
+		List<Integer> chunkFrequencyList = chunkList.stream().map(t -> t.getFrequency()).filter(t -> t.doubleValue() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch() && t.doubleValue() < MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMaxPitch())
 				.collect(Collectors.toList());
 		
 		if (chunkFrequencyList.size() == 0) {
@@ -711,7 +717,7 @@ public class UserChannelContext {
 	 */
 	private int computeTempoWithFrequency(MusicXmlNote musicXmlNote){
 		
-		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
+		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
 		
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
@@ -723,10 +729,11 @@ public class UserChannelContext {
 		
 		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 		
-		//根据完整度取部分有效信号,取中间
+		//根据完整度取部分有效信号,取开头
 		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
 		
-		int startIndex = (chunkAnalysisList.size() - elementSize) / 2 - 1;
+		//int startIndex = (chunkAnalysisList.size() - elementSize) / 2 - 1;
+		int startIndex = 0;
 		startIndex = startIndex < 1 ? 0 : startIndex;
 		List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(startIndex, elementSize + startIndex);
 		
@@ -735,7 +742,7 @@ public class UserChannelContext {
 		}
 		
 		if (musicXmlNote.getFrequency() == -1) {// 休止符
-			return chunkList.stream().filter(t -> t.getFrequency() > MIN_FREQUECY).count() <= 1? 0:1;
+			return chunkList.stream().filter(t -> t.getFrequency() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch()).count() <= 1? 0:1;
 		}
 
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
@@ -743,7 +750,7 @@ public class UserChannelContext {
 		List<ChunkAnalysis> ignoreHeaderList = chunkAnalysisList.subList(0, startIndex);
 		if(ignoreHeaderList != null && ignoreHeaderList.size() > 0){
 			for(ChunkAnalysis ca : ignoreHeaderList){
-				if(ca.getFrequency() < MIN_FREQUECY){
+				if(ca.getFrequency() < MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch()){
 					firstChunkAnalysis.setFrequency(-1);
 					break;
 				}
@@ -782,7 +789,7 @@ public class UserChannelContext {
 		for (int i = 0; i < chunkList.size(); i++) {
 			chunkAnalysis = chunkList.get(i);
 			if (chunkAnalysis != null) {
-				if (chunkAnalysis.getFrequency() > MIN_FREQUECY || firstPeakIndex > -1) {
+				if (chunkAnalysis.getFrequency() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch() || firstPeakIndex > -1) {
 					
 					if (firstPeakIndex == -1) {
 						firstPeakIndex = i;
@@ -812,10 +819,10 @@ public class UserChannelContext {
 			totalTimes = chunkList.size();
 		}
 		
-		if (maxTimes * 100 / totalTimes < hardLevel.getIntegrityRange()) {
+		/*if (maxTimes * 100 / totalTimes < hardLevel.getIntegrityRange()) {
 			tempo = 1;
 			LOGGER.debug("节奏错误原因:信号分堆后的最大数量不足指定的完成比例");
-		}
+		}*/
 		
 		/**
 		for (int i = 0; i < chunkList.size(); i++) {
@@ -858,13 +865,13 @@ public class UserChannelContext {
 		
 		if (tempo == 0) {
 			// 判断进入时间点
-			if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())){
+			if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())){
 				// 节奏慢
 				tempo = 2;
 				LOGGER.debug("节奏错误原因:进入时间点太晚");
 			}else{
 				//判断是否与上一个音延续下来的
-				if(firstChunkAnalysis.getFrequency() > MIN_FREQUECY && lastChunkAnalysis.getFrequency() > MIN_FREQUECY){
+				if(firstChunkAnalysis.getFrequency() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch() && lastChunkAnalysis.getFrequency() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch()){
 					tempo = new NoteFrequencyRange(standardFrequecy, firstChunkAnalysis.getFrequency()).equals(new NoteFrequencyRange(standardFrequecy, lastChunkAnalysis.getFrequency())) == false?0:1;
 					if(tempo == 1){
 						LOGGER.debug("节奏错误原因:上一个音[{}]延续下来导致的", lastChunkAnalysis.getFrequency());
@@ -878,12 +885,12 @@ public class UserChannelContext {
 	
 	private int computeTempoWithAmplitude2(MusicXmlNote musicXmlNote) {
 
-		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
+		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
 		
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 		
-		LOGGER.debug("------------TimeStamp:{}  floatingRange:{}  StartTime:{}  EndTime:{}------------", musicXmlNote.getTimeStamp(), floatingRange, startTime, endTime);
+		LOGGER.debug("------Tempo------standard start time:{}  floatingRange:{}  modified [ {} - {} ]------------", musicXmlNote.getTimeStamp(), floatingRange, startTime, endTime);
 		
 		List<ChunkAnalysis> chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(startTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(endTime)).collect(Collectors.toList());
 		
@@ -893,7 +900,7 @@ public class UserChannelContext {
 		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 		
 		//根据完整度取部分有效信号
-		int elementSize = chunkAnalysisList.size() * (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())) / 100;
+		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
 		List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(0, elementSize);
 		
 		if(chunkList == null || chunkList.size() == 0){
@@ -902,12 +909,12 @@ public class UserChannelContext {
 		
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
 		
-		LOGGER.debug("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkList.get(chunkList.size() - 1)
+		LOGGER.debug("------Tempo------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkList.get(chunkList.size() - 1)
 				.getEndTime());
 
 		if (musicXmlNote.getFrequency() == -1) {// 休止符
 			
-			LOGGER.debug("--Amplitude:{}  Denominator:{}",chunkList.stream().map(t -> t).collect(Collectors.toList()), musicXmlNote.getDenominator());
+			LOGGER.debug("--pause note Amplitude:{}  Denominator:{}",chunkList.stream().map(t -> t).collect(Collectors.toList()), musicXmlNote.getDenominator());
 			return chunkList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).count() <= 0 ? 0:1;
 		}
 		
@@ -964,7 +971,7 @@ public class UserChannelContext {
 		
 		if (tempo == 0) {
 			// 判断进入时间点
-			if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) * 2){
+			if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) * 2){
 				LOGGER.debug("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
 				tempo = 1;
 			}
@@ -976,17 +983,17 @@ public class UserChannelContext {
 	private double queryFirstNoteStartTime(List<ChunkAnalysis> chunkAnalysisList, MusicXmlNote musicXmlNote) {
 		
 		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
-			LOGGER.debug("找不到数据,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+			LOGGER.debug("[查询第一个音]找不到数据,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
 			return musicXmlNote.getTimeStamp() + dynamicOffset;
 		}
 		
 		if (percussionList.contains(subjectId)) {
 			Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).findFirst();
 			if(optional.isPresent()){
-				LOGGER.debug("范围内查询到信号,correctedStartTime:{}", optional.get().getStartTime());
+				LOGGER.debug("[查询第一个音]范围内查询到信号,correctedStartTime:{}", optional.get().getStartTime());
 				return optional.get().getStartTime();
 			}else{
-				LOGGER.debug("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+				LOGGER.debug("[查询第一个音]范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
 				return musicXmlNote.getTimeStamp() + dynamicOffset;
 			}
 		}
@@ -995,12 +1002,12 @@ public class UserChannelContext {
 		if(musicXmlNote.getMusicalNotesIndex() > 0){
 			MusicXmlNote preMusicXmlNote = getCurrentMusicNote(null, musicXmlNote.getMusicalNotesIndex() - 1);
 			if((int)preMusicXmlNote.getFrequency() == (int)musicXmlNote.getFrequency()){
-				Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= MIN_FREQUECY).findFirst();
+				Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch()).findFirst();
 				if(optional.isPresent()){
-					LOGGER.debug("与上一个音同音,有断开,correctedStartTime:{}", optional.get().getStartTime());
+					LOGGER.debug("[查询第一个音]与上一个音同音,有断开,correctedStartTime:{}", optional.get().getEndTime());
 					return optional.get().getEndTime();
 				}else{
-					LOGGER.debug("与上一个音同音,未断开,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+					LOGGER.debug("[查询第一个音]与上一个音同音,未断开,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
 					return musicXmlNote.getTimeStamp() + dynamicOffset;
 				}
 			}
@@ -1013,12 +1020,12 @@ public class UserChannelContext {
 		for (ChunkAnalysis ca : chunkAnalysisList) {
 			noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, ca.getFrequency());
 			if (standardNote.equals(noteFrequencyRange)) {
-				LOGGER.debug("范围内查询到信号,correctedStartTime:{}", ca.getStartTime());
+				LOGGER.debug("[查询第一个音]范围内查询到信号,correctedStartTime:{}", ca.getStartTime());
 				return ca.getStartTime();
 			}
 		}
 		
-		LOGGER.debug("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+		LOGGER.debug("[查询第一个音]范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
 
 		//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
 		return musicXmlNote.getTimeStamp() + dynamicOffset;
@@ -1033,7 +1040,8 @@ public class UserChannelContext {
 		   midi[x] = new BigDecimal(standardPitch).multiply(new BigDecimal(Math.pow(2, new BigDecimal(x-69).divide(new BigDecimal(12),6,BigDecimal.ROUND_HALF_UP).doubleValue()))).doubleValue();
 		   System.out.println("x=" + x +"  "+ midi[x]);
 		}
-		
+		UserChannelContext test= new UserChannelContext();
+		System.out.println(test.getCents(440, 442));
 	}
 	
 }

+ 21 - 1
audio-analysis/src/main/java/com/yonge/netty/entity/MusicXmlBasicInfo.java

@@ -36,7 +36,11 @@ public class MusicXmlBasicInfo {
 
 	private String uuid;
 	
-	private float beatLength;
+	private float beatLength;//节拍器的持续时长(毫秒)
+	
+	private Integer hertz;//标准音高
+	
+	private Integer reactionTimeMs;//用户设置的反应时间(毫秒)
 
 	private List<MusicXmlNote> musicXmlInfos = new ArrayList<MusicXmlNote>();
 
@@ -162,6 +166,22 @@ public class MusicXmlBasicInfo {
 		this.musicXmlInfos = musicXmlInfos;
 	}
 
+	public Integer getHertz() {
+		return hertz;
+	}
+
+	public void setHertz(Integer hertz) {
+		this.hertz = hertz;
+	}
+
+	public Integer getReactionTimeMs() {
+		return reactionTimeMs;
+	}
+
+	public void setReactionTimeMs(Integer reactionTimeMs) {
+		this.reactionTimeMs = reactionTimeMs;
+	}
+
 	public Map<Integer, MusicXmlSection> getMusicXmlSectionMap() {
 
 		if (musicXmlSectionMap.size() == 0) {

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

@@ -28,7 +28,6 @@ import com.alibaba.fastjson.JSONPath;
 import com.yonge.audio.analysis.AudioFloatConverter;
 import com.yonge.audio.utils.ArrayUtil;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareRecord;
 import com.yonge.cooleshow.biz.dal.enums.DeviceTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.FeatureType;
@@ -127,8 +126,7 @@ public class AudioCompareHandler implements MessageHandler {
 
 			channelContext.getSongMusicXmlMap().put(musicXmlBasicInfo.getExamSongId(), musicXmlBasicInfo);
 
-			channelContext.init(musicXmlBasicInfo.getPlatform(), musicXmlBasicInfo.getHeardLevel(), musicXmlBasicInfo.getSubjectId(),
-					musicXmlBasicInfo.getBeatLength(), audioFormat.getSampleRate(), bufferSize / 2);
+			channelContext.init(musicXmlBasicInfo, audioFormat.getSampleRate(), bufferSize / 2);
 			channelContext.setUser(user);
 			
 			userChannelContextService.register(channel, channelContext);
@@ -156,8 +154,6 @@ public class AudioCompareHandler implements MessageHandler {
 				sysMusicCompareRecord.setPartIndex(musicXmlBasicInfo.getPartIndex());
 				sysMusicCompareRecord.setCustomConfiguration(musicXmlBasicInfo.getCustomConfiguration());
 				
-				SysUser sysUser = sysUserFeignService.queryUserById(sysMusicCompareRecord.getUserId());
-				
 				MusicXmlNote musicXmlNote = musicXmlBasicInfo.getMusicXmlInfos().stream().max(Comparator.comparing(MusicXmlNote::getTimeStamp)).get();
 				sysMusicCompareRecord.setSourceTime((float) ((musicXmlNote.getTimeStamp()+musicXmlNote.getDuration())/1000));
 				sysMusicCompareRecordService.insert(sysMusicCompareRecord);
@@ -246,7 +242,7 @@ public class AudioCompareHandler implements MessageHandler {
 			
 			Integer offsetTime = dataObj.getInteger("offsetTime");
 			if(offsetTime != null){
-				channelContext.setOffsetMS(offsetTime);
+				channelContext.setDeviceDelayTimeMS(offsetTime);
 				channelContext.setHandlerSwitch(true);
 			}
 
@@ -305,19 +301,18 @@ public class AudioCompareHandler implements MessageHandler {
 			return false;
 		}
 		
-		if (channelContext.getOffsetMS() + channelContext.getBeatDuration() > 0) {
-			int beatByteLength = (int) (audioFormat.getSampleRate() * audioFormat.getSampleSizeInBits() / 8 * (channelContext.getOffsetMS() + channelContext.getBeatDuration()) / 1000);
+		if (channelContext.getDeviceDelayTimeMS() + channelContext.getBeatDuration() > 0) {
+			int beatByteLength = (int) (audioFormat.getSampleRate() * audioFormat.getSampleSizeInBits() / 8 * (channelContext.getDeviceDelayTimeMS() + channelContext.getBeatDuration()) / 1000);
 			
 			if(totalLength > beatByteLength){
 				if(beatByteLength % 2 != 0){
-					LOGGER.debug("**************奇数*****************");
 					beatByteLength--;
 				}
 				channelContext.setChannelBufferBytes(ArrayUtil.extractByte(channelContext.getChannelBufferBytes(), beatByteLength, totalLength - 1));
 				
-				LOGGER.debug("--------Length:{}  Times[{} + {}]:{}--------", waveFileProcessor.getFile().length() - channelContext.getChannelBufferBytes().length, channelContext.getOffsetMS() , channelContext.getBeatDuration(),(waveFileProcessor.getFile().length() - channelContext.getChannelBufferBytes().length) * 1000 /audioFormat.getSampleRate()/2);
+				LOGGER.debug("--------head message ignore length:{}  times[{} + {}]:{}--------", waveFileProcessor.getFile().length() - channelContext.getChannelBufferBytes().length, channelContext.getDeviceDelayTimeMS() , channelContext.getBeatDuration(),(waveFileProcessor.getFile().length() - channelContext.getChannelBufferBytes().length) * 1000 /audioFormat.getSampleRate()/2);
 				
-				channelContext.setOffsetMS(0);
+				channelContext.setDeviceDelayTimeMS(0);
 				channelContext.setBeatDuration(0);
 			}else{
 				return false;

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

@@ -84,17 +84,17 @@ public class NettyClient {
 	        handler.handshakeFuture().sync();
 	        
 			//step1发送xml
-			String step1 = FileUtils.readFileToString(FileUtils.toFile(WebSocketClientHandler.class.getResource("/悬崖上的金鱼姬1 速度160.json")));
+			String step1 = FileUtils.readFileToString(FileUtils.toFile(WebSocketClientHandler.class.getResource("/扬基歌88.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\"}}";
+			String step3 = "{\"body\":{\"offsetTime\":89},\"uuid\":\"1657779786620650261\",\"header\":{\"commond\":\"audioPlayStart\",\"type\":\"SOUND_COMPARE\"}}";
 			channel.writeAndFlush(new TextWebSocketFrame(step3));
 			
 			//step4 发送wav
-			String fileName = "/悬崖上的金鱼姬1 速度160.wav";
+			String fileName = "/扬基歌_速度88.wav";
 			AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(FileUtils.toFile(WebSocketClientHandler.class.getResource(fileName)));
 			
 			AudioFormat baseFormat = audioInputStream.getFormat();

BIN
audio-analysis/src/test/resources/160悬崖上的金鱼姬 修节.wav


BIN
audio-analysis/src/test/resources/160悬崖上的金鱼姬 修节奏2.wav


BIN
audio-analysis/src/test/resources/160悬崖上的金鱼姬 修音.wav


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.json


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
audio-analysis/src/test/resources/扬基歌88.json


BIN
audio-analysis/src/test/resources/扬基歌_速度88.wav


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

@@ -54,13 +54,13 @@ public interface AdminFeignService {
     /**
      * 设置商城收入分润
      */
-    @PostMapping("/userAccount/mallRecord")
+    @PostMapping("/open/mallRecord")
     public HttpResponseResult<Boolean> mallRecord(@RequestBody List<MallOrderItemDto> shareDto ) ;
 
     /**
      * 设置商城收入状态
      */
-    @PostMapping("/userAccount/mallRecordState")
+    @PostMapping("/open/mallRecordState")
     public HttpResponseResult<Boolean> mallRecordState(@RequestBody  List<MallOrderItemDto> shareDto ) ;
 
 

+ 0 - 5
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -1,20 +1,15 @@
 package com.yonge.cooleshow.auth.service.impl;
 
-import java.util.Date;
 import java.util.List;
 
 import com.yonge.cooleshow.auth.api.dto.*;
 import com.yonge.cooleshow.auth.config.RongCloudConfig;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
-import com.yonge.cooleshow.common.security.AuthUser;
-import com.yonge.cooleshow.common.security.SecurityUtils;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 import io.rong.models.user.UserModel;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 

+ 2 - 2
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/PostStatusEnum.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 /**
- * 入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 取消
+ * 入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 退费
  *
  * @Author: liweifan
  * @Data: 2022/4/7 15:48
@@ -14,7 +14,7 @@ public enum PostStatusEnum implements BaseEnum<String, PostStatusEnum> {
     WAIT("待入账"),
     FROZEN("冻结入账"),
     RECORDED("已入账"),
-    CANCEL("取消");
+    CANCEL("退费");
 
     @EnumValue
     private String code;

+ 5 - 3
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/MallAdminApplication.java

@@ -1,6 +1,8 @@
 package com.yonge.cooleshow.admin;
 
 import com.spring4all.swagger.EnableSwagger2Doc;
+import com.yonge.cooleshow.common.constant.AppConstant;
+import com.yonge.toolset.base.BaseApplication;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -14,13 +16,13 @@ import org.springframework.context.annotation.ComponentScan;
  */
 @SpringBootApplication
 @EnableDiscoveryClient
-@MapperScan({"com.yonge.cooleshow.admin.dao","com.yonge.cooleshow.mbg.mapper", "com.yonge.toolset.payment.core.dao"})
+@MapperScan({"com.yonge.cooleshow.admin.dao", "com.yonge.cooleshow.mbg.mapper", "com.yonge.toolset.payment.core.dao"})
 @ComponentScan(basePackages = {"com.yonge.cooleshow.admin", "com.yonge.cooleshow.mbg", "com.yonge.cooleshow.mall.common",
-                               "com.yonge.cooleshow.common","com.yonge.toolset.thirdparty","com.yonge.toolset.payment","com.yonge.toolset.log"})
+        "com.yonge.cooleshow.common", "com.yonge.toolset.thirdparty", "com.yonge.toolset.payment", "com.yonge.toolset.log"})
 @EnableSwagger2Doc
 @EnableFeignClients("com.yonge.cooleshow")
 public class MallAdminApplication {
     public static void main(String[] args) {
-        SpringApplication.run(MallAdminApplication.class, args);
+        BaseApplication.run(AppConstant.APPLICATION_MALL_ADMIN, MallAdminApplication.class, args);
     }
 }

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

@@ -30,7 +30,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 .permitAll()
             .and()
                 .authorizeRequests()
-                .antMatchers("/wechat/*","/feign-client/**","/v2/api-docs", "/code/*","/payment/callback","/admin/login")
+                .antMatchers("/wechat/*","/feign-client/**","/v2/api-docs", "/code/*","/payment/callback","/admin/login","/open/**")
             .permitAll().anyRequest().authenticated().and().httpBasic();
     }
 

+ 2 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderReturnApplyController.java

@@ -18,6 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 

+ 71 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java

@@ -0,0 +1,71 @@
+package com.yonge.cooleshow.admin.controller.open;
+
+import com.yonge.cooleshow.admin.controller.OmsOrderReturnApplyController;
+import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
+import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-07-28
+ */
+@Controller
+@RequestMapping("/open")
+public class OpenController {
+    @Autowired
+    private OmsOrderReturnApplyService returnApplyService;
+
+
+    @Value("${message.debugMode}")
+    private boolean debugMode;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    private static final Logger log = LoggerFactory.getLogger(OmsOrderReturnApplyController.class);
+
+    @ApiOperation("完成退货测试接口")
+    @GetMapping(value = "/test/returnApply/{id}")
+    @ResponseBody
+    public CommonResult test(@PathVariable Long id) {
+        if (!debugMode) {
+            return CommonResult.failed("当前环境不可使用");
+        }
+        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_REFUND_ORDER_MALL + ":refundOrder:" + id);
+        try {
+            boolean b = lock.tryLock(60, 60, TimeUnit.SECONDS);
+            if (b) {
+
+                returnApplyService.setTestReturnApply(id);
+                return CommonResult.success(true);
+
+            }
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        } finally {
+            if (lock.getHoldCount() >0) {
+                lock.unlock();
+            }
+        }
+
+        return CommonResult.failed();
+    }
+
+}

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

@@ -31,6 +31,9 @@ public interface OmsOrderReturnApplyService {
     @Transactional
     int updateStatus(Long id, OmsUpdateStatusParam statusParam);
 
+    void setTestReturnApply(Long id);
+
+
     /**
      * 获取指定申请详情
      */

+ 17 - 2
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -96,7 +96,7 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
         if (omsOrderReturnApply == null) {
             throw new BizException("退货订单不存在或被撤销");
         }
-        if (omsOrderReturnApply.getProductPrice().compareTo(statusParam.getReturnAmount()) <0) {
+        if (omsOrderReturnApply.getProductRealPrice().multiply(BigDecimal.valueOf(omsOrderReturnApply.getProductCount())).compareTo(statusParam.getReturnAmount()) <0) {
             throw new BizException("退款金额不能大于商品金额");
         }
         if (omsOrderReturnApply.getStatus().equals(statusParam.getStatus())) {
@@ -124,7 +124,7 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
             }
 
             // 确认退款 取消平台收入和 分润
-            setRecord(returnApply);
+            setRecord(omsOrderReturnApply);
 
         } else if (status.equals(3)) {
             //拒绝退货
@@ -139,6 +139,21 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
         return returnApplyMapper.updateByPrimaryKeySelective(returnApply);
     }
 
+
+    @Override
+    public void setTestReturnApply(Long id) {
+        OmsOrderReturnApply returnApply = returnApplyMapper.selectByPrimaryKey(id);
+        returnApply.setId(id);
+        returnApply.setStatus(2);
+        returnApply.setReceiveTime(new Date());
+        returnApply.setReceiveMan("测试退货");
+        returnApply.setReceiveNote("测试退货");
+
+        // 确认退款 取消平台收入和 分润
+        setRecord(returnApply);
+        returnApplyMapper.updateByPrimaryKeySelective(returnApply);
+    }
+
     private void setRecord(OmsOrderReturnApply returnApply) {
         if (returnApply.getOrderItemId() != null) {
             OmsOrderItem omsOrderItem = orderItemMapper.selectByPrimaryKey(returnApply.getOrderItemId());

+ 9 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -14,6 +14,7 @@ import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.mbg.model.OmsOrderExample;
 import com.yonge.cooleshow.mbg.model.OmsOrderOperateHistory;
 import com.yonge.cooleshow.admin.service.OmsOrderService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.cooleshow.admin.enums.OrderStatisticalEnum;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -84,6 +85,14 @@ public class OmsOrderServiceImpl implements OmsOrderService {
         record.setStatus(4);
         OmsOrderExample example = new OmsOrderExample();
         example.createCriteria().andDeleteStatusEqualTo(0).andIdIn(ids);
+
+        List<OmsOrder> omsOrders = orderMapper.selectByExample(example);
+        long count1 = omsOrders.stream()
+                               .filter(omsOrder -> omsOrder.getStatus() != 0 && omsOrder.getStatus() != 6)
+                               .count();
+        if (count1 != 0) {
+            throw new BizException("订单不处于待支付状态,不能关闭");
+        }
         int count = orderMapper.updateByExampleSelective(record, example);
         List<OmsOrderOperateHistory> historyList = ids.stream().map(orderId -> {
             OmsOrderOperateHistory history = new OmsOrderOperateHistory();

+ 12 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/api/CommonResult.java

@@ -18,6 +18,8 @@ public class CommonResult<T> {
      */
     private T data;
 
+    private Object err;
+
     protected CommonResult() {
     }
 
@@ -27,6 +29,8 @@ public class CommonResult<T> {
         this.data = data;
     }
 
+
+
     /**
      * 成功返回结果
      *
@@ -130,4 +134,12 @@ public class CommonResult<T> {
     public void setData(T data) {
         this.data = data;
     }
+
+    public Object getErr() {
+        return err;
+    }
+
+    public void setErr(Object err) {
+        this.err = err;
+    }
 }

+ 88 - 2
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/domain/WebLog.java

@@ -7,8 +7,6 @@ import lombok.EqualsAndHashCode;
  * Controller层的日志封装类
  * Created by macro on 2018/4/26.
  */
-@Data
-@EqualsAndHashCode(callSuper = false)
 public class WebLog {
     /**
      * 操作描述
@@ -65,4 +63,92 @@ public class WebLog {
      */
     private Object result;
 
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Long startTime) {
+        this.startTime = startTime;
+    }
+
+    public Integer getSpendTime() {
+        return spendTime;
+    }
+
+    public void setSpendTime(Integer spendTime) {
+        this.spendTime = spendTime;
+    }
+
+    public String getBasePath() {
+        return basePath;
+    }
+
+    public void setBasePath(String basePath) {
+        this.basePath = basePath;
+    }
+
+    public String getUri() {
+        return uri;
+    }
+
+    public void setUri(String uri) {
+        this.uri = uri;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public Object getParameter() {
+        return parameter;
+    }
+
+    public void setParameter(Object parameter) {
+        this.parameter = parameter;
+    }
+
+    public Object getResult() {
+        return result;
+    }
+
+    public void setResult(Object result) {
+        this.result = result;
+    }
 }

+ 5 - 3
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/MallPortalApplication.java

@@ -1,6 +1,8 @@
 package com.yonge.cooleshow.portal;
 
 import com.spring4all.swagger.EnableSwagger2Doc;
+import com.yonge.cooleshow.common.constant.AppConstant;
+import com.yonge.toolset.base.BaseApplication;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -9,15 +11,15 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
 
 @SpringBootApplication
-@MapperScan({ "com.yonge.cooleshow.portal.dao", "com.yonge.toolset.payment.core.dao", "com.yonge.cooleshow.mbg.mapper"})
-@ComponentScan(basePackages = {"com.yonge.cooleshow.portal","com.yonge.cooleshow.mbg", "com.yonge.cooleshow.mall.common", "com.yonge.cooleshow.common","com.yonge.toolset.payment","com.yonge.toolset.log"})
+@MapperScan({"com.yonge.cooleshow.portal.dao", "com.yonge.toolset.payment.core.dao", "com.yonge.cooleshow.mbg.mapper"})
+@ComponentScan(basePackages = {"com.yonge.cooleshow.portal", "com.yonge.cooleshow.mbg", "com.yonge.cooleshow.mall.common", "com.yonge.cooleshow.common", "com.yonge.toolset.payment", "com.yonge.toolset.log"})
 @EnableSwagger2Doc
 @EnableDiscoveryClient
 @EnableFeignClients("com.yonge.cooleshow")
 public class MallPortalApplication {
 
     public static void main(String[] args) {
-        SpringApplication.run(MallPortalApplication.class, args);
+        BaseApplication.run(AppConstant.APPLICATION_MALL_PORTAL, MallPortalApplication.class, args);
     }
 
 }

+ 5 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderReceiver.java

@@ -37,7 +37,11 @@ public class CancelOrderReceiver {
             DistributedLock.of(redissonClient)
                            .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
                                    , () -> {
-                                       portalOrderService.cancelOrder(orderId, "超时取消", null);
+                               try {
+                                   portalOrderService.cancelOrder(orderId, "超时取消", null);
+                               }catch (Exception e) {
+                                   logger.warn("超时队列 : {}",e.fillInStackTrace());
+                               }
                                    }, 60L, TimeUnit.SECONDS);
 
         } catch (BizException e) {

+ 12 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -16,6 +16,7 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
@@ -36,6 +37,10 @@ public class OmsPortalOrderController {
     private OmsPortalOrderService portalOrderService;
 
 
+
+    @Value("${message.debugMode}")
+    private boolean debugMode;
+
     @Autowired
     private RedissonClient redissonClient;
 
@@ -167,6 +172,9 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/paySuccess/test", method = RequestMethod.GET)
     @ResponseBody
     public CommonResult paySuccessTest(@RequestParam Long orderId,@RequestParam Integer payType) {
+        if (!debugMode) {
+            return CommonResult.failed("当前环境不可使用");
+        }
         OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
         if (omsOrder == null) {
             return CommonResult.failed("未找到订单");
@@ -190,6 +198,10 @@ public class OmsPortalOrderController {
     @ResponseBody
     public CommonResult cancelUserOrderTest(@RequestParam Long orderId) {
 
+        if (!debugMode) {
+            return CommonResult.failed("当前环境不可使用");
+        }
+
         OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
         if (omsOrder == null) {
             return CommonResult.failed("未找到订单");

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

@@ -20,7 +20,7 @@ import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("/open")
-@Api(value = "开放权限接口-分享", hidden = true)
+@Api(tags = "开放权限接口-分享")
 public class OpenShareController extends BaseController {
     private final static Logger log = LoggerFactory.getLogger(OpenShareController.class);
 

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

@@ -335,9 +335,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         OmsOrderDetail detail = detail(orderId);
 
         // 设置平台收入和分润
-
         setPromoterRecord(detail,PostStatusEnum.WAIT);
 
+        // 签协议
+        adminFeignService.contractRecord(new ContractDto(orderDetail.getPlatformType(),orderDetail.getMemberId()));
 
         return count;
     }
@@ -420,7 +421,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                                        if (timeOutOrder.getStatus() == 0) {
                                            payingOrderHandle(timeOutOrder);
                                        } else if (timeOutOrder.getStatus() == 6) {
-                                           cancelOrder(timeOutOrder.getId(), "超时取消", null);
+                                           try {
+                                               cancelOrder(timeOutOrder.getId(), "超时取消", null);
+                                           } catch (Exception e) {
+                                               LOG.warn("订单取消失败,{}",e.fillInStackTrace());
+                                           }
                                        }
                                    }, 60L, TimeUnit.SECONDS);
 
@@ -790,7 +795,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             DistributedLock.of(redissonClient)
                            .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
                                    , () -> {
-                                       this.confirmReceiveOrder(omsOrder.getId());
+                                        try {
+                                            this.confirmReceiveOrder(omsOrder.getId());
+
+                                        }catch (Exception e) {
+                                            LOG.warn("订单收货,{}",e.fillInStackTrace());
+                                        }
                                    }, 60L, TimeUnit.SECONDS);
         }
         return omsOrders.size();
@@ -817,7 +827,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             DistributedLock.of(redissonClient)
                            .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
                                    , () -> {
-                                       this.FinishReceiveOrder(omsOrder.getId());
+                               try {
+                                   this.FinishReceiveOrder(omsOrder.getId());
+
+                               } catch (Exception e) {
+                                   LOG.warn("停止售后失败,{}",e.fillInStackTrace());
+                               }
                                    }, 60L, TimeUnit.SECONDS);
         }
         return omsOrders.size();
@@ -1054,8 +1069,6 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         userOrderPaymentService.saveOrUpdate(orderPayment);
 
-        // 签协议
-        adminFeignService.contractRecord(new ContractDto(orderPayment.getPaymentClient(),detail.getMemberId()));
     }
 
 

+ 1 - 5
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml

@@ -9,11 +9,7 @@
     </resultMap>
     <select id="getDetail" resultMap="orderDetailMap">
         SELECT
-            o.id,
-            o.order_sn,
-            o.coupon_id,
-            o.integration,
-            o.member_id,
+            o.*,
             ot.id ot_id,
         ot.product_id ot_product_id,
             ot.product_name ot_product_name,

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

@@ -3,7 +3,6 @@ package com.yonge.cooleshow.admin.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetExport;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherMusicSheetAuditReq;
@@ -243,7 +242,8 @@ public class MusicSheetController extends BaseController {
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        return status(musicSheetService.sendBuyMessage(param.getTeacherId(),param.getStudentId(),param.getMusicSheetId()));
+        return status(musicSheetService.sendBuyMessage(param.getTeacherId(), param.getStudentId(), param.getMusicSheetId(),
+                                                       ClientEnum.STUDENT));
     }
     /**
      * 导入

+ 34 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PlatformCashAccountRecordController.java

@@ -1,11 +1,18 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.biz.dal.dto.excel.PlatformCashAccountRecordExport;
+import com.yonge.cooleshow.biz.dal.dto.excel.UserAccountRecordExport;
+import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountPageVo;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
+import com.yonge.toolset.utils.easyexcel.ExcelUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
 import javax.validation.Valid;
 
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.ui.ModelMap;
@@ -22,6 +29,10 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
 @RestController
 @RequestMapping("/platformCashAccountRecord")
 @Api(value = "平台账户记录", tags = "平台账户记录")
@@ -33,13 +44,34 @@ public class PlatformCashAccountRecordController extends BaseController {
 	@ApiOperation(value = "平台账户记录-列表", httpMethod = "POST", consumes = "application/json", produces = "application/json")
 	@PostMapping(value = "/list", consumes = "application/json", produces = "application/json")
 	@PreAuthorize("@pcs.hasPermissions('platformCashAccountRecord/list')")
-	public HttpResponseResult<PlatformCashAccountPageVo> list(@Valid @RequestBody PlatformCashAccountRecordSearch query) {
+	public HttpResponseResult<PlatformCashAccountPageVo> list(@RequestBody PlatformCashAccountRecordSearch query) {
 		PlatformCashAccountPageVo model = new PlatformCashAccountPageVo();
-		
 		PageInfo<PlatformCashAccountRecord> pageInfo = PageUtil.pageInfo(platformCashAccountRecordService.queryPage(PageUtil.getPage(query),query));
 		model.setPageInfo(pageInfo);
 		model.setSummary(platformCashAccountRecordService.querySummary(query));
 		return succeed(model);
 	}
 
+	/**
+	 * 查询导出
+	 */
+	@PostMapping("/export")
+	@ApiOperation(value = "查询导出", notes = "传入orderSearch")
+	@PreAuthorize("@pcs.hasPermissions('platformCashAccountRecord/export')")
+	public void export(@RequestBody PlatformCashAccountRecordSearch query) {
+		List<PlatformCashAccountRecord> platformCashAccountRecords = platformCashAccountRecordService.queryAll(query);
+
+		List<PlatformCashAccountRecordExport> list = new ArrayList<>();
+		platformCashAccountRecords.forEach(o -> {
+			PlatformCashAccountRecordExport export = new PlatformCashAccountRecordExport();
+			BeanUtils.copyProperties(o, export);
+			if (null == export.getTransAmount()) {
+				export.setTransAmount(BigDecimal.ZERO);
+			}
+			list.add(export);
+		});
+		ExcelUtils.exportExcel(list, "平台收支列表数据" + System.currentTimeMillis(),
+				"平台收支列表数据");
+	}
+
 }

+ 0 - 18
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountController.java

@@ -32,23 +32,5 @@ public class UserAccountController extends BaseController {
 	}
 
 
-    /**
-     * 设置商城收入分润
-     */
-    @PostMapping("/mallRecord")
-    public HttpResponseResult<Boolean> mallRecord(@RequestBody List<MallOrderItemDto> shareDto ) {
-        return succeed(userAccountService.saveMallAccountRecord(shareDto));
-    }
-
-
-
-    /**
-     * 设置商城收入状态
-     */
-    @PostMapping("/mallRecordState")
-    public HttpResponseResult<Boolean> mallRecordState(@RequestBody List<MallOrderItemDto> shareDto ) {
-        userAccountService.mallTeacherRecordState(shareDto);
-        return succeed();
-    }
 
 }

+ 42 - 6
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountRecordController.java

@@ -3,14 +3,21 @@ 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.excel.UserAccountRecordExport;
+import com.yonge.cooleshow.biz.dal.dto.excel.UserOrderExport;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 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 com.yonge.toolset.utils.easyexcel.ExcelUtils;
 import io.swagger.annotations.*;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -21,6 +28,9 @@ import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
 
 import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 
 @RestController
 @RequestMapping("/userAccountRecord")
@@ -30,16 +40,16 @@ public class UserAccountRecordController extends BaseController {
     @Autowired
     private UserAccountRecordService userAccountRecordService;
 
-	/**
+    /**
      * 查询单条
      */
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入id")
     @PreAuthorize("@pcs.hasPermissions('userAccountRecord/detail')")
     public HttpResponseResult<UserAccountRecordVo> detail(@PathVariable("id") Long id) {
-    	return succeed(userAccountRecordService.detail(id));
-	}
-    
+        return succeed(userAccountRecordService.detail(id));
+    }
+
     /**
      * 查询分页
      */
@@ -47,15 +57,41 @@ public class UserAccountRecordController extends BaseController {
     @ApiOperation(value = "查询分页", notes = "传入userAccountRecordSearch")
     @PreAuthorize("@pcs.hasPermissions('userAccountRecord/page')")
     public HttpResponseResult<PageInfo<UserAccountRecordVo>> page(@RequestBody UserAccountRecordSearch query) {
-		IPage<UserAccountRecordVo> pages = userAccountRecordService.selectPage(PageUtil.getPage(query), query);
+        query.setInOrOut(InOrOutEnum.IN);
+        IPage<UserAccountRecordVo> pages = userAccountRecordService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
-	}
+    }
+
+    /**
+     * 查询导出
+     */
+    @PostMapping("/export")
+    @ApiOperation(value = "查询导出", notes = "传入orderSearch")
+    @PreAuthorize("@pcs.hasPermissions('userAccountRecord/export')")
+    public void export(@RequestBody UserAccountRecordSearch query) {
+        query.setInOrOut(InOrOutEnum.IN);
+        List<UserAccountRecordVo> userAccountRecordVos = userAccountRecordService.selectAll(query);
+
+        List<UserAccountRecordExport> list = new ArrayList<>();
+        userAccountRecordVos.forEach(o -> {
+            UserAccountRecordExport export = new UserAccountRecordExport();
+            BeanUtils.copyProperties(o, export);
+            if (null == export.getTransAmount()) {
+                export.setTransAmount(BigDecimal.ZERO);
+            }
+            list.add(export);
+        });
+        ExcelUtils.exportExcel(list, "老师收入列表数据" + System.currentTimeMillis(),
+                "老师收入列表数据");
+    }
 
     @ApiOperation(value = "收入数据统计")
     @PostMapping("/accountTotal")
     @PreAuthorize("@pcs.hasPermissions('userAccountRecord/accountTotal')")
     public HttpResponseResult<UserAccountVo> accountTotal(@RequestBody UserAccountRecordSearch query) {
+        query.setInOrOut(InOrOutEnum.IN);
         return userAccountRecordService.accountTotal(query);
     }
 
+
 }

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

@@ -73,4 +73,17 @@ public class UserOrderRefundController extends BaseController {
 		}
 		return userOrderRefundService.orderRefund(orderNo, reason);
 	}
+
+	@PostMapping("/orderRefundSuccessBizHandle")
+	@ApiOperation(value = "调用退款后处理业务逻辑", notes = "传入authOperaReq")
+	@PreAuthorize("@pcs.hasPermissions('userOrderRefunds/orderRefundSuccessBizHandle')")
+	public HttpResponseResult<UserOrderRefundBill> orderRefundSuccessBizHandle(Long refundId) throws Exception {
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null || null == user.getId()) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		userOrderRefundService.orderRefundSuccessBizHandle(refundId);
+		return HttpResponseResult.succeed();
+	}
+
 }

+ 48 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenUserAccountController.java

@@ -0,0 +1,48 @@
+package com.yonge.cooleshow.admin.controller.open;
+
+import com.yonge.cooleshow.biz.dal.service.UserAccountService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.entity.MallOrderItemDto;
+import io.swagger.annotations.Api;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/open")
+@Api(value = "开放权限接口", tags = "开放权限接口")
+public class OpenUserAccountController extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(OpenUserAccountController.class);
+
+
+
+    @Autowired
+    private UserAccountService userAccountService;
+
+
+    /**
+     * 设置商城收入分润
+     */
+    @PostMapping("/mallRecord")
+    public HttpResponseResult<Boolean> mallRecord(@RequestBody List<MallOrderItemDto> shareDto ) {
+        return succeed(userAccountService.saveMallAccountRecord(shareDto));
+    }
+
+
+
+    /**
+     * 设置商城收入状态
+     */
+    @PostMapping("/mallRecordState")
+    public HttpResponseResult<Boolean> mallRecordState(@RequestBody List<MallOrderItemDto> shareDto ) {
+        userAccountService.mallTeacherRecordState(shareDto);
+        return succeed();
+    }
+}

+ 24 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.admin.controller.open;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
+import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
 import com.yonge.cooleshow.common.entity.ContractDto;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
@@ -28,6 +29,7 @@ import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -50,6 +52,9 @@ public class UserOrderClient extends BaseController {
     @Autowired
     private RedissonClient redissonClient;
 
+    @Value("${message.debugMode}")
+    private boolean debugMode;
+
     @ApiOperation(value = "查询付款单")
     @GetMapping("/queryPayment")
     public HttpResponseResult<Payment> queryPayment(String paymentNo) {
@@ -129,6 +134,9 @@ public class UserOrderClient extends BaseController {
      */
     @PostMapping("/testCallback")
     public void testCallback(@RequestBody PaymentCallBack data) {
+        if(!debugMode){
+            return;
+        }
         if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
             //支付交易
             paymentService.executePaymentCallBack(data);
@@ -144,6 +152,9 @@ public class UserOrderClient extends BaseController {
     @GetMapping("/setSuccessStatus")
     @ApiOperation(value = "完成所有订单(测试用)")
     public HttpResponseResult<Boolean> setSuccessStatus() {
+        if(!debugMode){
+            return HttpResponseResult.failed("当前环境不允许调用");
+        }
         userOrderService.setSuccessStatus();
         return succeed(true);
     }
@@ -153,17 +164,27 @@ public class UserOrderClient extends BaseController {
     public HttpResponseResult<Boolean> setOrderStatus(
             @RequestParam("orderNo") String orderNo,
             @RequestParam("orderStatus") OrderStatusEnum orderStatus) {
+        if(!debugMode){
+            return HttpResponseResult.failed("当前环境不允许调用");
+        }
         userOrderService.setOrderStatus(orderNo, orderStatus);
         return succeed(true);
     }
 
-
-
+    @GetMapping("/orderRefound")
+    @ApiOperation(value = "退款(测试用)")
+    public HttpResponseResult<UserOrderRefundBill> orderRefound(
+            @RequestParam("orderNo") String orderNo) {
+        if(!debugMode){
+            return HttpResponseResult.failed("当前环境不允许调用");
+        }
+        return userOrderRefundService.orderRefound(orderNo);
+    }
 
     /**
      * 签协议 商城调用
      */
-    @GetMapping("/contractRecord")
+    @PostMapping("/contractRecord")
     @ApiOperation(value = "签协议 商城调用", notes = "签协议 商城调用")
     public HttpResponseResult<Boolean> contractRecord(@RequestBody ContractDto contract) {
         paymentService.setContractRecord(contract.getType(),contract.getUserId());

+ 42 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/AccountBizTypeEnumConvert.java

@@ -0,0 +1,42 @@
+package com.yonge.cooleshow.biz.dal.convert;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/15 15:36
+ */
+public class AccountBizTypeEnumConvert implements Converter<AccountBizTypeEnum> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return CellDataTypeEnum.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public AccountBizTypeEnum convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            return AccountBizTypeEnum.valueOf(cellData.getStringValue());
+        }catch (Exception e){
+            return null;
+        }
+    }
+
+    @Override
+    public CellData convertToExcelData(AccountBizTypeEnum statusEnum, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if(null != statusEnum){
+            return new CellData(statusEnum.getMsg());
+        }
+        return new CellData("异常数据");
+    }
+}

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/InOrOutEnumConvert.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.convert;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/15 15:36
+ */
+public class InOrOutEnumConvert implements Converter<InOrOutEnum> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return CellDataTypeEnum.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public InOrOutEnum convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            return InOrOutEnum.valueOf(cellData.getStringValue());
+        }catch (Exception e){
+            return null;
+        }
+    }
+
+    @Override
+    public CellData convertToExcelData(InOrOutEnum statusEnum, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if(null != statusEnum){
+            return new CellData(statusEnum.getMsg());
+        }
+        return new CellData("异常数据");
+    }
+}

+ 42 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/PostStatusConvert.java

@@ -0,0 +1,42 @@
+package com.yonge.cooleshow.biz.dal.convert;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/15 15:36
+ */
+public class PostStatusConvert implements Converter<PostStatusEnum> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return CellDataTypeEnum.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public PostStatusEnum convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            return PostStatusEnum.valueOf(cellData.getStringValue());
+        }catch (Exception e){
+            return null;
+        }
+    }
+
+    @Override
+    public CellData convertToExcelData(PostStatusEnum statusEnum, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if(null != statusEnum){
+            return new CellData(statusEnum.getMsg());
+        }
+        return new CellData("异常数据");
+    }
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PlatformCashAccountRecordDao.java

@@ -25,6 +25,8 @@ public interface PlatformCashAccountRecordDao extends BaseMapper<PlatformCashAcc
 
     IPage<PlatformCashAccountRecord> queryPage(@Param("page") IPage<PlatformCashAccountRecord> page, @Param("param") PlatformCashAccountRecordSearch query);
 
+    List<PlatformCashAccountRecord> queryAll(@Param("param")PlatformCashAccountRecordSearch query);
+
     PlatformCashAccountRecordSummaryVo querySummary(@Param("param") PlatformCashAccountRecordSearch query);
 
     List<PlatformCashAccountRecord> queryCanAccountByBizType(@Param("bizTypes")List<String> bizTypes);
@@ -34,5 +36,11 @@ public interface PlatformCashAccountRecordDao extends BaseMapper<PlatformCashAcc
     Integer cancelRecord(@Param("orderNo")String orderNo,@Param("bizType") String bizType, @Param("bizId") Long bizId);
 
     Integer mallRecordedRecord(@Param("orderNo")String orderNo,@Param("bizType") String bizType, @Param("bizId") Long bizId);
+
+    /**
+     * 平台收益批量入账
+     * @param recordIds
+     */
+    void batchRecorded(@Param("recordIds") List<Long> recordIds);
 }
 

+ 4 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java

@@ -40,7 +40,7 @@ public interface UserAccountRecordDao extends BaseMapper<UserAccountRecord> {
      */
     List<UserAccountRecordVo> selectPage(@Param("page") IPage page, @Param("param") UserAccountRecordSearch userAccountRecord);
 
-    List<UserAccountRecordVo> selectAllPage(@Param("param") UserAccountRecordSearch userAccountRecord);
+    List<UserAccountRecordVo> selectAll(@Param("param") UserAccountRecordSearch userAccountRecord);
 
     List<UserAccountRecordVo> sharePage(@Param("page") IPage page, @Param("param") UserAccountRecordSearch userAccountRecord);
 
@@ -82,11 +82,12 @@ public interface UserAccountRecordDao extends BaseMapper<UserAccountRecord> {
     /**
      * 通过订单详情和业务id查询该详情对应的所有账户记录
      *
-     * @param param
+     * @param orderNo
+     * @param bizType
      * @param bizIds
      * @return
      */
-    List<UserAccountRecord> selectRecordByOrderDetail(@Param("param") UserOrderDetailVo param, @Param("bizIds") List<Long> bizIds);
+    List<UserAccountRecord> selectRecordByOrderDetail(@Param("orderNo") String orderNo,@Param("bizType")AccountBizTypeEnum bizType , @Param("bizIds") List<Long> bizIds);
 
     /**
      * 入账记录可以通过以下三个字段确定唯一

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserAccountRecordDto.java

@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 账户变更传输对象
@@ -18,6 +19,7 @@ import java.math.BigDecimal;
  */
 @ApiModel(value = "UserAccountRecordDto对象", description = "账户变更传输对象")
 public class UserAccountRecordDto extends UserAccountRecord {
+    public UserAccountRecordDto(){}
     public UserAccountRecordDto(Long accountId, PostStatusEnum postStatus, BigDecimal transAmount, InOrOutEnum inOrOut, AccountBizTypeEnum bizType,
                                 Long bizId, String bizName, String orderNo, Long buyUser) {
         this.setAccountId(accountId);
@@ -30,4 +32,18 @@ public class UserAccountRecordDto extends UserAccountRecord {
         this.setOrderNo(orderNo);
         this.setBuyUser(buyUser);
     }
+
+    public UserAccountRecordDto(Long accountId, PostStatusEnum postStatus, BigDecimal transAmount, InOrOutEnum inOrOut, AccountBizTypeEnum bizType,
+                                Long bizId, String bizName, String orderNo, Long buyUser, Date accountPeriodTime) {
+        this.setAccountId(accountId);
+        this.setPostStatus(postStatus);
+        this.setTransAmount(transAmount);
+        this.setInOrOut(inOrOut);
+        this.setBizType(bizType);
+        this.setBizId(bizId);
+        this.setBizName(bizName);
+        this.setOrderNo(orderNo);
+        this.setBuyUser(buyUser);
+        this.setAccountPeriodTime(accountPeriodTime);
+    }
 }

+ 89 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/excel/PlatformCashAccountRecordExport.java

@@ -0,0 +1,89 @@
+package com.yonge.cooleshow.biz.dal.dto.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.yonge.cooleshow.biz.dal.convert.AccountBizTypeEnumConvert;
+import com.yonge.cooleshow.biz.dal.convert.InOrOutEnumConvert;
+import com.yonge.cooleshow.biz.dal.convert.PostStatusConvert;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/15 17:32
+ */
+public class PlatformCashAccountRecordExport {
+    @ExcelProperty(value = "关联订单", index = 0)
+    private String orderNo;
+    @ExcelProperty(value = "金额", index = 1)
+    private BigDecimal transAmount;
+    @ExcelProperty(value = "产品编号", index = 2)
+    private Long bizId;
+    @ExcelProperty(value = "收支类型", index = 3, converter = InOrOutEnumConvert.class)
+    private InOrOutEnum inOrOut;
+    @ExcelProperty(value = "内容", index = 4, converter = AccountBizTypeEnumConvert.class)
+    private AccountBizTypeEnum bizType;
+    @ExcelProperty(value = "入账状态", index = 5, converter = PostStatusConvert.class)
+    private PostStatusEnum postStatus;
+    @ExcelProperty(value = "更新时间", index = 6)
+    private Date updateTime;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public BigDecimal getTransAmount() {
+        return transAmount;
+    }
+
+    public void setTransAmount(BigDecimal transAmount) {
+        this.transAmount = transAmount;
+    }
+
+    public Long getBizId() {
+        return bizId;
+    }
+
+    public void setBizId(Long bizId) {
+        this.bizId = bizId;
+    }
+
+    public InOrOutEnum getInOrOut() {
+        return inOrOut;
+    }
+
+    public void setInOrOut(InOrOutEnum inOrOut) {
+        this.inOrOut = inOrOut;
+    }
+
+    public AccountBizTypeEnum getBizType() {
+        return bizType;
+    }
+
+    public void setBizType(AccountBizTypeEnum bizType) {
+        this.bizType = bizType;
+    }
+
+    public PostStatusEnum getPostStatus() {
+        return postStatus;
+    }
+
+    public void setPostStatus(PostStatusEnum postStatus) {
+        this.postStatus = postStatus;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 85 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/excel/UserAccountRecordExport.java

@@ -0,0 +1,85 @@
+package com.yonge.cooleshow.biz.dal.dto.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.yonge.cooleshow.biz.dal.convert.PostStatusConvert;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/15 17:32
+ */
+public class UserAccountRecordExport {
+    @ExcelProperty(value = "关联订单", index = 0)
+    private String orderNo;
+    @ExcelProperty(value = "老师编号", index = 1)
+    private Long accountId;
+    @ExcelProperty(value = "老师姓名", index = 2)
+    private String accountName;
+    @ExcelProperty(value = "金额", index = 3)
+    private BigDecimal transAmount;
+    @ExcelProperty(value = "产品编号", index = 4)
+    private Long bizId;
+    @ExcelProperty(value = "入账状态", index = 5, converter = PostStatusConvert.class)
+    private PostStatusEnum postStatus;
+    @ExcelProperty(value = "更新时间", index = 6)
+    private Date updateTime;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(Long accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public BigDecimal getTransAmount() {
+        return transAmount;
+    }
+
+    public void setTransAmount(BigDecimal transAmount) {
+        this.transAmount = transAmount;
+    }
+
+    public Long getBizId() {
+        return bizId;
+    }
+
+    public void setBizId(Long bizId) {
+        this.bizId = bizId;
+    }
+
+    public PostStatusEnum getPostStatus() {
+        return postStatus;
+    }
+
+    public void setPostStatus(PostStatusEnum postStatus) {
+        this.postStatus = postStatus;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 16 - 13
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PlatformCashAccountRecordSearch.java

@@ -1,5 +1,8 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
@@ -16,13 +19,13 @@ public class PlatformCashAccountRecordSearch extends QueryInfo {
 	
 	@ApiModelProperty("收支类型(IN-收入  OUT-支出)")
 	private String inOrOut;
-	
-	@ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱")
-	private String bizType;
-	
-	@ApiModelProperty("入账状态 WAIT 待入账 RECORDED 已入账 CANCEL 取消")
-	private String status;
-	
+
+	@ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 WITHDRAWAL、提现 LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润 MUSIC_SHARE、乐谱分润 VIP_SHARE、会员分润 MALL_SHARE、商品分润 ")
+	private AccountBizTypeEnum bizType;
+
+	@ApiModelProperty(value = "入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 退费 ")
+	private PostStatusEnum postStatus;
+
 	@ApiModelProperty("记录开始时间")
 	private Date startDate;
 	
@@ -53,20 +56,20 @@ public class PlatformCashAccountRecordSearch extends QueryInfo {
 		this.inOrOut = inOrOut;
 	}
 
-	public String getBizType() {
+	public AccountBizTypeEnum getBizType() {
 		return bizType;
 	}
 
-	public void setBizType(String bizType) {
+	public void setBizType(AccountBizTypeEnum bizType) {
 		this.bizType = bizType;
 	}
 
-	public String getStatus() {
-		return status;
+	public PostStatusEnum getPostStatus() {
+		return postStatus;
 	}
 
-	public void setStatus(String status) {
-		this.status = status;
+	public void setPostStatus(PostStatusEnum postStatus) {
+		this.postStatus = postStatus;
 	}
 
 	public Date getStartDate() {

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserAccountRecordSearch.java

@@ -29,7 +29,7 @@ public class UserAccountRecordSearch extends QueryInfo{
 	@ApiModelProperty("收支类型:IN、收入 OUT、支出 ")
 	private InOrOutEnum inOrOut;
 
-	@ApiModelProperty(value = "入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 取消 ")
+	@ApiModelProperty(value = "入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 退费 ")
 	private PostStatusEnum postStatus;
 
 	@ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 WITHDRAWAL、提现 LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润 MUSIC_SHARE、乐谱分润 VIP_SHARE、会员分润 MALL_SHARE、商品分润 ")

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

@@ -51,6 +51,17 @@ public class VideoLessonGroupSearch extends QueryInfo {
         this.myself = myself;
     }
 
+    @ApiModelProperty("当前课程组id(查看其他课程时,筛选掉)")
+    private Long videoLessonGroupId;
+
+    public Long getVideoLessonGroupId() {
+        return videoLessonGroupId;
+    }
+
+    public void setVideoLessonGroupId(Long videoLessonGroupId) {
+        this.videoLessonGroupId = videoLessonGroupId;
+    }
+
     public Long getLessonSubject() {
         return lessonSubject;
     }

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

@@ -40,7 +40,7 @@ public class PlatformCashAccountRecord implements Serializable {
     private InOrOutEnum inOrOut;
 
     @TableField("post_status_")
-    @ApiModelProperty(value = "入账状态 WAIT 待入账 RECORDED 已入账 CANCEL 取消")
+    @ApiModelProperty(value = "入账状态 WAIT 待入账 RECORDED 已入账 CANCEL 退费")
     private PostStatusEnum postStatus;
 
     @TableField("biz_type_")

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

@@ -39,7 +39,7 @@ public class UserAccountRecord implements Serializable {
     @ApiModelProperty(value = "收支类型:IN、收入 OUT、支出 ",required = true)
     @TableField(value = "in_or_out_")
     private InOrOutEnum inOrOut;
-    @ApiModelProperty(value = "入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 取消 ")
+    @ApiModelProperty(value = "入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 退费 ")
     @TableField(value = "post_status_")
     private PostStatusEnum postStatus;
     @ApiModelProperty(value = "业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 WITHDRAWAL、提现 LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润 MUSIC_SHARE、乐谱分润 VIP_SHARE、会员分润 MALL_SHARE、商品分润",required = true)

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -20,6 +20,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     VIDEO_SHEET_AUTH_UNPASS("视频课审核失败"),
 
     STUDENT_BUY_MUSIC_SHEET_SUCCESS("学员购买乐谱成功"),
+    TEACHER_BUY_MUSIC_SHEET_SUCCESS("老师购买乐谱成功"),
     SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS("学员购买乐谱(短信)"),
 
     TEACHER_DECORATE_HOMEWORK("老师布置作业"),

+ 9 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java

@@ -100,8 +100,11 @@ public class WithdrawSdk {
             jsonObject = JSONObject.parseObject(s);
             if (StringUtils.equals(jsonObject.getString("return_code"), "T")) {
                 return true;
+            }else if(!StringUtils.isEmpty(jsonObject.getString("content"))){
+                throw new ThirdpartyException("合同签署失败:{}", jsonObject.getString("content"));
+            }else{
+                throw new ThirdpartyException("合同签署失败:{}", jsonObject.getString("return_message"));
             }
-            throw new ThirdpartyException("合同签署失败:{}", jsonObject.getString("return_message"));
         } catch (IOException e) {
             logger.error("请求[合同签署]接口报错", e);
             throw new ThirdpartyException("请求[合同签署]接口报错:{}", e.getMessage());
@@ -204,7 +207,11 @@ public class WithdrawSdk {
             if (returnCode.equals("T")) {
                 return HttpResponseResult.succeed(true);
             } else {
-                return HttpResponseResult.failed(String.valueOf(mapTypes.get("return_message")));
+                if(null != mapTypes.get("content")){
+                    return HttpResponseResult.failed(String.valueOf(mapTypes.get("content")));
+                }else{
+                    return HttpResponseResult.failed(String.valueOf(mapTypes.get("return_message")));
+                }
             }
         } catch (IOException e) {
             logger.info("发送失败:{}", e);
@@ -288,14 +295,4 @@ public class WithdrawSdk {
         }
         return BigDecimal.ZERO;
     }
-
-   /* public static void main(String[] args) throws Exception {
-        String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANf/X1s2raYQAmY5VY929XqOIRESFlpLzWbltA08EI2i0jnJY3/kcCpo1sCHqkyWpDFGRgM1WYE90ayzEpS6EdZpyJ2/N5JFJzx4wMil5KHLdtQUmVv9si+xuYNOKfJW6Xn6zI/Wh81J1+hMlUY4WigU5Qci7DjdOjg5OD6e5DO3AgMBAAECgYEAor9ENhII3SsK48MneKWFaQZWW+po9ThQV8uT0rUDM/UOuYPIeMDC0vGTfhW6d2K57Haqohg8jGjr51g2E+HvNV+fARaBfCwy00DGcxjI6N8gEInj2AppsGV6a0ZtzGBh3BxGhEFV7x3NmTylDk3WkGnkGDqDNyrBUgK0BzCJEmECQQD+gYckYRevVfrZEHDQHRNzzMUlV9/ljA9x8dt0LoCNbd/wFvs0Ekjhas/2lUBkewEd4Kr0jaFcYzlUO/qihcpNAkEA2UP5W44yLuIo8ttPpdsfkH/8Ax64IywQHrXWq+thH7I91VwY2vomTduw8x0PafZtp8xryF3LixTZwQ7gsYbwEwJAQbb8SB5x2SogPVALcREw5qOm+/92pnTFwCws+BDRzLLkMcAdWNKn0tybmhXrrIY+QZKzUbYIRiywrtlV3AUjuQJBAJbnFnfX4NUdchGT79Mjyd2kdxZ3rK+JOD0MUWkhWFkahMX/bKgTXK1xLIr/ISiY53rHigkl1Gzqc4Aa5EeJkI8CQFlzlBOfoVnq3fPMZCCZcZSm97L12MgHho0AzoNj9sw9YYn9WPM7bw2HT8GUheiU3aiZGCyGGpYuVHMiBGa7l9U=";
-
-        String sign = "zZi6+qN0+6cvyE3TO6BsggISgmZGuEkZYbz6POOJVNqY1r2ZvEL63rjAHoSB0vfrq7DJVdIb2kNWFOqVPNwH3OkTdkALlamxwFxMfL/Wg2VXKDxJpHKSqUPEGprcyIPcI+KZ2QbS9jj2P7NnVXBOlijRg/SZKfyX53zIipitg4uISV/5xuQVIvkLPAlHss1D5N0efRd9eep9PhxKAJ6g6GYgerDoSCAWZqBFCS2KdGQeg9Jvzj15xWsDAXMCgha9TS+YBZPvLpAbioaPO2PLfEEp8GAwHW1zdNw35O/6z3i0CQz6cJYCMRGAtGcnbK22rAiTAB5pZt7CLMdNhkNAGg==";
-
-        String decryptStr = RSA.decryptPri(sign, privateKey);
-        System.out.println(decryptStr);
-
-    }*/
 }

+ 3 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -3,7 +3,6 @@ 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;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
@@ -192,12 +191,12 @@ public interface MusicSheetService extends IService<MusicSheet> {
 
     /**
      * 发送学生购买曲目消息
-     *
-     * @param teacherId 老师id
+     *  @param teacherId 老师id
      * @param studentId 学生id
      * @param musicSheetId 曲目id
+     * @param orderClient
      */
-    boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId);
+    boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId, ClientEnum orderClient);
 
     /**
      * 订单生产后,创建记录

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

@@ -9,6 +9,8 @@ import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountRecordSummaryVo;
 
+import java.util.List;
+
 /**
  * 平台账户流水表(PlatformCashAccountRecord)表服务接口
  *
@@ -20,7 +22,9 @@ public interface PlatformCashAccountRecordService extends IService<PlatformCashA
     PlatformCashAccountRecordDao getDao();
     
     IPage<PlatformCashAccountRecord> queryPage(IPage<PlatformCashAccountRecord> page, PlatformCashAccountRecordSearch query);
-    
+
+    List<PlatformCashAccountRecord> queryAll(PlatformCashAccountRecordSearch query);
+
     PlatformCashAccountRecordSummaryVo querySummary(PlatformCashAccountRecordSearch query);
     
     /**

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

@@ -40,7 +40,7 @@ public interface UserAccountRecordService extends IService<UserAccountRecord> {
      */
     IPage<UserAccountRecordVo> selectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query);
 
-    List<UserAccountRecordVo> selectAllPage(UserAccountRecordSearch query);
+    List<UserAccountRecordVo> selectAll(UserAccountRecordSearch query);
 
 
     /**

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserAccount;
@@ -66,11 +67,11 @@ public interface UserAccountService extends IService<UserAccount>  {
      * 入账结算(入账状态变更)
      * @author liweifan
      * @param: recordId     记录id
-     * @param: postStatus   入账状态 RECORDED 已入账 CANCEL 取消
+     * @param: postStatus   入账状态 RECORDED 已入账 CANCEL 退费
      * @updateTime 2022/4/7 16:40
      * @return: java.lang.Integer
      */
-    HttpResponseResult<UserAccountRecord> accountChange(Long recordId, PostStatusEnum postStatus);
+    HttpResponseResult<UserAccountRecord> accountChange(UserAccountRecord record, PostStatusEnum postStatus);
     /***
      * 账户统计查询
      * @author liweifan

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

@@ -76,4 +76,12 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	 * @param data
 	 */
 	void refundPaymentCallBack(PaymentCallBack data);
+
+	/**
+	 * 直接退款(测试)
+	 * @param orderNo
+	 */
+	HttpResponseResult<UserOrderRefundBill> orderRefound(String orderNo);
+
+	void orderRefundSuccessBizHandle(Long refundId);
 }

+ 4 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java

@@ -1,24 +1,21 @@
 package com.yonge.cooleshow.biz.dal.service;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
-import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
-import org.apache.ibatis.annotations.Param;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -121,7 +118,6 @@ public interface UserOrderService extends IService<UserOrder> {
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
      */
     HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq);
-
     /***
      * 取消订单(未判断付款单状态)
      * @author liweifan
@@ -170,5 +166,7 @@ public interface UserOrderService extends IService<UserOrder> {
     void orderSuccess(UserOrderVo detail, PaymentCallBack data);
 
 
+    Date getAccountPeriodTime(UserOrderDetailVo orderDetailVo);
+
     public BigDecimal getShareFreeByGoodType(GoodTypeEnum goodType);
 }

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

@@ -809,11 +809,14 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
     //写入老师账户
     private void addTeacherAccount(UserOrderDetailVo orderParam, List<CourseScheduleTeacherSalary> teacherSalaryList, BigDecimal totalExpectPrice) {
+        //获取账期时间
+        Date accountPeriodTime = userOrderService.getAccountPeriodTime(orderParam);
+
         //老师待入账
         List<UserAccountRecordDto> userAccountRecordDtos = new ArrayList<>();
         for (CourseScheduleTeacherSalary salary : teacherSalaryList) {
             UserAccountRecordDto dto = new UserAccountRecordDto(orderParam.getMerchId(), PostStatusEnum.WAIT, salary.getActualSalary(),
-                    InOrOutEnum.IN, AccountBizTypeEnum.LIVE, salary.getCourseScheduleId(), orderParam.getGoodName(), orderParam.getOrderNo(), orderParam.getUserId());
+                    InOrOutEnum.IN, AccountBizTypeEnum.LIVE, salary.getCourseScheduleId(), orderParam.getGoodName(), orderParam.getOrderNo(), orderParam.getUserId(),accountPeriodTime);
             userAccountRecordDtos.add(dto);
         }
         userAccountService.accountRecord(userAccountRecordDtos);

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

@@ -117,6 +117,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     private UserAccountService userAccountService;
     @Autowired
     private UserAccountRecordService userAccountRecordService;
+    @Autowired
+    private UserOrderService userOrderService;
 
     @Override
     public CourseScheduleDao getDao() {
@@ -1143,11 +1145,14 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
     //写入老师账户
     private void addTeacherAccount(UserOrderDetailVo orderParam, List<CourseScheduleTeacherSalary> teacherSalaryList) {
+        //获取账期时间
+        Date accountPeriodTime = userOrderService.getAccountPeriodTime(orderParam);
+
         //老师待入账
         List<UserAccountRecordDto> userAccountRecordDtos = new ArrayList<>();
         for (CourseScheduleTeacherSalary salary : teacherSalaryList) {
             UserAccountRecordDto dto = new UserAccountRecordDto(orderParam.getMerchId(), PostStatusEnum.WAIT, salary.getActualSalary(),
-                    InOrOutEnum.IN, AccountBizTypeEnum.PRACTICE, salary.getCourseScheduleId(), orderParam.getGoodName(), orderParam.getOrderNo(), orderParam.getUserId());
+                    InOrOutEnum.IN, AccountBizTypeEnum.PRACTICE, salary.getCourseScheduleId(), orderParam.getGoodName(), orderParam.getOrderNo(), orderParam.getUserId(), accountPeriodTime);
             userAccountRecordDtos.add(dto);
         }
         userAccountService.accountRecord(userAccountRecordDtos);
@@ -1779,7 +1784,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             for (UserAccountRecordDto dto : list) {
                 UserAccountRecordVo record = userAccountRecordService.detail(dto.getOrderNo(), dto.getBizType(), dto.getBizId());
                 if (null != record) {
-                    userAccountService.accountChange(record.getId(), PostStatusEnum.RECORDED);
+                    userAccountService.accountChange(record, PostStatusEnum.RECORDED);
                 }
             }
             Set<Long> bizIds = list.stream().map(UserAccountRecordDto::getBizId).collect(Collectors.toSet());

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

@@ -102,6 +102,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     @Autowired
     private StudentStarService studentStarService;
+    @Autowired
+    private UserOrderService userOrderService;
 
     public MusicSheetDao getDao() {
         return musicSheetDao;
@@ -179,7 +181,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     }
 
     @Override
-    public MusicSheetDetailVo detail(Long id, SysUser sysUser,ClientEnum userType) {
+    public MusicSheetDetailVo detail(Long id, SysUser sysUser, ClientEnum userType) {
         MusicSheetDetailVo detail = baseMapper.detail(id);
         if (detail == null) {
             throw new BizException("未找到曲目信息");
@@ -193,13 +195,13 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         }
         if (ChargeTypeEnum.FREE.getCode().equals(detail.getChargeType().getCode())) {
             detail.setPlay(YesOrNoEnum.YES);
-        }  else if (ClientEnum.STUDENT.getCode().equals(userType.getCode())
+        } 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);
+                setMusicSheetPlay(sysUser.getId(), detail, userType);
             }
         } else {
             detail.setPlay(YesOrNoEnum.YES);
@@ -213,11 +215,12 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     /**
      * 设置学生曲目信息
-     *
+     * <p>
      * 2022 7 20  老师也能购买曲目
-     *  @param studentId 学生id
-     * @param detail 曲目详情
-     * @param userType 用户类型
+     *
+     * @param studentId 学生id
+     * @param detail    曲目详情
+     * @param userType  用户类型
      */
     private void setMusicSheetPlay(Long studentId, MusicSheetDetailVo detail, ClientEnum userType) {
         detail.setPlay(YesOrNoEnum.NO);
@@ -225,7 +228,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         if (ChargeTypeEnum.CHARGE.getCode().equals(detail.getChargeType().getCode())) {
             // 学生须判断是否能播放曲目
             MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
-                    studentId, detail.getId(),userType);
+                    studentId, detail.getId(), userType);
             if (musicSheetPurchaseRecord != null) {
                 detail.setOrderStatus(musicSheetPurchaseRecord.getOrderStatus());
                 detail.setOrderNo(musicSheetPurchaseRecord.getOrderNo());
@@ -241,7 +244,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                     detail.setPlay(YesOrNoEnum.YES);
                 }
             } else if (userType.equals(ClientEnum.TEACHER)) {
-                TeacherVo teacher= teacherService.detail(studentId);
+                TeacherVo teacher = teacherService.detail(studentId);
                 if (teacher != null && YesOrNoEnum.YES.getCode().equals(teacher.getIsVip().getCode())) {
                     detail.setPlay(YesOrNoEnum.YES);
                 }
@@ -477,7 +480,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         }
 
         // 检查已经购买
-        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId(),musicSheetPayDto.getClientType());
+        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId(), musicSheetPayDto.getClientType());
 
         orderCreateRes.setRes(true);
         if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
@@ -494,7 +497,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     /**
      * 检查是否已购买当前曲目
-     *  @param userId       用户id
+     *
+     * @param userId       用户id
      * @param musicSheetId 曲目id
      * @param clientType
      */
@@ -534,9 +538,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
         // 消息通知
         try {
-            sendBuyMessage(userOrderDetailVo.getMerchId(), userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId());
+            sendBuyMessage(userOrderDetailVo.getMerchId(), userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
         } catch (Exception e) {
-            log.warn("学生购买曲目消息推送失败 {}", e.getMessage());
+            log.warn("购买曲目消息推送失败 {}", e.getMessage());
         }
     }
 
@@ -546,35 +550,43 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      * @param teacherId    老师id
      * @param studentId    学生id
      * @param musicSheetId 曲目id
+     * @param orderClient
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId) {
-        SysUser teacher = sysUserFeignService.queryUserById(teacherId);
-        SysUser student = sysUserFeignService.queryUserById(studentId);
-        if (StringUtil.isEmpty(teacher.getPhone())) {
-            log.warn("teacher id {} name {} 手机号不存在,消息推送失败", teacher.getId(), teacher.getUsername());
-        }
+    public boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId, ClientEnum orderClient) {
 
         MusicSheet musicSheet = this.getById(musicSheetId);
-        // 推送老师
-        Map<Long, String> teacherReceivers = new HashMap<>();
-        teacherReceivers.put(teacherId, teacher.getPhone());
+        SysUser student = sysUserFeignService.queryUserById(studentId);
+        if (musicSheet.getSourceType().equals(SourceTypeEnum.TEACHER)) {
+            SysUser teacher = sysUserFeignService.queryUserById(teacherId);
+            if (StringUtil.isEmpty(teacher.getPhone())) {
+                log.warn("teacher id {} name {} 手机号不存在,消息推送失败", teacher.getId(), teacher.getUsername());
+            }
 
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-                MessageTypeEnum.STUDENT_BUY_TEACHER_MUSIC_SHEET, teacherReceivers, null,
-                0, null, ClientEnum.TEACHER.getCode(), student.getUsername(), musicSheet.getMusicSheetName());
+            // 推送老师
+            Map<Long, String> teacherReceivers = new HashMap<>();
+            teacherReceivers.put(teacherId, teacher.getPhone());
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_TEACHER_MUSIC_SHEET, teacherReceivers, null,
+                                               0, null, ClientEnum.TEACHER.getCode(), student.getUsername(), musicSheet.getMusicSheetName());
 
+        }
         // 推送学生
         Map<Long, String> studentReceivers = new HashMap<>();
         studentReceivers.put(studentId, student.getPhone());
+        MessageTypeEnum messageType;
+        if (orderClient.equals(ClientEnum.STUDENT)) {
+            messageType = MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS;
+        } else {
+            messageType = MessageTypeEnum.TEACHER_BUY_MUSIC_SHEET_SUCCESS;
+        }
 
-
-        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS.getCode());
+        String url = sysMessageService.selectConfigUrl(messageType.getCode());
 
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-                MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS, studentReceivers, null,
-                0, url, ClientEnum.STUDENT.getCode(), musicSheet.getMusicSheetName());
+                                           messageType, studentReceivers, null,
+                0, url, orderClient.getCode(), musicSheet.getMusicSheetName());
         // 推送学生
         Map<Long, String> studentSMS = new HashMap<>();
         studentSMS.put(studentId, student.getPhone());
@@ -595,7 +607,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      */
     private void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount) {
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(),userOrderDetailVo.getOrderClient());
+                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
@@ -622,11 +634,14 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      */
     private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount,
                                    Long musicSheetId) {
+        //获取账期时间
+        Date accountPeriodTime = userOrderService.getAccountPeriodTime(userOrderDetailVo);
+
         BigDecimal transAmount = actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
         //插入老师账户变更记录-老师预收
         userAccountService.accountRecord(
                 new UserAccountRecordDto(userOrderDetailVo.getMerchId(), PostStatusEnum.WAIT, transAmount, InOrOutEnum.IN,
-                        AccountBizTypeEnum.MUSIC, musicSheetId, userOrderDetailVo.getGoodName(), userOrderDetailVo.getOrderNo(),userOrderDetailVo.getUserId()));
+                        AccountBizTypeEnum.MUSIC, musicSheetId, userOrderDetailVo.getGoodName(), userOrderDetailVo.getOrderNo(), userOrderDetailVo.getUserId(), accountPeriodTime));
     }
 
     @Override
@@ -634,10 +649,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     public void orderAfterSheet(UserOrderDetailVo userOrderDetailVo) {
         // 保存购买记录
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId(),userOrderDetailVo.getOrderClient());
+                .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.setTeacherId(userOrderDetailVo.getMerchId());
@@ -651,7 +667,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Transactional(rollbackFor = Exception.class)
     public void buyMusicSheetCancel(UserOrderDetailVo userOrderDetailVo) {
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId(),userOrderDetailVo.getOrderClient());
+                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
 
         if (musicSheetPurchaseRecord == null) return;
         musicSheetPurchaseRecordService.removeById(musicSheetPurchaseRecord.getId());
@@ -851,15 +867,15 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Override
     public ShareProfitVo shareMusicSheetProfit(SysUser sysUser, Long musicSheetId) {
         ShareProfitVo result = new ShareProfitVo();
-        MusicSheetDetailVo musicSheet = detail(musicSheetId,null,null);
+        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()));
+        String teacherMusicShareProfitUrl = sysConfigService.findConfigValue(SysConfigConstant.TEACHER_MUSIC_SHEET_SHARE_PROFIT_URL);
+        result.setUrl(MessageFormatter.arrayFormat(teacherMusicShareProfitUrl, musicSheetId, sysUser.getId()));
         return result;
     }
 

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

@@ -1,13 +1,9 @@
 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 com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
 import com.yonge.toolset.base.util.StringUtil;
 import org.slf4j.Logger;
@@ -21,14 +17,10 @@ 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 com.yonge.cooleshow.common.constant.SysConfigConstant;
-import com.yonge.cooleshow.common.enums.PostStatusEnum;
-import org.springframework.util.CollectionUtils;
 
 /**
  * 平台账户流水表(PlatformCashAccountRecord)表服务实现类
@@ -57,6 +49,11 @@ public class PlatformCashAccountRecordServiceImpl extends ServiceImpl<PlatformCa
     }
 
     @Override
+    public List<PlatformCashAccountRecord> queryAll(PlatformCashAccountRecordSearch query) {
+        return getDao().queryAll(query);
+    }
+
+    @Override
     public PlatformCashAccountRecordSummaryVo querySummary(PlatformCashAccountRecordSearch query) {
         return getDao().querySummary(query);
     }
@@ -77,16 +74,8 @@ public class PlatformCashAccountRecordServiceImpl extends ServiceImpl<PlatformCa
         paramNames.add(AccountBizTypeEnum.VIP_SHARE.getCode());
 
         List<PlatformCashAccountRecord> list = getDao().queryCanAccountByBizType(paramNames);
-        if(!CollectionUtils.isEmpty(list)){
-            for (PlatformCashAccountRecord pcar : list) {
-                //预收改成实收
-                pcar.setPostStatus(PostStatusEnum.RECORDED);
-                pcar.setUpdateTime(new Date());
-            }
-            getDao().batchUpdate(list);
-        }
-        //老师账户修改
-        userAccountRecordService.updateWaitRecord();
+        List<Long> recordIds = list.stream().map(PlatformCashAccountRecord::getId).collect(Collectors.toList());
+        getDao().batchRecorded(recordIds);
         return true;
     }
 

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

@@ -31,10 +31,7 @@ import org.springframework.util.CollectionUtils;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
 @Service
@@ -69,8 +66,8 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
     }
 
     @Override
-    public List<UserAccountRecordVo> selectAllPage(UserAccountRecordSearch query) {
-        return baseMapper.selectAllPage(query);
+    public List<UserAccountRecordVo> selectAll(UserAccountRecordSearch query) {
+        return baseMapper.selectAll(query);
     }
 
     @Override
@@ -80,7 +77,16 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
 
     @Override
     public HttpResponseResult<UserAccountVo> accountTotal(UserAccountRecordSearch query) {
-        return HttpResponseResult.succeed(baseMapper.accountTotal(query));
+        UserAccountVo accountVo = baseMapper.accountTotal(query);
+        if (null == accountVo) {
+            accountVo = new UserAccountVo();
+        }
+        accountVo.setAmountUnrecorded(null == accountVo.getAmountUnrecorded() ? BigDecimal.ZERO : accountVo.getAmountUnrecorded());
+        accountVo.setAmountRecorded(null == accountVo.getAmountRecorded() ? BigDecimal.ZERO : accountVo.getAmountRecorded());
+        accountVo.setAmountTotal(null == accountVo.getAmountTotal() ? BigDecimal.ZERO : accountVo.getAmountTotal());
+        accountVo.setAmountUsable(null == accountVo.getAmountUsable() ? BigDecimal.ZERO : accountVo.getAmountUsable());
+        accountVo.setAmountFrozen(null == accountVo.getAmountFrozen() ? BigDecimal.ZERO : accountVo.getAmountFrozen());
+        return HttpResponseResult.succeed(accountVo);
     }
 
     @Override
@@ -96,7 +102,7 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
         paramNames.add(AccountBizTypeEnum.VIP_SHARE.getCode());
         List<UserAccountRecord> accountRecords = baseMapper.queryCanAccountByBizType(paramNames);
         for (UserAccountRecord accountRecord : accountRecords) {
-            userAccountService.accountChange(accountRecord.getId(), PostStatusEnum.RECORDED);
+            userAccountService.accountChange(accountRecord, PostStatusEnum.RECORDED);
         }
     }
 
@@ -106,7 +112,6 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
         return detail;
     }
 
-
     @Override
     public IPage<UserAccountRecordVo> appSelectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query) {
         return page.setRecords(baseMapper.appSelectPage(page, query));
@@ -141,27 +146,40 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
 
     @Override
     public List<UserAccountRecord> selectRecordByOrderDetail(UserOrderDetailVo userOrderDetailVo) {
-        //todo 这里需要测试
+        List<UserAccountRecord> records = new ArrayList<>();
         //订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(VIP、开通会员 PINAO_ROOM、琴房时长)
         //获取业务id
         List<Long> bizIds = new ArrayList<>();
-        if (GoodTypeEnum.VIP.equals(userOrderDetailVo.getGoodType())
-                || GoodTypeEnum.VIDEO.equals(userOrderDetailVo.getGoodType())
-                || GoodTypeEnum.MUSIC.equals(userOrderDetailVo.getGoodType())) {
+        if (GoodTypeEnum.VIP.equals(userOrderDetailVo.getGoodType())){
+            bizIds.add(userOrderDetailVo.getBizId());
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.VIP, bizIds));
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.VIP_SHARE, bizIds));
+        }else if(GoodTypeEnum.VIDEO.equals(userOrderDetailVo.getGoodType())){
             bizIds.add(userOrderDetailVo.getBizId());
-        } else if (GoodTypeEnum.PRACTICE.equals(userOrderDetailVo.getGoodType()) || GoodTypeEnum.LIVE.equals(userOrderDetailVo.getGoodType())) {
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.VIDEO, bizIds));
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.VIDEO_SHARE, bizIds));
+        }else if(GoodTypeEnum.MUSIC.equals(userOrderDetailVo.getGoodType())){
+            bizIds.add(userOrderDetailVo.getBizId());
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.MUSIC, bizIds));
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.MUSIC_SHARE, bizIds));
+        }else if(GoodTypeEnum.PRACTICE.equals(userOrderDetailVo.getGoodType())){
             //查询课程组下所有课程id
             List<CourseSchedule> cancel = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
                     .eq(CourseSchedule::getCourseGroupId, userOrderDetailVo.getBizId())
-                    .ne(CourseSchedule::getStatus, "CANCEL")
             );
             cancel.stream().forEach(o -> bizIds.add(o.getId()));
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.PRACTICE, bizIds));
+        }else if(GoodTypeEnum.LIVE.equals(userOrderDetailVo.getGoodType())){
+            List<Long> groupId = Arrays.asList(userOrderDetailVo.getBizId());
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.LIVE_SHARE, groupId));
+            //查询课程组下所有课程id
+            List<CourseSchedule> cancel = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
+                    .eq(CourseSchedule::getCourseGroupId, userOrderDetailVo.getBizId())
+            );
+            cancel.stream().forEach(o -> bizIds.add(o.getId()));
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.LIVE, bizIds));
         }
-        if (CollectionUtils.isEmpty(bizIds)) {
-            return new ArrayList<>();
-        }
-        return baseMapper.selectRecordByOrderDetail(userOrderDetailVo, bizIds);
+        return records;
     }
 
-
 }

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

@@ -64,6 +64,21 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         if (null == detail) {
             throw new BizException("用户没有开通账户");
         }
+        detail = dealUserAccountVo(detail);
+        return detail;
+    }
+
+    public UserAccountVo dealUserAccountVo(UserAccountVo detail){
+        detail.setAmountUnrecorded(
+                null == detail.getAmountUnrecorded() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : detail.getAmountUnrecorded().setScale(2, RoundingMode.HALF_UP));
+        detail.setAmountRecorded(
+                null == detail.getAmountRecorded() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : detail.getAmountRecorded().setScale(2, RoundingMode.HALF_UP));
+        detail.setAmountTotal(
+                null == detail.getAmountTotal() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : detail.getAmountTotal().setScale(2, RoundingMode.HALF_UP));
+        detail.setAmountUsable(
+                null == detail.getAmountUsable() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : detail.getAmountUsable().setScale(2, RoundingMode.HALF_UP));
+        detail.setAmountFrozen(
+                null == detail.getAmountFrozen() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : detail.getAmountFrozen().setScale(2, RoundingMode.HALF_UP));
         return detail;
     }
 
@@ -73,11 +88,13 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult accountRecord(UserAccountRecordDto accountRecordDto) {
         return accountRecord(Arrays.asList(accountRecordDto));
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult accountRecord(List<UserAccountRecordDto> accountRecordDtos) {
         if (CollectionUtils.isEmpty(accountRecordDtos)) {
             return HttpResponseResult.succeed();
@@ -209,63 +226,64 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     }
 
     @Override
-    public HttpResponseResult<UserAccountRecord> accountChange(Long recordId, PostStatusEnum postStatus) {
-        if (null == postStatus || null == recordId
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult<UserAccountRecord> accountChange(UserAccountRecord record, PostStatusEnum postStatus) {
+        if (null == postStatus || null == record
                 || (!PostStatusEnum.RECORDED.equals(postStatus) && !PostStatusEnum.CANCEL.equals(postStatus))) {
-            throw new BizException("入账状态变更, 参数异常: recordId is {} postStatus is {}", recordId, postStatus.getCode());
+            throw new BizException("入账状态变更, 参数异常: record is {} postStatus is {}", JSONObject.toJSONString(record), postStatus.getCode());
+        }
+        if (!PostStatusEnum.WAIT.equals(record.getPostStatus())
+                && !PostStatusEnum.FROZEN.equals(record.getPostStatus())) {
+            return HttpResponseResult.succeed();
         }
-        UserAccountRecord param = new UserAccountRecord();
-        param.setId(recordId);
-        param.setPostStatus(postStatus);
+        record.setPostStatus(postStatus);
         HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
-                .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(recordId)
-                        , this::doAccountChange, param, 10L);
+                .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(record.getAccountId())
+                        , this::doAccountChange, record, 10L);
         if (null != res) {
             return res;
         } else {
-            throw new BizException("记录变更-账户记录变更失败: param is {}", JSONObject.toJSONString(param));
+            throw new BizException("记录变更-账户记录变更失败: param is {}", JSONObject.toJSONString(record));
         }
     }
 
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<UserAccountRecord> doAccountChange(UserAccountRecord param) {
-        UserAccountRecordVo detail = userAccountRecordService.detail(param.getId());
-        if (null == detail) {
-            throw new BizException("入账状态变更, 未找到记录信息: recordId is {} postStatus is {}", param.getId(), param.getPostStatus().getCode());
-        }
-        if (!PostStatusEnum.WAIT.equals(detail.getPostStatus())
-                && !PostStatusEnum.FROZEN.equals(detail.getPostStatus())) {
+        //这里需要双重判断,这一次是锁内判断
+        UserAccountRecord old = userAccountRecordService.getById(param.getId());
+        if (!PostStatusEnum.WAIT.equals(old.getPostStatus())
+                && !PostStatusEnum.FROZEN.equals(old.getPostStatus())) {
             return HttpResponseResult.succeed();
         }
-        detail.setPostStatus(param.getPostStatus());
         //待入账
-        if (PostStatusEnum.WAIT.equals(detail.getPostStatus())) {
+        if (PostStatusEnum.WAIT.equals(old.getPostStatus())) {
             if (PostStatusEnum.RECORDED.equals(param.getPostStatus())) {
                 //正常入账
-                baseMapper.changeAccount(detail.getAccountId(), detail.getTransAmount(), detail.getInOrOut().getCode());
+                baseMapper.changeAccount(old.getAccountId(), old.getTransAmount(), old.getInOrOut().getCode());
             } else if (PostStatusEnum.CANCEL.equals(param.getPostStatus())) {
                 //取消入账
             }
-        } else if (PostStatusEnum.FROZEN.equals(detail.getPostStatus())) {
+        } else if (PostStatusEnum.FROZEN.equals(old.getPostStatus())) {
             if (PostStatusEnum.RECORDED.equals(param.getPostStatus())) {
                 //冻结后正常入账
-                baseMapper.frozenDeductChangeAccount(detail.getAccountId(), detail.getTransAmount(), detail.getInOrOut().getCode());
+                baseMapper.frozenDeductChangeAccount(old.getAccountId(), old.getTransAmount(), old.getInOrOut().getCode());
             } else if (PostStatusEnum.CANCEL.equals(param.getPostStatus())) {
                 //冻结后取消入账
-                baseMapper.frozenBackChangeAccount(detail.getAccountId(), detail.getTransAmount(), detail.getInOrOut().getCode());
+                baseMapper.frozenBackChangeAccount(old.getAccountId(), old.getTransAmount(), old.getInOrOut().getCode());
             }
         }
 
-        UserAccountVo accountVo = detail(detail.getAccountId());
+        UserAccountVo accountVo = detail(old.getAccountId());
         if (accountVo.getAmountTotal().doubleValue() < 0
                 || accountVo.getAmountUsable().doubleValue() < 0 || accountVo.getAmountFrozen().doubleValue() < 0) {
             throw new BizException("账户变更失败");
         }
         //插入账户变更记录
-        detail.setAccountBalance(accountVo.getAmountUsable());
-        detail.setUpdateTime(new Date());
-        userAccountRecordService.updateById(detail);
-        return HttpResponseResult.succeed(detail);
+        old.setPostStatus(param.getPostStatus());
+        old.setAccountBalance(accountVo.getAmountUsable());
+        old.setUpdateTime(new Date());
+        userAccountRecordService.updateById(old);
+        return HttpResponseResult.succeed(old);
     }
 
     @Override
@@ -283,16 +301,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         BigDecimal mallShareAmount = BigDecimal.ZERO;
 
         for (AccountTotal info : infoList) {
-            info.setPracticeAmount(null == info.getPracticeAmount() ? BigDecimal.ZERO : info.getPracticeAmount());
-            info.setLiveAmount(null == info.getLiveAmount() ? BigDecimal.ZERO : info.getLiveAmount());
-            info.setVideoAmount(null == info.getVideoAmount() ? BigDecimal.ZERO : info.getVideoAmount());
-            info.setMusicAmount(null == info.getMusicAmount() ? BigDecimal.ZERO : info.getMusicAmount());
-
-            info.setLiveShareAmount(null == info.getLiveShareAmount() ? BigDecimal.ZERO : info.getLiveShareRate());
-            info.setVideoShareAmount(null == info.getVideoShareAmount() ? BigDecimal.ZERO : info.getVipShareAmount());
-            info.setMusicShareAmount(null == info.getMusicShareAmount() ? BigDecimal.ZERO : info.getMusicShareAmount());
-            info.setVipShareAmount(null == info.getVipShareAmount() ? BigDecimal.ZERO : info.getVipShareAmount());
-            info.setMallShareAmount(null == info.getMusicShareAmount() ? BigDecimal.ZERO : info.getMusicShareAmount());
+            info = dealAccountTotal(info);
 
             practiceAmount = practiceAmount.add(info.getPracticeAmount());
             liveAmount = liveAmount.add(info.getLiveAmount());
@@ -407,7 +416,6 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     }
 
     public void mallTeacherRecordState(MallOrderItemDto shareDto) {
-
         // 平台修改收入状态
         if (shareDto.getStatus().equals(PostStatusEnum.RECORDED)) {
             platformCashAccountRecordService.mallRecordedRecord(shareDto.getProductSkuId(),shareDto.getOrderSn(),GoodTypeEnum.MALL.getCode());
@@ -426,7 +434,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
             return;
         }
         for (UserAccountRecord userAccount : list) {
-            this.accountChange(userAccount.getId(),shareDto.getStatus());
+            this.accountChange(userAccount,shareDto.getStatus());
         }
     }
 
@@ -465,7 +473,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         platformCashAccountRecordService.save(platformCashAccountRecord);
 
         //分润
-        if (null != shareDto.getPromoterId() && !shareDto.getPromoterId().equals(shareDto.getUserId())) {
+        if (null != shareDto.getPromoterId() && !shareDto.getPromoterId().equals(shareDto.getUserId()) && shareDto.getPromoterId() !=0) {
             //获取分润收益费率
             BigDecimal shareFeeRate = userOrderService.getShareFreeByGoodType(GoodTypeEnum.MALL);
             if (shareFeeRate.compareTo(BigDecimal.ZERO) > 0) {
@@ -486,4 +494,32 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         }
     }
 
+    public AccountTotal dealAccountTotal(AccountTotal info){
+        if(null == info){
+            info = new AccountTotal();
+        }
+        info.setTotalInAmount(
+                null == info.getTotalInAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getTotalInAmount().setScale(2, RoundingMode.HALF_UP));
+        info.setPracticeAmount(
+                null == info.getPracticeAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getPracticeAmount().setScale(2, RoundingMode.HALF_UP));
+        info.setLiveAmount(
+                null == info.getLiveAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getLiveAmount().setScale(2, RoundingMode.HALF_UP));
+        info.setVideoAmount(
+                null == info.getVideoAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getVideoAmount().setScale(2, RoundingMode.HALF_UP));
+        info.setMusicAmount(
+                null == info.getMusicAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getMusicAmount().setScale(2, RoundingMode.HALF_UP));
+
+        info.setLiveShareAmount(
+                null == info.getLiveShareAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getLiveShareRate().setScale(2, RoundingMode.HALF_UP));
+        info.setVideoShareAmount(
+                null == info.getVideoShareAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getVideoShareAmount().setScale(2, RoundingMode.HALF_UP));
+        info.setMusicShareAmount(
+                null == info.getMusicShareAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getMusicShareAmount().setScale(2, RoundingMode.HALF_UP));
+        info.setVipShareAmount(
+                null == info.getVipShareAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getVipShareAmount().setScale(2, RoundingMode.HALF_UP));
+        info.setMallShareAmount(
+                null == info.getMusicShareAmount() ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : info.getMallShareAmount().setScale(2, RoundingMode.HALF_UP));
+        return info;
+    }
+
 }

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

@@ -89,7 +89,6 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         return true;
     }
 
-
     @Override
     public Boolean closePaymentAndReqOpen(String orderNo, String reason) {
         UserOrderPayment orderPayment = baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery().eq(UserOrderPayment::getOrderNo, orderNo).eq(UserOrderPayment::getStatus, TradeStatusEnum.pending));

+ 106 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java

@@ -12,7 +12,6 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
@@ -393,6 +392,75 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         }
     }
 
+    @Override
+    public HttpResponseResult<UserOrderRefundBill> orderRefound(String orderNo) {
+        UserOrderVo detail = orderService.detail(orderNo, null);
+
+        if (null == detail || CollectionUtils.isEmpty(detail.getOrderDetailList())) {
+            return HttpResponseResult.failed("未找到订单信息");
+        }
+        if (!OrderStatusEnum.PAID.equals(detail.getStatus())) {
+            return HttpResponseResult.failed("订单状态异常");
+        }
+
+        //查询订单下未退款的所有详情订单
+        List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(detail.getId());
+        if (CollectionUtils.isEmpty(orderDetails)) {
+            return HttpResponseResult.failed("订单中没有可退款商品");
+        }
+
+        //退款的详情id
+        List<Long> detilIds = orderDetails.stream().map(UserOrderDetail::getId).collect(Collectors.toList());
+
+        OrderRefundReq orderRefundReq = new OrderRefundReq();
+        orderRefundReq.setOrderId(detail.getId());
+        orderRefundReq.setUserId(detail.getUserId());
+        orderRefundReq.setReason("测试退款");
+        orderRefundReq.setOredrDetilIds(detilIds);
+        //退款金额
+        BigDecimal actualPrice = BigDecimal.ZERO;
+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) {
+            Optional<Long> first = detilIds.stream().filter(o -> o.equals(vo.getId())).findFirst();
+            if (!first.isPresent()) {
+                continue;
+            }
+
+            Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>> refundCreateFunction = refundCreate.get(vo.getGoodType());
+            if (!Objects.isNull(refundCreateFunction)) {
+                orderRefundReq.setOredrDetil(vo);
+                HttpResponseResult<RefundCreateRes> apply = refundCreateFunction.apply(orderRefundReq);
+                if (apply.getStatus()) {
+                    actualPrice = actualPrice.add(apply.getData().getActualPrice());
+                }
+            } else {
+                actualPrice = actualPrice.add(vo.getActualPrice());
+            }
+        }
+        String join = StringUtil.join(detilIds, ",");
+
+        UserOrderRefund orderRefunds = new UserOrderRefund();
+        orderRefunds.setUserId(detail.getUserId());
+        orderRefunds.setOrderId(detail.getId());
+        orderRefunds.setOrderNo(detail.getOrderNo());
+        orderRefunds.setOredrDetilIds(join);
+        orderRefunds.setStatus(AuthStatusEnum.PASS);
+        orderRefunds.setApplyAmount(actualPrice);
+        orderRefunds.setActualAmount(actualPrice);
+        orderRefunds.setReason("测试退款");
+        save(orderRefunds);
+
+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) {
+            List<Long> collect = orderRefundReq.getOredrDetilIds().stream().filter(o -> o.equals(vo.getId())).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(collect)) {
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundAfter.get(vo.getGoodType());
+                if (!Objects.isNull(refundAfterConsumer)) {
+                    refundAfterConsumer.accept(vo);
+                }
+            }
+        }
+        return doOrderRefundTest(orderRefunds);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     HttpResponseResult<UserOrderRefundBill> doOrderRefund(UserOrderRefund orderRefund) {
         UserOrderPayment payment = orderPaymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery()
@@ -441,6 +509,39 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         return HttpResponseResult.succeed(orderRefundBill);
     }
 
+
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult<UserOrderRefundBill> doOrderRefundTest(UserOrderRefund orderRefund) {
+        UserOrderPayment payment = orderPaymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery()
+                .eq(UserOrderPayment::getOrderNo, orderRefund.getOrderNo())
+                .eq(UserOrderPayment::getStatus, TradeStatusEnum.succeeded)
+        );
+
+        if (null == payment) {
+            throw new BizException("订单状态异常");
+        }
+
+        RefundBill refundBill = new RefundBill(payment.getOpenType(),
+                PaymentClientEnum.valueOf(payment.getPaymentClient()), payment.getPayChannel());
+        refundBill.setTradeNo(payment.getTransNo());
+        refundBill.setPaymentNo(payment.getPaymentNo());
+
+        //单号生成
+        Long billNo = idGeneratorService.generatorId("billNo");
+        //入退款单表
+        UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
+        orderRefundBill.setRefundId(orderRefund.getId());
+        orderRefundBill.setBillNo(billNo.toString());
+        orderRefundBill.setRefundAmt(orderRefund.getActualAmount());
+        orderRefundBill.setStatus(TradeStatusEnum.succeeded);
+        refundBillService.save(orderRefundBill);
+        updateById(orderRefund);
+
+        //处理退款业务
+        orderRefundSuccessBizHandle(orderRefund.getId());
+        return HttpResponseResult.succeed(orderRefundBill);
+    }
+
     /***
      * 处理回调-退款成功
      * @author liweifan
@@ -498,10 +599,11 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
      *
      * @param refundId 退款单id
      */
-    private void orderRefundSuccessBizHandle(Long refundId) {
+    @Override
+    public void orderRefundSuccessBizHandle(Long refundId) {
         //处理业务
         UserOrderRefund orderRefund = getById(refundId);
-        if (StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
+        if (!StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
             List<Long> ids = new ArrayList<>();
             for (String id : orderRefund.getOredrDetilIds().split(",")) {
                 ids.add(Long.parseLong(id));
@@ -534,7 +636,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         for (UserAccountRecord userAccountRecord : dataList) {
             if (PostStatusEnum.WAIT.equals(userAccountRecord.getPostStatus())
                     || PostStatusEnum.FROZEN.equals(userAccountRecord.getPostStatus())) {
-                userAccountService.accountChange(userAccountRecord.getId(), PostStatusEnum.CANCEL);
+                userAccountService.accountChange(userAccountRecord, PostStatusEnum.CANCEL);
             }
         }
         //处理平台入账

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

@@ -8,10 +8,7 @@ import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 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.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
@@ -87,7 +84,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Autowired
     private PaymentProperties paymentProperties;
 
-
     //验证订单是否可以下单,获取订单金额信息
     private static final Map<GoodTypeEnum, Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>>> orderCreate = new HashMap<>();
     //插入订单后执行
@@ -114,8 +110,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderCreate.put(GoodTypeEnum.PINAO_ROOM, pianoRoomBuyRecordService::orderCreate);
 
         /**********订单生成后******************/
-
-
         //曲目购买
         orderAfter.put(GoodTypeEnum.MUSIC, musicSheetService::orderAfterSheet);
 
@@ -312,7 +306,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderDetailVo.setUserId(orderReq.getUserId());
             orderDetailVo.setOrderId(orderVo.getId());
             orderDetailVo.setRecomUserId(orderReq.getRecomUserId());
-
+            orderDetailVo.setOrderClient(orderVo.getOrderClient());
             Consumer<UserOrderDetailVo> afterFunction = orderAfter.get(orderDetailVo.getGoodType());
             if (!Objects.isNull(afterFunction)) {
                 afterFunction.accept(orderDetailVo);
@@ -733,35 +727,31 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         detail.setUpdateTime(now);
         updateById(detail);
 
-        try {
-            if (null != data) {
-                //更新付款单
-                UserOrderPayment orderPayment = orderPaymentService
-                        .detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
-                if (null != orderPayment) {
-                    orderPayment.setTransNo(data.getId());
-                    orderPayment.setStatus(TradeStatusEnum.succeeded);
-                    orderPayment.setArrivalTime(now);
-                    orderPayment.setUpdateTime(now);
-
-                    if (null != data.getExecutePaymentCallBack()) {
-                        orderPayment.setBackPayAmt(
-                                new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
-
-                        BigDecimal feeAmt = new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt());
-                        if (BigDecimal.ZERO.compareTo(feeAmt) == 0) {
-                            orderPayment.setFeeAmt(orderPayment.getPayAmt().subtract(orderPayment.getBackPayAmt()));
-                        } else {
-                            orderPayment.setFeeAmt(feeAmt);
-                        }
+        if (null != data) {
+            //更新付款单
+            UserOrderPayment orderPayment = orderPaymentService
+                    .detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
+            if (null != orderPayment) {
+                orderPayment.setTransNo(data.getId());
+                orderPayment.setStatus(TradeStatusEnum.succeeded);
+                orderPayment.setArrivalTime(now);
+                orderPayment.setUpdateTime(now);
+
+                if (null != data.getExecutePaymentCallBack()) {
+                    orderPayment.setBackPayAmt(
+                            new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
+
+                    BigDecimal feeAmt = new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt());
+                    if (BigDecimal.ZERO.compareTo(feeAmt) == 0) {
+                        orderPayment.setFeeAmt(orderPayment.getPayAmt().subtract(orderPayment.getBackPayAmt()));
+                    } else {
+                        orderPayment.setFeeAmt(feeAmt);
                     }
-                    orderPaymentService.updateById(orderPayment);
                 }
+                orderPaymentService.updateById(orderPayment);
             }
-        } catch (Exception e) {
-            log.error("订单完成-更新付款单失败, UserOrderVo is {},PaymentCallBack is {}", JSONObject.toJSONString(detail), JSONObject.toJSONString(data));
-            e.printStackTrace();
         }
+
         //调用业务
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(detail.getOrderNo());
 
@@ -795,7 +785,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      *
      * @param orderDetailVo
      */
-    private void savePlatformAccountRecord(UserOrderDetailVo orderDetailVo) {
+    @Transactional(rollbackFor = Exception.class)
+    public void savePlatformAccountRecord(UserOrderDetailVo orderDetailVo) {
         BigDecimal expectPrice = orderDetailVo.getExpectPrice();
         if (expectPrice.compareTo(BigDecimal.ZERO) <= 0) {
             return;
@@ -817,17 +808,18 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             if (GoodTypeEnum.PINAO_ROOM.equals(orderDetailVo.getGoodType())) {
                 platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getUserId(), platformFee,
                         InOrOutEnum.IN, PostStatusEnum.RECORDED, AccountBizTypeEnum.PIAON_ROOM, orderDetailVo.getBizId(),
-                        orderDetailVo.getOrderNo(),accountPeriodTime);
+                        orderDetailVo.getOrderNo(), accountPeriodTime);
             } else {
                 AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(orderDetailVo.getGoodType().getCode());
                 platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getUserId(), platformFee,
-                        InOrOutEnum.IN, PostStatusEnum.WAIT, bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getOrderNo(),accountPeriodTime);
+                        InOrOutEnum.IN, PostStatusEnum.WAIT, bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getOrderNo(), accountPeriodTime);
             }
             platformCashAccountRecordService.save(platformCashAccountRecord);
         }
 
-        //分润
-        if (null != orderDetailVo.getRecomUserId()) {
+        //卖家不能分润自己
+        if (null != orderDetailVo.getRecomUserId()
+                && !orderDetailVo.getRecomUserId().equals(orderDetailVo.getMerchId())) {
             //获取分润收益费率
             BigDecimal shareFeeRate = getShareFreeByGoodType(orderDetailVo.getGoodType());
             //入老师账户
@@ -838,11 +830,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                     //插入分润老师账户变更记录-分润老师预收
                     HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
                             new UserAccountRecordDto(orderDetailVo.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
-                                    bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getGoodName(), orderDetailVo.getOrderNo(),orderDetailVo.getUserId()));
+                                    bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getGoodName(), orderDetailVo.getOrderNo(), orderDetailVo.getUserId(), accountPeriodTime));
                     if (recomRecordRes.getStatus()) {
                         //插入平台预支
                         PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getRecomUserId(), shareFee,
-                                InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getOrderNo(),accountPeriodTime);
+                                InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getOrderNo(), accountPeriodTime);
                         platformCashAccountRecordService.save(platformCashAccountRecord);
                     }
                 }
@@ -856,7 +848,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @param orderDetailVo
      * @return
      */
-    private Date getAccountPeriodTime(UserOrderDetailVo orderDetailVo) {
+    @Override
+    public Date getAccountPeriodTime(UserOrderDetailVo orderDetailVo) {
         Calendar instance = Calendar.getInstance();
         GoodTypeEnum goodType = orderDetailVo.getGoodType();
 
@@ -870,9 +863,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             instance.add(Calendar.DAY_OF_MONTH, Integer.parseInt(sysConfigService.findConfigValue(SysConfigConstant.PRACTICE_ACCOUNT_PERIOD)));
         } else if (GoodTypeEnum.LIVE.equals(goodType)) {
             //直播课取直播课成课时间+账期
-
-
-            instance.add(Calendar.DAY_OF_MONTH, Integer.parseInt(sysConfigService.findConfigValue(SysConfigConstant.PRACTICE_ACCOUNT_PERIOD)));
+            CourseGroup byId = courseGroupService.getById(orderDetailVo.getBizId());
+            instance.setTime(byId.getSalesEndDate());
+            instance.add(Calendar.DAY_OF_MONTH, Integer.parseInt(sysConfigService.findConfigValue(SysConfigConstant.LIVE_ACCOUNT_PERIOD)));
         }
         return instance.getTime();
     }

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java

@@ -279,12 +279,12 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
                 res = HttpResponseResult.failed("结算" + authOperaReq.getId() + "失败,失败原因:" + withdraw.getMsg());
 
                 UserAccountRecordVo detail = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, Long.parseLong(authOperaReq.getId()));
-                userAccountService.accountChange(detail.getId(), PostStatusEnum.CANCEL);
+                userAccountService.accountChange(detail, PostStatusEnum.CANCEL);
             }
         } else {
             //审核不通过,账户解冻
             UserAccountRecordVo detail = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, Long.parseLong(authOperaReq.getId()));
-            userAccountService.accountChange(detail.getId(), PostStatusEnum.CANCEL);
+            userAccountService.accountChange(detail, PostStatusEnum.CANCEL);
 
             //发生审核未通过通知
             unpassSend(build.getUserId(), build.getPhone(), authOperaReq.getReason());
@@ -357,7 +357,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
 
             //结算成功,账户解冻,入账户明细
             UserAccountRecordVo recordVo = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, detail.getId());
-            userAccountService.accountChange(recordVo.getId(), PostStatusEnum.RECORDED);
+            userAccountService.accountChange(recordVo, PostStatusEnum.RECORDED);
             //发生结算成功通知
             successSend(detail.getUserId(), detail.getPhone());
         } else if ("2".equals(callback.getStatus())) {
@@ -369,7 +369,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
 
             //结算失败,账户解冻
             UserAccountRecordVo recordVo = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, detail.getId());
-            userAccountService.accountChange(recordVo.getId(), PostStatusEnum.CANCEL);
+            userAccountService.accountChange(recordVo, PostStatusEnum.CANCEL);
 
             //发生结算失败通知
             unpassSend(detail.getUserId(), detail.getPhone(), callback.getErrorMsg());

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

@@ -91,7 +91,8 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
 
     public List<VideoLessonGroupVo> selectPage(VideoLessonGroupSearch query) {
         List<VideoLessonGroupVo> list = baseMapper.selectPage(null, query);
-        List<VideoLessonGroupVo> collect = list.stream().sorted(Comparator.comparing(VideoLessonGroupVo::getCountStudent, Comparator.reverseOrder())).limit(2).collect(Collectors.toList());
+        List<VideoLessonGroupVo> collect = list.stream().filter(videoLessonGroupVo -> !videoLessonGroupVo.getId().equals(query.getVideoLessonGroupId()))
+                                               .sorted(Comparator.comparing(VideoLessonGroupVo::getCountStudent, Comparator.reverseOrder())).limit(2).collect(Collectors.toList());
         return collect;
     }
 

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

@@ -12,10 +12,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.dao.VideoLessonPurchaseRecordDao;
 import com.yonge.cooleshow.biz.dal.enums.*;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.SysMessageService;
-import com.yonge.cooleshow.biz.dal.service.UserAccountService;
-import com.yonge.cooleshow.biz.dal.service.VideoLessonPurchaseRecordService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -61,6 +58,8 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
     private UserOrderDao userOrderDao;
     @Autowired
     private SysMessageService sysMessageService;
+    @Autowired
+    private UserOrderService userOrderService;
 
     public VideoLessonPurchaseRecordDao getDao() {
         return videoLessonPurchaseRecordDao;
@@ -157,9 +156,9 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
      * @param lessonGroup
      */
     private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, VideoLessonGroup lessonGroup) {
-        if(null == userOrderDetailVo.getMerchId()){
+        //获取账期时间
+        Date accountPeriodTime = userOrderService.getAccountPeriodTime(userOrderDetailVo);
 
-        }
         //查询视频课服务费
         BigDecimal liveServiceRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE))
                 .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
@@ -173,7 +172,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         //插入老师账户变更记录-老师预收
         userAccountService.accountRecord(
                 new UserAccountRecordDto(userOrderDetailVo.getMerchId(), PostStatusEnum.WAIT, transAmount, InOrOutEnum.IN,
-                        AccountBizTypeEnum.VIDEO, lessonGroup.getId(), lessonGroup.getLessonName(), userOrderDetailVo.getOrderNo(),userOrderDetailVo.getUserId()));
+                        AccountBizTypeEnum.VIDEO, lessonGroup.getId(), lessonGroup.getLessonName(), userOrderDetailVo.getOrderNo(), userOrderDetailVo.getUserId(), accountPeriodTime));
     }
 
     /**

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

@@ -29,9 +29,20 @@ public class MusicSheetVo extends MusicSheet {
     @ApiModelProperty("收藏 0:否,1:是")
     private YesOrNoEnum favorite;
 
+    @ApiModelProperty("收藏人数")
+    private Long favoriteCount;
+
     @ApiModelProperty("是否购买/VIP(0:否,1:是) ")
     private YesOrNoEnum play;
 
+    public Long getFavoriteCount() {
+        return favoriteCount;
+    }
+
+    public void setFavoriteCount(Long favoriteCount) {
+        this.favoriteCount = favoriteCount;
+    }
+
     public String getAddName() {
         return addName;
     }

+ 10 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFens.java

@@ -2,7 +2,7 @@ package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import com.yonge.cooleshow.common.entity.BaseEntity;
-import com.yonge.toolset.base.page.QueryInfo;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 /**
@@ -22,6 +22,8 @@ public class MyFens extends BaseEntity {
     private String subjectName;
     @ApiModelProperty(value = "性别 0女 1男")
     private GenderEnum gender;
+    @ApiModelProperty(value = "是否会员 0否 1是")
+    private YesOrNoEnum isVip;
 
     public String getSubjectName() {
         return subjectName;
@@ -75,5 +77,11 @@ public class MyFens extends BaseEntity {
         }
     }
 
-    
+    public YesOrNoEnum getIsVip() {
+        return isVip;
+    }
+
+    public void setIsVip(YesOrNoEnum isVip) {
+        this.isVip = isVip;
+    }
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java

@@ -53,6 +53,8 @@ public class StudentHomeVo extends Student {
     private Integer musicAlbumNum;
     @ApiModelProperty("曲谱数 ")
     private Integer musicSheetNum;
+    @ApiModelProperty(value = "是否会员 0否 1是")
+    private YesOrNoEnum isVip;
 
     public String getHeardUrl() {
         return heardUrl;
@@ -211,4 +213,12 @@ public class StudentHomeVo extends Student {
     public void setMusicSheetNum(Integer musicSheetNum) {
         this.musicSheetNum = musicSheetNum;
     }
+
+    public YesOrNoEnum getIsVip() {
+        return isVip;
+    }
+
+    public void setIsVip(YesOrNoEnum isVip) {
+        this.isVip = isVip;
+    }
 }

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

@@ -15,7 +15,7 @@ import java.math.BigDecimal;
 public class UserAccountVo extends UserAccount{
 	private static final long serialVersionUID = 1L;
 
-	@ApiModelProperty("入账金额 ")
+	@ApiModelProperty("入账金额 ")
 	private BigDecimal amountUnrecorded;
 
 	@ApiModelProperty("已入账金额 ")

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

@@ -33,11 +33,8 @@ public class UserOrderDetailVo extends UserOrderDetail {
 
     @ApiModelProperty(value = "冗余字段,用于传递参数用")
     private Object bizParam;
-    @ApiModelProperty(value = "推荐用户id(有推荐人的情况)")
-    private Long recomUserId;
-
     @ApiModelProperty(value = "分润用户编号")
-    private Long routeUserId;
+    private Long recomUserId;
 
     public ClientEnum getOrderClient() {
         return orderClient;
@@ -47,14 +44,6 @@ public class UserOrderDetailVo extends UserOrderDetail {
         this.orderClient = orderClient;
     }
 
-    public Long getRouteUserId() {
-        return routeUserId;
-    }
-
-    public void setRouteUserId(Long routeUserId) {
-        this.routeUserId = routeUserId;
-    }
-
     public Long getUserId() {
         return userId;
     }

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

@@ -86,7 +86,8 @@
         <if test="param.idAndName != null and param.idAndName != ''">
             and (t.id_ like concat('%',#{param.idAndName},'%') or
             t.music_sheet_name_ like concat('%',#{param.idAndName},'%') or
-            t.composer_ like concat ('%',#{param.idAndName},'%'))
+            t.composer_ like concat ('%',#{param.idAndName},'%') or
+            su.username_ like concat ('%',#{param.idAndName},'%') )
         </if>
         <if test="param.musicTagIds != null and param.musicTagIds != ''">
             and
@@ -252,6 +253,9 @@
         ,su.avatar_ as addUserAvatar
         ,(select group_concat(mt.name_) from music_tag mt
         where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0  and mt.state_ = 1) as musicTagNames
+        ,(select count(1) as num from music_favorite af
+                left join sys_user su on af.user_id_ = su.id_
+                where su.del_flag_ = 0 and af.music_sheet_id_ = t.id_) as favoriteCount
         ,(select group_concat(s.name_) from subject s
         where find_in_set(s.id_,t.music_subject_)  and s.del_flag_ = 0) as subjectNames
         <if test="param.studentId != null">

+ 24 - 9
cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml

@@ -69,8 +69,16 @@
         </foreach>
     </update>
 
-	<select id="queryPage" resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
-    	select * from platform_cash_account_record
+	<update id="batchRecorded">
+		update platform_cash_account_record set post_status_ = 'RECORDED'
+		where post_status_ = 'WAIT' and id_ IN
+		<foreach collection="recordIds" item="item" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</update>
+
+	<sql id="selectSql">
+		select * from platform_cash_account_record
 		<where>
 			<if test="param.orderNo">
 				and order_no_ = #{param.orderNo}
@@ -84,8 +92,8 @@
 			<if test="param.bizType">
 				and biz_type_ = #{param.bizType}
 			</if>
-			<if test="param.status">
-				and post_status_ = #{param.status}
+			<if test="param.postStatus">
+				and post_status_ = #{param.postStatus}
 			</if>
 			<if test="param.startDate">
 				and update_time_ &gt;= #{param.startDate}
@@ -94,9 +102,16 @@
 				and update_time_ &lt;= #{param.endDate}
 			</if>
 		</where>
+	</sql>
+	<select id="queryPage" resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
+		<include refid="selectSql"/>
     </select>
-    
-    <select id="querySummary" resultType="com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountRecordSummaryVo">
+
+	<select id="queryAll" resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
+		<include refid="selectSql"/>
+	</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,
@@ -116,8 +131,8 @@
 			<if test="param.bizType">
 				and biz_type_ = #{param.bizType}
 			</if>
-			<if test="param.status">
-				and post_status_ = #{param.status}
+			<if test="param.postStatus">
+				and post_status_ = #{param.postStatus}
 			</if>
 			<if test="param.startDate">
 				and update_time_ &gt;= #{param.startDate}
@@ -144,7 +159,7 @@
 		</foreach>
 	</select>
 
-	<update id="cancelRecord">
+    <update id="cancelRecord">
 		update platform_cash_account_record set post_status_ = 'CANCEL'
 		where post_status_ = 'WAIT' and order_no_ = #{orderNo} and biz_id_ = #{bizId}
 		and biz_type_ = #{bizType}

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

@@ -177,7 +177,8 @@
             u.username_ AS userName,
             u.real_name_ AS realName,
             u.gender_ AS gender,
-            (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,sr.subject_id_)) AS subjectName
+            (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,sr.subject_id_)) AS subjectName,
+            if(sr.membership_start_time_ &lt;= now() and sr.membership_end_time_ &gt;= now(),1,0) AS isVip
         FROM student_star s
         LEFT JOIN sys_user u ON s.student_id_ = u.id_
         LEFT JOIN student sr ON s.student_id_ = sr.user_id_

+ 8 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml

@@ -81,7 +81,9 @@
             (select sum(a.trans_amount_) from user_cash_account_record a where a.account_id_ = t.user_id_
                 and a.post_status_ = 'WAIT' and a.in_or_out_ = 'IN') as amountUnrecorded,
             (select sum(a.trans_amount_) from user_cash_account_record a where a.account_id_ = t.user_id_
-                and a.post_status_ = 'RECORDED' and a.in_or_out_ = 'IN'
+                and a.post_status_ = 'RECORDED' and a.in_or_out_ = 'IN') as amountRecorded,
+            (select sum(a.trans_amount_) from user_cash_account_record a where a.account_id_ = t.user_id_
+                and a.post_status_ in ('RECORDED','WAIT') and a.in_or_out_ = 'IN'
                 and a.biz_type_ in ('LIVE_SHARE','VIDEO_SHARE','MUSIC_SHARE','VIP_SHARE','MALL_SHARE')) as amountShare
         FROM user_cash_account t
         where t.user_id_ = #{id}
@@ -125,6 +127,8 @@
                 sum(if(t.biz_type_ = 'MALL_SHARE',t.trans_amount_,0)) as mallShareAmount
         from user_cash_account_record t
             <where>
+                and t.post_status_ = 'RECORDED'
+                and t.in_or_out_ = 'IN' and t.err_flag_ != 1
                 <if test="param.startTime !=null">
                     <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>
                 </if>
@@ -151,12 +155,11 @@
         <if test="timeType != null and timeType == 'YEAR'">
             group by t.sys_day_ym_
         </if>
-        order by t.sys_day_ymd_
     </select>
 
     <select id="totalTransAmountByOrderNo" resultType="java.math.BigDecimal">
         select sum(trans_amount_) from user_cash_account_record
-        where post_status_ in ('WAIT','FROZEN','RECORDED') and in_or_out_ = 'IN' and err_flag_ = 0
+        where post_status_ in ('WAIT','FROZEN','RECORDED') and in_or_out_ = 'IN' and err_flag_ != 1
             and order_no_ = #{orderNo}
     </select>
 
@@ -168,7 +171,8 @@
             sum(if(t.post_status_ = 'CANCEL',t.trans_amount_,0)) as cancelAmount,
             count(distinct t.buy_user_) as studentNum
         from user_cash_account_record t
-        where t.account_id_ = #{param.userId}
+        where t.in_or_out_ = 'IN' and t.err_flag_ != 1
+          and t.account_id_ = #{param.userId}
           and t.biz_type_ in ('LIVE_SHARE','VIDEO_SHARE','MUSIC_SHARE','VIP_SHARE','MALL_SHARE')
     </select>
 </mapper>

+ 8 - 23
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml

@@ -99,7 +99,7 @@
         <include refid="selectSql"/>
     </select>
 
-    <select id="selectAllPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
+    <select id="selectAll" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
         <include refid="selectSql"/>
     </select>
 
@@ -285,28 +285,13 @@
         SELECT
             <include refid="baseColumns"/>
         FROM user_cash_account_record t
-        where t.order_no_ = #{param.orderNo}
-        <if test="null != param.goodType">
-            <if test="param.goodType.code == 'VIP'">
-                and t.biz_type_ = 'VIP_SHARE'
-            </if>
-            <if test="param.goodType.code == 'PRACTICE'">
-                and t.biz_type_ = 'PRACTICE'
-            </if>
-            <if test="param.goodType.code == 'LIVE'">
-                and t.biz_type_ in ('LIVE','LIVE_SHARE')
-            </if>
-            <if test="param.goodType.code == 'VIDEO'">
-                and t.biz_type_ in ('VIDEO','VIDEO_SHARE')
-            </if>
-            <if test="param.goodType.code == 'MUSIC'">
-                and t.biz_type_ in ('MUSIC','MUSIC_SHARE')
-            </if>
-        </if>
-        and t.biz_id_ IN
-        <foreach collection="bizIds" item="item" open="(" separator="," close=")">
-            #{item}
-        </foreach>
+        where t.post_status_ = 'WAIT'
+          and t.order_no_ = #{orderNo}
+            and t.biz_type_ = #{bizType}
+            and t.biz_id_ IN
+            <foreach collection="bizIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
     </select>
 
     <select id="detailByBiz" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">

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

@@ -49,6 +49,7 @@
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
             <include refid="baseColumns"/>,
+                o.order_client_ as orderClient,
                 o.user_id_ as userId,
                 o.recom_user_id_ as recomUserId
         FROM user_order_detail t
@@ -58,6 +59,7 @@
     <select id="detailByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
             <include refid="baseColumns"/>,
+            o.order_client_ as orderClient,
             o.user_id_ as userId,
             o.recom_user_id_ as recomUserId
         FROM user_order_detail t
@@ -68,12 +70,14 @@
     <sql id="selectSql">
         SELECT
             <include refid="baseColumns" />,
+            o.order_client_ as orderClient,
+            o.user_id_ as userId,
             o.recom_user_id_ as recomUserId
         FROM user_order_detail t
         left join user_order o on t.order_no_ = o.order_no_
         <where>
             <if test="param.orderNo != null and param.orderNo != ''">
-                AND t.order_no_ = #{orderNo}
+                AND t.order_no_ = #{param.orderNo}
             </if>
             <if test="param.ids != null and param.ids.size()>0">
                 AND t.id_ IN

+ 3 - 5
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -149,19 +149,17 @@ public class MusicSheetController extends BaseController {
     /**
      * 我的单曲,收藏单曲
      */
-    @GetMapping("/my")
+    @PostMapping("/my")
     @ApiOperation(value = "我的单曲")
-    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(QueryInfo query) {
+    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(@RequestBody  StudentMusicSheetSearch search) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        StudentMusicSheetSearch search = new StudentMusicSheetSearch();
         search.setStudentId(sysUser.getId());
         search.setState(YesOrNoEnum.YES);
         search.setAuditStatus(AuthStatusEnum.PASS);
-        search.setUserType(ClientEnum.TEACHER);
-        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.myMusic(PageUtil.getPage(query),search);
+        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.myMusic(PageUtil.getPage(search),search);
         return succeed(PageUtil.pageInfo(sheetVoIPage));
     }
 

+ 1 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/PianoRoomBuyRecordController.java

@@ -16,7 +16,7 @@ import com.yonge.cooleshow.biz.dal.service.PianoRoomBuyRecordService;
 
 @RestController
 @RequestMapping("/pianoRoomBuyRecord")
-@Api(value = "购买会员卡记录表", tags = "购买会员卡记录表")
+@Api(value = "购买琴房记录表", tags = "购买琴房记录表")
 public class PianoRoomBuyRecordController extends BaseController {
 
     @Autowired

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

@@ -80,6 +80,8 @@ public class TeacherCourseGroupController extends BaseController {
                 auditVersion = appVersionInfoService.getAppAuditVersion(param.get("platform").toString(),param.get("version").toString());
             }
             param.put("auditVersion",auditVersion);
+            param.put("groupStatus","APPLY");
+
         }
 
 

+ 15 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserAccountController.java

@@ -68,7 +68,6 @@ public class UserAccountController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         query.setUserId(user.getId());
-        query.setInOrOut(InOrOutEnum.IN);
 
         if (StringUtil.isEmpty(query.getSearchDate())) {
             query.setSearchDate(DateUtil.format(new Date(), "yyyy-MM"));
@@ -121,6 +120,21 @@ public class UserAccountController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         query.setUserId(user.getId());
+        if (StringUtil.isEmpty(query.getSearchDate())) {
+            query.setSearchDate(DateUtil.format(new Date(), "yyyy-MM"));
+        }
+        String[] classDateSp = query.getSearchDate().split("-");
+        try {
+            LocalDate date = LocalDate.of(Integer.parseInt(classDateSp[0]), Integer.parseInt(classDateSp[1]), 1);
+
+            LocalDateTime firstDay = LocalDateTime.of(date.with(TemporalAdjusters.firstDayOfMonth()), LocalTime.MIN);
+            LocalDateTime lastDay = LocalDateTime.of(date.with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX);
+
+            query.setStartTime(firstDay);
+            query.setEndTime(lastDay);
+        } catch (Exception e) {
+            throw new BizException("查询时间格式不正确 [" + query.getSearchDate() + "]");
+        }
         IPage<UserAccountRecordVo> pages = userAccountRecordService.sharePage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
     }

+ 7 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java

@@ -4,6 +4,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.ShareProfitParam;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
 
+
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.vo.*;
+
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -65,6 +69,9 @@ public class VideoLessonGroupController extends BaseController {
             // 检查app版本
             query.setAuditVersion(appVersionInfoService.getAppAuditVersion(query.getPlatform(),query.getVersion()));
         }
+        if (query.getMyself() != null && !query.getMyself()) {
+            query.setAuditStatus(AuthStatusEnum.PASS);
+        }
         IPage<VideoLessonGroupVo> pages = videoLessonGroupService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
     }

+ 56 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VipCardRecordController.java

@@ -0,0 +1,56 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.search.VipCardRecordSearch;
+import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
+import com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/vipCardRecord")
+@Api(value = "购买会员卡记录表", tags = "购买会员卡记录表")
+public class VipCardRecordController extends BaseController {
+
+    @Autowired
+    private VipCardRecordService vipCardRecordService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/detail/{orderDetilId}")
+    @ApiOperation(value = "详情", notes = "传入订单详情id")
+    public HttpResponseResult<VipCardRecordVo> detail(@PathVariable("orderDetilId") Long orderDetilId) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(vipCardRecordService.detail(orderDetilId, user.getId()));
+    }
+
+    /**
+     * 查询分页
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "传入vipCardRecordSearch")
+    public HttpResponseResult<PageInfo<VipCardRecordVo>> page(@RequestBody VipCardRecordSearch query) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        IPage<VipCardRecordVo> pages = vipCardRecordService.selectPage(PageUtil.getPage(query), query);
+        return succeed(PageUtil.pageInfo(pages));
+    }
+}

+ 1 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/open/OpenShareController.java

@@ -24,7 +24,7 @@ import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("/open")
-@Api(value = "开放权限接口-分享", hidden = true)
+@Api(tags = "开放权限接口-分享")
 public class OpenShareController extends BaseController {
     private final static Logger log = LoggerFactory.getLogger(OpenShareController.class);
 

+ 21 - 3
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicAlbumController.java

@@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 专辑表 web 控制层
@@ -80,14 +82,30 @@ public class OpenMusicAlbumController extends BaseController {
         musicAlbumSearch.setAlbumStatus(YesOrNoEnum.YES);
         musicAlbumSearch.setSortBy(1);
         musicAlbumSearch.setPage(1);
-        musicAlbumSearch.setRows(4);
+        musicAlbumSearch.setRows(5);
         IPage<MusicAlbumVo> hotMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch);
-        albumDetailVo.setHotMusicAlbum(hotMusicAlbum.getRecords());
+        List<MusicAlbumVo> musicAlbumVos = hotMusicAlbum.getRecords()
+                                                  .stream()
+                                                  .filter(musicAlbumVo -> !musicAlbumVo.getId()
+                                                                                       .equals(albumDetailVo.getId()))
+                                                  .collect(Collectors.toList());
+        if (musicAlbumVos.size() > 4) {
+            musicAlbumVos = musicAlbumVos.subList(0,4);
+        }
+        albumDetailVo.setHotMusicAlbum(musicAlbumVos);
 
         // 相关专辑
         musicAlbumSearch.setAlbumTagIds(albumDetailVo.getAlbumTag());
         IPage<MusicAlbumVo> relatedMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch);
-        albumDetailVo.setRelatedMusicAlbum(relatedMusicAlbum.getRecords());
+        List<MusicAlbumVo> musicAlbumVos1 = relatedMusicAlbum.getRecords()
+                                                      .stream()
+                                                      .filter(musicAlbumVo -> !musicAlbumVo.getId()
+                                                                                           .equals(albumDetailVo.getId()))
+                                                      .collect(Collectors.toList());
+        if (musicAlbumVos1.size() > 4) {
+            musicAlbumVos1 = musicAlbumVos1.subList(0,4);
+        }
+        albumDetailVo.setRelatedMusicAlbum(musicAlbumVos1);
         return succeed(albumDetailVo);
     }
 

+ 25 - 0
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenSubjectController.java

@@ -1,19 +1,24 @@
 package com.yonge.cooleshow.website.controller.open;
 
 import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.queryInfo.SubjectQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.SubjectService;
 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.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @RequestMapping("/open/subject")
 @Api(tags = "声部服务")
@@ -35,4 +40,24 @@ public class OpenSubjectController extends BaseController {
         return succeed(subjectSelect);
     }
 
+    @ApiOperation(value = "分页查询声部列表")
+    @GetMapping("/queryPage")
+    public HttpResponseResult<PageInfo<Subject>> queryPage(SubjectQueryInfo queryInfo) {
+        PageInfo<Subject> pageInfo = subjectService.queryPage(queryInfo);
+
+        if(pageInfo.getRows().size() == 0){
+            return succeed(pageInfo);
+        }
+
+        Map<Long, Subject> map = subjectService.findBySubjectByIdList(pageInfo.getRows().stream().map(t -> t.getParentSubjectId()).collect(
+                                                       Collectors.toList())).stream()
+                                               .collect(Collectors.toMap(Subject::getId, t -> t));
+
+        pageInfo.getRows().forEach(row -> {
+            if(row.getParentSubjectId() != null && row.getParentSubjectId() > 0) {
+                row.setParentSubjectName(map.get(row.getParentSubjectId()).getName());
+            }
+        });
+        return succeed(pageInfo);
+    }
 }

+ 5 - 5
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/util/DistributedLock.java

@@ -71,7 +71,7 @@ public class DistributedLock {
         } catch (BizException e) {
             throw e;
         }  catch (Exception e) {
-            log.error("runIfLockCanGet error lockName : {}", lockName, e);
+            e.printStackTrace();
             throw new RuntimeException("runIfLockCanGet error lockName :" + lockName, e);
         } finally {
             unlock(lock);
@@ -116,7 +116,7 @@ public class DistributedLock {
                 throw new BizException(message);
             }
         } catch (Exception e) {
-            log.error("callIfLockCanGet error lockKey {}", lockName);
+            e.printStackTrace();
             throw new RuntimeException("任务执行异常");
         } finally {
             executor.shutdown();
@@ -148,7 +148,7 @@ public class DistributedLock {
                 return null;
             }
         } catch (Exception e) {
-            log.error("callIfLockCanGet error lockKey {}", lockName);
+            e.printStackTrace();
             throw new RuntimeException("任务执行异常");
         } finally {
             executor.shutdown();
@@ -171,7 +171,7 @@ public class DistributedLock {
      *
      * @param lockName lockKey
      * @param function 需要执行的方法
-     * @return Future 异步任务
+     * @return Future
      */
     public <T, R> R runIfLockToFunction(final String lockName, Function<T, R> function, T param, long waitTime) {
         RLock lock = redissonClient.getLock(lockName);
@@ -189,7 +189,7 @@ public class DistributedLock {
         } catch (BizException e) {
             throw e;
         } catch (Exception e) {
-            log.error("callIfLockCanGet error lockKey {}", lockName);
+            e.printStackTrace();
             throw new RuntimeException("任务执行异常");
         } finally {
             unlock(lock);

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác