浏览代码

线下结算

刘俊驰 4 月之前
父节点
当前提交
ad3eda2195

+ 5 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java

@@ -15,6 +15,7 @@ import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.easyexcel.ExcelUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -94,6 +95,10 @@ public class UserWithdrawalController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        if (StringUtils.isBlank(authOperaReq.getType())) {
+            authOperaReq.setType("ONLINE");
+        }
+
         return userWithdrawalService.batchAuth(authOperaReq, user);
     }
 

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.dto.req;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
@@ -12,6 +13,7 @@ import javax.validation.constraints.NotNull;
  * @Author: liweifan
  * @Data: 2022/3/18 15:04
  */
+@Data
 @ApiModel(value = "AuthOperaReq", description = "审核操作对象")
 public class AuthOperaReq {
     @NotNull(message = "id不能为空")
@@ -26,6 +28,10 @@ public class AuthOperaReq {
     @ApiModelProperty(value = "用户id", hidden = true)
     private Long userId;
 
+    @ApiModelProperty(value = "线上 ONLINE,线下:OFFLINE")
+    private String type;
+
+
     public String getId() {
         return id;
     }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java

@@ -12,12 +12,14 @@ import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 import java.math.BigDecimal;
 
 /**
  * 用户账户结算表
  */
+@Data
 @TableName("user_withdrawal")
 @ApiModel(value = "UserWithdrawal对象", description = "用户账户结算表")
 public class UserWithdrawal implements Serializable {
@@ -94,6 +96,9 @@ public class UserWithdrawal implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
+    @ApiModelProperty("结算方式 线上 ONLINE,线下:OFFLINE ")
+    @TableField(value = "type_")
+    private String type;
     public Long getId() {
         return id;
     }

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

@@ -199,7 +199,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         List<Long> ids = Arrays.asList(StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId()));
 
         //先判断三方余额是否充足
-        if (authOperaReq.getPass()) {
+        if (authOperaReq.getPass() && "ONLINE".equals(authOperaReq.getType())) {
             List<UserWithdrawal> userWithdrawals = baseMapper.selectList(Wrappers.<UserWithdrawal>lambdaQuery()
                     .in(UserWithdrawal::getId, ids)
                     .eq(UserWithdrawal::getAuthStatus, AuthStatusEnum.DOING));
@@ -225,6 +225,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             param.setReason(authOperaReq.getReason());
             param.setPass(authOperaReq.getPass());
             param.setUserId(sysUser.getId());
+            param.setType(authOperaReq.getType());
             try {
                 HttpResponseResult<UserWithdrawalVo> res = DistributedLock.of(redissonClient)
                         .runIfLockToFunction(CacheNameEnum.LOCK_WITHDRAWAL.getRedisKey(id.toString())
@@ -258,10 +259,16 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         build.setAuthUserId(authOperaReq.getUserId());
         build.setUpdateTime(new Date());
         build.setAuthTime(new Date());
+        build.setType(authOperaReq.getType());
 
         SysUser withdrawalUser = sysUserService.findUserById(build.getUserId());
         HttpResponseResult res = HttpResponseResult.succeed(build);
         if (authOperaReq.getPass()) {
+            if (authOperaReq.getType().equals("OFFLINE")) {
+                //线下审核通过,不调用三方
+                withdrawalSuccess(null, build);
+                return res;
+            }
             //交易流水号生成
             Long transNo = idGeneratorService.generatorId("withdrawNo");
 
@@ -350,19 +357,9 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         if (!TradeStatusEnum.pending.equals(detail.getTradeStatus())) {
             return;
         }
+        detail.setCallbackJson(jsonStr);
         if ("1".equals(callback.getStatus())) {
-            //交易成功
-            detail.setTradeStatus(TradeStatusEnum.succeeded);
-            detail.setTradeNo(callback.getOrderNo());
-            BigDecimal actualAmount = new BigDecimal(callback.getActualAmount());
-            detail.setActualAmount(actualAmount.divide(new BigDecimal("100")));
-            detail.setTransferTime(callback.getEndTime());
-
-            //结算成功,账户解冻,入账户明细
-            UserAccountRecordVo recordVo = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, detail.getId());
-            userAccountService.accountChange(recordVo, PostStatusEnum.RECORDED);
-            //发生结算成功通知
-            successSend(detail.getUserId(), detail.getPhone());
+            withdrawalSuccess(callback, detail);
         } else if ("2".equals(callback.getStatus())) {
             //交易失败
             detail.setTradeStatus(TradeStatusEnum.failed);
@@ -373,14 +370,33 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             //结算失败,账户解冻
             UserAccountRecordVo recordVo = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, detail.getId());
             userAccountService.accountChange(recordVo, PostStatusEnum.CANCEL);
+            updateById(detail);
 
             //发生结算失败通知
             unpassSend(detail.getUserId(), detail.getPhone(), callback.getErrorMsg());
+        }
+    }
+
+    private void withdrawalSuccess(UserWithdrawalCallback callback, UserWithdrawalVo detail) {
+        //交易成功
+        detail.setTradeStatus(TradeStatusEnum.succeeded);
+        if (callback !=null) {
+            detail.setTradeNo(callback.getOrderNo());
+            BigDecimal actualAmount = new BigDecimal(callback.getActualAmount());
+            detail.setActualAmount(actualAmount.divide(new BigDecimal("100")));
+            detail.setTransferTime(callback.getEndTime());
         } else {
-            return;
+            detail.setTradeNo("");
+            detail.setActualAmount(detail.getAmount());
+            detail.setTransferTime(new Date());
         }
-        detail.setCallbackJson(jsonStr);
+
+        //结算成功,账户解冻,入账户明细
+        UserAccountRecordVo recordVo = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, detail.getId());
+        userAccountService.accountChange(recordVo, PostStatusEnum.RECORDED);
         updateById(detail);
+        //发生结算成功通知
+        successSend(detail.getUserId(), detail.getPhone());
     }
 
     @Override