Преглед изворни кода

Merge branch 'master' of http://git.dayaedu.com/yonge/cooleshow

liujunchi пре 3 година
родитељ
комит
17d74cad5a
27 измењених фајлова са 433 додато и 238 уклоњено
  1. 0 5
      audio-analysis/pom.xml
  2. 3 3
      audio-analysis/src/main/java/com/yonge/audio/AudioAnalysisServerApplication.java
  3. 2 9
      audio-analysis/src/main/java/com/yonge/netty/common/message/MessageDispatcher.java
  4. 1 1
      audio-analysis/src/main/java/com/yonge/netty/common/message/MessageHandler.java
  5. 0 128
      audio-analysis/src/main/resources/application-template.yml
  6. 11 0
      audio-analysis/src/main/resources/bootstrap-dev.yml
  7. 0 16
      audio-analysis/src/main/resources/bootstrap-prod.properties
  8. 0 16
      audio-analysis/src/main/resources/bootstrap-sim.properties
  9. 0 16
      audio-analysis/src/main/resources/bootstrap-test.properties
  10. 55 0
      audio-analysis/src/main/resources/logback-spring.xml
  11. 58 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderRefundReq.java
  12. 21 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderRefunds.java
  13. 32 20
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  14. 30 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  15. 10 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundsService.java
  16. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  17. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  18. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  19. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthEntryRecordServiceImpl.java
  20. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthMusicianRecordServiceImpl.java
  21. 62 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundsServiceImpl.java
  22. 38 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  23. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  24. 56 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/RefundCreateRes.java
  25. 3 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundsMapper.xml
  26. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  27. 22 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

+ 0 - 5
audio-analysis/pom.xml

@@ -28,11 +28,6 @@
 		</dependency>
 
 		<dependency>
-			<groupId>org.springframework.cloud</groupId>
-			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
-		</dependency>
-
-		<dependency>
 			<groupId>com.alibaba.cloud</groupId>
 			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 		</dependency>

+ 3 - 3
audio-analysis/src/main/java/com/yonge/audio/AudioAnalysisServerApplication.java

@@ -21,9 +21,9 @@ import com.yonge.audio.config.LocalFastJsonHttpMessageConverter;
 
 @SpringBootApplication
 @EnableDiscoveryClient
-@EnableFeignClients("com.ym.mec")
-@MapperScan("com.ym.mec.biz.dal.dao")
-@ComponentScan(basePackages = { "com.yonge.netty", "com.ym.mec", "com.yonge.log" })
+@EnableFeignClients("com.yonge.cooleshow")
+@MapperScan("com.yonge.cooleshow.biz.dal.dao")
+@ComponentScan(basePackages = {"com.yonge.netty", "com.yonge.cooleshow.auth", "com.yonge.cooleshow.biz", "com.yonge.cooleshow.common", "com.yonge.cooleshow.common.security","com.yonge.toolset.thirdparty" })
 @Configuration
 @EnableSwagger2Doc
 public class AudioAnalysisServerApplication {

+ 2 - 9
audio-analysis/src/main/java/com/yonge/netty/common/message/MessageDispatcher.java

@@ -18,17 +18,10 @@ public class MessageDispatcher extends SimpleChannelInboundHandler<Message<?>> {
 	@Override
 	protected void channelRead0(ChannelHandlerContext ctx, Message<?> message) {
 		// 获得 type 对应的 MessageHandler 处理器
-		MessageHandler messageHandler = messageHandlerContainer.getMessageHandler(message.getType());
+		MessageHandler<?> messageHandler = messageHandlerContainer.getMessageHandler(message.getType());
 		// 获得 MessageHandler 处理器 的消息类
 		// Class<? extends Message> messageClass = MessageHandlerContainer.getMessageClass(messageHandler);
 		// 执行逻辑
-		executor.submit(new Runnable() {
-
-			@Override
-			public void run() {
-				messageHandler.execute(ctx.channel(), message.getData());
-			}
-
-		});
+		executor.submit(() -> messageHandler.execute(ctx.channel(), message.getData()));
 	}
 }

+ 1 - 1
audio-analysis/src/main/java/com/yonge/netty/common/message/MessageHandler.java

@@ -10,7 +10,7 @@ public interface MessageHandler<T> {
 	 * @param channel 通道
 	 * @param message 消息
 	 */
-	void execute(Channel channel, T message);
+	void execute(Channel channel, Object message);
 
 	/**
 	 * @return 消息类型,即每个 Message 实现类上的 TYPE 静态字段

+ 0 - 128
audio-analysis/src/main/resources/application-template.yml

@@ -1,128 +0,0 @@
-server:
-  port: 9004
-  tomcat:
-    accesslog:
-      enabled: true
-      buffered: true
-      directory: /var/logs
-      file-date-format: -yyyy-MM-dd
-      pattern: common
-      prefix: tomcat-audio
-      rename-on-rotate: false
-      request-attributes-enabled: false
-      rotate: true
-      suffix: .log
-      
-netty:
-  server:
-    port: 8090
-
-eureka:
-  client:
-    serviceUrl:
-      defaultZone: http://admin:admin123@localhost:8761/eureka/eureka/
-    instance: 
-      lease-renewal-interval-in-seconds: 5
-
-spring:
-  application:
-    name: audio-analysis-server
-    
-  datasource:
-    name: test
-    url: jdbc:mysql://47.114.1.200:3306/mec_test?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
-    username: mec_dev
-    password: dayaDataOnline@2019
-    # 使用druid数据源
-    type: com.alibaba.druid.pool.DruidDataSource
-    driver-class-name: com.mysql.cj.jdbc.Driver
-    filters: stat
-    maxActive: 20
-    initialSize: 1
-    maxWait: 60000
-    minIdle: 1
-    timeBetweenEvictionRunsMillis: 60000
-    minEvictableIdleTimeMillis: 300000
-    validationQuery: select 'x'
-    testWhileIdle: true
-    testOnBorrow: false
-    testOnReturn: false
-    poolPreparedStatements: true
-    maxOpenPreparedStatements: 20
-  
-  redis:
-    host: 47.114.1.200
-    port: 6379
-    password: dyym
-    database: 1
-    #连接超时时间(毫秒)
-    timeout: 10000
-    jedis:
-      pool:
-        #连接池最大连接数(使用负值表示没有限制)
-        max-active: 20
-        #连接池最大阻塞等待时间(使用负值表示没有限制)
-        max-wait: 10000
-        #连接池中的最大空闲连接
-        max-idle: 10
-        #连接池中的最小空闲连接
-        min-idle: 5
-    
-
-mybatis:
-    mapperLocations: classpath:config/mybatis/*.xml
-    
-swagger:
-  base-package: com.yonge.audo.controller
-          
-##认证 
-security:
-  oauth2:
-    client:
-      client-id: app
-      client-secret: app
-    resource:
-      token-info-uri: http://localhost:8001/oauth/check_token
-  
-#spring boot admin 相关配置
-management:
-  endpoints:
-    web:
-      exposure:
-        include: "*"
-  endpoint:
-    health:
-      show-details: ALWAYS
-      
-
-ribbon:  
-    ReadTimeout: 60000  
-    ConnectTimeout: 60000
-
-message:
-  debugMode: true
-  
-##支付流水隐藏
-payment:
-  hiddenMode: false
-  #隐藏的支付方式
-  channel: YQPAY
-  
-eseal:
-  tsign:
-    projectid: 4438776254
-    projectSecret: a94cf63d6361084d232f345d71321691
-    apisUrl: http://smlitsm.tsign.cn:8080/tgmonitor/rest/app!getAPIInfo2
-
-push:
-  jiguang:
-    reqURL: https://api.jpush.cn/v3/push
-    appKey:
-      student: 0e7422e1d6e73637e678716a
-      teacher: 7e0282ca92c12c8c45a93bb3
-      system: 496fc1007dea59b1b4252d2b
-    masterSecret:
-      student: c2361016604eab56ab2db2ac
-      teacher: d47430e2f4755ef5dc050ac5
-      system: a5e51e9cdb25417463afbf7a
-    apns_production: false

+ 11 - 0
audio-analysis/src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,11 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        server-addr: 47.114.1.200:8848
+        namespace: 6f8374a9-598f-4889-bb17-476070ffb8de
+        group: DEFAULT_GROUP
+        prefix: audio-analysis-dev
+        file-extension: yaml
+        enabled: true
+        refresh-enabled: true

+ 0 - 16
audio-analysis/src/main/resources/bootstrap-prod.properties

@@ -1,16 +0,0 @@
-#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
-#spring.profiles.active=dev
-#\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=47.96.80.97:8848
-#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
-#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
-spring.cloud.nacos.config.group=DEFAULT_GROUP
-#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
-spring.cloud.nacos.config.prefix=audio-analysis
-#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
-spring.cloud.nacos.config.file-extension=yaml
-#\u662f\u5426\u52a8\u6001\u5237\u65b0
-spring.cloud.nacos.config.refresh.enabled=true
-#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
-spring.cloud.nacos.config.enabled=true

+ 0 - 16
audio-analysis/src/main/resources/bootstrap-sim.properties

@@ -1,16 +0,0 @@
-#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
-#spring.profiles.active=dev
-#\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=47.114.1.200:8848
-#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=763783fd-dfd1-4a44-857e-42a27448c42c
-#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
-spring.cloud.nacos.config.group=DEFAULT_GROUP
-#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
-spring.cloud.nacos.config.prefix=audio-analysis
-#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
-spring.cloud.nacos.config.file-extension=yaml
-#\u662f\u5426\u52a8\u6001\u5237\u65b0
-spring.cloud.nacos.config.refresh.enabled=true
-#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
-spring.cloud.nacos.config.enabled=true

+ 0 - 16
audio-analysis/src/main/resources/bootstrap-test.properties

@@ -1,16 +0,0 @@
-#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
-#spring.profiles.active=dev
-#\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=47.114.176.40:8848
-#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=46f06363-b9d6-46f0-9cd7-7b33dcf26bb0
-#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
-spring.cloud.nacos.config.group=DEFAULT_GROUP
-#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
-spring.cloud.nacos.config.prefix=audio-analysis
-#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
-spring.cloud.nacos.config.file-extension=yaml
-#\u662f\u5426\u52a8\u6001\u5237\u65b0
-spring.cloud.nacos.config.refresh.enabled=true
-#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
-spring.cloud.nacos.config.enabled=true

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

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+	<property name="LOG_HOME" value="/mdata/logs/audio-analysis-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="CONSOLE_LOG_PATTERN"
+		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
+
+	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder charset="UTF-8">
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<appender name="file"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>${LOG_HOME}</FileNamePattern>
+			<MaxHistory>90</MaxHistory>
+			<TimeBasedFileNamingAndTriggeringPolicy
+				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<MaxFileSize>20MB</MaxFileSize>
+			</TimeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+
+		<encoder>
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="com.yonge" level="info" />
+
+	<!--开发环境:打印控制台 -->
+	<springProfile name="dev">
+		<root level="dev">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+	
+	<springProfile name="test">
+		<root level="info">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+	<!--生产环境:输出到文件 -->
+	<springProfile name="prod">
+		<root level="WARN">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+</configuration>

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

@@ -0,0 +1,58 @@
+package com.yonge.cooleshow.biz.dal.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 退款请求
+ *
+ * @Author: liweifan
+ * @Data: 2022/3/31 14:55
+ */
+@ApiModel(value = "OrderRefundReq对象", description = "退款请求")
+public class OrderRefundReq {
+    @NotBlank(message = "订单号不能为空")
+    @ApiModelProperty(value = "订单号 ", required = true)
+    private String orderNo;
+    @NotBlank(message = "详情id不能为空")
+    @ApiModelProperty(value = "订单详情id ", required = true)
+    private Long orderDetilId;
+    @ApiModelProperty(value = "退款说明 ")
+    private String reason;
+
+    private Long userId;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Long getOrderDetilId() {
+        return orderDetilId;
+    }
+
+    public void setOrderDetilId(Long orderDetilId) {
+        this.orderDetilId = orderDetilId;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+}

+ 21 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderRefunds.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.AuthStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -23,13 +24,16 @@ public class UserOrderRefunds implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
     private Long id;
 	@TableField(value = "user_id_")
-    private Integer userId;
+    private Long userId;
     @ApiModelProperty("订单号 ")
 	@TableField(value = "order_no_")
     private String orderNo;
-    @ApiModelProperty("状态(1,审核中;2,通过;-1,拒绝;) ")
+    @ApiModelProperty("订单详情id ")
+    @TableField(value = "order_detil_id_")
+    private Long orderDetilId;
+    @ApiModelProperty("状态 DOING、审核中 PASS、通过 UNPASS、不通过")
 	@TableField(value = "status_")
-    private String status;
+    private AuthStatusEnum status;
     @ApiModelProperty("申请退费金额 ")
 	@TableField(value = "apply_amount_")
     private BigDecimal applyAmount;
@@ -61,11 +65,11 @@ public class UserOrderRefunds implements Serializable {
         this.id = id;
     }
     
-	public Integer getUserId() {
+	public Long getUserId() {
         return userId;
     }
 
-    public void setUserId(Integer userId) {
+    public void setUserId(Long userId) {
         this.userId = userId;
     }
     
@@ -76,12 +80,20 @@ public class UserOrderRefunds implements Serializable {
     public void setOrderNo(String orderNo) {
         this.orderNo = orderNo;
     }
-    
-	public String getStatus() {
+
+    public Long getOrderDetilId() {
+        return orderDetilId;
+    }
+
+    public void setOrderDetilId(Long orderDetilId) {
+        this.orderDetilId = orderDetilId;
+    }
+
+    public AuthStatusEnum getStatus() {
         return status;
     }
 
-    public void setStatus(String status) {
+    public void setStatus(AuthStatusEnum status) {
         this.status = status;
     }
     
@@ -92,7 +104,7 @@ public class UserOrderRefunds implements Serializable {
     public void setApplyAmount(BigDecimal applyAmount) {
         this.applyAmount = applyAmount;
     }
-    
+
 	public BigDecimal getActualAmount() {
         return actualAmount;
     }

+ 32 - 20
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -11,16 +11,29 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     STUDENT_BUY_TEACHER_MUSIC_SHEET("STUDENT_BUY_TEACHER_MUSIC_SHEET","学员购买老师乐谱"),
     MUSIC_SHEET_AUTH_PASS("MUSIC_SHEET_AUTH_PASS","乐谱审核通过"),
     MUSIC_SHEET_AUTH_UNPASS("MUSIC_SHEET_AUTH_UNPASS","乐谱审核失败"),
+
     STUDENT_BUY_MUSIC_SHEET_SUCCESS("STUDENT_BUY_MUSIC_SHEET_SUCCESS","学员购买乐谱成功"),
+    SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS("SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS","学员购买乐谱(短信)"),
+
     TEACHER_DECORATE_HOMEWORK("TEACHER_DECORATE_HOMEWORK","老师布置作业"),
     TEACHER_REVIEW_HOMEWORK("TEACHER_REVIEW_HOMEWORK","老师点评作业"),
     STUDENT_SUBMIT_HOMEWORK("STUDENT_SUBMIT_HOMEWORK","学生提交作业"),
 
-    TEACHER_AUTH_PASS("TEACHER_AUTH_PASS","老师认证通过"),
-    TEACHER_AUTH_FAIL("TEACHER_AUTH_FAIL","老师认证失败"),
-    MUSICIAN_AUTH_PASS("MUSICIAN_AUTH_PASS","音乐人认证通过"),
+    TEACHER_AUTH_PASS("TEACHER_AUTH_PASS","老师认证通过","H5?https//www.xxxx.com/teacher/#/practiceSetting"),
+    SMS_TEACHER_AUTH_PASS("SMS_TEACHER_AUTH_PASS","老师认证通过(短信)"),
+
+    TEACHER_AUTH_FAIL("TEACHER_AUTH_FAIL","老师认证失败","H5?https//www.xxxx.com/teacher/#/teacherCert"),
+    SMS_TEACHER_AUTH_FAIL("SMS_TEACHER_AUTH_FAIL","老师认证失败(短信)"),
+
+    MUSICIAN_AUTH_PASS("MUSICIAN_AUTH_PASS","音乐人认证通过","H5?https//www.xxxx.com/teacher/#/music-upload"),
+    SMS_MUSICIAN_AUTH_PASS("SMS_MUSICIAN_AUTH_PASS","音乐人认证通过(短信)"),
+
     MUSICIAN_AUTH_FAIL("MUSICIAN_AUTH_FAIL","音乐人认证失败"),
+    SMS_MUSICIAN_AUTH_FAIL("SMS_MUSICIAN_AUTH_FAIL","音乐人认证失败(短信)"),
+
     STUDENT_BUY_PRACTICE("STUDENT_BUY_PRACTICE","学员购买陪练课"),
+    SMS_STUDENT_BUY_PRACTICE("SMS_STUDENT_BUY_PRACTICE","学员购买陪练课(短信)"),
+
     STUDENT_BUY_LIVE("STUDENT_BUY_LIVE","学员购买直播课"),
     STUDENT_BUY_VIDEO("STUDENT_BUY_VIDEO","学员购买视频课"),
     LIVE_COMPLETION_SUCCESS("LIVE_COMPLETION_SUCCESS","直播课成课"),
@@ -33,12 +46,26 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     STUDENT_EVALUATE_TEACHER_PRACTICE("STUDENT_EVALUATE_TEACHER_PRACTICE","学员对老师评价"),
     WITHDRAWAL_SUCCESS("WITHDRAWAL_SUCCESS","提现成功"),
     STUDENT_JOIN_FANSGROUP("STUDENT_JOIN_FANSGROUP","学员申请加入粉丝群"),
+
     VIP_BUY_SUCCESS("VIP_BUY_SUCCESS","会员购买成功"),
-    VIP_EXPIRE_THIRTY_DAY("VIP_EXPIRE_THIRTY_DAY","会员到期前30天"),
-    VIP_EXPIRE("VIP_EXPIRE","会员到期"),
+    SMS_VIP_BUY_SUCCESS("SMS_VIP_BUY_SUCCESS","会员购买成功(短信)"),
+
+    VIP_EXPIRE_THIRTY_DAY("VIP_EXPIRE_THIRTY_DAY","会员到期前30天","H5?https//www.xxxx.com/student/#/memberCenter"),
+    SMS_VIP_EXPIRE_THIRTY_DAY("SMS_VIP_EXPIRE_THIRTY_DAY","会员到期前30天(短信)","H5?https//www.xxxx.com/student/#/memberCenter"),
+
+    VIP_EXPIRE("VIP_EXPIRE","会员到期","H5?https//www.xxxx.com/student/#/memberCenter"),
+    SMS_VIP_EXPIRE("SMS_VIP_EXPIRE","会员到期(短信)","H5?https//www.xxxx.com/student/#/memberCenter"),
+
     PRACTICE_BUY("PRACTICE_BUY","陪练课购买"),
+    SMS_PRACTICE_BUY("SMS_PRACTICE_BUY", "陪练课购买(短信)"),
+
     LIVE_BUY("LIVE_BUY","直播课购买"),
+    SMS_LIVE_BUY("SMS_LIVE_BUY","直播课购买"),
+
+
     VIDEO_BUY("VIDEO_BUY","视频课购买"),
+    SMS_VIDEO_BUY("SMS_VIDEO_BUY","视频课购买(短信)"),
+
     PRACTICE_REMIND("PRACTICE_REMIND","陪练课提醒(陪练课开始前20分钟)"),
     LIVE_REMIND("LIVE_REMIND","直播课提醒(直播课开始前20分钟)"),
     NOT_EVALUATE_TEACHER_PRACTICE("NOT_EVALUATE_TEACHER_PRACTICE","当日陪练课未对老师评价(每晚9点,已评价不发)"),
@@ -46,22 +73,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
 
     //------短信模板------
     SMS_BUY_LIVE("SMS_BUY_LIVE","直播课购买成功"),
-    SMS_LIVE_BUY("SMS_LIVE_BUY","直播课购买"),
     SMS_LIVE_COMPLETION_SUCCESS("SMS_LIVE_COMPLETION_SUCCESS","直播课成课"),
-
-    SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS("SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS","学员购买乐谱(短信)"),
-
-    SMS_TEACHER_AUTH_PASS("SMS_TEACHER_AUTH_PASS","老师认证通过(短信)"),
-    SMS_TEACHER_AUTH_FAIL("SMS_TEACHER_AUTH_FAIL","老师认证失败(短信)"),
-    SMS_MUSICIAN_AUTH_PASS("SMS_MUSICIAN_AUTH_PASS","音乐人认证通过(短信)"),
-    SMS_MUSICIAN_AUTH_FAIL("SMS_MUSICIAN_AUTH_FAIL","音乐人认证失败(短信)"),
-    SMS_VIP_BUY_SUCCESS("SMS_VIP_BUY_SUCCESS","会员购买成功(短信)"),
-    SMS_VIP_EXPIRE_THIRTY_DAY("SMS_VIP_EXPIRE_THIRTY_DAY","会员到期前30天(短信)"),
-    SMS_VIP_EXPIRE("SMS_VIP_EXPIRE","会员到期(短信)"),
-
-    SMS_VIDEO_BUY("SMS_VIDEO_BUY","视频课购买(短信)"),
-    SMS_STUDENT_BUY_PRACTICE("SMS_STUDENT_BUY_PRACTICE","学员购买陪练课(短信)"),
-    SMS_PRACTICE_BUY("SMS_PRACTICE_BUY", "陪练课购买(短信)"),
     SMS_TOMORROW_COURSE_REMINDER("SMS_TOMORROW_COURSE_REMINDER", "明日课程提醒(每晚9点)(短信)");
 
     MessageTypeEnum(String code, String msg) {

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
@@ -13,6 +14,7 @@ import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
 import org.redisson.api.RMap;
@@ -142,6 +144,33 @@ public interface CourseGroupService extends IService<CourseGroup> {
      * <p>定时将符合结束售卖日期的在售卖中的直播课课程组修改为取消或者成课状态状态-每隔10分钟执行一次
      */
     void opsCourseGroup();
-
+    /***
+     * 直播课退款单-创建前
+     * @param: refundReq
+     * @updateTime 2022/5/9 15:11
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
+     */
+    HttpResponseResult<RefundCreateRes> refundCreate(OrderRefundReq refundReq);
+    /***
+     * 直播课退款单-创建后
+     * @param: refundReq
+     * @updateTime 2022/5/9 15:11
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
+     */
+    void refundAfter(UserOrderRefundsVo userOrderRefundsVo);
+    /***
+     * 直播课退款单-退款成功
+     * @param: refundReq
+     * @updateTime 2022/5/9 15:11
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
+     */
+    void refundSuccess(UserOrderRefundsVo userOrderRefundsVo);
+    /***
+     * 直播课退款单-退款失败
+     * @param: refundReq
+     * @updateTime 2022/5/9 15:11
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
+     */
+    void refundCancel(UserOrderRefundsVo userOrderRefundsVo);
 }
 

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

@@ -2,9 +2,11 @@ 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.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundsVo;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderRefundsSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderRefunds;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 /**
  * 用户退款表 服务类
@@ -12,7 +14,6 @@ import com.yonge.cooleshow.biz.dal.entity.UserOrderRefunds;
  * @date 2022-03-30
  */
 public interface UserOrderRefundsService extends IService<UserOrderRefunds>  {
-
 	/**
      * 查询详情
      * @author liweifan
@@ -26,4 +27,12 @@ public interface UserOrderRefundsService extends IService<UserOrderRefunds>  {
  	 * @date 2022-03-30
      */
     IPage<UserOrderRefundsVo> selectPage(IPage<UserOrderRefundsVo> page, OrderRefundsSearch query);
+	/***
+	 * 订单退款
+	 * @author liweifan
+	 * @param: refundReq
+	 * @updateTime 2022/5/9 14:29
+	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
+	 */
+	HttpResponseResult<Boolean> orderRefund(OrderRefundReq refundReq);
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java

@@ -3,6 +3,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.biz.dal.dto.req.OrderPayReq;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
@@ -114,6 +115,16 @@ public interface UserOrderService extends IService<UserOrder> {
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
      */
     HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq);
+
+    /***
+     * 订单退款
+     * @author liweifan
+     * @param: payReq
+     * @updateTime 2022/4/21 19:39
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
+     */
+    HttpResponseResult<Boolean> orderRefund(OrderRefundReq refundReq);
+
     /***
      * 取消订单(未判断付款单状态)
      * @author liweifan
@@ -154,4 +165,5 @@ public interface UserOrderService extends IService<UserOrder> {
      * @updateTime 2022/4/29 18:41
      */
     void setOrderStatus(String orderNo, OrderStatusEnum orderStatus);
+
 }

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

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto.CoursePlanDto;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
@@ -24,6 +25,7 @@ import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
@@ -834,6 +836,14 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         closeCourseGroup();
     }
 
+    @Override
+    public HttpResponseResult<RefundCreateRes> refundCreate(OrderRefundReq refundReq) {
+        RefundCreateRes refundCreateRes = new RefundCreateRes();
+        refundCreateRes.setRes(true);
+        refundCreateRes.setActualPrice(BigDecimal.ZERO);
+        return HttpResponseResult.succeed(refundCreateRes);
+    }
+
     /**
      * 定时将符合开售日期的未开售的直播课课程组修改为报名中状态
      */

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

@@ -118,7 +118,6 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         //会员购买消息推送
         authSend(studentVo.getUserId(), studentVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN));
-
     }
 
 

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

@@ -118,7 +118,7 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
         } else {
             try {
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_AUTH_FAIL,
-                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(), reason, "app内认证链接");
+                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(), reason, MessageTypeEnum.TEACHER_AUTH_FAIL.getUrl());
             } catch (Exception e) {
                 log.error("入驻审核极光消息推送异常,userId={}", userId);
             }

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

@@ -124,7 +124,7 @@ public class TeacherAuthMusicianRecordServiceImpl extends ServiceImpl<TeacherAut
         if (isPass) {
             try {
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSICIAN_AUTH_PASS,
-                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(), "app内上传乐谱链接");
+                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(), MessageTypeEnum.MUSICIAN_AUTH_PASS.getUrl());
             } catch (Exception e) {
                 log.error("音乐人认证极光消息推送异常,userId={}", userId);
             }

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

@@ -1,7 +1,18 @@
 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.dto.req.OrderRefundReq;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderRefunds;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundsVo;
@@ -9,9 +20,40 @@ import com.yonge.cooleshow.biz.dal.dto.search.OrderRefundsSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderRefundsDao;
 import com.yonge.cooleshow.biz.dal.service.UserOrderRefundsService;
 
+import javax.annotation.PostConstruct;
+import java.sql.Wrapper;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
 
 @Service
 public class UserOrderRefundsServiceImpl extends ServiceImpl<UserOrderRefundsDao, UserOrderRefunds> implements UserOrderRefundsService {
+    @Autowired
+    private CourseGroupService courseGroupService;
+
+    //验证是否可以退款,获取退款金额信息
+    private static final Map<GoodTypeEnum, Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>>> refundCreate = new HashMap<>();
+    //插入退款后执行
+    private static final Map<GoodTypeEnum, Consumer<UserOrderRefundsVo>> refundAfter = new HashMap<>();
+    //退款完成后执行
+    private static final Map<GoodTypeEnum, Consumer<UserOrderRefundsVo>> refundSuccess = new HashMap<>();
+    //退款未通过后执行
+    private static final Map<GoodTypeEnum, Consumer<UserOrderRefundsVo>> refundCancel = new HashMap<>();
+
+    @PostConstruct
+    private void init() {
+        /**********退费单生成前******************/
+        //直播课退费
+        refundCreate.put(GoodTypeEnum.LIVE, courseGroupService::refundCreate);
+
+        refundAfter.put(GoodTypeEnum.LIVE, courseGroupService::refundAfter);
+
+        refundSuccess.put(GoodTypeEnum.LIVE, courseGroupService::refundSuccess);
+
+        refundCancel.put(GoodTypeEnum.LIVE, courseGroupService::refundCancel);
+    }
 
 	@Override
     public UserOrderRefundsVo detail(Long id) {
@@ -23,5 +65,24 @@ public class UserOrderRefundsServiceImpl extends ServiceImpl<UserOrderRefundsDao
     public IPage<UserOrderRefundsVo> selectPage(IPage<UserOrderRefundsVo> page, OrderRefundsSearch query){
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
+    @Override
+    public HttpResponseResult<Boolean> orderRefund(OrderRefundReq refundReq) {
+        UserOrderRefunds old = baseMapper.selectOne(Wrappers.<UserOrderRefunds>lambdaQuery()
+                .eq(UserOrderRefunds::getUserId, refundReq.getUserId())
+                .eq(UserOrderRefunds::getOrderNo, refundReq.getOrderNo())
+                .eq(UserOrderRefunds::getOrderDetilId, refundReq.getOrderDetilId()));
+        if(null != old){
+            return HttpResponseResult.failed("已存在退款记录");
+        }
+        UserOrderRefunds orderRefunds = new UserOrderRefunds();
+        orderRefunds.setUserId(refundReq.getUserId());
+        orderRefunds.setOrderNo(refundReq.getOrderNo());
+        orderRefunds.setOrderDetilId(refundReq.getOrderDetilId());
+        orderRefunds.setReason(refundReq.getReason());
+        orderRefunds.setStatus(AuthStatusEnum.DOING);
+
+        return null;
+    }
+
 }

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

@@ -2,9 +2,11 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.config.HuifuConfiguration;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
@@ -59,6 +61,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Autowired
     private UserOrderPaymentService orderPaymentService;
     @Autowired
+    private UserOrderRefundsService orderRefundsService;
+    @Autowired
     private PaymentSdk paymentSdk;
     @Autowired
     private IdGeneratorService idGeneratorService;
@@ -73,7 +77,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Autowired
     private RedissonClient redissonClient;
 
-    //验证订单是否可以下单
+    //验证订单是否可以下单,获取订单金额信息
     private static final Map<GoodTypeEnum, Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>>> orderCreate = new HashMap<>();
     //插入订单后执行
     private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> orderAfter = new HashMap<>();
@@ -204,6 +208,38 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult<Boolean> orderRefund(OrderRefundReq refundReq) {
+        UserOrderVo detail = detail(refundReq.getOrderNo(), refundReq.getUserId());
+        if (null == detail || CollectionUtils.isEmpty(detail.getOrderDetailList())) {
+            return HttpResponseResult.failed("未找到订单信息");
+        }
+        if (!OrderStatusEnum.PAID.equals(detail.getStatus())) {
+            return HttpResponseResult.failed("订单状态异常");
+        }
+        UserOrderDetailVo orderDetail = null;
+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) {
+            if(vo.getId().equals(refundReq.getOrderDetilId())){
+                orderDetail = vo;
+            }
+        }
+
+        if (null == orderDetail) {
+            return HttpResponseResult.failed("未找到订单信息");
+        }
+
+        if (StringUtil.isEmpty(detail.getTransNo())) {
+            return HttpResponseResult.failed("未找到订单付款信息");
+        }
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(detail.getTransNo());
+        if (null == orderPayment || !TradeStatusEnum.succeeded.equals(orderPayment.getStatus())) {
+            return HttpResponseResult.failed("订单付款状态异常");
+        }
+        //发起退款申请
+        return orderRefundsService.orderRefund(refundReq);
+    }
+
+    @Override
     public void setSuccessStatus() {
         OrderSearch query = new OrderSearch();
         query.setStatus("WAIT_PAY,PAYING");
@@ -345,7 +381,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      */
     private void paymentSucceededHandle(JSONObject hfRes) {
         UserOrderPayment orderPayment = orderPaymentService.detailByAdapayNo(hfRes.getString("order_no"));
-        if(null == orderPayment){
+        if (null == orderPayment) {
             return;
         }
         //订单完成

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

@@ -91,14 +91,14 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         receivers.put(userId, phone);
         try {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_EXPIRE_THIRTY_DAY,
-                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), "会员中心链接");
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), MessageTypeEnum.VIP_EXPIRE_THIRTY_DAY.getUrl());
         } catch (Exception e) {
             log.error("会员到期3天极光消息推送异常,userId={}", userId);
         }
 
         try {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_EXPIRE_THIRTY_DAY,
-                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), "会员中心链接");
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), MessageTypeEnum.SMS_VIP_EXPIRE_THIRTY_DAY.getUrl());
         } catch (Exception e) {
             log.error("会员到期3天短信消息推送异常,userId={}", userId);
         }
@@ -110,14 +110,14 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         receivers.put(userId, phone);
         try {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_EXPIRE,
-                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), "会员中心链接");
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), MessageTypeEnum.VIP_EXPIRE.getUrl());
         } catch (Exception e) {
             log.error("会员到期3天极光消息推送异常,userId={}", userId);
         }
 
         try {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_EXPIRE,
-                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), "会员中心链接");
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), MessageTypeEnum.SMS_VIP_EXPIRE.getUrl());
         } catch (Exception e) {
             log.error("会员到期3天短信消息推送异常,userId={}", userId);
         }

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

@@ -0,0 +1,56 @@
+package com.yonge.cooleshow.biz.dal.vo.res;
+
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/3/31 16:18
+ */
+@ApiModel(value = "OrderCheckRes", description = "退款创建业务返回对象")
+public class RefundCreateRes {
+    @ApiModelProperty("验证结果(必填)")
+    private Boolean res;
+    @ApiModelProperty("实际价格(必填)")
+    private BigDecimal actualPrice;
+
+    @ApiModelProperty("商品类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播")
+    private GoodTypeEnum goodType;
+    @ApiModelProperty(value = "冗余字段,用于传递参数用")
+    private Object bizParam;
+
+    public Boolean getRes() {
+        return res;
+    }
+
+    public void setRes(Boolean res) {
+        this.res = res;
+    }
+
+    public BigDecimal getActualPrice() {
+        return actualPrice;
+    }
+
+    public void setActualPrice(BigDecimal actualPrice) {
+        this.actualPrice = actualPrice;
+    }
+
+    public GoodTypeEnum getGoodType() {
+        return goodType;
+    }
+
+    public void setGoodType(GoodTypeEnum goodType) {
+        this.goodType = goodType;
+    }
+
+    public Object getBizParam() {
+        return bizParam;
+    }
+
+    public void setBizParam(Object bizParam) {
+        this.bizParam = bizParam;
+    }
+}

+ 3 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundsMapper.xml

@@ -5,7 +5,8 @@
             <result column="id_" property="id" />
 	        <result column="user_id_" property="userId" />
 	        <result column="order_no_" property="orderNo" />
-	        <result column="status_" property="status" />
+            <result column="order_detil_id_" property="orderDetilId" />
+            <result column="status_" property="status" />
 	        <result column="apply_amount_" property="applyAmount" />
 	        <result column="actual_amount_" property="actualAmount" />
 	        <result column="reason_" property="reason" />
@@ -20,6 +21,7 @@
          t.id_ as id
         , t.user_id_ as userId
         , t.order_no_ as orderNo
+        , t.order_detil_id_ as orderDetilId
         , t.status_ as status
         , t.apply_amount_ as applyAmount
         , t.actual_amount_ as actualAmount

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

@@ -96,7 +96,7 @@ public class PaymentController extends BaseController {
             String sign = request.getParameter("sign");
             //回调业务类型
             String type = request.getParameter("type");
-            log.info("汇付回调,type is {},type is {}, res is {}", type, sign, data);
+            log.info("汇付回调,type is {},sign is {}, data is {}", type, sign, data);
             if (StringUtil.isEmpty(type)) {
                 log.error("汇付回调参数异常");
                 return;

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

@@ -4,6 +4,7 @@ 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.req.OrderPayReq;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
@@ -140,7 +141,7 @@ public class UserOrderController extends BaseController {
             @ApiImplicitParam(name = "orderNo", value = "订单号", paramType = "query", dataType = "String", required = true),
             @ApiImplicitParam(name = "reason", value = "取消说明", paramType = "query", dataType = "String")
     })
-    public HttpResponseResult<Boolean> orderCancel(@ApiIgnore @RequestBody OrderPayReq payReq, HttpServletRequest request) {
+    public HttpResponseResult<Boolean> orderCancel(@ApiIgnore @RequestBody OrderPayReq payReq) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -162,6 +163,26 @@ public class UserOrderController extends BaseController {
         }
     }
 
+    @ApiOperation(value = "订单退款")
+    @PostMapping("/orderRefund")
+    public HttpResponseResult<Boolean> orderRefund(@RequestBody OrderRefundReq refundReq) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        refundReq.setUserId(user.getId());
+        Future<HttpResponseResult<Boolean>> httpResponseResultFuture = DistributedLock.of(redissonClient)
+                .callIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                        , () -> userOrderService.orderRefund(refundReq), 60L, TimeUnit.SECONDS);
+
+        try {
+            return httpResponseResultFuture.get();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("订单退款失败");
+        }
+    }
+
     /**
      * 查询分页
      */