wesmiler 1 năm trước cách đây
mục cha
commit
7cdd4b59c2

+ 14 - 0
app/Http/Controllers/Api/v1/MemberController.php

@@ -97,4 +97,18 @@ class MemberController extends webApp
         }
     }
 
+    /**
+     * 闪兑
+     * @return array
+     */
+    public function exchange()
+    {
+        $params = request()->post();
+        if($result = MemberService::make()->exchange($this->userId, $params)){
+            return showJson(2105, true, $result);
+        }else{
+            return showJson(MemberService::make()->getError(),false, MemberService::make()->getErrorData());
+        }
+    }
+
 }

+ 175 - 0
app/Services/Api/MemberService.php

@@ -589,6 +589,7 @@ class MemberService extends BaseService
         // 可提金额或手续费验证
         try {
             DB::beginTransaction();
+            RedisService::set($cacheKey . '_lock', date('Y-m-d H:i:s'), rand(3,5));
             if ($coinType == 1) {
                 $maxUsdtRate = ConfigService::make()->getConfigByCode('usdt_withdraw_max_rate', 0);
                 $withdrawTotal = BalanceLogService::make()->getCountByType($userId, 2, 1, 0);
@@ -598,6 +599,7 @@ class MemberService extends BaseService
                     DB::rollBack();
                     $this->error = 2026; // 可提金额超出
                     $this->errorData = ['money' => moneyFormat($maxWithdrawMoney - $withdrawTotal, 2)];
+                    RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
@@ -606,6 +608,7 @@ class MemberService extends BaseService
                 if (!$this->model->where(['id' => $userId])->update($updateData)) {
                     DB::rollBack();
                     $this->error = 2033; // 提现处理失败
+                    RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
@@ -632,6 +635,7 @@ class MemberService extends BaseService
                 if (!BalanceLogModel::insertGetId($log)) {
                     DB::rollBack();
                     $this->error = 2033;
+                    RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
@@ -654,6 +658,7 @@ class MemberService extends BaseService
                 if (!AccountLogModel::insertGetId($data)) {
                     DB::rollBack();
                     $this->error = 2033;
+                    RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
@@ -669,6 +674,7 @@ class MemberService extends BaseService
                     DB::rollBack();
                     $this->error = 2032; // 手续费不足
                     $this->errorData = ['money' => $sbtFee];
+                    RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
@@ -677,6 +683,7 @@ class MemberService extends BaseService
                     DB::rollBack();
                     $this->error = 2026; // 手续费不足
                     $this->errorData = ['money' => $userProfit];
+                    RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
@@ -685,6 +692,7 @@ class MemberService extends BaseService
                 if (!$this->model->where(['id' => $userId])->update($updateData)) {
                     DB::rollBack();
                     $this->error = 2033; // 提现处理失败
+                    RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
@@ -712,6 +720,7 @@ class MemberService extends BaseService
                 if (!BalanceLogModel::insertGetId($log)) {
                     DB::rollBack();
                     $this->error = 2033;
+                    RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
@@ -734,6 +743,7 @@ class MemberService extends BaseService
                 if (!AccountLogModel::insertGetId($data)) {
                     DB::rollBack();
                     $this->error = 2033;
+                    RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
@@ -757,6 +767,7 @@ class MemberService extends BaseService
                     if (!AccountLogModel::insertGetId($data)) {
                         DB::rollBack();
                         $this->error = 2033;
+                        RedisService::clear($cacheKey . '_lock');
                         return false;
                     }
                 }
@@ -764,17 +775,181 @@ class MemberService extends BaseService
                 // 成功
                 DB::commit();
                 RedisService::keyDel("caches:balanceLog:total*");
+                RedisService::clear($cacheKey . '_lock');
                 return $this->getInfo($userId, 3, true);
             }
         } catch (\Exception $exception) {
             DB::rollBack();
             $this->errorData = ['error' => $exception->getMessage()];
+            RedisService::clear($cacheKey . '_lock');
             $this->error = 2028;
             return false;
         }
     }
 
     /**
+     * 闪兑
+     * @param $userId 用户
+     * @param $params 参数:money-闪兑金额
+     * @return array|false|mixed
+     */
+    public function exchange($userId, $params)
+    {
+        $money = isset($params['money']) ? floatval($params['money']) : 0;
+        $coinType = 2;
+        if ($money <= 0) {
+            $this->error = 2101;
+            return false;
+        }
+
+        $cacheKey = "caches:exchange:{$userId}_{$coinType}";
+        if (RedisService::get($cacheKey . '_lock')) {
+            return false;
+        }
+
+        $info = $this->model->where(['id' => $userId, 'mark' => 1])->first();
+        if (empty($info)) {
+            $this->error = 2016;
+            return false;
+        }
+
+        $status = isset($info['status']) ? $info['status'] : 0;
+        $userProfit = isset($info['profit']) ? floatval($info['profit']) : 0;
+        $userSbt = isset($info['sbt']) ? floatval($info['sbt']) : 0;
+        $userUsdt = isset($info['usdt']) ? floatval($info['usdt']) : 0;
+        if ($status != 1) {
+            $this->error = 2015; // 冻结
+            return false;
+        }
+
+        // 闪兑验证
+        $sbtLimit = ConfigService::make()->getConfigByCode('sbt_exchange_limit', 100);
+        $sbtPrice = PriceLogService::make()->getSbtPrice();
+        $sbtLimit = round($sbtLimit/$sbtPrice, 2);
+        $sbtLimit = $sbtLimit>0? $sbtLimit : 0;
+        if($sbtLimit>0 && $sbtLimit < $userSbt){
+            $this->error = lang(2102,['money'=> $sbtLimit]);
+            return false;
+        }
+
+        // 可提金额或手续费验证
+        try {
+            DB::beginTransaction();
+            RedisService::set($cacheKey . '_lock',date('Y-m-d H:i:s'), rand(3,5));
+            // TODO SBT 闪兑 USDT
+            if ($coinType == 2) {
+                // 手续费
+                $exchangeFeeRate = ConfigService::make()->getConfigByCode('exchange_fee_rate', 0);
+                $exchangeFeeRate = $exchangeFeeRate>0 && $exchangeFeeRate<100? floatval($exchangeFeeRate) : 0;
+
+                // 闪兑金额
+                $sbtUsdt = moneyFormat($money * $sbtPrice, 2); // 闪兑USDT金额
+                $feeUsdt = round($sbtUsdt * $exchangeFeeRate/100, 2);
+                $actualUsdt = moneyFormat($sbtUsdt - $feeUsdt, 2);
+
+                // 闪兑入账收益账户处理
+                $updateData = [
+                    'profit' => DB::raw("profit + {$actualUsdt}"),
+                    'sbt' => DB::raw("sbt - {$money}"),
+                    'update_time' => time()
+                ];
+                if (!$this->model->where(['id' => $userId])->update($updateData)) {
+                    DB::rollBack();
+                    $this->error = 2103;
+                    RedisService::clear($cacheKey . '_lock');
+                    return false;
+                }
+
+                // SBT扣除账单
+                $orderNo = get_order_num('SE');
+                $data = [
+                    'user_id' => $userId,
+                    'order_no' => $orderNo,
+                    'type' => 2,
+                    'user_type' => 1,
+                    'coin_type' => 2,
+                    'money' => -$money,
+                    'before_money' => $userSbt,
+                    'create_time' => time(),
+                    'action_ip' => get_client_ip(),
+                    'remark' => 'SBT闪兑',
+                    'status' => 1,
+                    'mark' => 1,
+                ];
+
+                if (!AccountLogModel::insertGetId($data)) {
+                    DB::rollBack();
+                    $this->error = 2103;
+                    RedisService::clear($cacheKey . '_lock');
+                    return false;
+                }
+
+                // 到账USDT收益账单
+                $data = [
+                    'user_id' => $userId,
+                    'order_no' => $orderNo,
+                    'type' => 2,
+                    'user_type' => 1,
+                    'coin_type' => 3,
+                    'money' => $actualUsdt,
+                    'before_money' => $userProfit,
+                    'create_time' => time(),
+                    'action_ip' => get_client_ip(),
+                    'remark' => 'SBT闪兑到账',
+                    'status' => 1,
+                    'mark' => 1,
+                ];
+
+                if (!AccountLogModel::insertGetId($data)) {
+                    DB::rollBack();
+                    $this->error = 2103;
+                    RedisService::clear($cacheKey . '_lock');
+                    return false;
+                }
+
+                // 闪兑手续费账单
+                $data = [
+                    'user_id' => $userId,
+                    'order_no' => $orderNo,
+                    'type' => 18,
+                    'user_type' => 1,
+                    'coin_type' => 3,
+                    'money' => $feeUsdt,
+                    'before_money' => moneyFormat($userProfit + $actualUsdt,2),
+                    'create_time' => time(),
+                    'action_ip' => get_client_ip(),
+                    'remark' => 'SBT闪兑手续费',
+                    'status' => 1,
+                    'mark' => 1,
+                ];
+
+                if (!AccountLogModel::insertGetId($data)) {
+                    DB::rollBack();
+                    $this->error = 2103;
+                    RedisService::clear($cacheKey . '_lock');
+                    return false;
+                }
+
+                // 成功
+                DB::commit();
+                $this->error = 2105;
+                return $this->getInfo($userId, 3, true);
+            }else{
+                DB::rollBack();
+                $this->error = 1031;
+                RedisService::clear($cacheKey . '_lock');
+                return false;
+            }
+        } catch (\Exception $exception) {
+            DB::rollBack();
+            $this->errorData = ['error' => $exception->getMessage()];
+            RedisService::clear($cacheKey . '_lock');
+            $this->error = 2104;
+            return false;
+        }
+    }
+
+    /**
      * 更新用户等级
      * @param $userId 需要更新等级用户ID
      */

+ 6 - 0
resources/lang/zh-cn/api.php

@@ -72,6 +72,12 @@ return [
     '2033' => '提现处理失败',
     '2034' => '提现回调处理失败',
 
+    '2101'=> '请填写闪兑金额',
+    '2102'=> '闪兑账户余额SBT金额不足:money',
+    '2103'=> '闪兑处理失败',
+    '2104'=> '闪兑失败',
+    '2105'=> '闪兑成功',
+
     '2207'=> '没有获取到数据',
     '2208'=> '未获取到代币账户',
     '2209'=> '钱包授权失败',

+ 1 - 0
routes/api.php

@@ -34,6 +34,7 @@ Route::middleware('web.login')->prefix('v1')->group(function(){
     Route::put('/user/setBonus', [\App\Http\Controllers\Api\v1\MemberController::class, 'setBonus']);
     Route::post('/user/withdraw', [\App\Http\Controllers\Api\v1\MemberController::class, 'withdraw']);
     Route::post('/user/recharge', [\App\Http\Controllers\Api\v1\MemberController::class, 'recharge']);
+    Route::post('/user/exchange', [\App\Http\Controllers\Api\v1\MemberController::class, 'exchange']);
 
     // 账户
     Route::get('/account/index', [\App\Http\Controllers\Api\v1\AccountController::class, 'index']);