Browse Source

订单修改

liweifan 2 years ago
parent
commit
233101a1b9
25 changed files with 355 additions and 204 deletions
  1. 0 87
      cooleshow-resource/pom.xml
  2. 0 28
      cooleshow-resource/src/main/java/com/yonge/cooleshow/resource/ResourceApplication.java
  3. 0 12
      cooleshow-resource/src/main/resources/bootstrap-prod.yml
  4. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  5. 19 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderRefundReq.java
  6. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTotal.java
  7. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherTotal.java
  8. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  9. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  10. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  11. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  12. 40 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentTotalServiceImpl.java
  13. 8 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  14. 28 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherTotalServiceImpl.java
  15. 4 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  16. 9 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  17. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java
  18. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java
  19. 47 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  20. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthMusicianRecordMapper.xml
  21. 13 13
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  22. 2 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java
  23. 13 13
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java
  24. 0 1
      pom.xml
  25. 35 3
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/util/DistributedLock.java

+ 0 - 87
cooleshow-resource/pom.xml

@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>cooleshow</artifactId>
-        <groupId>com.yonge.cooleshow</groupId>
-        <version>1.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>cooleshow-resource</artifactId>
-    <version>1.0</version>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-    <dependencies>
-        <dependency>
-            <groupId>com.yonge.cooleshow</groupId>
-            <artifactId>cooleshow-common</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-security</artifactId>
-        </dependency>
-
-        <!-- swagger-spring-boot -->
-        <dependency>
-            <groupId>com.spring4all</groupId>
-            <artifactId>swagger-spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.yonge.toolset</groupId>
-            <artifactId>toolset-mybatis</artifactId>
-            <version>${project.toolset.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.yonge.toolset</groupId>
-            <artifactId>toolset-feign</artifactId>
-            <version>1.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.yonge.cooleshow</groupId>
-            <artifactId>cooleshow-common</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.yonge.toolset</groupId>
-            <artifactId>thirdparty-component</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.yonge.toolset</groupId>
-            <artifactId>toolset-mybatis</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.yonge.toolset</groupId>
-            <artifactId>toolset-emoji</artifactId>
-            <version>1.0</version>
-        </dependency>
-
-        <!-- mybatis-plus -->
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-            <version>3.0.7.1</version>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 28
cooleshow-resource/src/main/java/com/yonge/cooleshow/resource/ResourceApplication.java

@@ -1,28 +0,0 @@
-package com.yonge.cooleshow.resource;
-
-import com.spring4all.swagger.EnableSwagger2Doc;
-import com.yonge.cooleshow.common.constant.AppConstant;
-import com.yonge.toolset.base.BaseApplication;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-import org.springframework.cloud.openfeign.EnableFeignClients;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-
-@SpringBootApplication
-@EnableDiscoveryClient
-@EnableFeignClients("com.yonge.cooleshow")
-@MapperScan(basePackages = {"com.yonge.cooleshow.resource.dao"})
-@ComponentScan(basePackages = {
-        "com.yonge.cooleshow",
-        "com.yonge.toolset"
-})
-@Configuration
-@EnableSwagger2Doc
-public class ResourceApplication {
-    public static void main(String[] args) {
-        BaseApplication.run(AppConstant.APPLICATION_RESOURCE,ResourceApplication.class, args);
-    }
-
-}

+ 0 - 12
cooleshow-resource/src/main/resources/bootstrap-prod.yml

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

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java

@@ -136,4 +136,17 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      * @return
      */
     TeacherAuditMusicSheetVo selectTeacherCount(@Param("userId") Long userId);
+
+    /**
+     * 老师统计
+     * @param userId
+     * @return
+     */
+    List<TeacherTotalVo> queryTeacherTotal(@Param("userId") Long userId);
+    /**
+     * 学生统计
+     * @param userId
+     * @return
+     */
+    List<StudentTotalVo> queryStudentTotal(@Param("userId") Long userId);
 }

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

@@ -16,9 +16,9 @@ import java.util.List;
 @ApiModel(value = "OrderRefundReq对象", description = "退款请求")
 public class OrderRefundReq {
 
-    @ApiModelProperty("订单ID ")
-    @NotNull(message = "订单id不能为空")
-    private Long orderId;
+    @ApiModelProperty("订单 ")
+    @NotNull(message = "订单不能为空")
+    private String orderNo;
 
     @ApiModelProperty("订单详情ids ")
     private List<Long> oredrDetilIds;
@@ -26,16 +26,19 @@ public class OrderRefundReq {
     @ApiModelProperty(value = "退款说明 ")
     private String reason;
 
+    @ApiModelProperty(hidden = true)
     private Long userId;
-
+    @ApiModelProperty(hidden = true)
+    private Long orderId;
+    @ApiModelProperty(hidden = true)
     private UserOrderDetailVo oredrDetil;
 
-    public Long getOrderId() {
-        return orderId;
+    public String getOrderNo() {
+        return orderNo;
     }
 
-    public void setOrderId(Long orderId) {
-        this.orderId = orderId;
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
     }
 
     public List<Long> getOredrDetilIds() {
@@ -69,4 +72,12 @@ public class OrderRefundReq {
     public void setOredrDetil(UserOrderDetailVo oredrDetil) {
         this.oredrDetil = oredrDetil;
     }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
 }

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTotal.java

@@ -45,6 +45,13 @@ public class StudentTotal implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
+    @ApiModelProperty("专辑数 ")
+    @TableField(value = "music_album_num_")
+    private Integer musicAlbumNum = 0;
+    @ApiModelProperty("曲谱数 ")
+    @TableField(value = "music_sheet_num_")
+    private Integer musicSheetNum = 0;
+
     public Long getUserId() {
         return userId;
     }
@@ -108,4 +115,20 @@ public class StudentTotal implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
 }

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherTotal.java

@@ -42,6 +42,14 @@ public class TeacherTotal implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
+    @ApiModelProperty("专辑数 ")
+    @TableField(value = "music_album_num_")
+    private Integer musicAlbumNum = 0;
+    @ApiModelProperty("曲谱数 ")
+    @TableField(value = "music_sheet_num_")
+    private Integer musicSheetNum = 0;
+
+
     public Long getUserId() {
         return userId;
     }
@@ -98,4 +106,19 @@ public class TeacherTotal implements Serializable {
         this.updateTime = updateTime;
     }
 
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
 }

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -14,6 +14,7 @@ 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;
 
@@ -251,4 +252,19 @@ public interface MusicSheetService extends IService<MusicSheet> {
      * @return
      */
     TeacherAuditMusicSheetVo selectTeacherCount(Long userId);
+
+    /**
+     * 老师统计
+     * @author liweifan
+     * @param userId
+     * @return
+     */
+    List<TeacherTotalVo> queryTeacherTotal(Long userId);
+
+    /***
+     * 学生统计
+     * @author liweifan
+     * @param: userId
+     */
+    List<StudentTotalVo> queryStudentTotal(Long userId);
 }

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

@@ -66,7 +66,7 @@ public interface UserOrderService extends IService<UserOrder> {
      * @updateTime 2022/3/31 15:42
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.entity.Order>
      */
-    HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) throws Exception;
+    HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq);
 
     /***
      * 订单付款
@@ -75,7 +75,7 @@ public interface UserOrderService extends IService<UserOrder> {
      * @updateTime 2022/3/31 17:23
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult
      */
-    HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) throws Exception;
+    HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq);
 
     /***
      * 通过业务id查询用户正在交易中的订单

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

@@ -793,6 +793,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         return baseMapper.selectTeacherCount(userId);
     }
 
+    @Override
+    public List<TeacherTotalVo> queryTeacherTotal(Long userId) {
+        return baseMapper.queryTeacherTotal(userId);
+    }
+
+    @Override
+    public List<StudentTotalVo> queryStudentTotal(Long userId) {
+        return baseMapper.queryStudentTotal(userId);
+    }
+
     private SysUser getSysUser(Long userId) {
         return Optional.ofNullable(userId)
                        .map(sysUserFeignService::queryUserById)

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

@@ -88,6 +88,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         studentHomeVo.setFinshClassHours(null == total.getFinshHours() ? 0 : total.getFinshHours());
         studentHomeVo.setUnfinshClassHours(null == total.getUnfinshHours() ? 0 : total.getUnfinshHours());
         studentHomeVo.setStarTeacherNum(null == total.getStarTeacherNum() ? 0 : total.getStarTeacherNum());
+        studentHomeVo.setMusicAlbumNum(null == total.getMusicAlbumNum() ? 0 : total.getMusicAlbumNum());
+        studentHomeVo.setMusicSheetNum(null == total.getMusicSheetNum() ? 0 : total.getMusicSheetNum());
         return studentHomeVo;
     }
 
@@ -155,7 +157,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             //学生老师增加好友关系
             Set<Long> studentIds = new HashSet<>();
             studentIds.add(studentVo.getUserId());
-            imUserFriendService.saveUserFriend(userId,studentIds);
+            imUserFriendService.saveUserFriend(userId, studentIds);
         }
         resMap.put("now", detail);
         return HttpResponseResult.succeed(resMap);

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

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.StudentStar;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,6 +41,8 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private RedissonClient redissonClient;
+    @Autowired
+    private MusicSheetService musicSheetService;
 
     @Override
     public StudentTotalVo detail(Long id) {
@@ -68,23 +71,34 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
         if (!CollectionUtils.isEmpty(studentCourseTotal)) {
             studentCourseMap = studentCourseTotal.stream().collect(Collectors.toMap(StudentTotalVo::getUserId, o -> o));
         }
+
+        //乐谱统计
+        List<StudentTotalVo> studentMusicTotal = musicSheetService.queryStudentTotal(null);
+        Map<Long, StudentTotalVo> studentMusicMap = new HashMap<>();
+        if (!CollectionUtils.isEmpty(studentMusicTotal)) {
+            studentMusicMap = studentMusicTotal.stream().collect(Collectors.toMap(StudentTotalVo::getUserId, o -> o));
+        }
+
         List<StudentTotal> resultList = new ArrayList<>();
         for (Student student : students) {
             StudentTotal studentTotal = new StudentTotal();
             studentTotal.setUserId(student.getUserId());
             StudentTotalVo starTotal = studentStarMap.get(student.getUserId());
-            if (null != starTotal && null != starTotal.getStarTeacherNum()) {
-                studentTotal.setStarTeacherNum(starTotal.getStarTeacherNum());
+            if (null != starTotal) {
+                studentTotal.setStarTeacherNum(null == starTotal.getStarTeacherNum() ? 0 : starTotal.getStarTeacherNum());
             }
             StudentTotalVo courseTotal = studentCourseMap.get(student.getUserId());
             if (null != courseTotal) {
-                if (null != courseTotal.getFinshHours()) {
-                    studentTotal.setFinshHours(courseTotal.getFinshHours());
-                }
-                if (null != courseTotal.getUnfinshHours()) {
-                    studentTotal.setUnfinshHours(courseTotal.getUnfinshHours());
-                }
+                studentTotal.setFinshHours(null == courseTotal.getFinshHours() ? 0 : courseTotal.getFinshHours());
+                studentTotal.setUnfinshHours(null == courseTotal.getUnfinshHours() ? 0 : courseTotal.getFinshHours());
             }
+
+            StudentTotalVo musicTotal = studentMusicMap.get(student.getUserId());
+            if (null != musicTotal) {
+                studentTotal.setMusicAlbumNum(null == musicTotal.getMusicAlbumNum() ? 0 : musicTotal.getMusicAlbumNum());
+                studentTotal.setMusicSheetNum(null == musicTotal.getMusicSheetNum() ? 0 : musicTotal.getMusicSheetNum());
+            }
+
             //todo 缺少累计练习天数 累计练习时长 累计评测次数
             resultList.add(studentTotal);
             redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(studentTotal.getUserId()))
@@ -108,7 +122,7 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
 
     @Override
     public void updateTotalCache(StudentTotal studentTotal) {
-        if(null != studentTotal && null != studentTotal.getUserId()){
+        if (null != studentTotal && null != studentTotal.getUserId()) {
             redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(studentTotal.getUserId())).set(studentTotal);
         }
     }
@@ -124,14 +138,25 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
         );
         studentTotal.setStarTeacherNum(starTeacherNum);
 
-        List<StudentTotalVo> studentTotalVos = courseScheduleDao.queryStudentTotal(id);
-        if (!CollectionUtils.isEmpty(studentTotalVos)) {
-            StudentTotalVo studentTotalVo = studentTotalVos.get(0);
-            studentTotal.setFinshHours(null == studentTotalVo.getFinshHours() ? 0 : studentTotalVo.getFinshHours());
-            studentTotal.setUnfinshHours(null == studentTotalVo.getUnfinshHours() ? 0 : studentTotalVo.getUnfinshHours());
+        List<StudentTotalVo> studentScheduleTotal = courseScheduleDao.queryStudentTotal(id);
+        if (!CollectionUtils.isEmpty(studentScheduleTotal)) {
+            StudentTotalVo scheduleTotal = studentScheduleTotal.get(0);
+            if (null != scheduleTotal) {
+                studentTotal.setFinshHours(null == scheduleTotal.getFinshHours() ? 0 : scheduleTotal.getFinshHours());
+                studentTotal.setUnfinshHours(null == scheduleTotal.getUnfinshHours() ? 0 : scheduleTotal.getUnfinshHours());
+            }
         }
-        //todo 缺少累计练习天数 累计练习时长 累计评测次数
 
+        List<StudentTotalVo> studentMuiscTotal = musicSheetService.queryStudentTotal(id);
+        if (!CollectionUtils.isEmpty(studentMuiscTotal)) {
+            StudentTotalVo muiscTotal = studentMuiscTotal.get(0);
+            if (null != muiscTotal) {
+                studentTotal.setMusicAlbumNum(null == muiscTotal.getMusicAlbumNum() ? 0 : muiscTotal.getMusicAlbumNum());
+                studentTotal.setMusicSheetNum(null == muiscTotal.getMusicSheetNum() ? 0 : muiscTotal.getMusicSheetNum());
+            }
+        }
+
+        //todo 缺少累计练习天数 累计练习时长 累计评测次数
         redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(studentTotal.getUserId()))
                 .set(studentTotal);
 
@@ -144,7 +169,6 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
         return studentTotal;
     }
 
-
     int batchSize = 100;
 
     /***

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

@@ -141,10 +141,12 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         if (null == total) {
             total = new TeacherTotal();
         }
-        teacherHomeVo.setStarGrade((null == total.getStarGrade()) ? 0 : total.getStarGrade().intValue());
-        teacherHomeVo.setFansNum((null == total.getFansNum()) ? 0 : total.getFansNum());
-        teacherHomeVo.setExpTime((null == total.getExpTime()) ? 0 : total.getExpTime());
-        teacherHomeVo.setUnExpTime((null == total.getUnExpTime()) ? 0 : total.getUnExpTime());
+        teacherHomeVo.setStarGrade(null == total.getStarGrade() ? 0 : total.getStarGrade().intValue());
+        teacherHomeVo.setFansNum(null == total.getFansNum() ? 0 : total.getFansNum());
+        teacherHomeVo.setExpTime(null == total.getExpTime() ? 0 : total.getExpTime());
+        teacherHomeVo.setUnExpTime(null == total.getUnExpTime() ? 0 : total.getUnExpTime());
+        teacherHomeVo.setMusicAlbumNum(null == total.getMusicAlbumNum() ? 0 : total.getMusicAlbumNum());
+        teacherHomeVo.setMusicSheetNum(null == total.getMusicSheetNum() ? 0 : total.getMusicSheetNum());
         return HttpResponseResult.succeed(teacherHomeVo);
     }
 
@@ -207,7 +209,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         baseMapper.insert(teacher);
         //插入老师账户表
         UserAccount oldAcc = userAccountService.getById(sysUser.getId());
-        if(null == oldAcc){
+        if (null == oldAcc) {
             UserAccount userAccount = new UserAccount();
             userAccount.setUserId(sysUser.getId());
             userAccountService.save(userAccount);
@@ -327,7 +329,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         } else {
             data.setLiveing(YesOrNoEnum.NO);
         }
-        if(null != studentId){
+        if (null != studentId) {
             StudentStar studentStar = studentStarService.getByStudentIdAndTeacherId(studentId, teacherId);
             if (null == studentStar) {
                 data.setIsStar(YesOrNoEnum.NO);

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

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
 import org.redisson.api.RedissonClient;
@@ -20,10 +21,7 @@ import com.yonge.cooleshow.biz.dal.dao.TeacherTotalDao;
 import com.yonge.cooleshow.biz.dal.service.TeacherTotalService;
 import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -41,6 +39,8 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
     private RedissonClient redissonClient;
     @Autowired
     private LiveRoomService liveRoomService;
+    @Autowired
+    private MusicSheetService musicSheetService;
 
     @Override
     public TeacherTotalVo detail(Long id) {
@@ -79,6 +79,13 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
             liveMap.put(liveRoom.getSpeakerId(), true);
         }
 
+        //查询老师曲谱统计
+        List<TeacherTotalVo> musicTotals = musicSheetService.queryTeacherTotal(null);
+        Map<Long, TeacherTotalVo> teacherMusicMap = new HashMap<>();
+        if (!CollectionUtils.isEmpty(musicTotals)) {
+            teacherMusicMap = musicTotals.stream().collect(Collectors.toMap(TeacherTotalVo::getUserId, o -> o));
+        }
+
         List<TeacherTotal> resultList = new ArrayList<>();
         for (Teacher teacher : teachers) {
             TeacherTotal teacherTotal = new TeacherTotal();
@@ -108,6 +115,12 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
             //是否正在直播
             teacherTotal.setLiveFlag(null == liveMap.get(teacher.getUserId()) ? false : true);
 
+            //曲谱统计
+            TeacherTotalVo musicTotal = teacherMusicMap.get(teacher.getUserId());
+            if (null != musicTotal) {
+                teacherTotal.setMusicAlbumNum(musicTotal.getMusicAlbumNum());
+                teacherTotal.setMusicSheetNum(musicTotal.getMusicSheetNum());
+            }
             resultList.add(teacherTotal);
             redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherTotal.getUserId()))
                     .set(teacherTotal);
@@ -233,6 +246,17 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
         }else {
             teacherTotal.setLiveFlag(true);
         }
+
+        //查询老师曲谱数
+        List<TeacherTotalVo> musicTotals = musicSheetService.queryTeacherTotal(id);
+        if (!CollectionUtils.isEmpty(musicTotals)) {
+            TeacherTotalVo musicTotal = musicTotals.get(0);
+            if (null != musicTotal) {
+                teacherTotal.setMusicAlbumNum(musicTotal.getMusicAlbumNum());
+                teacherTotal.setMusicSheetNum(musicTotal.getMusicSheetNum());
+            }
+        }
+
         redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherTotal.getUserId()))
                 .set(teacherTotal);
 

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

@@ -107,7 +107,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> orderRefund(OrderRefundReq refundReq) {
-        UserOrderVo detail = orderService.detail(refundReq.getOrderId());
+        UserOrderVo detail = orderService.detail(refundReq.getOrderNo(), refundReq.getUserId());
         if (null == detail || CollectionUtils.isEmpty(detail.getOrderDetailList())) {
             return HttpResponseResult.failed("未找到订单信息");
         }
@@ -117,13 +117,14 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         if (StringUtil.isEmpty(detail.getTransNo()) && StringUtil.isEmpty(detail.getPaymentNo())) {
             return HttpResponseResult.failed("未找到订单付款信息");
         }
+        refundReq.setOrderId(detail.getId());
         UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
         if (null == orderPayment || !TradeStatusEnum.succeeded.equals(orderPayment.getStatus())) {
             return HttpResponseResult.failed("订单付款状态异常");
         }
         if (CollectionUtils.isEmpty(refundReq.getOredrDetilIds())) {
             //查询订单下未退款的所有详情订单
-            List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(refundReq.getOrderId());
+            List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(detail.getId());
 
             refundReq.setOredrDetilIds(orderDetails.stream().map(UserOrderDetail::getId).collect(Collectors.toList()));
         }
@@ -317,7 +318,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         String join = StringUtil.join(detilIds, ",");
 
         List<UserOrderRefund> list = list(Wrappers.<UserOrderRefund>lambdaQuery().eq(UserOrderRefund::getOrderNo, detail.getOrderNo()));
-        if(!CollectionUtils.isEmpty(list)){
+        if (!CollectionUtils.isEmpty(list)) {
             return HttpResponseResult.failed("已经存在退款单");
         }
 

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

@@ -193,7 +193,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             return HttpResponseResult.failed("订单已关闭");
         }
         Boolean close = orderPaymentService.closePaymentAndReqOpen(payReq.getOrderNo(), "用户取消订单");
-        if(close){
+        if (close) {
             //关闭订单
             doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
         }
@@ -252,7 +252,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) throws Exception {
+    public HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) {
         long start = System.currentTimeMillis();
         log.info("订单[创建订单] Req:{}", JSONObject.toJSONString(orderReq));
         //订单号生成
@@ -308,7 +308,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) throws Exception {
+    public HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) {
         //查询订单
         UserOrderVo detail = detail(payReq.getOrderNo(), payReq.getUserId());
         if (null == detail || !payReq.getUserId().equals(detail.getUserId())) {
@@ -425,7 +425,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/3/31 16:15
      * @return: com.yonge.cooleshow.biz.dal.entity.Order
      */
-    private UserOrderVo insertOrder(OrderReq orderReq) throws Exception {
+    private UserOrderVo insertOrder(OrderReq orderReq) {
         UserOrder userOrder = new UserOrder();
 
         userOrder.setOrderNo(orderReq.getOrderNo());
@@ -511,7 +511,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             throw new BizException("创建订单失败");
         }
         UserOrderVo vo = new UserOrderVo();
-        BeanUtils.copyProperties(vo, userOrder);
+        try {
+            BeanUtils.copyProperties(vo, userOrder);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
         vo.setOrderDetailList(orderDetailList);
         return vo;
     }

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
@@ -50,6 +51,10 @@ public class StudentHomeVo extends Student {
     private YesOrNoEnum isReal;
     @ApiModelProperty(value = "学生 STUDENT 老师 TEACHER 系统用户 SYSTEM")
     private String userType;
+    @ApiModelProperty("专辑数 ")
+    private Integer musicAlbumNum;
+    @ApiModelProperty("曲谱数 ")
+    private Integer musicSheetNum;
 
     public String getHeardUrl() {
         return heardUrl;
@@ -186,4 +191,20 @@ public class StudentHomeVo extends Student {
     public void setUserType(String userType) {
         this.userType = userType;
     }
+
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
@@ -33,6 +34,12 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     private Integer expTime;
     @ApiModelProperty("未上课时")
     private Integer unExpTime;
+
+    @ApiModelProperty("专辑数 ")
+    private Integer musicAlbumNum;
+    @ApiModelProperty("曲谱数 ")
+    private Integer musicSheetNum;
+
     @ApiModelProperty(value = "声部名称(支持多个,用逗号分隔) ")
     private String subjectName;
     @ApiModelProperty(value = "性别 0女 1男")
@@ -243,4 +250,20 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     public void setUserType(String userType) {
         this.userType = userType;
     }
+
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
 }

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

@@ -529,4 +529,51 @@
         where t.user_id_ = #{userId}
 
     </select>
+
+    <select id="queryStudentTotal" resultType="com.yonge.cooleshow.biz.dal.vo.StudentTotalVo">
+        select
+            t.user_id_ as userId,
+            a.musicAlbumNum,
+            b.musicSheetNum
+        from teacher t
+        left join (
+            select
+                user_id_, count(1) as musicAlbumNum
+            from album_favorite
+            <where>
+                <if test="null != userId">
+                    and user_id_ = #{userId}
+                </if>
+            </where>
+            group by user_id_
+        ) a on t.user_id_ = a.user_id_
+        left join (
+            select
+                user_id_, count(1) as musicSheetNum
+            from music_favorite
+            <where>
+                <if test="null != userId">
+                    and user_id_ = #{userId}
+                </if>
+            </where>
+            group by user_id_
+        ) b on t.user_id_ = b.user_id_
+    </select>
+
+    <select id="queryTeacherTotal" resultType="com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo">
+        select
+            t.user_id_ as userId,
+            a.musicSheetNum as musicSheetNum
+        from student t
+        left join (
+            select
+                user_id_, count(1) as musicSheetNum
+            from music_sheet
+            where source_type_ = 'TEACHER' and state_ = 1 and audit_status_ = 'PASS' and del_flag_ = 0
+            <if test="null != userId">
+                and user_id_ = #{userId}
+            </if>
+            group by user_id_
+        ) a on t.user_id_ = a.user_id_
+    </select>
 </mapper>

+ 3 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthMusicianRecordMapper.xml

@@ -34,6 +34,9 @@
             , te.introduction_ as "introduction"
             , te.graduate_school_ as "graduateSchool"
             , te.subject_ as "subject"
+            ,(
+                SELECT GROUP_CONCAT(name_) FROM subject WHERE FIND_IN_SET(id_,t.subject_id_)
+            ) as subjectName
             , te.grad_certificate_ as "gradCertificate"
             , te.degree_certificate_ as "degreeCertificate"
             , te.teacher_certificate_ as "teacherCertificate"

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

@@ -67,16 +67,16 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<UserOrder> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.executeOrder(orderReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::executeOrder, orderReq, 10l);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("下单失败");
             }
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
-        }  catch (Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
             return HttpResponseResult.failed("下单失败");
         }
@@ -98,11 +98,11 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<OrderPayRes> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.orderPay(payReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::orderPay, payReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("付款失败");
             }
         } catch (BizException e) {
@@ -158,11 +158,11 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(payReq.getOrderNo())
-                            , () -> userOrderService.orderCancel(payReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(payReq.getOrderNo())
+                            , userOrderService::orderCancel, payReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("取消订单失败");
             }
         } catch (BizException e) {

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

@@ -73,8 +73,8 @@ public class UserOrderRefundController extends BaseController {
 
         try {
             HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderRefundService.orderRefund(refundReq), 60L, TimeUnit.SECONDS);
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(refundReq.getOrderNo())
+                            , userOrderRefundService::orderRefund, refundReq, 10L);
             if (null != res) {
                 return res;
             } else {

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

@@ -69,16 +69,16 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<UserOrder> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.executeOrder(orderReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::executeOrder, orderReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("下单失败");
             }
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
-        }  catch (Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
             return HttpResponseResult.failed("下单失败");
         }
@@ -100,11 +100,11 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<OrderPayRes> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.orderPay(payReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::orderPay, payReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("付款失败");
             }
         } catch (BizException e) {
@@ -133,11 +133,11 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.orderCancel(payReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::orderCancel, payReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("取消订单失败");
             }
         } catch (BizException e) {

+ 0 - 1
pom.xml

@@ -370,7 +370,6 @@
 		<module>toolset</module>
 	    <module>cooleshow-task</module>
 		<module>cooleshow-mall</module>
-		<module>cooleshow-resource</module>
         <module>cooleshow-websocket</module>
         <module>cooleshow-api</module>
     </modules>

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

@@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
 
 import java.util.Objects;
 import java.util.concurrent.*;
+import java.util.function.Function;
 
 /**
  * 分布式竞争锁
@@ -103,12 +104,13 @@ public class DistributedLock {
             throw e;
         } catch (ExecutionException e) {
             Throwable cause = e.getCause();
-            cause.printStackTrace();;
+            cause.printStackTrace();
+            ;
 
             String message = cause.getMessage();
-            if(StringUtil.isEmpty(message)){
+            if (StringUtil.isEmpty(message)) {
                 throw new RuntimeException("任务执行异常");
-            }else{
+            } else {
                 throw new BizException(message);
             }
         } catch (Exception e) {
@@ -161,4 +163,34 @@ public class DistributedLock {
         }
     }
 
+
+    /**
+     * 分布式锁-同步
+     *
+     * @param lockName lockKey
+     * @param function 需要执行的方法
+     * @return Future 异步任务
+     */
+    public <T, R> R runIfLockToFunction(final String lockName, Function<T, R> function, T param, long waitTime) {
+        RLock lock = redissonClient.getLock(lockName);
+        if (Objects.isNull(lock)) {
+            log.info("callIfLockCanGet lock is null lockName : {}", lockName);
+            return null;
+        }
+        try {
+            if (lock.tryLock(waitTime, 60, TimeUnit.SECONDS)) {
+                log.info("callIfLockCanGet lock lockName : {} time is {}", lockName, System.currentTimeMillis());
+                return function.apply(param);
+            } else {
+                return null;
+            }
+        } catch (BizException e) {
+            throw e;
+        } catch (Exception e) {
+            log.error("callIfLockCanGet error lockKey {}", lockName);
+            throw new RuntimeException("任务执行异常");
+        } finally {
+            unlock(lock);
+        }
+    }
 }