Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

zouxuan 3 vuotta sitten
vanhempi
commit
ea4c8d2a5c
100 muutettua tiedostoa jossa 3156 lisäystä ja 498 poistoa
  1. 119 0
      audio-analysis/src/test/java/com/yonge/netty/client/NettyClient.java
  2. 87 0
      audio-analysis/src/test/java/com/yonge/netty/handler/WebSocketClientHandler.java
  3. BIN
      audio-analysis/src/test/resources/huanlesong-16bit.wav
  4. 0 0
      audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.json
  5. BIN
      audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.wav
  6. 4 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  7. 7 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  8. 5 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/SysUserFeignService.java
  9. 5 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/fallback/SysUserFeignServiceFallback.java
  10. 10 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java
  11. 67 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  12. 1 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java
  13. 36 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/PostStatusEnum.java
  14. 3 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsAdminServiceImpl.java
  15. 5 0
      cooleshow-mall/mall-portal/pom.xml
  16. 9 3
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PmsPortalProductController.java
  17. 51 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java
  18. 72 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ShareProductVo.java
  19. 34 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ShareProfitParam.java
  20. 10 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java
  21. 5 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java
  22. 23 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java
  23. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
  24. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherStyleVideoController.java
  25. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PlatformCashAccountRecordDao.java
  26. 73 28
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java
  27. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetPayDto.java
  28. 4 44
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserAccountRecordDto.java
  29. 33 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  30. 10 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java
  31. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ShareProfitParam.java
  32. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java
  33. 27 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserAccountRecordSearch.java
  34. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VideoLessonGroupSearch.java
  35. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPurchaseRecord.java
  36. 157 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java
  37. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java
  38. 62 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java
  39. 27 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserAccountRecord.java
  40. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  41. 16 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java
  42. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  43. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ClientEnum.java
  44. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/FrozenTypeEnum.java
  45. 37 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TeacherTagEnum.java
  46. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  47. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java
  48. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java
  49. 10 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  50. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PlatformCashAccountRecordService.java
  51. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  52. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherStyleVideoService.java
  53. 46 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountRecordService.java
  54. 30 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountService.java
  55. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupService.java
  56. 44 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  57. 8 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  58. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  59. 100 24
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  60. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java
  61. 160 102
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  62. 29 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PlatformCashAccountRecordServiceImpl.java
  63. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentTimeServiceImpl.java
  64. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  65. 16 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherStyleVideoServiceImpl.java
  66. 64 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java
  67. 175 73
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  68. 29 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  69. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  70. 17 37
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  71. 48 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java
  72. 59 25
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  73. 27 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  74. 38 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseGroupShareVo.java
  75. 114 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ShareProfitVo.java
  76. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java
  77. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java
  78. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountVo.java
  79. 33 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java
  80. 109 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserVipInfoVo.java
  81. 100 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/AccountTotal.java
  82. 2 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPurchaseRecordMapper.xml
  83. 34 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml
  84. 6 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysConfigMapper.xml
  85. 8 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  86. 17 13
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml
  87. 149 31
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml
  88. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  89. 11 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  90. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml
  91. 2 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  92. 2 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  93. 54 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MemberPriceSettingsController.java
  94. 118 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicAlbumController.java
  95. 51 12
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  96. 29 3
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java
  97. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserAccountController.java
  98. 2 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java
  99. 29 7
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java
  100. 93 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/open/OpenShareController.java

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

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

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

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

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


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.json


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


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

@@ -49,4 +49,8 @@ public interface AdminFeignService {
     //老师课酬
     @PostMapping(value = "/task/refreshBlackList")
     HttpResponseResult refreshBlackList();
+
+    @GetMapping(value = "/sysConfig/findConfigValue")
+    HttpResponseResult<String> findConfigValue(String paramName);
+
 }

+ 7 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java

@@ -31,7 +31,14 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     }
 
     @Override
+
     public HttpResponseResult refreshBlackList() {
+
+        return null;
+    }
+
+    public HttpResponseResult<String> findConfigValue(String paramName) {
+
         return null;
     }
 }

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

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

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

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

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

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

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

@@ -234,4 +234,71 @@ public interface SysConfigConstant {
      * 敏感词-白名单
      */
     String WHITE_LIST = "white_list";
+
+
+    /** 老师分享曲目二维码跳转链接 */
+    String TEACHER_MUSIC_SHEET_SHARE_PROFIT_URL = "teacher_music_sheet_share_profit_url";
+
+
+    /** 老师分享直播课二维码跳转链接 */
+    String TEACHER_LIVE_GROUP_SHARE_PROFIT_URL = "teacher_live_group_share_profit_url";
+
+
+    /** 老师分享视频课二维码跳转链接 */
+    String TEACHER_VIDEO_GROUP_SHARE_PROFIT_URL = "teacher_video_group_share_profit_url";
+
+
+    /** 老师分享VIP二维码跳转链接 */
+    String TEACHER_VIP_SHARE_PROFIT_URL = "teacher_vip_share_profit_url";
+
+
+
+    /** 老师分享商品二维码跳转链接 */
+    String TEACHER_PRODUCT_SHARE_PROFIT_URL = "teacher_product_share_profit_url";
+
+    /**
+     * 直播课推荐分润比例
+     */
+    String LIVE_SHARE_FEE = "live_share_fee";
+    /**
+     * 视频课推荐分润比例
+     */
+    String VIDEO_SHARE_FEE = "video_share_fee";
+    /**
+     * 会员推荐分润比例
+     */
+    String VIP_SHARE_FEE = "vip_share_fee";
+    /**
+     * 乐谱推荐分润比例
+     */
+    String MUSIC_SHARE_FEE = "music_share_fee";
+    /**
+     * 商品推荐分润比例
+     */
+    String MALL_SHARE_FEE = "mall_share_fee";
+    /**
+     * 陪练课账期
+     */
+    String PRACTICE_ACCOUNT_PERIOD = "practice_account_period";
+    /**
+     * 直播课账期
+     */
+    String LIVE_ACCOUNT_PERIOD = "live_account_period";
+    /**
+     * 视频课账期
+     */
+    String VIDEO_ACCOUNT_PERIOD = "video_account_period";
+    /**
+     * 会员账期
+     */
+    String VIP_ACCOUNT_PERIOD = "vip_account_period";
+    /**
+     * 乐谱账期
+     */
+    String MUSIC_ACCOUNT_PERIOD = "music_account_period";
+    /**
+     * 商品账期
+     */
+    String MALL_ACCOUNT_PERIOD = "mall_account_period";
+
 }

+ 1 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java

@@ -21,6 +21,7 @@ public enum CacheNameEnum implements BaseEnum<String, CacheNameEnum> {
     STUDENT_SUBJECT_ITEM("学生声部下拉缓存", Duration.ofHours(1L)),
 
     LOCK_EXECUTE_ORDER("用户下单/付款/取消订单锁"),
+    LOCK_RECORD_ACCOUNT("账户记录锁"),
     LOCK_CHANGE_ACCOUNT("账户变更锁"),
     LOCK_WITHDRAWAL("锁用户结算"),
 

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

@@ -0,0 +1,36 @@
+package com.yonge.cooleshow.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 取消
+ *
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum PostStatusEnum implements BaseEnum<String, PostStatusEnum> {
+
+    WAIT("待入账"),
+    FROZEN("冻结入账"),
+    RECORDED("已入账"),
+    CANCEL("取消");
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    PostStatusEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -0,0 +1,19 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 平台账户流水表(PlatformCashAccountRecord)表数据库访问层
+ *
+ * @author zx
+ * @since 2022-07-21 10:32:06
+ */
+public interface PlatformCashAccountRecordDao extends BaseMapper<PlatformCashAccountRecord> {
+
+    int insertBatch(@Param("entities") List<PlatformCashAccountRecord> entities);
+}
+

+ 73 - 28
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java

@@ -5,11 +5,14 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
+import org.springframework.security.core.parameters.P;
 
 /**
  * 账户记账规则
@@ -18,35 +21,77 @@ import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
  * 用户购买老师乐谱后 记录入账
  */
 public interface UserAccountRecordDao extends BaseMapper<UserAccountRecord> {
-	/**
-	 * 查询详情
-	 * @author liweifan
-	 * @date 2022-03-30 13:53:51
-	 * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
-	 */
-	UserAccountRecordVo detail(@Param("id") Long id);
-
-	/**
-	 * 分页查询
-	 *
-	 * @author liweifan
-	 * @date 2022-03-30 13:53:51
-	 * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
-	 */
-	List<UserAccountRecordVo> selectPage(@Param("page") IPage page, @Param("param") UserAccountRecordSearch userAccountRecord);
-
-	/**
-	 * 老师本月收入
-	 *
-	 * @param userId 老师id
-	 * @return
-	 */
+    /**
+     * 查询详情
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    UserAccountRecordVo detail(@Param("id") Long id);
+
+    /**
+     * 分页查询
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    List<UserAccountRecordVo> selectPage(@Param("page") IPage page, @Param("param") UserAccountRecordSearch userAccountRecord);
+
+    List<UserAccountRecordVo> selectAllPage(@Param("param") UserAccountRecordSearch userAccountRecord);
+
+    /**
+     * app查询详情
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    UserAccountRecordVo appDetail(@Param("id") Long id);
+
+    /**
+     * 分页查询
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    List<UserAccountRecordVo> appSelectPage(@Param("page") IPage page, @Param("param") UserAccountRecordSearch userAccountRecord);
+
+    /**
+     * 老师本月收入
+     *
+     * @param userId 老师id
+     * @return
+     */
     BigDecimal selectMonthDecimal(@Param("userId") Long userId);
 
-	/**
-	 * 老师当天收入
-	 *
-	 * @return
-	 */
+    /**
+     * 老师当天收入
+     *
+     * @return
+     */
     List<TeacherEarningVo> selectTodayTeacherEarning();
+
+    /**
+     * 通过订单详情和业务id查询该详情对应的所有账户记录
+     *
+     * @param param
+     * @param bizIds
+     * @return
+     */
+    List<UserAccountRecord> selectRecordByOrderDetail(@Param("param") UserOrderDetailVo param, @Param("bizIds") List<Long> bizIds);
+
+    /**
+     * 入账记录可以通过以下三个字段确定唯一
+     *
+     * @param orderNo 订单号
+     * @param bizType 业务类型
+     * @param bizId   业务id
+     * @return
+     */
+    UserAccountRecordVo detailByBiz(@Param("orderNo") String orderNo,
+                                    @Param("bizType") AccountBizTypeEnum bizType,
+                                    @Param("bizId") Long bizId);
 }

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

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

+ 4 - 44
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserAccountRecordDto.java

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.FrozenTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -17,27 +18,10 @@ import java.math.BigDecimal;
  */
 @ApiModel(value = "UserAccountRecordDto对象", description = "账户变更传输对象")
 public class UserAccountRecordDto extends UserAccountRecord {
-
-    @ApiModelProperty(value = "用户id", required = true)
-    private Long userId;
-    @ApiModelProperty(value = "变更冻结类型 NONE 无 FROZEN 冻结 UNFROZEN 解冻")
-    private FrozenTypeEnum frozenType;
-
-    private Boolean saveRecord = true;
-
-    public UserAccountRecordDto() {
-    }
-
-    public UserAccountRecordDto(Long userId, BigDecimal transAmount, InOrOutEnum inOrOut, AccountBizTypeEnum bizType) {
-        this.userId = userId;
-        this.setTransAmount(transAmount);
-        this.setInOrOut(inOrOut);
-        this.setBizType(bizType);
-    }
-
-    public UserAccountRecordDto(Long userId, BigDecimal transAmount, InOrOutEnum inOrOut, AccountBizTypeEnum bizType,
+    public UserAccountRecordDto(Long accountId, PostStatusEnum postStatus, BigDecimal transAmount, InOrOutEnum inOrOut, AccountBizTypeEnum bizType,
                                 Long bizId, String bizName, String orderNo) {
-        this.userId = userId;
+        this.setAccountId(accountId);
+        this.setPostStatus(postStatus);
         this.setTransAmount(transAmount);
         this.setInOrOut(inOrOut);
         this.setBizType(bizType);
@@ -45,28 +29,4 @@ public class UserAccountRecordDto extends UserAccountRecord {
         this.setBizName(bizName);
         this.setOrderNo(orderNo);
     }
-
-    public Boolean getSaveRecord() {
-        return saveRecord;
-    }
-
-    public void setSaveRecord(Boolean saveRecord) {
-        this.saveRecord = saveRecord;
-    }
-
-    public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    public FrozenTypeEnum getFrozenType() {
-        return frozenType;
-    }
-
-    public void setFrozenType(FrozenTypeEnum frozenType) {
-        this.frozenType = frozenType;
-    }
 }

+ 33 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -1,8 +1,10 @@
 package com.yonge.cooleshow.biz.dal.dto.req;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import springfox.documentation.annotations.ApiIgnore;
@@ -24,6 +26,8 @@ public class OrderReq {
     private Long userId;
     @ApiModelProperty(value = "订单号", hidden = true)
     private String orderNo;
+    @ApiModelProperty(value = "下单客户端 ",hidden = true)
+    private ClientEnum orderClient;
     @NotBlank(message = "订单名称不能为空")
     @ApiModelProperty(value = "订单名称 ", required = true)
     private String orderName;
@@ -36,6 +40,8 @@ public class OrderReq {
     private String userNote;
     @ApiModelProperty(value = "优惠券id")
     private Long couponId;
+    @ApiModelProperty(value = "推荐用户id(有推荐人的情况)")
+    private Long recomUserId;
     @NotNull(message = "订单金额不能为空")
     @ApiModelProperty(value = "订单金额", required = true)
     private BigDecimal actualPrice;
@@ -43,10 +49,13 @@ public class OrderReq {
     @ApiModelProperty(value = "业务请求详情", required = true)
     private List<OrderReqInfo> orderInfos;
 
+
     @ApiModel(value = "OrderReqInfo对象", description = "下单请求业务详情对象")
     public class OrderReqInfo {
         @ApiModelProperty(value = "y用户id", hidden = true)
         private Long userId;
+        @ApiModelProperty(value = "推荐用户id(有推荐人的情况)")
+        private Long recomUserId;
         @ApiModelProperty(value = "订单号", hidden = true)
         private String orderNo;
         @ApiModelProperty(value = "订单详情号", hidden = true)
@@ -126,6 +135,14 @@ public class OrderReq {
         public void setCreateRes(OrderCreateRes createRes) {
             this.createRes = createRes;
         }
+
+        public Long getRecomUserId() {
+            return recomUserId;
+        }
+
+        public void setRecomUserId(Long recomUserId) {
+            this.recomUserId = recomUserId;
+        }
     }
 
     public Long getUserId() {
@@ -199,4 +216,20 @@ public class OrderReq {
     public void setOrderNo(String orderNo) {
         this.orderNo = orderNo;
     }
+
+    public ClientEnum getOrderClient() {
+        return orderClient;
+    }
+
+    public void setOrderClient(ClientEnum orderClient) {
+        this.orderClient = orderClient;
+    }
+
+    public Long getRecomUserId() {
+        return recomUserId;
+    }
+
+    public void setRecomUserId(Long recomUserId) {
+        this.recomUserId = recomUserId;
+    }
 }

+ 10 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java

@@ -15,6 +15,8 @@ import java.time.LocalDateTime;
 public class OrderSearch extends QueryInfo{
     @ApiModelProperty("交易流水号/订单号")
 	private String searchNo;
+	@ApiModelProperty("下单应用:STUDENT 学生端 TEACHER 老师端")
+	private String orderClient;
 	@ApiModelProperty("交易类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 (多选用,分割)")
 	private String orderType;
 	@ApiModelProperty("订单状态 WAIT_PAY 待支付 PAYING 支付中  PAID 已付款 CLOSE 已关闭 FAIL 支付失败 (多选用,分割)")
@@ -31,8 +33,6 @@ public class OrderSearch extends QueryInfo{
 	private Long merchId;
 	@ApiModelProperty("查询时间(yyyy-mm) ")
 	private String searchDate;
-
-
 	@ApiModelProperty(hidden = true)
 	private String goodType;
 	@ApiModelProperty(hidden = true)
@@ -94,7 +94,6 @@ public class OrderSearch extends QueryInfo{
 		this.merchId = merchId;
 	}
 
-
 	public String getSearchDate() {
 		return searchDate;
 	}
@@ -118,4 +117,12 @@ public class OrderSearch extends QueryInfo{
 	public void setBizId(Long bizId) {
 		this.bizId = bizId;
 	}
+
+	public String getOrderClient() {
+		return orderClient;
+	}
+
+	public void setOrderClient(String orderClient) {
+		this.orderClient = orderClient;
+	}
 }

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

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

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

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

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

@@ -1,8 +1,10 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -22,10 +24,16 @@ public class UserAccountRecordSearch extends QueryInfo{
 	@ApiModelProperty("用户id ")
 	private Long userId;
 
+	@ApiModelProperty("订单号 ")
+	private String orderNo;
+
 	@ApiModelProperty("收支类型:IN、收入 OUT、支出 ")
 	private InOrOutEnum inOrOut;
 
-	@ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 MUSIC、乐谱 WITHDRAWAL、结算 ")
+	@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、商品分润 ")
 	private AccountBizTypeEnum bizType;
 
 	@ApiModelProperty("查询时间(yyyy-mm) ")
@@ -41,6 +49,8 @@ public class UserAccountRecordSearch extends QueryInfo{
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private LocalDateTime endTime;
 
+
+
 	public Long getUserId() {
 		return userId;
 	}
@@ -88,4 +98,20 @@ public class UserAccountRecordSearch extends QueryInfo{
 	public void setEndTime(LocalDateTime endTime) {
 		this.endTime = endTime;
 	}
+
+	public String getOrderNo() {
+		return orderNo;
+	}
+
+	public void setOrderNo(String orderNo) {
+		this.orderNo = orderNo;
+	}
+
+	public PostStatusEnum getPostStatus() {
+		return postStatus;
+	}
+
+	public void setPostStatus(PostStatusEnum postStatus) {
+		this.postStatus = postStatus;
+	}
 }

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

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

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

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

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

@@ -0,0 +1,157 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 平台账户流水表(PlatformCashAccountRecord)表实体类
+ *
+ * @author zx
+ * @since 2022-07-21 10:32:06
+ */
+@ApiModel(value = "platform_cash_account_record-平台账户流水表")
+public class PlatformCashAccountRecord implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @TableField("account_id_")
+    @ApiModelProperty(value = "支出账户id")
+    private Long accountId;
+
+    @TableField("trans_amount_")
+    @ApiModelProperty(value = "交易金额")
+    private BigDecimal transAmount;
+
+    @TableField("in_or_out_")
+    @ApiModelProperty(value = "收支类型:IN、收入 OUT、支出")
+    private String inOrOut;
+
+    @TableField("post_status_")
+    @ApiModelProperty(value = "入账状态 WAIT 待入账 RECORDED 已入账 CANCEL 取消")
+    private String postStatus;
+
+    @TableField("biz_type_")
+    @ApiModelProperty(value = "业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱")
+    private String bizType;
+
+    @TableField("biz_id_")
+    @ApiModelProperty(value = "业务id(陪练课,直播课course_schedule_id_ | 视频课,乐谱为课程组曲子id | 提现为提现记录id)")
+    private Long bizId;
+
+    @TableField("memo_")
+    @ApiModelProperty(value = "备注")
+    private String memo;
+
+    @TableField("order_no_")
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(Long accountId) {
+        this.accountId = accountId;
+    }
+
+    public BigDecimal getTransAmount() {
+        return transAmount;
+    }
+
+    public void setTransAmount(BigDecimal transAmount) {
+        this.transAmount = transAmount;
+    }
+
+    public String getInOrOut() {
+        return inOrOut;
+    }
+
+    public void setInOrOut(String inOrOut) {
+        this.inOrOut = inOrOut;
+    }
+
+    public String getPostStatus() {
+        return postStatus;
+    }
+
+    public void setPostStatus(String postStatus) {
+        this.postStatus = postStatus;
+    }
+
+    public String getBizType() {
+        return bizType;
+    }
+
+    public void setBizType(String bizType) {
+        this.bizType = bizType;
+    }
+
+    public Long getBizId() {
+        return bizId;
+    }
+
+    public void setBizId(Long bizId) {
+        this.bizId = bizId;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}
+

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

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

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

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

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 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.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -38,10 +39,13 @@ public class UserAccountRecord implements Serializable {
     @ApiModelProperty(value = "收支类型:IN、收入 OUT、支出 ",required = true)
     @TableField(value = "in_or_out_")
     private InOrOutEnum inOrOut;
-    @ApiModelProperty(value = "业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 WITHDRAWAL、结算 ",required = true)
+    @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)
     @TableField(value = "biz_type_")
     private AccountBizTypeEnum bizType;
-    @ApiModelProperty("业务id ")
+    @ApiModelProperty("业务id(陪练课,直播课course_schedule_id_ | 视频课,乐谱为课程组曲子id | 提现为提现记录id | 会员分润为会员购买记录id | 商品分润为商品订单id)")
     @TableField(value = "biz_id_")
     private Long bizId;
     @ApiModelProperty("业务名称 ")
@@ -55,6 +59,11 @@ public class UserAccountRecord implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date createTime;
+    @ApiModelProperty("更新时间 ")
+    @TableField(value = "update_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date updateTime;
     @ApiModelProperty("是否异常 ")
     @TableField(value = "err_flag_")
     private Integer errFlag = 0;
@@ -157,4 +166,20 @@ public class UserAccountRecord implements Serializable {
     public void setErrMsg(String errMsg) {
         this.errMsg = errMsg;
     }
+
+    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;
+    }
 }

+ 25 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.ApiModel;
@@ -32,9 +33,15 @@ public class UserOrder implements Serializable {
     @ApiModelProperty("买家id ")
     @TableField(value = "user_id_")
     private Long userId;
+    @ApiModelProperty(value = "推荐用户id(有推荐人的情况)")
+    @TableField(value = "recom_user_id_")
+    private Long recomUserId;
     @ApiModelProperty("订单名称 ")
     @TableField(value = "order_name_")
     private String orderName;
+    @ApiModelProperty("下单应用:STUDENT 学生端 TEACHER 老师端")
+    @TableField(value = "order_client_")
+    private ClientEnum orderClient;
     @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)")
     @TableField(value = "order_type_")
     private OrderTypeEnum orderType;
@@ -80,6 +87,8 @@ public class UserOrder implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
+
+
     public Long getId() {
         return id;
     }
@@ -112,6 +121,14 @@ public class UserOrder implements Serializable {
         this.orderName = orderName;
     }
 
+    public ClientEnum getOrderClient() {
+        return orderClient;
+    }
+
+    public void setOrderClient(ClientEnum orderClient) {
+        this.orderClient = orderClient;
+    }
+
     public OrderTypeEnum getOrderType() {
         return orderType;
     }
@@ -215,4 +232,12 @@ public class UserOrder implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public Long getRecomUserId() {
+        return recomUserId;
+    }
+
+    public void setRecomUserId(Long recomUserId) {
+        this.recomUserId = recomUserId;
+    }
 }

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

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

+ 9 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java

@@ -14,7 +14,15 @@ public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
     LIVE("直播课", InOrOutEnum.IN),
     VIDEO("视频课", InOrOutEnum.IN),
     MUSIC("乐谱", InOrOutEnum.IN),
-    WITHDRAWAL("结算", InOrOutEnum.OUT);
+    WITHDRAWAL("结算", InOrOutEnum.OUT),
+
+    LIVE_SHARE("直播课分润", InOrOutEnum.IN),
+    VIDEO_SHARE("视频课分润", InOrOutEnum.IN),
+    MUSIC_SHARE("乐谱分润", InOrOutEnum.IN),
+    VIP_SHARE("会员分润", InOrOutEnum.IN),
+    MALL_SHARE("商品分润", InOrOutEnum.IN),
+
+    ;
     @EnumValue
     private String code;
     private String msg;

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

@@ -13,6 +13,7 @@ public enum ClientEnum implements BaseEnum<String, ClientEnum> {
     TEACHER("老师端"),
     STUDENT("学生端"),
     SYSTEM("平台端"),
+    WEBSITE("官网"),
 
     ;
     @EnumValue

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/FrozenTypeEnum.java

@@ -17,6 +17,8 @@ public enum  FrozenTypeEnum implements BaseEnum<String, FrozenTypeEnum> {
     private String code;
     private String msg;
 
+
+
     FrozenTypeEnum(String msg) {
         this.code = this.name();
         this.msg = msg;

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

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

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

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

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

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

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

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

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

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

+ 18 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PlatformCashAccountRecordService.java

@@ -0,0 +1,18 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dao.PlatformCashAccountRecordDao;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+
+/**
+ * 平台账户流水表(PlatformCashAccountRecord)表服务接口
+ *
+ * @author zx
+ * @since 2022-07-21 10:32:06
+ */
+public interface PlatformCashAccountRecordService extends IService<PlatformCashAccountRecord> {
+
+    PlatformCashAccountRecordDao getDao();
+}
+

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

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

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

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

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

@@ -2,43 +2,75 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 用户账户流水表 服务类
+ *
  * @author liweifan
  * @date 2022-03-30
  */
-public interface UserAccountRecordService extends IService<UserAccountRecord>  {
+public interface UserAccountRecordService extends IService<UserAccountRecord> {
 
-	/**
+    /**
      * 查询详情
+     *
      * @author liweifan
- 	 * @date 2022-03-30
+     * @date 2022-03-30
      */
-	UserAccountRecordVo detail(Long id);
+    UserAccountRecordVo detail(Long id);
 
+    UserAccountRecordVo detail(String orderNo, AccountBizTypeEnum bizType, Long bizId);
     /**
      * 分页查询
+     *
      * @author liweifan
- 	 * @date 2022-03-30
+     * @date 2022-03-30
      */
     IPage<UserAccountRecordVo> selectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query);
 
-	/**
-	 * 老师本月收入
-	 *
-	 * @param userId 老师id
-	 * @return 老师本月收入
-	 */
+    List<UserAccountRecordVo> selectAllPage(UserAccountRecordSearch query);
+
+    /**
+     * app查询详情
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    UserAccountRecordVo appDetail(Long id);
+    /**
+     * app分页查询
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    IPage<UserAccountRecordVo> appSelectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query);
+
+    /**
+     * 老师本月收入
+     *
+     * @param userId 老师id
+     * @return 老师本月收入
+     */
     BigDecimal getMonthDecimal(Long userId);
 
-	/**
-	 * 老师课酬收入通知
-	 */
+    /**
+     * 老师课酬收入通知
+     */
     void sendTeacherEarning();
+
+    /**
+     * 通过订单详情查询该详情对应的所有账户记录
+     */
+    List<UserAccountRecord> selectRecordByOrderDetail(UserOrderDetailVo userOrderDetailVo);
 }

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

@@ -10,9 +10,17 @@ import com.yonge.cooleshow.biz.dal.dto.search.UserAccountSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserAccount;
 import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 
 /**
  * 用户账户表 服务类
+ * 入账逻辑:
+ *   普通入账 -(记录入账接口)并在业务中记录账户记录id 入账状态:WAIT     待入账
+ *           - 业务确认入账(调用记录状态变更接口)   入账状态:RECORDED 已入账  修改账户总表
+ *           - 业务取消 (调用记录状态变更接口)     入账状态:CANCEL   取消
+ *   冻结入账 -(记录入账接口)并在业务中记录账户记录id 入账状态:FROZEN   冻结入账  修改账户总表 冻结金额 ++ 可用余额 --
+ *           - 业务确认入账(调用记录状态变更接口)   入账状态:RECORDED 已入账   修改账户总表 冻结金额 -- 账户余额 --
+ *           - 业务取消 (调用记录状态变更接口)     入账状态:CANCEL   取消     修改账户总表 冻结金额 -- 可用余额 ++
  * @author liweifan
  * @date 2022-03-30
  */
@@ -31,14 +39,33 @@ public interface UserAccountService extends IService<UserAccount>  {
  	 * @date 2022-03-30
      */
     IPage<UserAccountVo> selectPage(IPage<UserAccountVo> page, UserAccountSearch query);
+
+    /**
+     * 记录入账
+     * 使用 new UserAccountRecordDto(Long accountId, PostStatusEnum postStatus, BigDecimal transAmount, InOrOutEnum inOrOut, AccountBizTypeEnum bizType,
+     *                                 Long bizId, String bizName, String orderNo);
+     * accountId: 账户id
+     * postStatus: WAIT("待入账"),FROZEN("冻结入账")
+     * transAmount: 交易金额
+     * inOrOut: IN("收入"),OUT("支出")
+     * bizType:业务类型
+     * bizId:业务id
+     * bizName:业务名称
+     * orderNo:订单号
+     * @author liweifan
+     * @date 2022-07-20
+     */
+    HttpResponseResult<UserAccountRecord> accountRecord(UserAccountRecordDto accountRecordDto);
+
     /***
-     * 账户变更(账户变更使用该方法,有分布式锁)
+     * 入账结算(入账状态变更
      * @author liweifan
-     * @param: accountRecordDto
+     * @param: recordId     记录id
+     * @param: postStatus   入账状态 RECORDED 已入账 CANCEL 取消
      * @updateTime 2022/4/7 16:40
      * @return: java.lang.Integer
      */
-    HttpResponseResult<UserAccountRecord> accountChange(UserAccountRecordDto accountRecordDto);
+    HttpResponseResult<UserAccountRecord> accountChange(Long recordId, PostStatusEnum postStatus);
     /***
      * 账户统计查询
      * @author liweifan

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

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

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

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

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

@@ -22,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 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.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
@@ -114,6 +115,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     private ImUserFriendService imUserFriendService;
     @Autowired
     private UserAccountService userAccountService;
+    @Autowired
+    private UserAccountRecordService userAccountRecordService;
 
     @Override
     public CourseScheduleDao getDao() {
@@ -1109,8 +1112,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             teacherSalary.setReduceSalary(expectPrice.subtract(actualSalary));//扣除薪水 = 预计 - 实际
             teacherSalary.setReduceSalaryRemark(SysConfigConstant.PRACTICE_SERVICE_FEE);//扣除原因
             teacherSalary.setStatus(TeacherSalaryEnum.NOT_START.getCode());
-            teacherSalaryList.add(teacherSalary);
             teacherSalary.setCreateTime(now);
+            teacherSalaryList.add(teacherSalary);
 
             teacherId = payment.getTeacherId();
             studentId = payment.getUserId();
@@ -1759,9 +1762,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         List<UserAccountRecordDto> list = baseMapper.selectWaitCourse(day);
         if (CollectionUtils.isNotEmpty(list)) {
             for (UserAccountRecordDto dto : list) {
-                userAccountService.accountChange(dto);
+                UserAccountRecordVo record = userAccountRecordService.detail(dto.getOrderNo(), dto.getBizType(), dto.getBizId());
+                if (null != record) {
+                    userAccountService.accountChange(record.getId(), PostStatusEnum.RECORDED);
+                }
             }
-
             Set<Long> bizIds = list.stream().map(UserAccountRecordDto::getBizId).collect(Collectors.toSet());
             courseScheduleTeacherSalaryService.update(null, Wrappers.<CourseScheduleTeacherSalary>lambdaUpdate()
                     .set(CourseScheduleTeacherSalary::getStatus, TeacherSalaryEnum.COMPLETE.getCode())

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

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

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

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

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

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

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

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.common.enums.SysUserType;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetExport;
@@ -45,14 +45,15 @@ import java.util.stream.Collectors;
 
 /**
  * MusicSheetService服务实现类
+ *
  * @author yzp
- * @date 2022-03-26 00:01:37
  * @version v1.0
+ * @date 2022-03-26 00:01:37
  **/
 @Service
-public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet> implements MusicSheetService {
+public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet> implements MusicSheetService {
 
-    private static final  Logger log = LoggerFactory.getLogger(MusicSheetServiceImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(MusicSheetServiceImpl.class);
 
     @Autowired
     private MusicSheetDao musicSheetDao;
@@ -107,7 +108,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public boolean saveMp3AndAccompaniment(MusicSheetDto musicSheetDto,Long userId) {
+    public boolean saveMp3AndAccompaniment(MusicSheetDto musicSheetDto, Long userId) {
         MusicSheet musicSheet = new MusicSheet();
         BeanUtils.copyProperties(musicSheetDto, musicSheet);
         //保存主表
@@ -130,7 +131,6 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     @Override
     public IPage<MusicSheetVo> selectPage(IPage<MusicSheetVo> page, MusicSheetSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
-
     }
 
     @Override
@@ -138,7 +138,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     public boolean state(Long id) {
         MusicSheet musicSheet = this.getById(id);
         if (musicSheet == null) {
-            throw  new BizException("未找到曲目信息");
+            throw new BizException("未找到曲目信息");
         }
         if (YesOrNoEnum.NO.getCode().equals(musicSheet.getState().getCode())) {
             musicSheet.setState(YesOrNoEnum.YES);
@@ -172,14 +172,14 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         musicSheetShareVo.setName(sysUser.getUsername());
         musicSheetShareVo.setAvatar(sysUser.getAvatar());
 
-        String teacherMusicShareUrl= sysConfigService.findConfigValue(SysConfigConstant.TEACHER_MUSIC_SHEET_SHARE_URL);
+        String teacherMusicShareUrl = sysConfigService.findConfigValue(SysConfigConstant.TEACHER_MUSIC_SHEET_SHARE_URL);
         musicSheetShareVo.setUrl(MessageFormatter.arrayFormat(teacherMusicShareUrl, sysUser.getId()));
 
         return musicSheetShareVo;
     }
 
     @Override
-    public MusicSheetDetailVo detail(Long id, SysUser sysUser,SysUserType userType) {
+    public MusicSheetDetailVo detail(Long id, SysUser sysUser,ClientEnum userType) {
         MusicSheetDetailVo detail = baseMapper.detail(id);
         if (detail == null) {
             throw new BizException("未找到曲目信息");
@@ -193,12 +193,18 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         }
         if (ChargeTypeEnum.FREE.getCode().equals(detail.getChargeType().getCode())) {
             detail.setPlay(YesOrNoEnum.YES);
-        }  else if (SysUserType.STUDENT.getCode().equals(userType.getCode())) {
-            setStudentMusicSheet(sysUser.getId(), detail);
+        }  else if (ClientEnum.STUDENT.getCode().equals(userType.getCode())
+                || ClientEnum.TEACHER.getCode().equals(userType.getCode())) {
+            // 2022 7 20  老师也能购买曲目
+            if (ClientEnum.TEACHER.getCode().equals(userType.getCode()) && detail.getUserId().equals(sysUser.getId())) {
+                detail.setPlay(YesOrNoEnum.YES);
+            } else {
+                setMusicSheetPlay(sysUser.getId(), detail,userType);
+            }
         } else {
             detail.setPlay(YesOrNoEnum.YES);
         }
-        if (SysUserType.STUDENT.getCode().equals(userType.getCode())) {
+        if (ClientEnum.STUDENT.getCode().equals(userType.getCode())) {
             // 学生进入小酷Ai练习,添加一条练习记录
             musicSheetPracticeRecordService.addRecord(id, sysUser.getId());
         }
@@ -208,16 +214,18 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     /**
      * 设置学生曲目信息
      *
-     * @param studentId 学生id
+     * 2022 7 20  老师也能购买曲目
+     *  @param studentId 学生id
      * @param detail 曲目详情
+     * @param userType 用户类型
      */
-    private void setStudentMusicSheet(Long studentId, MusicSheetDetailVo detail) {
+    private void setMusicSheetPlay(Long studentId, MusicSheetDetailVo detail, ClientEnum userType) {
         detail.setPlay(YesOrNoEnum.NO);
         // 单曲购买 判断购买记录,有记录课播放
         if (ChargeTypeEnum.CHARGE.getCode().equals(detail.getChargeType().getCode())) {
             // 学生须判断是否能播放曲目
             MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
-                    studentId, detail.getId());
+                    studentId, detail.getId(),userType);
             if (musicSheetPurchaseRecord != null) {
                 detail.setOrderStatus(musicSheetPurchaseRecord.getOrderStatus());
                 detail.setOrderNo(musicSheetPurchaseRecord.getOrderNo());
@@ -225,11 +233,19 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                     detail.setPlay(YesOrNoEnum.YES);
                 }
             }
-        } else if  (ChargeTypeEnum.VIP.getCode().equals(detail.getChargeType().getCode())) {
+        } else if (ChargeTypeEnum.VIP.getCode().equals(detail.getChargeType().getCode())) {
             // 会员 判断是否为会员, 会员可播放
-            StudentVo studentVo = studentService.detail(studentId);
-            if (studentVo != null && YesOrNoEnum.YES.getCode().equals(studentVo.getIsVip().getCode())) {
-                detail.setPlay(YesOrNoEnum.YES);
+            // todo 老师会员判断
+            if (userType.equals(ClientEnum.STUDENT)) {
+                StudentVo studentVo = studentService.detail(studentId);
+                if (studentVo != null && YesOrNoEnum.YES.getCode().equals(studentVo.getIsVip().getCode())) {
+                    detail.setPlay(YesOrNoEnum.YES);
+                }
+            } else if (userType.equals(ClientEnum.TEACHER)) {
+                TeacherVo teacher= teacherService.detail(studentId);
+                if (teacher != null && YesOrNoEnum.YES.getCode().equals(teacher.getIsVip().getCode())) {
+                    detail.setPlay(YesOrNoEnum.YES);
+                }
             }
         }
     }
@@ -272,26 +288,26 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
     @Override
     public IPage<MusicSheetVo> myMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
-        return page.setRecords(baseMapper.selectMyMusicPage(page,query));
+        return page.setRecords(baseMapper.selectMyMusicPage(page, query));
     }
 
     @Override
     public IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
-        return page.setRecords(baseMapper.selectFavoriteMusicPage(page,query));
+        return page.setRecords(baseMapper.selectFavoriteMusicPage(page, query));
     }
 
     @Override
     public IPage<MusicSheetVo> practiceMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
         // 预计最近练习表数据量会很多
         // 先找到最近练习的曲目id 在根据曲目id进行精确查找
-        IPage<Long> practiceMusicIdPage = musicSheetPracticeRecordService.selectPracticeMusic(query,page.getPages(),page.getSize());
+        IPage<Long> practiceMusicIdPage = musicSheetPracticeRecordService.selectPracticeMusic(query, page.getPages(), page.getSize());
         List<Long> practiceMusicIdList = practiceMusicIdPage.getRecords();
         if (CollectionUtils.isEmpty(practiceMusicIdList)) {
             page.setRecords(new ArrayList<>());
             return page;
         }
         // 构建分页信息
-        page.setRecords(baseMapper.selectPracticeMusicPage(query,practiceMusicIdList));
+        page.setRecords(baseMapper.selectPracticeMusicPage(query, practiceMusicIdList));
         page.setPages(practiceMusicIdPage.getPages());
         page.setCurrent(practiceMusicIdPage.getCurrent());
         page.setSize(practiceMusicIdPage.getSize());
@@ -301,17 +317,17 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
     @Override
     public IPage<StudentMusicSheetOrderVo> selectStudentOrderPage(IPage<StudentMusicSheetOrderVo> page, StudentMusicSheetOrderSearch query) {
-        return page.setRecords(baseMapper.selectStudentOrderPage(page,query));
+        return page.setRecords(baseMapper.selectStudentOrderPage(page, query));
     }
 
     @Override
     public IPage<TeacherMusicSheetVo> selectTeacherPage(IPage<TeacherMusicSheetVo> page, TeacherMusicSheetSearch query) {
-        return page.setRecords(baseMapper.selectTeacherPage(page,query));
+        return page.setRecords(baseMapper.selectTeacherPage(page, query));
     }
 
     @Override
     public IPage<TeacherMusicSheetVo> selectAuditPage(IPage<TeacherMusicSheetVo> page, TeacherMusicSheetAuditSearch query) {
-        return page.setRecords(baseMapper.selectAuditPage(page,query));
+        return page.setRecords(baseMapper.selectAuditPage(page, query));
     }
 
     @Override
@@ -320,31 +336,35 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
         MusicSheet musicSheet = this.getById(param.getMusicSheetId());
         if (musicSheet == null) {
-            throw  new BizException("未找到曲目信息");
+            throw new BizException("未找到曲目信息");
         }
         if (!AuthStatusEnum.DOING.getCode().equals(musicSheet.getAuditStatus().getCode())) {
-            throw  new BizException("曲目已经过审批");
+            throw new BizException("曲目已经过审批");
         }
 
         boolean flag = false;
-        if (musicSheetAuthRecordService.audit(param,userId)) {
+        if (musicSheetAuthRecordService.audit(param, userId)) {
             musicSheet.setAuditStatus(param.getAuthStatus());
             musicSheet.setUpdateBy(userId);
             musicSheet.setUpdateTime(new Date());
             if (AuthStatusEnum.PASS.getCode().equals(param.getAuthStatus().getCode())) {
                 musicSheet.setState(YesOrNoEnum.YES);
+
+                // 修改老师标签
+                teacherService.setTeacherTag(musicSheet.getUserId(), TeacherTagEnum.MUSIC);
+
             }
-            flag =  this.updateById(musicSheet);
+            flag = this.updateById(musicSheet);
         }
 
         // 发送审核通知
-        Map<Long,String> receivers = new HashMap<>();
+        Map<Long, String> receivers = new HashMap<>();
         SysUser teacher = sysUserFeignService.queryUserById(musicSheet.getUserId());
         receivers.put(musicSheet.getUserId(), teacher.getPhone());
         try {
             sendMusicSheetAuditMessage(param, musicSheet, receivers);
         } catch (Exception e) {
-            log.warn("曲目审核消息发送失败,{}",e.getMessage());
+            log.warn("曲目审核消息发送失败,{}", e.getMessage());
         }
 
         return flag;
@@ -354,11 +374,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     private void sendMusicSheetAuditMessage(TeacherMusicSheetAuditReq param, MusicSheet musicSheet, Map<Long, String> receivers) {
         if (AuthStatusEnum.PASS.getCode().equals(param.getAuthStatus().getCode())) {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSIC_SHEET_AUTH_PASS,
-                           receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName());
-        } else if (AuthStatusEnum.UNPASS.getCode().equals(param.getAuthStatus().getCode())){
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName());
+        } else if (AuthStatusEnum.UNPASS.getCode().equals(param.getAuthStatus().getCode())) {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSIC_SHEET_AUTH_UNPASS,
-                   receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName(),
-                   param.getRemark());
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName(),
+                    param.getRemark());
         }
     }
 
@@ -377,17 +397,17 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     @Override
     public Integer countTeacherMusicSheet(SysUser sysUser) {
         return this.lambdaQuery()
-                .eq(MusicSheet::getAuditStatus,AuthStatusEnum.PASS)
-                .eq(MusicSheet::getCreateBy,sysUser.getId())
-                .eq(MusicSheet::getState,YesOrNoEnum.YES)
-                .eq(MusicSheet::getDelFlag,YesOrNoEnum.NO)
-                .eq(MusicSheet::getSourceType,SourceTypeEnum.TEACHER.getCode())
+                .eq(MusicSheet::getAuditStatus, AuthStatusEnum.PASS)
+                .eq(MusicSheet::getCreateBy, sysUser.getId())
+                .eq(MusicSheet::getState, YesOrNoEnum.YES)
+                .eq(MusicSheet::getDelFlag, YesOrNoEnum.NO)
+                .eq(MusicSheet::getSourceType, SourceTypeEnum.TEACHER.getCode())
                 .count();
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean saveMusicSheet(MusicSheetDto musicSheetDto,Long userId) {
+    public boolean saveMusicSheet(MusicSheetDto musicSheetDto, Long userId) {
 
         if (musicSheetDto.getId() != null) {
             musicSheetAccompanimentService.delByMusicSheetId(musicSheetDto.getId());
@@ -398,15 +418,15 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         }
 
         // 删除曲目专辑关联
-        delAlbumSheetRef(musicSheetDto.getId(),musicSheetDto.getMusicSubject());
+        delAlbumSheetRef(musicSheetDto.getId(), musicSheetDto.getMusicSubject());
 
         List<MusicSheetAccompaniment> list;
-        if (!AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())){
+        if (!AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())) {
             list = musicSheetDto.getBackground();
-            if (CollectionUtils.isEmpty(list)){
+            if (CollectionUtils.isEmpty(list)) {
                 throw new BizException("mp3音频文件对应的主音或者伴奏文件没有提供");
             }
-            return saveMp3AndAccompaniment(musicSheetDto,userId);
+            return saveMp3AndAccompaniment(musicSheetDto, userId);
         } else {
             MusicSheet musicSheet = new MusicSheet();
             BeanUtils.copyProperties(musicSheetDto, musicSheet);
@@ -425,12 +445,12 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     /**
      * 删除专辑曲目关联
      *
-     * @param id 曲目id
+     * @param id        曲目id
      * @param subjectId 声部id
      */
-    private void delAlbumSheetRef(Long id,String subjectId) {
+    private void delAlbumSheetRef(Long id, String subjectId) {
 
-        if (id == null ) {
+        if (id == null) {
             return;
         }
         MusicSheet musicSheet = this.getById(id);
@@ -458,8 +478,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         }
 
         // 检查已经购买
-        checkoutPay(orderReqInfo.getUserId(),musicSheetPayDto.getMusicSheetId());
-
+        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId(),musicSheetPayDto.getClientType());
 
 
         orderCreateRes.setRes(true);
@@ -469,36 +488,35 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         orderCreateRes.setGoodNum(1);
         orderCreateRes.setOriginalPrice(musicSheet.getMusicPrice());
         orderCreateRes.setExpectPrice(musicSheet.getMusicPrice());
-        return  HttpResponseResult.succeed(orderCreateRes);
+        return HttpResponseResult.succeed(orderCreateRes);
 
     }
 
     /**
      * 检查是否已购买当前曲目
-     *
-     * @param userId 用户id
+     *  @param userId       用户id
      * @param musicSheetId 曲目id
+     * @param clientType
      */
-    private void checkoutPay(Long userId, Long musicSheetId) {
+    private void checkoutPay(Long userId, Long musicSheetId, String clientType) {
         List<MusicSheetPurchaseRecord> list = musicSheetPurchaseRecordService
                 .lambdaQuery()
                 .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
                 .eq(MusicSheetPurchaseRecord::getStudentId, userId)
-                .eq(MusicSheetPurchaseRecord::getOrderStatus,OrderStatusEnum.PAID)
+                .eq(MusicSheetPurchaseRecord::getClientType, clientType)
+                .eq(MusicSheetPurchaseRecord::getOrderStatus, OrderStatusEnum.PAID)
                 .list();
         if (!CollectionUtils.isEmpty(list)) {
-            throw  new BizException("已经购买了当前曲目");
+            throw new BizException("已经购买了当前曲目");
         }
     }
 
     @Override
     @Transactional
     public void buyMusicSheetSuccess(UserOrderDetailVo userOrderDetailVo) {
-
         MusicSheet musicSheet = this.getById(userOrderDetailVo.getBizId());
-
         // 曲目服务费比例
-        String musicSheetServiceFee= sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE);
+        String musicSheetServiceFee = sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE);
         BigDecimal serviceFee = new BigDecimal(musicSheetServiceFee).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
         //支付金额
         BigDecimal actualPrice = userOrderDetailVo.getActualPrice();
@@ -516,17 +534,17 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
         // 消息通知
         try {
-            sendBuyMessage(userOrderDetailVo.getMerchId(),userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId());
-        }catch (Exception e) {
-            log.warn("学生购买曲目消息推送失败 {}",e.getMessage());
+            sendBuyMessage(userOrderDetailVo.getMerchId(), userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId());
+        } catch (Exception e) {
+            log.warn("学生购买曲目消息推送失败 {}", e.getMessage());
         }
     }
 
     /**
      * 发送购买消息通知
      *
-     * @param teacherId 老师id
-     * @param studentId 学生id
+     * @param teacherId    老师id
+     * @param studentId    学生id
      * @param musicSheetId 曲目id
      */
     @Override
@@ -535,35 +553,35 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         SysUser teacher = sysUserFeignService.queryUserById(teacherId);
         SysUser student = sysUserFeignService.queryUserById(studentId);
         if (StringUtil.isEmpty(teacher.getPhone())) {
-            log.warn("teacher id {} name {} 手机号不存在,消息推送失败",teacher.getId(),teacher.getUsername());
+            log.warn("teacher id {} name {} 手机号不存在,消息推送失败", teacher.getId(), teacher.getUsername());
         }
 
         MusicSheet musicSheet = this.getById(musicSheetId);
         // 推送老师
-        Map<Long,String> teacherReceivers = new HashMap<>();
+        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());
+                MessageTypeEnum.STUDENT_BUY_TEACHER_MUSIC_SHEET, teacherReceivers, null,
+                0, null, ClientEnum.TEACHER.getCode(), student.getUsername(), musicSheet.getMusicSheetName());
 
         // 推送学生
-        Map<Long,String> studentReceivers = new HashMap<>();
+        Map<Long, String> studentReceivers = new HashMap<>();
         studentReceivers.put(studentId, student.getPhone());
 
 
         String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS.getCode());
 
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-                                           MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS, studentReceivers, null,
-                                           0, url,ClientEnum.STUDENT.getCode(),musicSheet.getMusicSheetName());
+                MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS, studentReceivers, null,
+                0, url, ClientEnum.STUDENT.getCode(), musicSheet.getMusicSheetName());
         // 推送学生
-        Map<Long,String> studentSMS = new HashMap<>();
+        Map<Long, String> studentSMS = new HashMap<>();
         studentSMS.put(studentId, student.getPhone());
         // 推送短信
         url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS.getCode());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS,
-        studentSMS,null,0,url,null,musicSheet.getMusicSheetName());
+                studentSMS, null, 0, url, null, musicSheet.getMusicSheetName());
 
         return true;
     }
@@ -572,15 +590,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
      * 保存购买记录
      *
      * @param userOrderDetailVo 订单信息
-     * @param actualPrice  付款价格
-     * @param serviceFeeAmount 服务费
+     * @param actualPrice       付款价格
+     * @param serviceFeeAmount  服务费
      */
     private void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount) {
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId());
+                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(),userOrderDetailVo.getOrderClient());
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
+        musicSheetPurchaseRecord.setClientType(userOrderDetailVo.getOrderClient());
         musicSheetPurchaseRecord.setMusicSheetId(userOrderDetailVo.getBizId());
         musicSheetPurchaseRecord.setOrderNo(userOrderDetailVo.getOrderNo());
         musicSheetPurchaseRecord.setPurchasePrice(actualPrice);
@@ -597,23 +616,46 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
      * 添加金额到老师账户
      *
      * @param userOrderDetailVo 订单信息
-     * @param actualPrice 付款价格
-     * @param serviceFeeAmount 服务费
-     * @param musicSheetId 曲目id
+     * @param actualPrice       付款价格
+     * @param serviceFeeAmount  服务费
+     * @param musicSheetId      曲目id
      */
     private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount,
                                    Long musicSheetId) {
-        UserAccountRecordDto userAccountRecordDto = new UserAccountRecordDto();
-        userAccountRecordDto.setUserId(userOrderDetailVo.getMerchId());
-        userAccountRecordDto.setFrozenType(FrozenTypeEnum.NONE);
 
-        userAccountRecordDto.setTransAmount(actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP));
-        userAccountRecordDto.setInOrOut(InOrOutEnum.IN);
-        userAccountRecordDto.setBizType(AccountBizTypeEnum.MUSIC);
-        userAccountRecordDto.setBizId(musicSheetId);
-        userAccountRecordDto.setBizName(userOrderDetailVo.getGoodName());
-        userAccountRecordDto.setOrderNo(userOrderDetailVo.getOrderNo());
-        userAccountService.accountChange(userAccountRecordDto);
+        BigDecimal transAmount = actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
+
+        //插入老师账户变更记录
+        HttpResponseResult<UserAccountRecord> recordRes = userAccountService.accountRecord(
+                new UserAccountRecordDto(userOrderDetailVo.getMerchId(), PostStatusEnum.WAIT, transAmount, InOrOutEnum.IN,
+                        AccountBizTypeEnum.MUSIC, musicSheetId, userOrderDetailVo.getGoodName(), userOrderDetailVo.getOrderNo()));
+
+        if (recordRes.getStatus()) {
+            userAccountService.accountChange(recordRes.getData().getId(), PostStatusEnum.RECORDED);
+        }
+
+        //todo 插入平台实收
+
+        //判断是否分润
+        if (null != userOrderDetailVo.getRecomUserId()) {
+            // 分润比例
+            BigDecimal shareFeeRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+
+            //分润金额
+            BigDecimal shareFee = serviceFeeAmount.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
+
+            //插入分润老师账户变更记录
+            HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
+                    new UserAccountRecordDto(userOrderDetailVo.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
+                            AccountBizTypeEnum.MUSIC_SHARE, musicSheetId, userOrderDetailVo.getGoodName(), userOrderDetailVo.getOrderNo()));
+
+            if (recomRecordRes.getStatus()) {
+                userAccountService.accountChange(recomRecordRes.getData().getId(), PostStatusEnum.RECORDED);
+            }
+
+            //todo 插入平台分润支出
+        }
     }
 
     @Override
@@ -621,7 +663,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     public void orderAfterSheet(UserOrderDetailVo userOrderDetailVo) {
         // 保存购买记录
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId());
+                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId(),userOrderDetailVo.getOrderClient());
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
@@ -638,7 +680,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     @Transactional(rollbackFor = Exception.class)
     public void buyMusicSheetCancel(UserOrderDetailVo userOrderDetailVo) {
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId());
+                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId(),userOrderDetailVo.getOrderClient());
+
         if (musicSheetPurchaseRecord == null) return;
         musicSheetPurchaseRecordService.removeById(musicSheetPurchaseRecord.getId());
     }
@@ -688,9 +731,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                 continue;
             }
             MusicSheetExport sheetExport = readerProperty.getClazz();
-            BeanUtils.copyProperties(sheetExport,musicSheetDto);
+            BeanUtils.copyProperties(sheetExport, musicSheetDto);
 
-            if(AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())) {
+            if (AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())) {
                 musicSheetDto.setMp3Type(null);
             }
 
@@ -703,7 +746,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
             StringBuilder musicTagIds = new StringBuilder();
             if (musicTags == null || musicTags.equals("")) {
                 errMsgList.add(new ErrMsg(readerProperty.getRowIndex(), "曲目标签不能为空"));
-            }  else {
+            } else {
                 String[] stringList = musicTags.split("[,,]");
                 List<MusicTag> childrenMusicTag = new ArrayList<>();
                 for (MusicTagVo musicTagVo : musicTagVoList) {
@@ -739,8 +782,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                     childrenSubject.addAll(subject.getSubjects());
                 }
                 List<Subject> collect = childrenSubject.stream()
-                       .filter(subject -> subject.getName().equals(sheetExport.getMusicSubjects()))
-                       .collect(Collectors.toList());
+                        .filter(subject -> subject.getName().equals(sheetExport.getMusicSubjects()))
+                        .collect(Collectors.toList());
                 if (CollectionUtils.isEmpty(collect)) {
                     errMsgList.add(new ErrMsg(readerProperty.getRowIndex(), "曲目声部名错误:" + sheetExport.getMusicSubjects()));
                 } else {
@@ -764,11 +807,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
             musicSheetDtoList.add(musicSheetDto);
         }
 
-        if(!CollectionUtils.isEmpty(errMsgList)) {
+        if (!CollectionUtils.isEmpty(errMsgList)) {
             throw new ExcelException("导入异常", errMsgList);
         }
 
-        musicSheetDtoList.forEach(musicSheetDto -> saveMusicSheet(musicSheetDto,userId));
+        musicSheetDtoList.forEach(musicSheetDto -> saveMusicSheet(musicSheetDto, userId));
 
     }
 
@@ -776,7 +819,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     public MusicSheetWebsiteDetailVo websiteDetail(Long musicSheetId, SysUser sysUser) {
         MusicSheetDetailVo detail = detail(musicSheetId, null, null);
         MusicSheetWebsiteDetailVo musicSheetWebsiteDetailVo = new MusicSheetWebsiteDetailVo();
-        BeanUtils.copyProperties(detail,musicSheetWebsiteDetailVo);
+        BeanUtils.copyProperties(detail, musicSheetWebsiteDetailVo);
 
         // 曲目收藏数
         long musicSheetFavoriteNum = musicFavoriteService.getMusicSheetFavoriteNum(musicSheetId);
@@ -834,9 +877,24 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         return baseMapper.queryStudentTotal(userId);
     }
 
+    @Override
+    public ShareProfitVo shareMusicSheetProfit(SysUser sysUser, Long musicSheetId) {
+        ShareProfitVo result = new ShareProfitVo();
+        MusicSheetDetailVo musicSheet = detail(musicSheetId,null,null);
+
+        result.setTeacherId(sysUser.getId());
+        result.setType("MUSIC");
+        result.setMusicSheet(musicSheet);
+        result.setAvatar(sysUser.getAvatar());
+        result.setName(sysUser.getUsername());
+        String teacherMusicShareProfitUrl= sysConfigService.findConfigValue(SysConfigConstant.TEACHER_MUSIC_SHEET_SHARE_PROFIT_URL);
+        result.setUrl(MessageFormatter.arrayFormat(teacherMusicShareProfitUrl,musicSheetId, sysUser.getId()));
+        return result;
+    }
+
     private SysUser getSysUser(Long userId) {
         return Optional.ofNullable(userId)
-                       .map(sysUserFeignService::queryUserById)
-                       .orElseThrow(() -> new BizException("用户不存在"));
+                .map(sysUserFeignService::queryUserById)
+                .orElseThrow(() -> new BizException("用户不存在"));
     }
 }

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

@@ -0,0 +1,29 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.PlatformCashAccountRecordDao;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.service.PlatformCashAccountRecordService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * 平台账户流水表(PlatformCashAccountRecord)表服务实现类
+ *
+ * @author zx
+ * @since 2022-07-21 10:32:07
+ */
+@Service("platformCashAccountRecordService")
+public class PlatformCashAccountRecordServiceImpl extends ServiceImpl<PlatformCashAccountRecordDao, PlatformCashAccountRecord> implements PlatformCashAccountRecordService {
+
+    private final static Logger log = LoggerFactory.getLogger(PlatformCashAccountRecordServiceImpl.class);
+
+    @Override
+    public PlatformCashAccountRecordDao getDao() {
+        return this.baseMapper;
+    }
+
+}
+

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.api.feign.MallAdminFeignService;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderDetailService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
@@ -43,6 +44,7 @@ public class StudentTimeServiceImpl extends ServiceImpl<StudentTimeDao, StudentT
         LocalDate toDay = LocalDate.now();
         //查询未记录第一次购买时间的订单
         OrderSearch query = new OrderSearch();
+        query.setOrderClient(ClientEnum.STUDENT.getCode());
         query.setStartTime(LocalDateTime.of(toDay, LocalTime.MIN));
         query.setEndTime(LocalDateTime.of(toDay, LocalTime.MAX));
 

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

@@ -180,6 +180,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             teacher.setLiveDate(new Date());
             teacher.setUpdateTime(new Date());
             baseMapper.updateById(teacher);
+
+            // 添加标签
+            this.setTeacherTag(id,TeacherTagEnum.LIVE);
+
             return HttpResponseResult.status(true);
         } else {
             return HttpResponseResult.failed("不满足开通条件");
@@ -430,4 +434,21 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         return page.setRecords(teacherVos);
     }
 
+    @Override
+    public void setTeacherTag(Long userId, TeacherTagEnum teacherTagEnum) {
+        TeacherVo teacherVo = this.detail(userId);
+        if (teacherVo == null) {
+            return;
+        }
+        if (StringUtil.isEmpty(teacherVo.getTag())) {
+            teacherVo.setTag(teacherTagEnum.getCode());
+        } else  if (teacherVo.getTag().contains(teacherTagEnum.getCode())) {
+            return;
+        } else {
+            teacherVo.setTag(teacherVo.getTag() + "," + teacherTagEnum.getCode());
+        }
+
+        this.updateById(teacherVo);
+    }
+
 }

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

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

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

@@ -1,11 +1,17 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -21,6 +27,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;
@@ -34,22 +41,46 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
     @Autowired
     private SysMessageService sysMessageService;
 
-	@Override
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+
+    @Override
     public UserAccountRecordVo detail(Long id) {
         UserAccountRecordVo detail = baseMapper.detail(id);
         return detail;
     }
-    
-     @Override
-    public IPage<UserAccountRecordVo> selectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query){
+
+    @Override
+    public UserAccountRecordVo detail(String orderNo, AccountBizTypeEnum bizType, Long bizId) {
+        UserAccountRecordVo detail = baseMapper.detailByBiz(orderNo,bizType,bizId);
+        return detail;
+    }
+
+    @Override
+    public IPage<UserAccountRecordVo> selectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
 
     @Override
-    public BigDecimal getMonthDecimal(Long userId) {
+    public List<UserAccountRecordVo> selectAllPage(UserAccountRecordSearch query) {
+        return baseMapper.selectAllPage(query);
+    }
+
+    @Override
+    public UserAccountRecordVo appDetail(Long id){
+        UserAccountRecordVo detail = baseMapper.appDetail(id);
+        return detail;
+    }
 
-        return baseMapper.selectMonthDecimal(userId);
 
+    @Override
+    public IPage<UserAccountRecordVo> appSelectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query) {
+        return page.setRecords(baseMapper.appSelectPage(page, query));
+    }
+
+    @Override
+    public BigDecimal getMonthDecimal(Long userId) {
+        return baseMapper.selectMonthDecimal(userId);
     }
 
     @Override
@@ -65,12 +96,37 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
             String dateString = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
             try {
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.COURSE_SETTLEMENT,
-                                                   receivers, null, 0, url, ClientEnum.TEACHER.getCode(), dateString);
+                        receivers, null, 0, url, ClientEnum.TEACHER.getCode(), dateString);
                 log.info(" COURSE_SETTLEMENT ok");
             } catch (Exception e) {
-                log.warn("老师课酬结算消息推送失败,{}",e.getMessage());
+                log.warn("老师课酬结算消息推送失败,{}", e.getMessage());
             }
         }
     }
 
+
+    @Override
+    public List<UserAccountRecord> selectRecordByOrderDetail(UserOrderDetailVo userOrderDetailVo) {
+        //todo 这里需要测试
+        //订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)
+        //获取业务id
+        List<Long> bizIds = new ArrayList<>();
+        if (GoodTypeEnum.VIP.equals(userOrderDetailVo.getGoodType())
+                || GoodTypeEnum.VIDEO.equals(userOrderDetailVo.getGoodType())
+                || GoodTypeEnum.MUSIC.equals(userOrderDetailVo.getGoodType())) {
+            bizIds.add(userOrderDetailVo.getBizId());
+        } else if (GoodTypeEnum.PRACTICE.equals(userOrderDetailVo.getGoodType()) || GoodTypeEnum.LIVE.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()));
+        }
+        if (CollectionUtils.isEmpty(bizIds)) {
+            return new ArrayList<>();
+        }
+        return baseMapper.selectRecordByOrderDetail(userOrderDetailVo, bizIds);
+    }
+
 }

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

@@ -10,12 +10,14 @@ import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.FrozenTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
 import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.util.DistributedLock;
 import org.redisson.api.RLock;
@@ -33,6 +35,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.*;
@@ -64,27 +67,122 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     }
 
     @Override
-    public HttpResponseResult<UserAccountRecord> accountChange(UserAccountRecordDto accountRecordDto) {
-        if (null == accountRecordDto.getUserId() || null == accountRecordDto.getTransAmount()
-                || null == accountRecordDto.getInOrOut() || null == accountRecordDto.getBizType()) {
-            return HttpResponseResult.failed("缺少参数");
+    public HttpResponseResult<UserAccountRecord> accountRecord(UserAccountRecordDto accountRecordDto) {
+        if (null == accountRecordDto.getInOrOut()
+                || null == accountRecordDto.getPostStatus()
+                || (!PostStatusEnum.WAIT.equals(accountRecordDto.getPostStatus()) && !PostStatusEnum.FROZEN.equals(accountRecordDto.getPostStatus()))
+        ) {
+            throw new BizException("记录入账-入账状态异常: param is {}", JSONObject.toJSONString(accountRecordDto));
         }
 
-        try {
-            HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
-                    .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(accountRecordDto.getUserId())
-                            , this::doAccountChange, accountRecordDto, 10L);
-            if (null != res) {
-                return res;
-            } else {
-                return HttpResponseResult.failed("账户变更失败");
+        if (null == accountRecordDto.getTransAmount() || null == accountRecordDto.getBizId()
+                || null == accountRecordDto.getBizType()) {
+            throw new BizException("记录入账-缺少入账参数: param is {}", JSONObject.toJSONString(accountRecordDto));
+        }
+        if (BigDecimal.ZERO.compareTo(accountRecordDto.getTransAmount()) > 0) {
+            throw new BizException("记录入账-变动金额不能为负数: param is {}", JSONObject.toJSONString(accountRecordDto));
+        }
+
+        HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
+                .runIfLockToFunction(CacheNameEnum.LOCK_RECORD_ACCOUNT.getRedisKey(accountRecordDto.getAccountId())
+                        , this::doAccountRecord, accountRecordDto, 10L);
+        if (null != res) {
+            return res;
+        } else {
+            throw new BizException("记录入账-插入账户记录失败: param is {}", JSONObject.toJSONString(accountRecordDto));
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    HttpResponseResult<UserAccountRecord> doAccountRecord(UserAccountRecordDto accountRecordDto) {
+        //收入要校验金额
+        if (InOrOutEnum.IN.equals(accountRecordDto.getInOrOut())) {
+            UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
+                    .eq(UserOrder::getOrderNo, accountRecordDto.getOrderNo()));
+            if (null == userOrder) {
+                throw new BizException("记录入账-未找到入账对应订单信息: param is {}", JSONObject.toJSONString(accountRecordDto));
             }
-        } catch (BizException e) {
-            return HttpResponseResult.failed(e.getMessage());
-        } catch (Exception e) {
-            e.printStackTrace();
-            return HttpResponseResult.failed("付款失败");
+            //收入判断订单金额,所有收入不能大于订单用户付款
+            BigDecimal totalTransAmount = baseMapper.totalTransAmount(accountRecordDto);
+            if (null == totalTransAmount) {
+                totalTransAmount = BigDecimal.ZERO;
+            }
+            //金额校验失败
+            if (null == userOrder || totalTransAmount.add(accountRecordDto.getTransAmount()).compareTo(userOrder.getActualPrice()) > 0) {
+                log.error("记录入账-订单入账总金额大于购买金额: param is {}" + JSONObject.toJSONString(accountRecordDto));
+                accountRecordDto.setErrFlag(1);
+                accountRecordDto.setErrMsg("账户变更异常,订单入账总金额大于购买金额,订单号:" + accountRecordDto.getOrderNo());
+            }
+        } else {
+            //支出 需要判断所有支出金额不能大于账户余额
+            UserAccountVo detail = baseMapper.detail(accountRecordDto.getAccountId());
+            if (detail.getAmountUsable().compareTo(accountRecordDto.getTransAmount()) < 0) {
+                throw new BizException("记录入账-账户余额不足: param is {}", JSONObject.toJSONString(accountRecordDto));
+            }
+        }
+        //如果是冻结入账,需要修改主账户冻结金额和可用余额
+        if (PostStatusEnum.FROZEN.equals(accountRecordDto.getPostStatus()) && accountRecordDto.getErrFlag() == 0) {
+            baseMapper.frozenChangeAccount(accountRecordDto.getAccountId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         }
+        //插入账户变更记录
+        userAccountRecordService.save(accountRecordDto);
+        return HttpResponseResult.succeed(accountRecordDto);
+    }
+
+    @Override
+    public HttpResponseResult<UserAccountRecord> accountChange(Long recordId, PostStatusEnum postStatus) {
+        if (null == postStatus || null == recordId
+                || (!PostStatusEnum.RECORDED.equals(postStatus) && !PostStatusEnum.CANCEL.equals(postStatus))) {
+            throw new BizException("入账状态变更, 参数异常: recordId is {} postStatus is {}", recordId, postStatus.getCode());
+        }
+        UserAccountRecord param = new UserAccountRecord();
+        param.setId(recordId);
+        param.setPostStatus(postStatus);
+        HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
+                .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(recordId)
+                        , this::doAccountChange, param, 10L);
+        if (null != res) {
+            return res;
+        } else {
+            throw new BizException("记录变更-账户记录变更失败: param is {}", JSONObject.toJSONString(param));
+        }
+    }
+
+    @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());
+        }
+        detail.setPostStatus(param.getPostStatus());
+        //待入账
+        if (PostStatusEnum.WAIT.equals(detail.getPostStatus())) {
+            if (PostStatusEnum.RECORDED.equals(param.getPostStatus())) {
+                //正常入账
+                baseMapper.changeAccount(detail.getAccountId(), detail.getTransAmount(), detail.getInOrOut().getCode());
+            } else if (PostStatusEnum.CANCEL.equals(param.getPostStatus())) {
+                //取消入账
+            }
+        } else if (PostStatusEnum.FROZEN.equals(detail.getPostStatus())) {
+            if (PostStatusEnum.RECORDED.equals(param.getPostStatus())) {
+                //冻结后正常入账
+                baseMapper.frozenDeductChangeAccount(detail.getAccountId(), detail.getTransAmount(), detail.getInOrOut().getCode());
+            } else if (PostStatusEnum.CANCEL.equals(param.getPostStatus())) {
+                //冻结后取消入账
+                baseMapper.frozenBackChangeAccount(detail.getAccountId(), detail.getTransAmount(), detail.getInOrOut().getCode());
+            }
+        }
+
+        UserAccountVo accountVo = detail(detail.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);
     }
 
     @Override
@@ -95,87 +193,91 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         BigDecimal liveAmount = BigDecimal.ZERO;
         BigDecimal videoAmount = BigDecimal.ZERO;
         BigDecimal musicAmount = BigDecimal.ZERO;
+        BigDecimal liveShareAmount = BigDecimal.ZERO;
+        BigDecimal videoShareAmount = BigDecimal.ZERO;
+        BigDecimal musicShareAmount = BigDecimal.ZERO;
+        BigDecimal vipShareAmount = BigDecimal.ZERO;
+        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());
+
             practiceAmount = practiceAmount.add(info.getPracticeAmount());
             liveAmount = liveAmount.add(info.getLiveAmount());
             videoAmount = videoAmount.add(info.getVideoAmount());
             musicAmount = musicAmount.add(info.getMusicAmount());
+
+            liveShareAmount = liveShareAmount.add(info.getLiveShareAmount());
+            videoShareAmount = videoShareAmount.add(info.getVideoShareAmount());
+            musicShareAmount = musicShareAmount.add(info.getMusicShareAmount());
+            vipShareAmount = vipShareAmount.add(info.getVipShareAmount());
+            mallShareAmount = mallShareAmount.add(info.getMallShareAmount());
         }
         AccountTotal total = new AccountTotal();
 
-        total.setTotalInAmount(practiceAmount.add(liveAmount).add(videoAmount).add(musicAmount));
+        total.setTotalInAmount(
+                practiceAmount.add(liveAmount).add(videoAmount).add(musicAmount)
+                        .add(liveShareAmount).add(videoShareAmount).add(musicShareAmount)
+                        .add(vipShareAmount).add(mallShareAmount)
+        );
         if (total.getTotalInAmount().doubleValue() > 0) {
             total.setPracticeAmount(practiceAmount);
-            BigDecimal practiceRate = total.getPracticeAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-            total.setPracticeRate(practiceRate);
+            total.setPracticeRate(total.getPracticeAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100")));
 
             total.setLiveAmount(liveAmount);
-            BigDecimal liveRate = total.getLiveAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-            total.setLiveRate(liveRate);
+            total.setLiveRate(total.getLiveAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100")));
 
             total.setVideoAmount(videoAmount);
-            BigDecimal videoRate = total.getVideoAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-            total.setVideoRate(videoRate);
+            total.setVideoRate(total.getVideoAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100")));
 
             total.setMusicAmount(musicAmount);
-            BigDecimal musicRate = total.getMusicAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-            total.setMusicRate(musicRate);
-        }
-        total.setInfoList(infoList);
-        return HttpResponseResult.succeed(total);
-    }
+            total.setMusicRate(total.getMusicAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100")));
 
-    @Transactional(rollbackFor = Exception.class)
-    HttpResponseResult<UserAccountRecord> doAccountChange(UserAccountRecordDto accountRecordDto) {
-        //收入要校验金额
-        if (InOrOutEnum.IN.equals(accountRecordDto.getInOrOut())) {
-            UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
-                    .eq(UserOrder::getOrderNo, accountRecordDto.getOrderNo()));
+            total.setLiveShareAmount(liveShareAmount);
+            total.setLiveShareRate(total.getLiveShareAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100")));
 
-            BigDecimal totalTransAmount = baseMapper.totalTransAmount(accountRecordDto);
-            if (null == totalTransAmount) {
-                totalTransAmount = BigDecimal.ZERO;
-            }
-            //金额校验失败,入账为冻结金额
-            if (null == userOrder || totalTransAmount.add(accountRecordDto.getTransAmount()).compareTo(userOrder.getActualPrice()) > 0) {
-                log.error("账户变更失败,param is " + JSONObject.toJSONString(accountRecordDto));
-                accountRecordDto.setErrFlag(1);
-                accountRecordDto.setErrMsg("账户变更异常,订单入账总金额大于购买金额,订单号:" + accountRecordDto.getOrderNo());
-            }
-        }
-        if (accountRecordDto.getErrFlag() == 0) {
-            if (FrozenTypeEnum.FROZEN.equals(accountRecordDto.getFrozenType())) {
-                baseMapper.frozenChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
-            } else if (FrozenTypeEnum.FROZEN_DEDUCT.equals(accountRecordDto.getFrozenType())) {
-                baseMapper.frozenDeductChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
-            } else if (FrozenTypeEnum.FROZEN_BACK.equals(accountRecordDto.getFrozenType())) {
-                baseMapper.frozenBackChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
-            } else {
-                baseMapper.changeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
-            }
-        }
+            total.setVideoShareAmount(videoShareAmount);
+            total.setVideoShareRate(total.getVideoShareAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100")));
 
-        UserAccountVo detail = detail(accountRecordDto.getUserId());
-        if (detail.getAmountTotal().doubleValue() < 0
-                || detail.getAmountUsable().doubleValue() < 0 || detail.getAmountFrozen().doubleValue() < 0) {
-            throw new BizException("账户变更失败");
-        }
+            total.setMusicShareAmount(musicShareAmount);
+            total.setMusicShareRate(total.getMusicShareAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100")));
 
-        if (accountRecordDto.getSaveRecord()) {
-            //插入账户变更记录
-            accountRecordDto.setAccountId(accountRecordDto.getUserId());
-            accountRecordDto.setAccountBalance(detail.getAmountUsable());
-            userAccountRecordService.save(accountRecordDto);
+            total.setVipShareAmount(vipShareAmount);
+            total.setVipShareRate(total.getVipShareAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100")));
+
+            total.setMallShareAmount(mallShareAmount);
+            total.setMallShareRate(total.getMallShareAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100")));
         }
-        return HttpResponseResult.succeed(accountRecordDto);
+        total.setInfoList(infoList);
+        return HttpResponseResult.succeed(total);
     }
+
+
 }

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

@@ -11,10 +11,8 @@ import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 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.UserOrderDetail;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
+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;
@@ -24,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
@@ -66,6 +65,10 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     private IdGeneratorService idGeneratorService;
     @Autowired
     private PaymentClient paymentClient;
+    @Autowired
+    private UserAccountService userAccountService;
+    @Autowired
+    private UserAccountRecordService userAccountRecordService;
 
     //验证是否可以退款,获取退款金额信息
     private static final Map<GoodTypeEnum, Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>>> refundCreate = new HashMap<>();
@@ -122,7 +125,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         if (CollectionUtils.isEmpty(refundReq.getOredrDetilIds())) {
             //查询订单下未退款的所有详情订单
             List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(detail.getId());
-            if(CollectionUtils.isEmpty(orderDetails)){
+            if (CollectionUtils.isEmpty(orderDetails)) {
                 return HttpResponseResult.failed("订单中没有可退款商品");
             }
             refundReq.setOredrDetilIds(orderDetails.stream().map(UserOrderDetail::getId).collect(Collectors.toList()));
@@ -236,7 +239,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         }
         //查询订单下未退款的所有详情订单
         List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(detail.getId());
-        if(CollectionUtils.isEmpty(orderDetails)){
+        if (CollectionUtils.isEmpty(orderDetails)) {
             return HttpResponseResult.failed("订单中没有可退款商品");
         }
 
@@ -509,8 +512,28 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                 if (!Objects.isNull(refundAfterConsumer)) {
                     refundAfterConsumer.accept(vo);
                 }
+                accountHandle(vo);
+            }
+
+
+        }
+    }
+
+    /**
+     * 处理退款后账户
+     *
+     * @param vo
+     */
+    private void accountHandle(UserOrderDetailVo vo) {
+        List<UserAccountRecord> dataList = userAccountRecordService.selectRecordByOrderDetail(vo);
+        for (UserAccountRecord userAccountRecord : dataList) {
+            if (PostStatusEnum.WAIT.equals(userAccountRecord.getPostStatus())
+                    || PostStatusEnum.FROZEN.equals(userAccountRecord.getPostStatus())) {
+                userAccountService.accountChange(userAccountRecord.getId(), PostStatusEnum.CANCEL);
             }
         }
+
+        //todo 处理平台入账
     }
 
     /**

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

@@ -256,6 +256,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //订单号生成
         Long orderNo = idGeneratorService.generatorId("orderNo");
         orderReq.setOrderNo(Long.toString(orderNo));
+
+        //分润人为自己,不是分润订单
+        if(null != orderReq.getRecomUserId() && orderReq.getUserId().equals(orderReq.getRecomUserId())){
+            orderReq.setRecomUserId(null);
+        }
+
         //验证参数,必须验证参数
         BigDecimal actualPrice = BigDecimal.ZERO;
         for (OrderReq.OrderReqInfo info : orderReq.getOrderInfos()) {
@@ -266,8 +272,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             info.setOrderNo(orderReq.getOrderNo());
             Long subOrderNo = idGeneratorService.generatorId("subOrderNo");
             info.setSubOrderNo(Long.toString(subOrderNo));
-
             info.setUserId(orderReq.getUserId());
+            info.setRecomUserId(orderReq.getRecomUserId());
+
             HttpResponseResult<OrderCreateRes> createResult = createFunction.apply(info);
             OrderCreateRes createRes = createResult.getData();
             if (!createResult.getStatus() || null == createRes || !createRes.getRes()) {
@@ -298,6 +305,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(orderReq.getUserId());
             orderDetailVo.setOrderId(orderVo.getId());
+            orderDetailVo.setRecomUserId(orderReq.getRecomUserId());
 
             Consumer<UserOrderDetailVo> afterFunction = orderAfter.get(orderDetailVo.getGoodType());
             if (!Objects.isNull(afterFunction)) {
@@ -515,6 +523,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         userOrder.setUserId(orderReq.getUserId());
         userOrder.setOrderName(orderReq.getOrderName());
         userOrder.setOrderType(orderReq.getOrderType());
+        userOrder.setOrderClient(orderReq.getOrderClient());
+        userOrder.setRecomUserId(orderReq.getRecomUserId());
 
         String desc = "";
         if (StringUtil.isEmpty(orderReq.getOrderDesc())) {
@@ -752,6 +762,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(detail.getUserId());
             orderDetailVo.setOrderId(detail.getId());
+            orderDetailVo.setRecomUserId(detail.getRecomUserId());
             //调用业务
             Consumer<UserOrderDetailVo> userOrderVoConsumer = orderSuccess.get(orderDetailVo.getGoodType());
             if (!Objects.isNull(userOrderVoConsumer)) {

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

@@ -11,6 +11,8 @@ import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -67,6 +69,8 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     private IdGeneratorService idGeneratorService;
     @Autowired
     private RedissonClient redissonClient;
+    @Autowired
+    private UserAccountRecordService accountRecordService;
 
     @Override
     public UserWithdrawalVo detail(Long id) {
@@ -159,13 +163,10 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         //插入用户结算表
         UserWithdrawal userWithdrawal = insertUserWithdrawal(user.getId(), withdrawalReq, bankCardVo, withdrawalServiceFee, withdrawalAuthSwitch, withdrawalAuthFee);
         //插入账户变更
-        UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                user.getId(), withdrawalReq.getAmountWithdrawal(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
+        HttpResponseResult<UserAccountRecord> accountChange = userAccountService.accountRecord(new UserAccountRecordDto(user.getId(), PostStatusEnum.FROZEN,
+                withdrawalReq.getAmountWithdrawal(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
                 userWithdrawal.getId(), "老师结算", null
-        );
-        accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN);
-        accountRecordDto.setSaveRecord(false);
-        HttpResponseResult<UserAccountRecord> accountChange = userAccountService.accountChange(accountRecordDto);
+        ));
 
         if (accountChange.getStatus()) {
             if (YesOrNoEnum.NO.getCode().toString().equals(withdrawalAuthSwitch)
@@ -198,7 +199,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         List<Long> ids = Arrays.asList(StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId()));
 
         //先判断三方余额是否充足
-        if(authOperaReq.getPass()){
+        if (authOperaReq.getPass()) {
             List<UserWithdrawal> userWithdrawals = baseMapper.selectList(Wrappers.<UserWithdrawal>lambdaQuery()
                     .in(UserWithdrawal::getId, ids)
                     .eq(UserWithdrawal::getAuthStatus, AuthStatusEnum.DOING));
@@ -277,24 +278,13 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
                 build.setErrorMsg(withdraw.getMsg());
                 res = HttpResponseResult.failed("结算" + authOperaReq.getId() + "失败,失败原因:" + withdraw.getMsg());
 
-                //审核不通过,账户解冻
-                UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                        build.getUserId(), build.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
-                        build.getId(), "老师结算", null
-                );
-                accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
-                accountRecordDto.setSaveRecord(false);
-                userAccountService.accountChange(accountRecordDto);
+                UserAccountRecordVo detail = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, Long.parseLong(authOperaReq.getId()));
+                userAccountService.accountChange(detail.getId(),PostStatusEnum.CANCEL);
             }
         } else {
             //审核不通过,账户解冻
-            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                    build.getUserId(), build.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
-                    build.getId(), "老师结算", null
-            );
-            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
-            accountRecordDto.setSaveRecord(false);
-            userAccountService.accountChange(accountRecordDto);
+            UserAccountRecordVo detail = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, Long.parseLong(authOperaReq.getId()));
+            userAccountService.accountChange(detail.getId(),PostStatusEnum.CANCEL);
 
             //发生审核未通过通知
             unpassSend(build.getUserId(), build.getPhone(), authOperaReq.getReason());
@@ -366,13 +356,8 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             detail.setTransferTime(callback.getEndTime());
 
             //结算成功,账户解冻,入账户明细
-            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                    detail.getUserId(), detail.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
-                    detail.getId(), "老师结算", null
-            );
-            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_DEDUCT);
-            accountRecordDto.setSaveRecord(true);
-            userAccountService.accountChange(accountRecordDto);
+            UserAccountRecordVo recordVo = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, detail.getId());
+            userAccountService.accountChange(recordVo.getId(),PostStatusEnum.RECORDED);
             //发生结算成功通知
             successSend(detail.getUserId(), detail.getPhone());
         } else if ("2".equals(callback.getStatus())) {
@@ -382,14 +367,9 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             detail.setErrorCode(callback.getErrorCode());
             detail.setErrorMsg(callback.getErrorMsg());
 
-            //审核不通过,账户解冻
-            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                    detail.getUserId(), detail.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
-                    detail.getId(), "老师结算", null
-            );
-            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
-            accountRecordDto.setSaveRecord(false);
-            userAccountService.accountChange(accountRecordDto);
+            //结算失败,账户解冻
+            UserAccountRecordVo recordVo = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, detail.getId());
+            userAccountService.accountChange(recordVo.getId(),PostStatusEnum.CANCEL);
 
             //发生结算失败通知
             unpassSend(detail.getUserId(), detail.getPhone(), callback.getErrorMsg());

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

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

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

@@ -20,6 +20,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.obj.ObjectUtil;
@@ -128,7 +129,6 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
     public void buyVideoCourseSuccess(UserOrderDetailVo orderParam) {
         log.info("buyVideoCourseSuccess  param:{}", JSON.toJSONString(orderParam));
         String orderNo = orderParam.getOrderNo();
-
         VideoLessonPurchaseRecord purchaseRecord = videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
                 .eq(VideoLessonPurchaseRecord::getOrderNo, orderNo));
         if (purchaseRecord == null) {
@@ -143,30 +143,64 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         }
         //修改支付状态
         videoLessonPurchaseRecordDao.updateStatus(orderNo, OrderStatusEnum.PAID.getCode());
-
-        //查询直播课服务费
-        String videoServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE);
-        BigDecimal liveServiceRate = new BigDecimal(videoServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
-
         //查询组信息
         VideoLessonGroup lessonGroup = videoLessonGroupDao.selectById(purchaseRecord.getVideoLessonGroupId());
-        Long teacherId = lessonGroup.getTeacherId();
-        Long studentId = purchaseRecord.getStudentId();
         //记录流水
-        BigDecimal payMoney = purchaseRecord.getPayMoney();//学生支付金额
-        UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
-        userAccountRecord.setUserId(teacherId);
-        //扣除手续费后所得金额
-        userAccountRecord.setTransAmount(payMoney.subtract(payMoney.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP));
-        userAccountRecord.setInOrOut(InOrOutEnum.IN);
-        userAccountRecord.setBizType(AccountBizTypeEnum.VIDEO);
-        userAccountRecord.setBizId(lessonGroup.getId());
-        userAccountRecord.setBizName(lessonGroup.getLessonName());
-        userAccountRecord.setOrderNo(orderNo);
-        userAccountService.accountChange(userAccountRecord);
-        log.info("buyVideoCourseSuccess ok");
-
-        videoSend(teacherId, studentId, lessonGroup);
+        addTeacherAccount(orderParam, purchaseRecord, lessonGroup);
+        videoSend(lessonGroup.getTeacherId(), purchaseRecord.getStudentId(), lessonGroup);
+    }
+
+    /**
+     * 记录老师账户记录
+     *
+     * @param userOrderDetailVo
+     * @param purchaseRecord
+     */
+    private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, VideoLessonPurchaseRecord purchaseRecord, VideoLessonGroup lessonGroup) {
+        //查询直播课服务费
+        BigDecimal liveServiceRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE))
+                .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        //支付金额
+        BigDecimal actualPrice = userOrderDetailVo.getActualPrice();
+        //学生支付金额
+        //BigDecimal payMoney = purchaseRecord.getPayMoney();
+        //服务费
+        BigDecimal serviceFeeAmount = actualPrice.multiply(liveServiceRate).setScale(2, RoundingMode.HALF_UP);
+
+        //老师入账金额
+        BigDecimal transAmount = actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
+
+        //插入老师账户变更记录
+        HttpResponseResult<UserAccountRecord> recordRes = userAccountService.accountRecord(
+                new UserAccountRecordDto(userOrderDetailVo.getMerchId(), PostStatusEnum.WAIT, transAmount, InOrOutEnum.IN,
+                        AccountBizTypeEnum.VIDEO, lessonGroup.getId(), lessonGroup.getLessonName(), userOrderDetailVo.getOrderNo()));
+        //
+        if (recordRes.getStatus()) {
+            userAccountService.accountChange(recordRes.getData().getId(), PostStatusEnum.RECORDED);
+        }
+
+        //todo 插入平台实收
+
+        //判断是否分润
+        if (null != userOrderDetailVo.getRecomUserId()) {
+            // 分润比例
+            BigDecimal shareFeeRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+
+            //分润金额
+            BigDecimal shareFee = serviceFeeAmount.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
+
+            //插入分润老师账户变更记录
+            HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
+                    new UserAccountRecordDto(userOrderDetailVo.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
+                            AccountBizTypeEnum.VIDEO_SHARE, lessonGroup.getId(), lessonGroup.getLessonName(), userOrderDetailVo.getOrderNo()));
+
+            if (recomRecordRes.getStatus()) {
+                userAccountService.accountChange(recomRecordRes.getData().getId(), PostStatusEnum.RECORDED);
+            }
+
+            //todo 插入平台分润支出
+        }
     }
 
     /**
@@ -230,10 +264,10 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
 
         //学生端-购买视频课
         try {
-            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode(),lesson.getId());
+            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode(), lesson.getId());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIDEO_BUY,
-                    studentReceivers, null, 0, url , ClientEnum.STUDENT.getCode(),
-                    teacher.getUsername(), lesson.getLessonName() );
+                    studentReceivers, null, 0, url, ClientEnum.STUDENT.getCode(),
+                    teacher.getUsername(), lesson.getLessonName());
             log.info("send success {}", MessageTypeEnum.VIDEO_BUY);
         } catch (Exception e) {
             log.error("send fail {}", MessageTypeEnum.VIDEO_BUY);

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

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

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

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

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

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

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

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

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

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

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

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.entity.UserAccount;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
 
 /**
  * @Author: liweifan
@@ -11,4 +15,14 @@ import io.swagger.annotations.ApiModel;
 public class UserAccountVo extends UserAccount{
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("待入账金额 ")
+	private BigDecimal amountUnrecorded;
+
+	public BigDecimal getAmountUnrecorded() {
+		return amountUnrecorded;
+	}
+
+	public void setAmountUnrecorded(BigDecimal amountUnrecorded) {
+		this.amountUnrecorded = amountUnrecorded;
+	}
 }

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -18,6 +19,9 @@ public class UserOrderDetailVo extends UserOrderDetail {
     @ApiModelProperty("订单id ")
     private Long orderId;
 
+    @ApiModelProperty("用户类型 学生:STUDENT 老师 :TEACHER")
+    private ClientEnum orderClient;
+
     @ApiModelProperty("头像 ")
     private String avatar;
 
@@ -29,6 +33,27 @@ public class UserOrderDetailVo extends UserOrderDetail {
 
     @ApiModelProperty(value = "冗余字段,用于传递参数用")
     private Object bizParam;
+    @ApiModelProperty(value = "推荐用户id(有推荐人的情况)")
+    private Long recomUserId;
+
+    @ApiModelProperty(value = "分润用户编号")
+    private Long routeUserId;
+
+    public ClientEnum getOrderClient() {
+        return orderClient;
+    }
+
+    public void setOrderClient(ClientEnum orderClient) {
+        this.orderClient = orderClient;
+    }
+
+    public Long getRouteUserId() {
+        return routeUserId;
+    }
+
+    public void setRouteUserId(Long routeUserId) {
+        this.routeUserId = routeUserId;
+    }
 
     public Long getUserId() {
         return userId;
@@ -77,4 +102,12 @@ public class UserOrderDetailVo extends UserOrderDetail {
     public void setBizParam(Object bizParam) {
         this.bizParam = bizParam;
     }
+
+    public Long getRecomUserId() {
+        return recomUserId;
+    }
+
+    public void setRecomUserId(Long recomUserId) {
+        this.recomUserId = recomUserId;
+    }
 }

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

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

+ 100 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/AccountTotal.java

@@ -30,6 +30,26 @@ public class AccountTotal {
     private BigDecimal musicAmount = BigDecimal.ZERO;
     @ApiModelProperty("乐谱-百分比")
     private BigDecimal musicRate = BigDecimal.ZERO;
+    @ApiModelProperty("小酷AI推广")
+    private BigDecimal vipShareAmount = BigDecimal.ZERO;
+    @ApiModelProperty("小酷AI推广-百分比")
+    private BigDecimal vipShareRate = BigDecimal.ZERO;
+    @ApiModelProperty("商品推荐")
+    private BigDecimal mallShareAmount = BigDecimal.ZERO;
+    @ApiModelProperty("商品推荐-百分比")
+    private BigDecimal mallShareRate = BigDecimal.ZERO;
+    @ApiModelProperty("乐谱分润")
+    private BigDecimal musicShareAmount = BigDecimal.ZERO;
+    @ApiModelProperty("乐谱分润-百分比")
+    private BigDecimal musicShareRate = BigDecimal.ZERO;
+    @ApiModelProperty("直播课分润")
+    private BigDecimal liveShareAmount = BigDecimal.ZERO;
+    @ApiModelProperty("直播课分润-百分比")
+    private BigDecimal liveShareRate = BigDecimal.ZERO;
+    @ApiModelProperty("视频课分润")
+    private BigDecimal videoShareAmount = BigDecimal.ZERO;
+    @ApiModelProperty("视频课-百分比")
+    private BigDecimal videoShareRate = BigDecimal.ZERO;
 
     @ApiModelProperty("时间(详情数据中使用)")
     private String timeStr;
@@ -123,4 +143,84 @@ public class AccountTotal {
     public void setInfoList(List<AccountTotal> infoList) {
         this.infoList = infoList;
     }
+
+    public BigDecimal getVipShareAmount() {
+        return vipShareAmount;
+    }
+
+    public void setVipShareAmount(BigDecimal vipShareAmount) {
+        this.vipShareAmount = vipShareAmount;
+    }
+
+    public BigDecimal getVipShareRate() {
+        return vipShareRate;
+    }
+
+    public void setVipShareRate(BigDecimal vipShareRate) {
+        this.vipShareRate = vipShareRate;
+    }
+
+    public BigDecimal getMallShareAmount() {
+        return mallShareAmount;
+    }
+
+    public void setMallShareAmount(BigDecimal mallShareAmount) {
+        this.mallShareAmount = mallShareAmount;
+    }
+
+    public BigDecimal getMallShareRate() {
+        return mallShareRate;
+    }
+
+    public void setMallShareRate(BigDecimal mallShareRate) {
+        this.mallShareRate = mallShareRate;
+    }
+
+    public BigDecimal getMusicShareAmount() {
+        return musicShareAmount;
+    }
+
+    public void setMusicShareAmount(BigDecimal musicShareAmount) {
+        this.musicShareAmount = musicShareAmount;
+    }
+
+    public BigDecimal getMusicShareRate() {
+        return musicShareRate;
+    }
+
+    public void setMusicShareRate(BigDecimal musicShareRate) {
+        this.musicShareRate = musicShareRate;
+    }
+
+    public BigDecimal getLiveShareAmount() {
+        return liveShareAmount;
+    }
+
+    public void setLiveShareAmount(BigDecimal liveShareAmount) {
+        this.liveShareAmount = liveShareAmount;
+    }
+
+    public BigDecimal getLiveShareRate() {
+        return liveShareRate;
+    }
+
+    public void setLiveShareRate(BigDecimal liveShareRate) {
+        this.liveShareRate = liveShareRate;
+    }
+
+    public BigDecimal getVideoShareAmount() {
+        return videoShareAmount;
+    }
+
+    public void setVideoShareAmount(BigDecimal videoShareAmount) {
+        this.videoShareAmount = videoShareAmount;
+    }
+
+    public BigDecimal getVideoShareRate() {
+        return videoShareRate;
+    }
+
+    public void setVideoShareRate(BigDecimal videoShareRate) {
+        this.videoShareRate = videoShareRate;
+    }
 }

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

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

+ 34 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.PlatformCashAccountRecordDao">
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="account_id_" jdbcType="INTEGER" property="accountId"/>
+        <result column="trans_amount_" jdbcType="VARCHAR" property="transAmount"/>
+        <result column="in_or_out_" jdbcType="VARCHAR" property="inOrOut"/>
+        <result column="post_status_" jdbcType="VARCHAR" property="postStatus"/>
+        <result column="biz_type_" jdbcType="VARCHAR" property="bizType"/>
+        <result column="biz_id_" jdbcType="INTEGER" property="bizId"/>
+        <result column="memo_" jdbcType="VARCHAR" property="memo"/>
+        <result column="order_no_" jdbcType="VARCHAR" property="orderNo"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , account_id_, trans_amount_, in_or_out_, post_status_, biz_type_, biz_id_, memo_, order_no_, create_time_, update_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
+        insert into platform_cash_account_record(account_id_, trans_amount_, in_or_out_, post_status_, biz_type_,
+        biz_id_, memo_, order_no_, create_time_, update_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.accountId}, #{entity.transAmount}, #{entity.inOrOut}, #{entity.postStatus}, #{entity.bizType},
+            #{entity.bizId}, #{entity.memo}, #{entity.orderNo}, #{entity.createTime}, #{entity.updateTime})
+        </foreach>
+    </insert>
+
+</mapper>

+ 6 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysConfigMapper.xml

@@ -21,10 +21,12 @@
 
 	<!-- 全查询 -->
 	<select id="findAll" resultMap="SysConfig">
-		SELECT * FROM sys_config where 1=1
-		<if test="group != null">
-			and group_ = #{group}
-		</if>
+		SELECT * FROM sys_config
+		<where>
+			<if test="group != null and group != ''">
+				and find_in_set(group_,#{group})
+			</if>
+		</where>
 		ORDER BY id_
 	</select>
 

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

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

+ 17 - 13
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml

@@ -77,7 +77,9 @@
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountVo">
         SELECT
-        <include refid="baseColumns"/>
+            <include refid="baseColumns"/>,
+            (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
         FROM user_cash_account t
         where t.user_id_ = #{id}
     </select>
@@ -99,7 +101,12 @@
             sum(a.practiceAmount) as practiceAmount,
             sum(a.liveAmount) as liveAmount,
             sum(a.videoAmount) as videoAmount,
-            sum(a.musicAmount) as musicAmount
+            sum(a.musicAmount) as musicAmount,
+            sum(a.liveShareAmount) as liveShareAmount,
+            sum(a.videoShareAmount) as videoShareAmount,
+            sum(a.musicShareAmount) as musicShareAmount,
+            sum(a.vipShareAmount) as vipShareAmount,
+            sum(a.mallShareAmount) as mallShareAmount
         from sys_day t
         left join (
             select
@@ -107,8 +114,13 @@
                 sum(if(t.biz_type_ = 'PRACTICE',t.trans_amount_,0)) as practiceAmount,
                 sum(if(t.biz_type_ = 'LIVE',t.trans_amount_,0)) as liveAmount,
                 sum(if(t.biz_type_ = 'VIDEO',t.trans_amount_,0)) as videoAmount,
-                sum(if(t.biz_type_ = 'MUSIC',t.trans_amount_,0)) as musicAmount
-            from user_cash_account_record t
+                sum(if(t.biz_type_ = 'MUSIC',t.trans_amount_,0)) as musicAmount,
+                sum(if(t.biz_type_ = 'LIVE_SHARE',t.trans_amount_,0)) as liveShareAmount,
+                sum(if(t.biz_type_ = 'VIDEO_SHARE',t.trans_amount_,0)) as videoShareAmount,
+                sum(if(t.biz_type_ = 'MUSIC_SHARE',t.trans_amount_,0)) as musicShareAmount,
+                sum(if(t.biz_type_ = 'VIP_SHARE',t.trans_amount_,0)) as vipShareAmount,
+                sum(if(t.biz_type_ = 'MALL_SHARE',t.trans_amount_,0)) as mallShareAmount
+        from user_cash_account_record t
             <where>
                 <if test="param.startTime !=null">
                     <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>
@@ -142,18 +154,10 @@
     <select id="totalTransAmount" resultType="java.math.BigDecimal">
         select sum(trans_amount_) from user_cash_account_record
         <where>
-            <if test="param.accountId != null">
-                and account_id_ = #{param.accountId}
-            </if>
-            <if test="param.inOrOut != null">
-                and in_or_out_ = #{param.inOrOut}
-            </if>
+            and post_status_ in ('WAIT','FROZEN','RECORDED') and in_or_out_ = 'IN' and err_flag_ = 0
             <if test="param.orderNo != null and param.orderNo != ''">
                 and order_no_ = #{param.orderNo}
             </if>
-            <if test="param.bizType != null">
-                and biz_type_ = #{param.bizType}
-            </if>
         </where>
     </select>
 </mapper>

+ 149 - 31
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml

@@ -7,10 +7,15 @@
         <result column="trans_amount_" property="transAmount" />
         <result column="account_balance_" property="accountBalance" />
         <result column="in_or_out_" property="inOrOut" />
+        <result column="post_status_" property="postStatus" />
         <result column="biz_type_" property="bizType" />
         <result column="biz_id_" property="bizId" />
         <result column="biz_name_" property="bizName" />
+        <result column="order_no_" property="orderNo" />
         <result column="create_time_" property="createTime" />
+        <result column="update_time_" property="updateTime" />
+        <result column="err_flag_" property="errFlag" />
+        <result column="err_msg_" property="errMsg" />
     </resultMap>
 
     <!-- 表字段 -->
@@ -20,15 +25,98 @@
         , t.trans_amount_ as transAmount
         , t.account_balance_ as accountBalance
         , t.in_or_out_ as inOrOut
+        , t.post_status_ as postStatus
         , t.biz_type_ as bizType
         , t.biz_id_ as bizId
         , t.biz_name_ as bizName
+        , t.order_no_ as orderNo
         , t.create_time_ as createTime
+        , t.update_time_ as updateTime
+        , t.err_flag_ as errFlag
+        , t.err_msg_ as errMsg
         </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
         SELECT
             <include refid="baseColumns"/>
+        FROM user_cash_account_record t
+        where t.id_ = #{id}
+    </select>
+
+    <sql id="selectCondition">
+        and t.err_flag_ = 0
+        <if test="null != param.orderNo and '' != param.orderNo">
+            AND t.order_no_ LIKE CONCAT('%', #{param.orderNo}, '%')
+        </if>
+
+        <if test="null != param.userId">
+            AND t.account_id_ = #{param.userId}
+        </if>
+        <if test="null != param.inOrOut">
+            AND t.in_or_out_ = #{param.inOrOut}
+        </if>
+        <if test="null != param.postStatus">
+            AND t.post_status_ = #{param.postStatus}
+        </if>
+        <if test="null != param.bizType">
+            AND t.biz_type_ = #{param.bizType}
+        </if>
+        <if test="param.startTime !=null">
+            <![CDATA[AND t.update_time_ >= #{param.startTime} ]]>
+        </if>
+        <if test="param.endTime !=null">
+            <![CDATA[AND t.update_time_ < #{param.endTime} ]]>
+        </if>
+    </sql>
+
+    <sql id="selectSql">
+        select
+            <include refid="baseColumns" />,
+            DATE_FORMAT(t.create_time_,'%m-%d') as timeDay,
+            a.start_time_ as startTime,
+            a.end_time_ as endTime
+        from user_cash_account_record t
+        left join sys_user u on t.account_id_ = u.id_
+        left join course_schedule a on t.biz_id_ = a.id_ and t.biz_type_ in ('PRACTICE','LIVE')
+        <where>
+            <if test="null != param.search and '' != param.search">
+                AND (
+                u.user_id_ LIKE CONCAT('%', #{param.search}, '%') or
+                u.username_ LIKE CONCAT('%', #{param.search}, '%') or
+                u.phone_ LIKE CONCAT('%', #{param.search}, '%')
+                )
+            </if>
+            <include refid="selectCondition"/>
+        </where>
+        order by t.update_time_ desc
+    </sql>
+
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
+        <include refid="selectSql"/>
+    </select>
+
+    <select id="selectAllPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
+        <include refid="selectSql"/>
+    </select>
+
+    <!-- 表字段 -->
+    <sql id="appBaseColumns">
+        t.id_ as id
+        , t.account_id_ as accountId
+        , t.trans_amount_ as transAmount
+        , t.account_balance_ as accountBalance
+        , t.in_or_out_ as inOrOut
+        , t.post_status_ as postStatus
+        , t.biz_type_ as bizType
+        , t.biz_id_ as bizId
+        , t.biz_name_ as bizName
+        , t.create_time_ as createTime
+        , t.update_time_ as updateTime
+    </sql>
+
+    <select id="appDetail" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
+        SELECT
+            <include refid="appBaseColumns"/>
         FROM (
             select
                 max(t.id_) as id_,
@@ -36,16 +124,18 @@
                 sum(t.trans_amount_) as trans_amount_,
                 if(t.in_or_out_ = 'OUT', min(t.account_balance_), max(t.account_balance_)) as account_balance_,
                 t.in_or_out_,
+                t.post_status_,
                 t.biz_type_,
                 t.biz_id_,
                 t.biz_name_,
-                max(t.create_time_) as create_time_
+                max(t.update_time_) as create_time_,
+                max(t.update_time_) as update_time_
             from user_cash_account_record t
             where t.biz_type_ = 'LIVE' and exists(
                 select 1 from user_cash_account_record t1
-                where t1.biz_id_ = t.biz_id_ and t1.biz_type_ = 'LIVE' and  t1.id_ = #{id}
+                where t1.biz_id_ = t.biz_id_ and t1.post_status_ = t.post_status_ and t1.biz_type_ = 'LIVE' and  t1.id_ = #{id}
             )
-            group by t.account_id_,t.in_or_out_,t.biz_type_,biz_id_,biz_name_
+            group by t.account_id_,t.in_or_out_,t.post_status_,t.biz_type_,biz_id_,biz_name_
             union all
             select
                 t.id_,
@@ -53,37 +143,21 @@
                 t.trans_amount_,
                 t.account_balance_,
                 t.in_or_out_,
+                t.post_status_,
                 t.biz_type_,
                 t.biz_id_,
                 t.biz_name_,
-                t.create_time_
+                t.update_time_ as create_time_,
+                t.update_time_ as update_time_
             from user_cash_account_record t
             where t.biz_type_ != 'LIVE' and t.id_ = #{id}
         ) t
     </select>
-    
-    <sql id="selectCondition">
-        <if test="null != param.userId">
-            AND t.account_id_ = #{param.userId}
-        </if>
-        <if test="null != param.inOrOut">
-            AND t.in_or_out_ = #{param.inOrOut}
-        </if>
-        <if test="null != param.bizType">
-            AND t.biz_type_ = #{param.bizType}
-        </if>
-        <if test="param.startTime !=null">
-            <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>
-        </if>
-        <if test="param.endTime !=null">
-            <![CDATA[AND t.create_time_ < #{param.endTime} ]]>
-        </if>
-    </sql>
 
-    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
+    <select id="appSelectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
         SELECT
-            <include refid="baseColumns" />,
-            DATE_FORMAT(t.create_time_,'%m-%d') as timeDay,
+            <include refid="appBaseColumns" />,
+            DATE_FORMAT(t.update_time_,'%m-%d') as timeDay,
             a.start_time_ as startTime,
             a.end_time_ as endTime
         FROM (
@@ -93,14 +167,16 @@
                 sum(t.trans_amount_) as trans_amount_,
                 if(t.in_or_out_ = 'OUT', min(t.account_balance_), max(t.account_balance_)) as account_balance_,
                 t.in_or_out_,
+                t.post_status_,
                 t.biz_type_,
                 t.biz_id_,
                 t.biz_name_,
-                max(t.create_time_) as create_time_
+                max(t.update_time_) as create_time_,
+                max(t.update_time_) as update_time_
             from user_cash_account_record t
             where t.biz_type_ = 'LIVE'
             <include refid="selectCondition"/>
-            group by t.account_id_,t.in_or_out_,t.biz_type_,biz_id_,biz_name_
+            group by t.account_id_,t.in_or_out_,t.post_status_,t.biz_type_,biz_id_,biz_name_
             union all
             select
                 t.id_,
@@ -108,22 +184,24 @@
                 t.trans_amount_,
                 t.account_balance_,
                 t.in_or_out_,
+                t.post_status_,
                 t.biz_type_,
                 t.biz_id_,
                 t.biz_name_,
-                t.create_time_
+                t.update_time_ as create_time_,
+                t.update_time_ as update_time_
             from user_cash_account_record t
             where t.biz_type_ != 'LIVE'
             <include refid="selectCondition"/>
         ) t
         left join course_schedule a on t.biz_id_ = a.id_ and t.biz_type_ in ('PRACTICE','LIVE')
-        order by t.create_time_ desc
+        order by t.update_time_ desc
     </select>
 
     <select id="selectMonthDecimal" resultType="java.math.BigDecimal">
         select  sum(trans_amount_)
         from user_cash_account_record
-        where in_or_out_ = 'IN' and account_id_ = #{userId}
+        where in_or_out_ = 'IN' and post_status_ = 'RECORDED' and account_id_ = #{userId}
         and date_format(create_time_,'%Y-%m') = date_format(now(),'%Y-%m')
     </select>
 
@@ -134,7 +212,47 @@
             sum(ucar.trans_amount_)
         from user_cash_account_record ucar
         left join sys_user su on ucar.account_id_ = su.id_
-            where ucar.create_time_ > date_format(now(),'%Y-%m-%d')
+        where post_status_ = 'RECORDED' and ucar.create_time_ > date_format(now(),'%Y-%m-%d')
         group by su.id_, su.phone_
     </select>
+
+    <select id="selectRecordByOrderDetail" resultType="com.yonge.cooleshow.biz.dal.entity.UserAccountRecord">
+        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>
+    </select>
+
+    <select id="detailByBiz" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
+        select
+            <include refid="baseColumns"/>
+        from user_cash_account_record t
+        <where>
+            t.biz_type_ = #{bizType} and t.biz_id_ = #{bizId}
+            <if test="orderNo != null and orderNo != ''">
+                and t.order_no_ = #{orderNo}
+            </if>
+        </where>
+    </select>
 </mapper>

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

@@ -93,8 +93,10 @@
             <include refid="baseColumns" />,
             u.avatar_ as avatar,
             u.username_ as username,
+            uo.order_client_ as orderClient,
             a.star_grade_ as starGrade
         FROM user_order_detail t
+        left join user_order uo on uo.order_no_ = t.order_no_
         left join sys_user u on t.merch_id_ = u.id_
         left join teacher_total a on t.merch_id_ = a.user_id_
         where t.order_no_ = #{orderNo}

+ 11 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -5,7 +5,9 @@
         <result column="id_" property="id"/>
         <result column="order_no_" property="orderNo"/>
         <result column="user_id_" property="userId"/>
+        <result column="recom_user_id_" property="recomUserId"/>
         <result column="order_name_" property="orderName"/>
+        <result column="order_client_" property="orderClient"/>
         <result column="order_type_" property="orderType"/>
         <result column="order_desc_" property="orderDesc"/>
         <result column="status_" property="status"/>
@@ -26,7 +28,9 @@
          t.id_ as id
         , t.order_no_ as orderNo
         , t.user_id_ as userId
+        , t.recom_user_id_ as recomUserId
         , t.order_name_ as orderName
+        , t.order_client_ as orderClient
         , t.order_type_ as orderType
         , t.order_desc_ as orderDesc
         , t.status_ as status
@@ -113,6 +117,9 @@
         left join sys_user u on t.user_id_ = u.id_
         <where>
             u.del_flag_ = 0
+            <if test="null != param.orderClient and '' != param.orderClient">
+                AND t.order_client_ = #{param.orderClient}
+            </if>
             <if test="null != param.search and '' != param.search">
                 AND (
                 t.user_id_ LIKE CONCAT('%', #{param.search}, '%') or
@@ -200,6 +207,9 @@
         left join user_order_payment p on t.order_no_ = p.order_no_ and (p.status_ = 'pending' or p.status_ = 'succeeded')
         where t.status_ in ('WAIT_PAY','PAYING')
         and t.user_id_ = #{param.userId}
+        <if test="null != param.orderClient and '' != param.orderClient">
+            AND t.order_client_ = #{param.orderClient}
+        </if>
         and exists (
             select 1 from user_order_detail d where t.order_no_ = d.order_no_
             and d.good_type_ = #{param.goodType}
@@ -218,6 +228,7 @@
         FROM user_order t
         left join student_time st on t.user_id_ = st.user_id_
         where t.status_ = 'PAID'
+        and t.order_client_ = #{param.orderClient}
         and exists (
             select 1 from user_order_detail od where t.order_no_ = od.order_no_
             and (

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

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

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

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

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

@@ -7,6 +7,7 @@ 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.UserOrder;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
@@ -64,7 +65,7 @@ public class UserOrderController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         orderReq.setUserId(user.getId());
-
+        orderReq.setOrderClient(ClientEnum.STUDENT);
         try {
             HttpResponseResult<UserOrder> res = DistributedLock.of(redissonClient)
                     .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())

+ 54 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MemberPriceSettingsController.java

@@ -0,0 +1,54 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.yonge.cooleshow.biz.dal.dto.search.MemberPriceSettingsSearch;
+import com.yonge.cooleshow.biz.dal.entity.SysConfig;
+import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.vo.MemberPriceSettingsVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RequestMapping("memberPriceSettings")
+@Api(tags = "会员价格设置")
+@RestController
+public class MemberPriceSettingsController extends BaseController {
+	@Autowired
+	private MemberPriceSettingsService memberPriceSettingsService;
+	@Autowired
+	private SysConfigService sysConfigService;
+
+	/**
+	 * 查询单条
+	 */
+	@GetMapping("/detail/{id}")
+	@ApiOperation(value = "详情", notes = "传入id")
+	public HttpResponseResult<MemberPriceSettingsVo> detail(@PathVariable("id") Long id) {
+		return succeed(memberPriceSettingsService.detail(id));
+	}
+
+	@PostMapping("/list")
+	@ApiOperation(value = "查询列表")
+	public HttpResponseResult<List<MemberPriceSettingsVo>> list(@RequestBody MemberPriceSettingsSearch query) {
+		List<MemberPriceSettingsVo> list = memberPriceSettingsService.selectList(query);
+		return succeed(list);
+	}
+
+	@PostMapping("/vipPermissions")
+	@ApiOperation(value = "查询vip权限")
+	public HttpResponseResult<List<SysConfig>> vipPermissions() {
+		Map<String,Object> params = new HashMap<>();
+		params.put("group", "VIP_PERMISSION");
+		List<SysConfig> configs = sysConfigService.findAll(params);
+		return succeed(configs);
+	}
+
+
+}

+ 118 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicAlbumController.java

@@ -0,0 +1,118 @@
+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.MusicAlbumDetailSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
+import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.base.page.QueryInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+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.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 专辑表 web 控制层
+ * @author yzp
+ * @date 2022-03-26 00:21:46
+ * @version v1.0
+ **/
+@RestController
+@RequestMapping("/music/album")
+@Api(tags = "专辑表 API接口")
+public class MusicAlbumController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private MusicAlbumService musicAlbumService;
+
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private AppVersionInfoService appVersionInfoService;
+
+    @ApiOperation(value = "分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/list", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> list(@RequestBody MusicAlbumSearch query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+
+        // 检查app版本
+        query.setAuditVersion(appVersionInfoService.getAppAuditVersion(query.getPlatform(),query.getVersion()));
+
+        query.setAlbumStatus(YesOrNoEnum.YES);
+        query.setSortBy(1);
+        IPage<MusicAlbumVo> iPage = musicAlbumService.selectStudentPage(PageUtil.getPage(query),query);
+        return succeed(PageUtil.pageInfo(iPage));
+    }
+
+
+    /**
+     * 专辑详情
+     */
+    @PostMapping(value = "/detail",  consumes="application/json", produces="application/json")
+    @ApiOperation(value = "专辑详情",httpMethod="POST", consumes="application/json", produces="application/json")
+    public HttpResponseResult<AlbumDetailVo> detail(@Valid @RequestBody MusicAlbumDetailSearch query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        query.setType(2);
+        query.setState(YesOrNoEnum.YES);
+        YesOrNoEnum yesOrNoEnum = musicAlbumService.checkFavorite(sysUser.getId(),query.getId() );
+        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query);
+        albumDetailVo.setFavorite(yesOrNoEnum);
+        return succeed(albumDetailVo);
+    }
+
+    /**
+     * 专辑收藏
+     */
+    // @PostMapping("/favorite/{id}")
+    @ApiOperation(value = "专辑收藏/取消收藏")
+    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "专辑编号", required = true) @PathVariable("id") Long id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+
+        return succeed(musicAlbumService.setFavorite(sysUser.getId(),id));
+    }
+
+
+    /**
+     * 专辑收藏
+     */
+    // @GetMapping("/favorite")
+    @ApiOperation(value = "收藏专辑列表")
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> favoriteAlbum(QueryInfo query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
+        search.setStudentId(sysUser.getId());
+        search.setAlbumStatus(YesOrNoEnum.YES);
+        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search);
+        return succeed(PageUtil.pageInfo(albumVoIPage));
+    }
+}

+ 51 - 12
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -3,19 +3,23 @@ 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.common.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
-import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
-import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
-import com.yonge.cooleshow.common.enums.YesOrNoEnum;
-import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetShareVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.base.page.QueryInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -41,6 +45,8 @@ public class MusicSheetController extends BaseController {
 	@Autowired
 	private MusicSheetService musicSheetService;
 
+    @Autowired
+    private AppVersionInfoService appVersionInfoService;
 
     /**
      * 查询单条
@@ -52,7 +58,7 @@ public class MusicSheetController extends BaseController {
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        return succeed(musicSheetService.detail(id, sysUser, SysUserType.TEACHER));
+        return succeed(musicSheetService.detail(id, sysUser, ClientEnum.TEACHER));
     }
 
 	@ApiOperation(value = "新增", httpMethod="POST", consumes="application/json", produces="application/json")
@@ -110,24 +116,54 @@ public class MusicSheetController extends BaseController {
         }
     }
 
-    @ApiOperation(value = "分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
+    @ApiOperation(value = "曲目分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/list", consumes="application/json", produces="application/json")
-    public HttpResponseResult<PageInfo<MusicSheetVo>> list(@RequestBody MusicSheetSearch query) {
+    public HttpResponseResult<PageInfo<MusicSheetVo>> list(@RequestBody StudentMusicSheetSearch query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        // 设置只查老师用户 状态为启用
-        query.setCreateBy(sysUser.getId());
-        if (query.getAuditStatus() != null && AuthStatusEnum.PASS.getCode().equals(query.getAuditStatus().getCode())) {
+        // 老师课查看所有曲目
+        if (query.getMyself() == null || query.getMyself()) {
+            // 设置只查老师用户 状态为启用
+            query.setCreateBy(sysUser.getId());
+            if (query.getAuditStatus() != null && AuthStatusEnum.PASS.getCode().equals(query.getAuditStatus().getCode())) {
+                query.setState(YesOrNoEnum.YES);
+            }
+            query.setSourceType(SourceTypeEnum.TEACHER);
+        } else {
+            // 检查app版本
+            query.setAuditVersion(appVersionInfoService.getAppAuditVersion(query.getPlatform(),query.getVersion()));
+
+            //  只能看通过审核 并且 启用的 曲目
             query.setState(YesOrNoEnum.YES);
+            query.setAuditStatus(AuthStatusEnum.PASS);
+            query.setStudentId(sysUser.getId());
         }
-        query.setSourceType(SourceTypeEnum.TEACHER);
 
         IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 
+
+    /**
+     * 我的单曲,收藏单曲
+     */
+    @GetMapping("/my")
+    @ApiOperation(value = "我的单曲")
+    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(QueryInfo query) {
+        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);
+        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.myMusic(PageUtil.getPage(query),search);
+        return succeed(PageUtil.pageInfo(sheetVoIPage));
+    }
+
     @ApiOperation(value = "乐谱分享")
     @GetMapping(value="/share")
     public HttpResponseResult<MusicSheetShareVo> shareMusicSheet() {
@@ -148,4 +184,7 @@ public class MusicSheetController extends BaseController {
         }
         return succeed(musicSheetService.countTeacherMusicSheet(sysUser));
     }
+
+
+
 }

+ 29 - 3
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java

@@ -5,16 +5,21 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
+import com.yonge.cooleshow.biz.dal.dto.search.ShareProfitParam;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
+import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.CourseGroupVo;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
+import com.yonge.cooleshow.biz.dal.vo.ShareProfitVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.*;
+import org.apache.commons.collections.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -41,6 +46,8 @@ public class TeacherCourseGroupController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private AppVersionInfoService appVersionInfoService;
     @ApiOperation("直播课详情")
     @GetMapping("/queryLiveCourseInfo")
     public HttpResponseResult<LiveCourseInfoVo> queryLiveCourseInfo(@ApiParam(value = "课程组id", required = true) @RequestParam(value = "groupId") Long groupId) {
@@ -53,13 +60,29 @@ public class TeacherCourseGroupController extends BaseController {
             @ApiImplicitParam(name = "groupStatus", dataType = "String", value = "课程组状态  ING(进行中)  NOT_SALE(未开售,未上架) APPLY(报名中,销售中) COMPLETE(已完成)"),
             @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
             @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+            @ApiImplicitParam(name = "myself", dataType = "Boolean", value = "查看我自己的直播课"),
+            @ApiImplicitParam(name = "version", dataType = "String", value = "版本"),
+            @ApiImplicitParam(name = "platform", dataType = "Integer", value = "平台"),
     })
     @ApiOperation("分页查询直播课课程组列表")
     @PostMapping("/queryPageCourseGroup")
     public HttpResponseResult<PageInfo<CourseGroupVo>> queryPageLiveCourseGroup(@RequestBody Map<String, Object> param) {
-        Long teacherId = WrapperUtil.toLong(param, "teacherId");
-        teacherId = Optional.ofNullable(teacherId).orElseGet(() -> getSysUser().getId());
-        param.put("teacherId", teacherId);
+
+
+        Boolean myself = MapUtils.getBoolean(param,"myself");
+        if (myself == null || myself) {
+            Long teacherId = WrapperUtil.toLong(param, "teacherId");
+            teacherId = Optional.ofNullable(teacherId).orElseGet(() -> getSysUser().getId());
+            param.put("teacherId", teacherId);
+        } else {
+            YesOrNoEnum auditVersion = YesOrNoEnum.NO;
+            if (param.get("platform") != null && param.get("version") != null) {
+                auditVersion = appVersionInfoService.getAppAuditVersion(param.get("platform").toString(),param.get("version").toString());
+            }
+            param.put("auditVersion",auditVersion);
+        }
+
+
         return succeed(courseGroupService.queryPageLiveCourseGroup(param));
     }
 
@@ -100,5 +123,8 @@ public class TeacherCourseGroupController extends BaseController {
         return Optional.ofNullable(sysUserFeignService.queryUserInfo())
                 .orElseThrow(() -> new BizException("用户不存在"));
     }
+
+
+
 }
 

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

@@ -84,7 +84,7 @@ public class UserAccountController extends BaseController {
             throw new BizException("查询时间格式不正确 [" + query.getSearchDate() + "]");
         }
 
-        IPage<UserAccountRecordVo> pages = userAccountRecordService.selectPage(PageUtil.getPage(query), query);
+        IPage<UserAccountRecordVo> pages = userAccountRecordService.appSelectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
     }
 

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

@@ -7,6 +7,7 @@ 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.UserOrder;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.toolset.payment.util.DistributedLock;
@@ -66,7 +67,7 @@ public class UserOrderController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         orderReq.setUserId(user.getId());
-
+        orderReq.setOrderClient(ClientEnum.TEACHER);
         try {
             HttpResponseResult<UserOrder> res = DistributedLock.of(redissonClient)
                     .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())

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

@@ -1,14 +1,16 @@
 package com.yonge.cooleshow.teacher.controller;
 
 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.service.AppVersionInfoService;
+
+import com.yonge.cooleshow.biz.dal.vo.*;
+
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.valid.AddGroup;
 import com.yonge.cooleshow.biz.dal.valid.UpdateGroup;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupUpVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonStudentVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonVo;
 import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -43,6 +45,8 @@ public class VideoLessonGroupController extends BaseController {
     @Autowired
     private VideoLessonGroupService videoLessonGroupService;
 
+    @Autowired
+    private AppVersionInfoService appVersionInfoService;
     /**
     * @Description: 查询视频课组
     * @Author: cy
@@ -55,8 +59,12 @@ public class VideoLessonGroupController extends BaseController {
         if (sysUser == null || sysUser.getId() == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-
-        query.setTeacherId(sysUser.getId());
+        if (query.getMyself() == null || query.getMyself()) {
+            query.setTeacherId(sysUser.getId());
+        } else {
+            // 检查app版本
+            query.setAuditVersion(appVersionInfoService.getAppAuditVersion(query.getPlatform(),query.getVersion()));
+        }
         IPage<VideoLessonGroupVo> pages = videoLessonGroupService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
     }
@@ -131,7 +139,19 @@ public class VideoLessonGroupController extends BaseController {
     @ApiOperation(value = "根据组id查询视频课&视频课组")
     @GetMapping(value="/selectVideoLesson")
     public HttpResponseResult<VideoLessonStudentVo> selectVideoLesson(@NotNull(message = "视频组id不能为空") Long groupId) {
-        return succeed(videoLessonGroupService.selectVideoLesson(groupId));
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        VideoLessonStudentVo videoLessonStudentVo = videoLessonGroupService.selectVideoLesson(groupId);
+        if (videoLessonStudentVo.getLessonGroup() != null && sysUser.getId().equals(videoLessonStudentVo.getLessonGroup().getId())) {
+            videoLessonStudentVo.setAlreadyBuy(true);
+        } else {
+            videoLessonStudentVo.setAlreadyBuy(false);
+        }
+        return succeed(videoLessonStudentVo);
+
     }
 
     /**
@@ -153,4 +173,6 @@ public class VideoLessonGroupController extends BaseController {
         videoLessonGroupService.update(lessonVo,sysUser);
         return succeed();
     }
+
+
 }

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

@@ -0,0 +1,93 @@
+package com.yonge.cooleshow.teacher.controller.open;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.search.ShareProfitParam;
+import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
+import com.yonge.cooleshow.biz.dal.vo.ShareProfitVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/open")
+@Api(value = "开放权限接口-分享", hidden = true)
+public class OpenShareController extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(OpenShareController.class);
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private VideoLessonGroupService videoLessonGroupService;
+
+    @Autowired
+    private MusicSheetService musicSheetService;
+
+    @Autowired
+    private MemberPriceSettingsService memberPriceSettingsService;
+
+    /**
+     * 服务对象
+     */
+    @Resource
+    private CourseGroupService courseGroupService;
+
+    @ApiOperation(value = "老师乐谱分享分润")
+    @PostMapping(value="/musicShareProfit")
+    public HttpResponseResult<ShareProfitVo> shareMusicSheetProfit(@RequestBody ShareProfitParam param) {
+        SysUser sysUser = sysUserFeignService.queryUserById(param.getUserId());
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(musicSheetService.shareMusicSheetProfit(sysUser,param.getBizId()));
+    }
+
+
+    @ApiOperation(value = "老师直播课分享分润")
+    @PostMapping(value= "/liveShareProfit")
+    public HttpResponseResult<ShareProfitVo> shareLiveCourseProfit(@RequestBody ShareProfitParam param) {
+        SysUser sysUser = sysUserFeignService.queryUserById(param.getUserId());
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(courseGroupService.shareLiveCourseProfit(sysUser, param.getBizId()));
+    }
+
+
+
+    @ApiOperation(value = "老师视频课分享分润")
+    @PostMapping(value= "/videoShareProfit")
+    public HttpResponseResult<ShareProfitVo> shareVideoCourseProfit(@RequestBody ShareProfitParam param) {
+        SysUser sysUser = sysUserFeignService.queryUserById(param.getUserId());
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(videoLessonGroupService.shareVideoCourseProfit(sysUser, param.getBizId()));
+    }
+
+
+
+    @ApiOperation(value = "老师VIP分享分润")
+    @PostMapping(value="/vipProfit")
+    public HttpResponseResult<ShareProfitVo> shareVipProfit(@RequestBody ShareProfitParam param) {
+        SysUser sysUser = sysUserFeignService.queryUserById(param.getUserId());
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(memberPriceSettingsService.shareVipProfit(sysUser,param.getBizId()));
+    }
+}

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä