فهرست منبع

Merge remote-tracking branch 'origin/master'

cy 3 سال پیش
والد
کامیت
7201a95a14
16فایلهای تغییر یافته به همراه517 افزوده شده و 215 حذف شده
  1. 31 6
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  2. 2 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java
  3. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserOrderRefundController.java
  4. 35 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java
  5. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java
  6. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/AuthOperaReq.java
  7. 46 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java
  8. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  9. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserWithdrawalService.java
  10. 39 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthEntryRecordServiceImpl.java
  11. 31 25
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthMusicianRecordServiceImpl.java
  12. 26 22
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherStyleVideoServiceImpl.java
  13. 34 30
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  14. 213 82
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  15. 7 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml
  16. 23 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java

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

@@ -19,12 +19,7 @@ public interface SysConfigConstant {
      * @updateTime 2022/3/24 10:20
      */
     String OPEN_LIVE_OVER_CLASS = "open_list_over_class";
-    /***
-     * 平台结算手续费
-     * @author liweifan
-     * @updateTime 2022/3/24 17:15
-     */
-    String WITHDRAWAL_SERVICE_FEE = "withdrawal_service_fee";
+
     /**
      * 陪练课服务费
      */
@@ -184,6 +179,36 @@ public interface SysConfigConstant {
      * 琴房课扣时公式
      */
     String PIANO_ROOM_TIME_FORMULA = "piano_room_time_formula";
+    /***
+     * 提现开关 0 关闭 1开启
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_SWITCH = "withdrawal_switch";
+    /***
+     * 提现审核开关 0 关闭 1开启
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_AUTH_SWITCH = "withdrawal_auth_switch";
+    /***
+     * 提现审核额度(小于该额度免审核提现)
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_AUTH_FEE = "withdrawal_auth_fee";
+    /***
+     * 一天最多提现次数
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_MAX_COUNT = "withdrawal_max_count";
+    /***
+     * 平台结算手续费
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_SERVICE_FEE = "withdrawal_service_fee";
 
     /** 公司名称 */
     String COMPANY_NAME = "company_name";

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

@@ -22,6 +22,8 @@ public enum CacheNameEnum implements BaseEnum<String, CacheNameEnum> {
 
     LOCK_EXECUTE_ORDER("用户下单/付款/取消订单锁"),
     LOCK_CHANGE_ACCOUNT("账户变更锁"),
+    LOCK_WITHDRAWAL("锁用户提现"),
+
 
     ;
     /***

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

@@ -55,7 +55,7 @@ public class UserOrderRefundController extends BaseController {
 	@PostMapping("/doAuth")
 	@ApiOperation(value = "审核", notes = "传入authOperaReq")
 	@PreAuthorize("@pcs.hasPermissions('userOrderRefunds/doAuth')")
-	public HttpResponseResult<UserOrderRefundBill> doAuth(@Valid @RequestBody AuthOperaReq authOperaReq) throws Exception {
+	public HttpResponseResult<Boolean> doAuth(@Valid @RequestBody AuthOperaReq authOperaReq) throws Exception {
 		SysUser user = sysUserFeignService.queryUserInfo();
 		if (user == null || null == user.getId()) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");

+ 35 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java

@@ -3,7 +3,9 @@ package com.yonge.cooleshow.admin.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.excel.UserWithdrawalExport;
+import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -12,13 +14,16 @@ import com.yonge.toolset.utils.easyexcel.*;
 import io.swagger.annotations.*;
 import org.apache.commons.beanutils.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
+import springfox.documentation.annotations.ApiIgnore;
 
+import javax.validation.Valid;
 import java.lang.reflect.InvocationTargetException;
 import java.util.*;
 
@@ -83,6 +88,36 @@ public class UserWithdrawalController extends BaseController {
                 "列表数据");
     }
 
+
+    @PostMapping("/doAuth")
+    @ApiOperation(value = "审核", notes = "传入authOperaReq")
+    @PreAuthorize("@pcs.hasPermissions('userWithdrawal/doAuth')")
+    public HttpResponseResult<Boolean> doAuth(@Valid @RequestBody AuthOperaReq authOperaReq) throws Exception {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return userWithdrawalService.doAuth(authOperaReq, user);
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(
+                    name = "id",
+                    value = "审核单id",
+                    paramType = "query", dataType = "Long"
+            )
+    })
+    @PostMapping("/transferAccount")
+    @ApiOperation(value = "继续转账", notes = "传入authOperaReq")
+    @PreAuthorize("@pcs.hasPermissions('userWithdrawal/transferAccount')")
+    public HttpResponseResult<Boolean> transferAccount(@ApiIgnore @RequestBody AuthOperaReq authOperaReq) throws Exception {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return userWithdrawalService.transferAccount(authOperaReq, user);
+    }
+
     /**
      * 导入
      */

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java

@@ -36,4 +36,10 @@ public interface UserWithdrawalDao extends BaseMapper<UserWithdrawal>{
 	 */
 	List<UserWithdrawalVo> selectList(@Param("param") TeacherWithdrawalSearch teacherWithdrawal);
 
+	/**
+	 * 查询用户今天发起的提现次数
+	 * @param userId
+	 * @return
+	 */
+	Integer getNowDayWithdrawalCount(@Param("userId") Long userId);
 }

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/AuthOperaReq.java

@@ -15,8 +15,8 @@ import javax.validation.constraints.NotNull;
 @ApiModel(value = "AuthOperaReq", description = "审核操作对象")
 public class AuthOperaReq {
     @NotNull(message = "id不能为空")
-    @ApiModelProperty(value = "id", required = true)
-    private Long id;
+    @ApiModelProperty(value = "审核id,多个id,分割", required = true)
+    private String id;
     @NotNull(message = "请说明审核是否通过")
     @ApiModelProperty(value = "审核是否通过", required = true)
     private Boolean isPass;
@@ -24,11 +24,11 @@ public class AuthOperaReq {
     @ApiModelProperty(value = "审核理由", required = true)
     private String reason;
 
-    public Long getId() {
+    public String getId() {
         return id;
     }
 
-    public void setId(Long id) {
+    public void setId(String id) {
         this.id = id;
     }
 

+ 46 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.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 com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -30,9 +31,21 @@ public class UserWithdrawal implements Serializable {
     @ApiModelProperty("结算金额 ")
     @TableField(value = "amount_")
     private BigDecimal amount;
+    @ApiModelProperty("实际到账金额 ")
+    @TableField(value = "actual_amount_")
+    private BigDecimal actualAmount;
     @ApiModelProperty("平台服务费 ")
     @TableField(value = "plantform_fee_")
     private BigDecimal plantformFee;
+    @ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过")
+    @TableField(value = "auth_status_")
+    private AuthStatusEnum authStatus;
+    @ApiModelProperty("审核用户表id ")
+    @TableField(value = "auth_user_id_")
+    private Long authUserId;
+    @ApiModelProperty("审核原因 ")
+    @TableField(value = "reason_")
+    private String reason;
     @ApiModelProperty("银行卡id ")
     @TableField(value = "bank_card_id_")
     private Long bankCardId;
@@ -43,11 +56,11 @@ public class UserWithdrawal implements Serializable {
     @TableField(value = "trans_no_")
     private String transNo;
     @ApiModelProperty("交易状态 pending、交易处理中 succeeded、交易成功 failed、交易失败 ")
-    @TableField(value = "status_")
-    private TradeStatusEnum status;
-    @ApiModelProperty("实际到账金额 ")
-    @TableField(value = "actual_amount_")
-    private BigDecimal actualAmount;
+    @TableField(value = "trade_status_")
+    private TradeStatusEnum tradeStatus;
+    @ApiModelProperty("三方接口返回金额 ")
+    @TableField(value = "callbak_amount_")
+    private BigDecimal callbakAmount;
     @ApiModelProperty("转账时间 ")
     @TableField(value = "transfer_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -129,12 +142,20 @@ public class UserWithdrawal implements Serializable {
         this.transNo = transNo;
     }
 
-    public TradeStatusEnum getStatus() {
-        return status;
+    public AuthStatusEnum getAuthStatus() {
+        return authStatus;
+    }
+
+    public void setAuthStatus(AuthStatusEnum authStatus) {
+        this.authStatus = authStatus;
+    }
+
+    public TradeStatusEnum getTradeStatus() {
+        return tradeStatus;
     }
 
-    public void setStatus(TradeStatusEnum status) {
-        this.status = status;
+    public void setTradeStatus(TradeStatusEnum tradeStatus) {
+        this.tradeStatus = tradeStatus;
     }
 
     public BigDecimal getActualAmount() {
@@ -192,4 +213,20 @@ public class UserWithdrawal implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public Long getAuthUserId() {
+        return authUserId;
+    }
+
+    public void setAuthUserId(Long authUserId) {
+        this.authUserId = authUserId;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
 }

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

@@ -53,7 +53,7 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	 * @updateTime 2022/5/9 16:25
 	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
 	 */
-    HttpResponseResult<UserOrderRefundBill> doAuth(AuthOperaReq authOperaReq, SysUser user);
+    HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser user);
 
 	/**
 	 * 系統自動退款

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

@@ -4,6 +4,7 @@ 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.excel.UserWithdrawalExport;
+import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
@@ -83,6 +84,23 @@ public interface UserWithdrawalService extends IService<UserWithdrawal> {
      * @param errMsg
      */
     void contractCallback(String status, String serialNo, String url, String errMsg);
+    /***
+     * 审核
+     * @author liweifan
+     * @param: authOperaReq
+     * @param: sysUser
+     * @updateTime 2022/3/21 14:21
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
+     */
+    HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser user);
+
+    /**
+     * 继续转账
+     * @param authOperaReq
+     * @param user
+     * @return
+     */
+    HttpResponseResult<Boolean> transferAccount(AuthOperaReq authOperaReq, SysUser user);
 
 
     /***

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

@@ -17,6 +17,7 @@ import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherAuthEntryRecordVo;
 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.string.ValueUtil;
@@ -58,44 +59,48 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception {
-        TeacherAuthEntryRecord build = baseMapper.selectById(authOperaReq.getId());
-        if (!AuthStatusEnum.DOING.equals(build.getTeacherAuthStatus())) {
-            return HttpResponseResult.failed("审核单已审核");
-        }
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            TeacherAuthEntryRecord build = baseMapper.selectById(id);
+            if (!AuthStatusEnum.DOING.equals(build.getTeacherAuthStatus())) {
+                continue;
+            }
 
-        build.setTeacherAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
-        build.setReason(authOperaReq.getReason());
-        build.setVerifyUserId(sysUser.getId());
-        build.setUpdateTime(new Date());
+            build.setTeacherAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+            build.setReason(authOperaReq.getReason());
+            build.setVerifyUserId(sysUser.getId());
+            build.setUpdateTime(new Date());
 
-        //修改teacher表
-        TeacherVo teacher = teacherDao.detail(build.getUserId());
-        if (null == teacher) {
-            return HttpResponseResult.failed("未找到用户信息");
-        }
-        if (YesOrNoEnum.YES.equals(teacher.getEntryFlag())) {
-            return HttpResponseResult.failed("用户已经通过审核");
-        }
-        if (authOperaReq.getPass()) {
-            teacher.setSubjectId(StringUtil.isEmpty(teacher.getSubjectId()) ? build.getSubjectId() : teacher.getSubjectId());
-            teacher.setIntroduction(StringUtil.isEmpty(teacher.getIntroduction()) ? build.getIntroduction() : teacher.getIntroduction());
-            teacher.setGraduateSchool(StringUtil.isEmpty(teacher.getGraduateSchool()) ? build.getGraduateSchool() : teacher.getGraduateSchool());
-            teacher.setSubject(StringUtil.isEmpty(teacher.getSubject()) ? build.getSubject() : teacher.getSubject());
-            teacher.setGradCertificate(StringUtil.isEmpty(teacher.getGradCertificate()) ? build.getGradCertificate() : teacher.getGradCertificate());
-            teacher.setDegreeCertificate(StringUtil.isEmpty(teacher.getDegreeCertificate()) ? build.getDegreeCertificate() : teacher.getDegreeCertificate());
-            teacher.setTeacherCertificate(StringUtil.isEmpty(teacher.getTeacherCertificate()) ? build.getTeacherCertificate() : teacher.getTeacherCertificate());
-        }
-        teacher.setEntryFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
-        teacher.setEntryAuthDate(new Date());
-        teacher.setUpdateTime(new Date());
+            //修改teacher表
+            TeacherVo teacher = teacherDao.detail(build.getUserId());
+            if (null == teacher) {
+                continue;
+            }
+            if (YesOrNoEnum.YES.equals(teacher.getEntryFlag())) {
+                continue;
+            }
+            if (authOperaReq.getPass()) {
+                teacher.setSubjectId(StringUtil.isEmpty(teacher.getSubjectId()) ? build.getSubjectId() : teacher.getSubjectId());
+                teacher.setIntroduction(StringUtil.isEmpty(teacher.getIntroduction()) ? build.getIntroduction() : teacher.getIntroduction());
+                teacher.setGraduateSchool(StringUtil.isEmpty(teacher.getGraduateSchool()) ? build.getGraduateSchool() : teacher.getGraduateSchool());
+                teacher.setSubject(StringUtil.isEmpty(teacher.getSubject()) ? build.getSubject() : teacher.getSubject());
+                teacher.setGradCertificate(StringUtil.isEmpty(teacher.getGradCertificate()) ? build.getGradCertificate() : teacher.getGradCertificate());
+                teacher.setDegreeCertificate(StringUtil.isEmpty(teacher.getDegreeCertificate()) ? build.getDegreeCertificate() : teacher.getDegreeCertificate());
+                teacher.setTeacherCertificate(StringUtil.isEmpty(teacher.getTeacherCertificate()) ? build.getTeacherCertificate() : teacher.getTeacherCertificate());
+            }
+            teacher.setEntryFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
+            teacher.setEntryAuthDate(new Date());
+            teacher.setUpdateTime(new Date());
 
-        Teacher newTeacher = new Teacher();
-        BeanUtils.copyProperties(newTeacher, teacher);
-        teacherDao.updateById(newTeacher);
+            Teacher newTeacher = new Teacher();
+            BeanUtils.copyProperties(newTeacher, teacher);
+            teacherDao.updateById(newTeacher);
 
-        // 发送审核通知
-        authSend(teacher.getUserId(), teacher.getPhone(), authOperaReq.getPass(), authOperaReq.getReason());
-        return HttpResponseResult.succeed(baseMapper.updateById(build) > 0);
+            // 发送审核通知
+            authSend(teacher.getUserId(), teacher.getPhone(), authOperaReq.getPass(), authOperaReq.getReason());
+            baseMapper.updateById(build);
+        }
+        return HttpResponseResult.succeed(true);
     }
 
     // 发送审核通知

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

@@ -16,6 +16,8 @@ import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.MusicianAuthEntryRecordVo;
 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 org.apache.commons.beanutils.BeanUtils;
 import org.slf4j.Logger;
@@ -85,36 +87,40 @@ public class TeacherAuthMusicianRecordServiceImpl extends ServiceImpl<TeacherAut
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception {
-        TeacherAuthMusicianRecord build = baseMapper.selectById(authOperaReq.getId());
-        if (!AuthStatusEnum.DOING.equals(build.getTeacherAuthStatus())) {
-            return HttpResponseResult.failed("审核单已审核");
-        }
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            TeacherAuthMusicianRecord build = baseMapper.selectById(id);
+            if (!AuthStatusEnum.DOING.equals(build.getTeacherAuthStatus())) {
+                continue;
+            }
 
-        build.setTeacherAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
-        build.setReason(authOperaReq.getReason());
-        build.setVerifyUserId(sysUser.getId());
-        build.setUpdateTime(new Date());
+            build.setTeacherAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+            build.setReason(authOperaReq.getReason());
+            build.setVerifyUserId(sysUser.getId());
+            build.setUpdateTime(new Date());
 
-        //修改teacher表
-        TeacherVo teacher = teacherDao.detail(build.getUserId());
-        if (null == teacher) {
-            return HttpResponseResult.failed("未找到用户信息");
-        }
-        if (YesOrNoEnum.YES.equals(teacher.getMusicianFlag())) {
-            return HttpResponseResult.failed("用户已经通过审核");
-        }
+            //修改teacher表
+            TeacherVo teacher = teacherDao.detail(build.getUserId());
+            if (null == teacher) {
+                continue;
+            }
+            if (YesOrNoEnum.YES.equals(teacher.getMusicianFlag())) {
+                continue;
+            }
 
-        teacher.setMusicianFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
-        teacher.setMusicianDate(new Date());
-        teacher.setUpdateTime(new Date());
+            teacher.setMusicianFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
+            teacher.setMusicianDate(new Date());
+            teacher.setUpdateTime(new Date());
 
-        Teacher newTeacher = new Teacher();
-        BeanUtils.copyProperties(newTeacher, teacher);
-        teacherDao.updateById(newTeacher);
+            Teacher newTeacher = new Teacher();
+            BeanUtils.copyProperties(newTeacher, teacher);
+            teacherDao.updateById(newTeacher);
 
-        // 发送审核通知
-        authSend(teacher.getUserId(), teacher.getPhone(), authOperaReq.getPass(), authOperaReq.getReason());
-        return HttpResponseResult.succeed(baseMapper.updateById(build) > 0);
+            // 发送审核通知
+            authSend(teacher.getUserId(), teacher.getPhone(), authOperaReq.getPass(), authOperaReq.getReason());
+            baseMapper.updateById(build);
+        }
+        return HttpResponseResult.succeed(true);
     }
 
     // 发送审核通知

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

@@ -13,6 +13,8 @@ import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherStyleVideoVo;
 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;
@@ -47,44 +49,46 @@ public class TeacherStyleVideoServiceImpl extends ServiceImpl<TeacherStyleVideoD
     }
 
     @Override
-    public IPage<TeacherStyleVideoVo> selectPage(IPage<TeacherStyleVideoVo> page, TeacherStyleVideoSearch query){
+    public IPage<TeacherStyleVideoVo> selectPage(IPage<TeacherStyleVideoVo> page, TeacherStyleVideoSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception {
-        TeacherStyleVideo build = baseMapper.selectById(authOperaReq.getId());
-        if (!AuthStatusEnum.DOING.equals(build.getAuthStatus())) {
-            return HttpResponseResult.failed("审核单已审核");
-        }
-
-        build.setAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
-        build.setReason(authOperaReq.getReason());
-        build.setVerifyUserId(sysUser.getId());
-        build.setUpdateTime(new Date());
-        HttpResponseResult<Boolean> result = HttpResponseResult.succeed(baseMapper.updateById(build) > 0);
-        if (result.getStatus()) {
-            sendAuthMessage(authOperaReq.getPass(), build.getUserId(), authOperaReq.getReason());
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            TeacherStyleVideo build = baseMapper.selectById(id);
+            if (!AuthStatusEnum.DOING.equals(build.getAuthStatus())) {
+                continue;
+            }
+            build.setAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+            build.setReason(authOperaReq.getReason());
+            build.setVerifyUserId(sysUser.getId());
+            build.setUpdateTime(new Date());
+            HttpResponseResult<Boolean> result = HttpResponseResult.succeed(baseMapper.updateById(build) > 0);
+            if (result.getStatus()) {
+                sendAuthMessage(authOperaReq.getPass(), build.getUserId(), authOperaReq.getReason());
+            }
         }
-        return result;
+        return HttpResponseResult.succeed(true);
     }
 
     /**
-     *  发送个人风采审核
+     * 发送个人风采审核
      *
      * @param pass 通过/失败
      */
-    private void sendAuthMessage(Boolean pass, Long teacherId,String remark) {
+    private void sendAuthMessage(Boolean pass, Long teacherId, String remark) {
         if (Boolean.TRUE.equals(pass)) {
             try {
                 SysUser user = sysUserFeignService.queryUserById(teacherId);
                 Map<Long, String> teacherReceivers = new HashMap<>();
                 teacherReceivers.put(user.getId(), user.getPhone());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_STYLE_VIDEO_SUCCESS,
-                       teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode());
-            }catch (Exception e) {
-                log.warn("老师个人风采审核成功消息发送失败,{}",e.getMessage());
+                        teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode());
+            } catch (Exception e) {
+                log.warn("老师个人风采审核成功消息发送失败,{}", e.getMessage());
             }
         } else {
             try {
@@ -92,9 +96,9 @@ public class TeacherStyleVideoServiceImpl extends ServiceImpl<TeacherStyleVideoD
                 Map<Long, String> teacherReceivers = new HashMap<>();
                 teacherReceivers.put(user.getId(), user.getPhone());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_STYLE_VIDEO_FAIL,
-                                                   teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),remark);
-            }catch (Exception e) {
-                log.warn("老师个人风采审核失败消息发送失败,{}",e.getMessage());
+                        teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(), remark);
+            } catch (Exception e) {
+                log.warn("老师个人风采审核失败消息发送失败,{}", e.getMessage());
             }
         }
     }

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

@@ -27,6 +27,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.base.string.StringPool;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
@@ -178,41 +179,44 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<UserOrderRefundBill> doAuth(AuthOperaReq authOperaReq, SysUser user) {
-        UserOrderRefund orderRefund = baseMapper.selectById(authOperaReq.getId());
-        if (!AuthStatusEnum.DOING.equals(orderRefund.getStatus())) {
-            return HttpResponseResult.failed("退款单已审核");
-        }
-        String oredrDetilIds = orderRefund.getOredrDetilIds();
-        if (StringUtil.isEmpty(oredrDetilIds)) {
-            return HttpResponseResult.succeed();
-        }
+    public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser user) {
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            UserOrderRefund orderRefund = baseMapper.selectById(id);
+            if (!AuthStatusEnum.DOING.equals(orderRefund.getStatus())) {
+                continue;
+            }
+            String oredrDetilIds = orderRefund.getOredrDetilIds();
+            if (StringUtil.isEmpty(oredrDetilIds)) {
+                continue;
+            }
 
-        orderRefund.setStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
-        orderRefund.setActualAmount(orderRefund.getApplyAmount());
-        orderRefund.setOperateId(user.getId());
-        orderRefund.setOperateReason(authOperaReq.getReason());
-        orderRefund.setUpdateTime(new Date());
-        updateById(orderRefund);
+            orderRefund.setStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+            orderRefund.setActualAmount(orderRefund.getApplyAmount());
+            orderRefund.setOperateId(user.getId());
+            orderRefund.setOperateReason(authOperaReq.getReason());
+            orderRefund.setUpdateTime(new Date());
+            updateById(orderRefund);
 
-        if (authOperaReq.getPass()) {
-            //通过调用退款接口
-            return doOrderRefund(orderRefund);
-        } else {
-            List<String> detilIds = Arrays.asList(oredrDetilIds.split(","));
-            for (String id : detilIds) {
-                UserOrderDetailVo detail = orderDetailService.detail(Long.parseLong(id));
-                if (null == detail) {
-                    continue;
-                }
-                //调用业务方法
-                Consumer<UserOrderDetailVo> refundCancelConsumer = refundCancel.get(detail.getGoodType());
-                if (!Objects.isNull(refundCancelConsumer)) {
-                    refundCancelConsumer.accept(detail);
+            if (authOperaReq.getPass()) {
+                //通过调用退款接口
+                doOrderRefund(orderRefund);
+            } else {
+                List<String> detilIds = Arrays.asList(oredrDetilIds.split(StringPool.COMMA));
+                for (String detilId : detilIds) {
+                    UserOrderDetailVo detail = orderDetailService.detail(Long.parseLong(detilId));
+                    if (null == detail) {
+                        continue;
+                    }
+                    //调用业务方法
+                    Consumer<UserOrderDetailVo> refundCancelConsumer = refundCancel.get(detail.getGoodType());
+                    if (!Objects.isNull(refundCancelConsumer)) {
+                        refundCancelConsumer.accept(detail);
+                    }
                 }
             }
         }
-        return HttpResponseResult.succeed();
+        return HttpResponseResult.succeed(true);
     }
 
 

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

@@ -1,25 +1,26 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 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.dao.SysUserContractRecordDao;
+import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 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.SysMessageService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.UserBankCardDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.UserAccountService;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.vo.UserBankCardVo;
 import com.yonge.cooleshow.biz.dal.vo.res.WithdrawalInfoRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.string.StringPool;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
@@ -32,7 +33,6 @@ import com.yonge.cooleshow.biz.dal.entity.UserWithdrawal;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserWithdrawalDao;
-import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
@@ -50,6 +50,8 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     @Autowired
     private SysConfigService sysConfigService;
     @Autowired
+    private SysUserService sysUserService;
+    @Autowired
     private WithdrawSdk withdrawSdk;
     @Autowired
     private SysMessageService sysMessageService;
@@ -94,14 +96,28 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> withdrawal(SysUser user, WithdrawalReq withdrawalReq) {
+        if (StringUtil.isEmpty(user.getIdCardNo())) {
+            return HttpResponseResult.failed("用户未实名认证");
+        }
+        //校验--提现开关
+        String withdrawalSwitch = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_SWITCH);
+        if (!YesOrNoEnum.YES.getCode().toString().equals(withdrawalSwitch)) {
+            return HttpResponseResult.failed("当前不允许提现");
+        }
+        //校验--判断今天提现次数
+        String withdrawalMaxCount = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_MAX_COUNT);
+        Integer count = getNowDayWithdrawalCount(user.getId());
+        if (count >= Integer.parseInt(withdrawalMaxCount)) {
+            return HttpResponseResult.failed("达到当天提现最大次数");
+        }
+        //校验--校验金额(金额不能小于手续费,手续费从提现金额里面扣除)
         BigDecimal withdrawalServiceFee = getWithdrawalServiceFee();
-        //校验金额
-        if (withdrawalReq.getAmountWithdrawal().floatValue() <= 0) {
+        BigDecimal actualAmount = withdrawalReq.getAmountWithdrawal().subtract(withdrawalServiceFee);
+        if (actualAmount.compareTo(BigDecimal.ZERO) <= 0) {
             return HttpResponseResult.failed("结算金额过小");
         }
-        //获取用户结算金额
+        //获取用户结算金额
         BigDecimal amountWithdrawal = getAmountUsable(user.getId());
-        //比较大小
         if (amountWithdrawal.compareTo(withdrawalReq.getAmountWithdrawal()) < 0) {
             return HttpResponseResult.failed("账户余额不足");
         }
@@ -110,9 +126,13 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         if (null == bankCardVo) {
             return HttpResponseResult.failed("未找到用户绑卡信息");
         }
+        //提现审核开关
+        String withdrawalAuthSwitch = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_AUTH_SWITCH);
+        //提现审核额度(小于该额度免审核提现)
+        String withdrawalAuthFee = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_AUTH_FEE);
 
         //插入用户结算表
-        UserWithdrawal userWithdrawal = insertUserWithdrawal(user.getId(), withdrawalReq, bankCardVo, withdrawalServiceFee);
+        UserWithdrawal userWithdrawal = insertUserWithdrawal(user.getId(), withdrawalReq, bankCardVo, withdrawalServiceFee, withdrawalAuthSwitch, withdrawalAuthFee);
         //插入账户变更
         UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
                 user.getId(), withdrawalReq.getAmountWithdrawal(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
@@ -121,12 +141,23 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN);
         accountRecordDto.setSaveRecord(false);
         HttpResponseResult<UserAccountRecord> accountChange = userAccountService.accountChange(accountRecordDto);
+
         if (accountChange.getStatus()) {
-            //请求三方接口
-            withdrawSdk.withdraw(
-                    userWithdrawal.getId().toString(), bankCardVo.getName(), bankCardVo.getPhone(), user.getIdCardNo(),
-                    amountWithdrawal.multiply(new BigDecimal("100")).intValue(), bankCardVo.getBankCard(), null
-            );
+            if (YesOrNoEnum.NO.getCode().toString().equals(withdrawalAuthSwitch)
+                    || new BigDecimal(withdrawalAuthFee).compareTo(withdrawalReq.getAmountWithdrawal()) > 0) {
+                //不用审核的,需要请求三方
+                HttpResponseResult<Boolean> withdraw = withdrawSdk.withdraw(
+                        userWithdrawal.getId().toString(), bankCardVo.getName(), bankCardVo.getPhone(), user.getIdCardNo(),
+                        userWithdrawal.getActualAmount().multiply(new BigDecimal("100")).intValue(), bankCardVo.getBankCard(), null
+                );
+                if (withdraw.getStatus() && withdraw.getData()) {
+                    userWithdrawal.setTradeStatus(TradeStatusEnum.pending);
+                    updateById(userWithdrawal);
+                } else {
+                    log.error("结算调用三方接口失败:user is {}, param is {}, res is {}", user.getId(), JSONObject.toJSONString(withdrawalReq), withdraw);
+                    throw new BizException("结算失败");
+                }
+            }
             return HttpResponseResult.succeed(true);
         } else {
             throw new BizException("结算失败");
@@ -135,6 +166,79 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser sysUser) {
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            UserWithdrawalVo build = detail(id);
+            if (!AuthStatusEnum.DOING.equals(build.getAuthStatus())) {
+                continue;
+            }
+            build.setAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+            build.setReason(authOperaReq.getReason());
+            build.setAuthUserId(sysUser.getId());
+            build.setUpdateTime(new Date());
+
+            //请求三方
+            SysUser withdrawalUser = sysUserService.findUserById(build.getUserId());
+            Boolean flag = false;
+            if (authOperaReq.getPass()) {
+                //请求三方接口
+                HttpResponseResult<Boolean> withdraw = withdrawSdk.withdraw(
+                        build.getId().toString(), build.getBankName(), build.getPhone(), withdrawalUser.getIdCardNo(),
+                        build.getActualAmount().multiply(new BigDecimal("100")).intValue(), build.getBankCard(), null
+                );
+                if (withdraw.getStatus() && withdraw.getData()) {
+                    build.setTradeStatus(TradeStatusEnum.pending);
+                    flag = true;
+                }
+            }
+            //修改系统中账户
+            if (!authOperaReq.getPass() || !flag) {
+                //审核不通过,账户解冻
+                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);
+            }
+            updateById(build);
+        }
+        return HttpResponseResult.succeed();
+    }
+
+    @Override
+    public HttpResponseResult<Boolean> transferAccount(AuthOperaReq authOperaReq, SysUser user) {
+        UserWithdrawalVo detail = detail(Long.parseLong(authOperaReq.getId()));
+        if (detail == null) {
+            return HttpResponseResult.failed("提现记录不存在");
+        }
+        if (!detail.getAuthStatus().equals(AuthStatusEnum.PASS)) {
+            return HttpResponseResult.failed("提现记录未审核");
+        }
+        if (detail.getTradeStatus().equals(TradeStatusEnum.succeeded)) {
+            return HttpResponseResult.failed("提现已经交易成功");
+        }
+
+        //不用审核的,需要请求三方
+        HttpResponseResult<Boolean> withdraw = withdrawSdk.withdraw(
+                detail.getId().toString(), detail.getBankName(), detail.getPhone(), user.getIdCardNo(),
+                detail.getActualAmount().multiply(new BigDecimal("100")).intValue(), detail.getBankCard(), null
+        );
+        if (withdraw.getStatus() && withdraw.getData()) {
+            detail.setTradeStatus(TradeStatusEnum.pending);
+            updateById(detail);
+            return HttpResponseResult.succeed(true);
+        } else {
+            log.error("结算调用三方接口失败:user is {}, data is {}, res is {}", user.getId(), JSONObject.toJSONString(detail), withdraw);
+            throw new BizException("结算失败");
+        }
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public void callback(UserWithdrawalCallback callback, String jsonStr) {
         if (StringUtil.isEmpty(callback.getOuterOrderNo()) ||
                 StringUtil.isEmpty(callback.getStatus())) {
@@ -144,12 +248,12 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         if (null == detail) {
             throw new BizException("参数异常,未找到交易记录,param is {}", jsonStr);
         }
-        if (!TradeStatusEnum.pending.equals(detail.getStatus())) {
+        if (!TradeStatusEnum.pending.equals(detail.getTradeStatus())) {
             return;
         }
         if ("1".equals(callback.getStatus())) {
             //交易成功
-            detail.setStatus(TradeStatusEnum.succeeded);
+            detail.setTradeStatus(TradeStatusEnum.succeeded);
             detail.setTransNo(callback.getOrderNo());
             BigDecimal actualAmount = new BigDecimal(callback.getActualAmount());
             detail.setActualAmount(actualAmount.divide(new BigDecimal("100")));
@@ -167,18 +271,18 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             successSend(detail.getUserId(), detail.getPhone());
         } else if ("2".equals(callback.getStatus())) {
             //交易失败
-            detail.setStatus(TradeStatusEnum.failed);
+            detail.setTradeStatus(TradeStatusEnum.failed);
             detail.setErrorCode(callback.getErrorCode());
             detail.setErrorMsg(callback.getErrorMsg());
 
             //结算失败,账户解冻
-            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
+            /*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);
+            userAccountService.accountChange(accountRecordDto);*/
         } else {
             return;
         }
@@ -191,6 +295,16 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         userContractRecordDao.contractCallbackUpdate(status, serialNo, url, errMsg);
     }
 
+    /**
+     * 查询用户今天发起的提现次数
+     *
+     * @param userId
+     * @return
+     */
+    private Integer getNowDayWithdrawalCount(Long userId) {
+        return baseMapper.getNowDayWithdrawalCount(userId);
+    }
+
     private void successSend(Long userId, String phone) {
         Map<Long, String> receivers = new HashMap<>();
         receivers.put(userId, phone);
@@ -202,7 +316,86 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         }
     }
 
-   /* @Override
+
+    /***
+     * 入结算表
+     * @author liweifan
+     * @param: userId
+     * @param: withdrawalReq
+     * @param: bankCardVo
+     * @param: userAccountRecord
+     * @updateTime 2022/4/7 16:46
+     */
+    private UserWithdrawal insertUserWithdrawal(Long userId, WithdrawalReq withdrawalReq,
+                                                UserBankCardVo bankCardVo, BigDecimal withdrawalServiceFee,
+                                                String withdrawalAuthSwitch, String withdrawalAuthFee) {
+        UserWithdrawal userWithdrawal = new UserWithdrawal();
+        userWithdrawal.setUserId(userId);
+        userWithdrawal.setAmount(withdrawalReq.getAmountWithdrawal());
+        userWithdrawal.setPlantformFee(withdrawalServiceFee);
+        userWithdrawal.setActualAmount(withdrawalReq.getAmountWithdrawal().subtract(withdrawalServiceFee));
+        userWithdrawal.setBankCardId(bankCardVo.getId());
+        userWithdrawal.setOpenType(OpenContractEnum.lingxinpay.getCode());
+
+        if (YesOrNoEnum.NO.getCode().toString().equals(withdrawalAuthSwitch)) {
+            userWithdrawal.setAuthStatus(AuthStatusEnum.PASS);
+            userWithdrawal.setAuthUserId(0L);
+            userWithdrawal.setReason("系统审核通过");
+        } else {
+            if (new BigDecimal(withdrawalAuthFee).compareTo(withdrawalReq.getAmountWithdrawal()) > 0) {
+                userWithdrawal.setAuthStatus(AuthStatusEnum.PASS);
+                userWithdrawal.setAuthUserId(0L);
+                userWithdrawal.setReason("系统审核通过");
+            } else {
+                userWithdrawal.setAuthStatus(AuthStatusEnum.DOING);
+            }
+        }
+        userWithdrawal.setCreateTime(new Date());
+        userWithdrawal.setUpdateTime(new Date());
+        baseMapper.insert(userWithdrawal);
+        return userWithdrawal;
+    }
+
+    /***
+     * 获取平台结算服务费
+     * @author liweifan
+     * @param: userId
+     * @updateTime 2022/4/7 14:59
+     * @return: java.math.BigDecimal
+     */
+    private BigDecimal getWithdrawalServiceFee() {
+        BigDecimal withdrawalServiceFee;
+        try {
+            String configValue = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_SERVICE_FEE);
+            withdrawalServiceFee = new BigDecimal(configValue);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("获取平台配置失败 key={}", SysConfigConstant.WITHDRAWAL_SERVICE_FEE);
+            withdrawalServiceFee = new BigDecimal(0);
+        }
+        return withdrawalServiceFee;
+    }
+
+    /***
+     * 获取用户可结算金额
+     * @author liweifan
+     * @param: userId
+     * @param: withdrawalServiceFee
+     * @updateTime 2022/4/7 15:02
+     * @return: java.math.BigDecimal
+     */
+    private BigDecimal getAmountUsable(Long userId) {
+        //查询用户账户余额
+        UserAccountVo detail = userAccountService.detail(userId);
+        BigDecimal subtract = detail.getAmountUsable();
+        if (subtract.intValue() < 0) {
+            subtract = new BigDecimal(0);
+        }
+        return subtract;
+    }
+
+
+       /* @Override
     @Transactional(rollbackFor = Exception.class)
     public void importExcel(List<ExcelDataReaderProperty<UserWithdrawalExport>> dataList, Long userId) {
         List<ErrMsg> errMsgList = new ArrayList<>();
@@ -290,66 +483,4 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             baseMapper.updateById(userWithdrawal);
         }
     }*/
-
-    /***
-     * 入结算表
-     * @author liweifan
-     * @param: userId
-     * @param: withdrawalReq
-     * @param: bankCardVo
-     * @param: userAccountRecord
-     * @updateTime 2022/4/7 16:46
-     */
-    private UserWithdrawal insertUserWithdrawal(Long userId, WithdrawalReq withdrawalReq,
-                                                UserBankCardVo bankCardVo, BigDecimal withdrawalServiceFee) {
-        UserWithdrawal userWithdrawal = new UserWithdrawal();
-        userWithdrawal.setUserId(userId);
-        userWithdrawal.setAmount(withdrawalReq.getAmountWithdrawal());
-        userWithdrawal.setPlantformFee(withdrawalServiceFee);
-        userWithdrawal.setBankCardId(bankCardVo.getId());
-        userWithdrawal.setOpenType(OpenContractEnum.lingxinpay.getCode());
-        userWithdrawal.setStatus(TradeStatusEnum.pending);
-        userWithdrawal.setCreateTime(new Date());
-        userWithdrawal.setUpdateTime(new Date());
-        baseMapper.insert(userWithdrawal);
-        return userWithdrawal;
-    }
-
-    /***
-     * 获取平台结算服务费
-     * @author liweifan
-     * @param: userId
-     * @updateTime 2022/4/7 14:59
-     * @return: java.math.BigDecimal
-     */
-    private BigDecimal getWithdrawalServiceFee() {
-        BigDecimal withdrawalServiceFee;
-        try {
-            String configValue = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_SERVICE_FEE);
-            withdrawalServiceFee = new BigDecimal(configValue);
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.info("获取平台配置失败 key={}", SysConfigConstant.WITHDRAWAL_SERVICE_FEE);
-            withdrawalServiceFee = new BigDecimal(0);
-        }
-        return withdrawalServiceFee;
-    }
-
-    /***
-     * 获取用户可结算金额
-     * @author liweifan
-     * @param: userId
-     * @param: withdrawalServiceFee
-     * @updateTime 2022/4/7 15:02
-     * @return: java.math.BigDecimal
-     */
-    private BigDecimal getAmountUsable(Long userId) {
-        //查询用户账户余额
-        UserAccountVo detail = userAccountService.detail(userId);
-        BigDecimal subtract = detail.getAmountUsable();
-        if (subtract.intValue() < 0) {
-            subtract = new BigDecimal(0);
-        }
-        return subtract;
-    }
 }

+ 7 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml

@@ -88,4 +88,11 @@
     <select id="selectList" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
         <include refid="selectSql"/>
     </select>
+
+    <select id="getNowDayWithdrawalCount" resultType="java.lang.Integer">
+        select count(1) from user_withdrawal
+        where user_id_ = #{userId}
+          and auth_status_ in ('DOING','PASS') and trade_status_ != 'failed'
+        and to_days(create_time_) = to_days(now())
+    </select>
 </mapper>

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

@@ -5,7 +5,10 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
+import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.vo.res.WithdrawalInfoRes;
@@ -19,6 +22,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
@@ -30,6 +34,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.TemporalAdjusters;
 import java.util.Date;
+import java.util.concurrent.TimeUnit;
 
 @RestController
 @RequestMapping("/userWithdrawal")
@@ -42,6 +47,9 @@ public class UserWithdrawalController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private RedissonClient redissonClient;
+
     @PostMapping("/getWithdrawalInfo")
     @ApiOperation(value = "查询结算页面信息")
     public HttpResponseResult<WithdrawalInfoRes> getWithdrawalInfo() {
@@ -59,7 +67,21 @@ public class UserWithdrawalController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return userWithdrawalService.withdrawal(user, withdrawalReq);
+        try {
+            HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
+                    .runIfLockCanGet(CacheNameEnum.LOCK_WITHDRAWAL.getRedisKey(user.getId())
+                            , () -> userWithdrawalService.withdrawal(user, withdrawalReq), 60L, TimeUnit.SECONDS);
+            if(null != res){
+                return res;
+            }else{
+                return HttpResponseResult.failed("提现失败");
+            }
+        } catch (BizException e) {
+            return HttpResponseResult.failed(e.getMessage());
+        }  catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("提现失败");
+        }
     }