wesmiler 2 лет назад
Родитель
Сommit
fe3a5fd49b
3 измененных файлов с 163 добавлено и 23 удалено
  1. 146 2
      app/Services/Api/MemberNodeService.php
  2. 13 21
      app/Services/Api/MemberService.php
  3. 4 0
      resources/lang/zh-cn/api.php

+ 146 - 2
app/Services/Api/MemberNodeService.php

@@ -13,10 +13,13 @@ namespace App\Services\Api;
 
 use App\Models\AccountLogModel;
 use App\Models\MemberLevelModel;
+use App\Models\MemberModel;
 use App\Models\MemberNodeModel;
 use App\Models\MemberSettingModel;
 use App\Services\BaseService;
+use App\Services\ConfigService;
 use App\Services\RedisService;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 节点会员服务管理-服务类
@@ -91,17 +94,158 @@ class MemberNodeService extends BaseService
         ];
     }
 
+    /**
+     * 购买节点
+     * @param $userId 用户ID
+     * @param $params 节点参数:id-节点ID,pay_password-交易密码
+     * @return bool
+     */
     public function buyNode($userId, $params)
     {
         $nodeId = isset($params['id'])? intval($params['id']) : 0;
+        $payPassword = isset($params['pay_password'])? trim($params['pay_password']) : '';
         if($nodeId<=0){
             $this->error = 2014;
             return false;
         }
 
-        $nodeInfo = $this->model->where(['id'=> $nodeId,'status'=>1,'mark'=>1])
-            ->select(['id'])
+        $cacheKey = "caches:members:nodes:buy_{$userId}_{$nodeId}";
+        if(RedisService::get($cacheKey.'_lock')){
+            $this->error = 1034;
+            return false;
+        }
+
+        $nodeInfo = $this->model->where(['a.id'=> $nodeId,'a.status'=>1,'a.mark'=>1])
+            ->leftJoin('member_level as b','b.id','=','a.upgrade_level_id')
+            ->select(['a.*','b.name as level_name'])
+            ->first();
+        $price = isset($nodeInfo['price'])? floatval($nodeInfo['price']) : 0;
+        $boxNum = isset($nodeInfo['box_num'])? intval($nodeInfo['box_num']) : 0;
+        $upgradeLevelId = isset($nodeInfo['upgrade_level_id'])? intval($nodeInfo['upgrade_level_id']) : 0;
+        $nodeName = isset($nodeInfo['name'])? $nodeInfo['name'] : '';
+        $levelName = isset($nodeInfo['level_name'])? $nodeInfo['level_name'] : '';
+        if(empty($nodeInfo) || $price<=0){
+            $this->error = 2501;
+            return false;
+        }
+
+        $userInfo = $this->model->where(['id'=> $userId,'mark'=>1])
+            ->select(['id','nickname','usdt','wait_score','trc_url','pay_password','status'])
             ->first();
+        $status = isset($userInfo['status'])? $userInfo['status'] : 0;
+        $userUsdt = isset($userInfo['usdt'])? $userInfo['usdt'] : 0;
+        $userPayPassword = isset($userInfo['pay_password'])? $userInfo['pay_password'] : '';
+        $userWaitScore = isset($userInfo['wait_score'])? $userInfo['wait_score'] : 0;
+        if(empty($userInfo) || $status != 1){
+            $this->error = 2024;
+            return false;
+        }
+
+        // 是否已经购买过
+        if(AccountLogModel::where(['user_id'=> $userId,'source_id'=>$nodeId,'type'=>4,'status'=>1,'mark'=>1])->value('id')){
+            $this->error = 2502;
+            return false;
+        }
+
+        // USDT余额是否足够
+        if($userUsdt < $price){
+            $this->error = 2035;
+            return false;
+        }
+
+        // 交易密码
+        if(empty($userPayPassword)){
+            $this->error = 1040;
+            return false;
+        }
+
+        if($userPayPassword != get_password($payPassword)){
+            $this->error = 2038;
+            return false;
+        }
+
+        // 购买明细
+        $orderNo = get_order_num('VN');
+        DB::beginTransaction();
+        $log = [
+            'user_id' => $userId,
+            'source_id' => $nodeId,
+            'source_order_no' => $orderNo,
+            'type' => 4,
+            'coin_type' => 1,
+            'user_type'=> 1,
+            'money' => -$price,
+            'actual_money' => -$price,
+            'balance' => $userUsdt,
+            'create_time' => time(),
+            'update_time' => time(),
+            'remark' => "购买{$nodeName}",
+            'status' => 1,
+            'mark' => 1,
+        ];
+        if(!AccountLogModel::insertGetId($log)){
+            DB::rollBack();
+            $this->error = 2029;
+            RedisService::clear($cacheKey);
+            return false;
+        }
+
+        // 待返积分明细
+        $xdPrice = ConfigService::make()->getConfigByCode('xd_price',100);
+        $xdPrice = $xdPrice>0 && $xdPrice<=10000? $xdPrice : 100;
+
+        $waitScoreRate = ConfigService::make()->getConfigByCode('node_award_score_rate', 200);
+        $waitScoreRate = $waitScoreRate>0 && $waitScoreRate<=1000? $waitScoreRate : 0;
+        $waitScore = moneyFormat($price * $xdPrice * $waitScoreRate/100, 2);
+        if($waitScore>0){
+            $log = [
+                'user_id' => $userId,
+                'source_id' => $nodeId,
+                'source_order_no' => $orderNo,
+                'type' => 9,
+                'coin_type' => 5,
+                'user_type'=> 1,
+                'money' => $waitScore,
+                'actual_money' => $waitScore,
+                'balance' => $userWaitScore,
+                'create_time' => time(),
+                'update_time' => time(),
+                'remark' => "购买{$nodeName}",
+                'status' => 1,
+                'mark' => 1,
+            ];
+            if(!AccountLogModel::insertGetId($log)){
+                DB::rollBack();
+                $this->error = 2029;
+                RedisService::clear($cacheKey);
+                return false;
+            }
+        }
+
+        // 账户
+        $updateData = [
+            'usdt'=> DB::raw("usdt - {$price}"), // 扣除USDT
+            'supper_point'=>$nodeId,
+            'member_level'=> $upgradeLevelId, // 直达等级
+            'box_num'=>DB::raw("box_num + {$boxNum}"),  // 奖励盲盒数量
+            'wait_score'=>DB::raw("wait_score + {$waitScore}"),  // 奖励盲盒数量
+            'update_time'=>time()
+        ];
+        if(!MemberModel::where(['id'=> $userId])->update($updateData)){
+            DB::rollBack();
+            $this->error = 2036;
+            RedisService::clear($cacheKey);
+            return false;
+        }
+
+        // 消息
+        $dateTime = date('Y-m-d H:i:s');
+        $levelTip = $upgradeLevelId>0? ",并升级为{$levelName}" :'';
+        MessageService::make()->pushMessage($userId,"购买{$nodeName}成功","您在{$dateTime}(UTC+8)成功支付{$price}USDT购买【{$nodeName}】{$levelTip}。",3);
+
+        DB::commit();
+        $this->error = 2503;
+        return true;
     }
 
 }

+ 13 - 21
app/Services/Api/MemberService.php

@@ -688,14 +688,6 @@ class MemberService extends BaseService
                 }
                 return true;
             }
-        }else if($type == 3){
-            $oldAvatar = MechanicModel::where(['user_id' => $userId])->value('avatar');
-            if (MechanicModel::where(['user_id' => $userId])->update(['avatar' => $avatar, 'update_time' => time()])) {
-                if ($oldAvatar && file_exists(ATTACHMENT_PATH . $oldAvatar)) {
-                    @unlink(ATTACHMENT_PATH . $oldAvatar);
-                }
-                return true;
-            }
         }
 
 
@@ -909,19 +901,6 @@ class MemberService extends BaseService
         $this->model->where(['id' => $userId])->update($data);
 
         // 发送消息
-        $params = [
-            'title'=> "身份认证提交成功",
-            'body' => "您的身份认证信息已提交成功,请耐心等候审核",
-            'type' => 1, // 1-公告通知,2-订单通知,3-交易通知,4-其他
-            'content' => [
-                'account' => ['name' => '账号', 'text' => $info['username']],
-                'pay_time' => ['name' => '申请时间', 'text' => date('Y-m-d H:i:s')],
-                'status' => ['name' => '状态', 'text' => '待审核'],
-            ],
-            'click_type' => 'payload',
-            'url' => '/pages/my/profile/auth',
-        ];
-        PushService::make()->pushMessageByUser($userId, $params, 0);
         $this->error = 2036;
         return true;
     }
@@ -1122,6 +1101,12 @@ class MemberService extends BaseService
             return false;
         }
 
+        $cacheKey = "caches:member:recharge:lock_{$userId}";
+        if(RedisService::get($cacheKey)){
+            $this->error = 1034;
+            return false;
+        }
+
         $userInfo = $this->model->where(['id'=> $userId,'mark'=>1])
             ->select(['id','nickname','usdt','pay_password','balance','status'])
             ->first();
@@ -1144,6 +1129,7 @@ class MemberService extends BaseService
         $money = $usdt;
         // 星豆
         DB::beginTransaction();
+        RedisService::set($cacheKey, $userInfo, rand(2,3));
         if($coinType == 2){
             $xdPrice = ConfigService::make()->getConfigByCode('xd_price',100);
             $xdPrice = $xdPrice>0 && $xdPrice <=10000? $xdPrice : 100;
@@ -1151,12 +1137,14 @@ class MemberService extends BaseService
 
             if($usdt > $userUsdt){
                 $this->error = 2035;
+                RedisService::clear($cacheKey);
                 return false;
             }
 
             // 扣除usdt余额
             $updateData = ['usdt'=>DB::raw("usdt - {$usdt}"),'balance'=>DB::raw("balance + {$money}"),'update_time'=>time()];
             if(!$this->model->where(['id'=> $userId])->update($updateData)){
+                RedisService::clear($cacheKey);
                 $this->error = 2036;
                 DB::rollBack();
                 return false;
@@ -1181,6 +1169,7 @@ class MemberService extends BaseService
         ];
 
         if(!$orderId = BalanceLogModel::insertGetId($data)){
+            RedisService::clear($cacheKey);
             $this->error = 2033;
             DB::rollBack();
             return false;
@@ -1204,6 +1193,7 @@ class MemberService extends BaseService
         ];
 
         if(!AccountLogModel::insertGetId($log)){
+            RedisService::clear($cacheKey);
             $this->error = 2029;
             DB::rollBack();
             return false;
@@ -1227,6 +1217,7 @@ class MemberService extends BaseService
         ];
 
         if(!AccountLogModel::insertGetId($log)){
+            RedisService::clear($cacheKey);
             $this->error = 2029;
             DB::rollBack();
             return false;
@@ -1242,6 +1233,7 @@ class MemberService extends BaseService
         TaskService::make()->updateTask($userId,9, 0);
 
         $this->error = 2037;
+        RedisService::clear($cacheKey);
         return ['order_id'=> $orderId,'balance'=> moneyFormat($balance + $money,2),'usdt'=> moneyFormat($userUsdt-$usdt, 2)];
     }
 

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

@@ -129,6 +129,10 @@ return [
     '2453'=> '该邀请码账号不存在或不可用,请更换绑定',
     '2454'=> '不可绑定自己下级团队用户为推荐人',
 
+    '2501'=> '该节点参数配置错误,请联系客服',
+    '2502'=> '您已购买过该节点',
+    '2503'=> '购买成功',
+
     
     '我正在直播,快来看看吧'=>'我正在直播,快来看看吧',
     '打赏消费通知'=>'打赏消费通知',