浏览代码

优化层级奖励

jason 8 月之前
父节点
当前提交
1b17f31018

+ 8 - 2
application/api/command/SenAirdrop.php

@@ -25,10 +25,16 @@ class SenAirdrop extends Command
         $GLOBALS['_beginTime'] = microtime(TRUE);
         $output->writeln('定时任务开始执行:' . date('Y-m-d H:i:s', time()));
 
-        // 发放团队奖励
         $teamRewards = new AirdropLogic();
+
+        $output->writeln('向指定用户空投:' . date('Y-m-d H:i:s', time()));
         $teamRewards->setAirdropRewards();
-    
+        $output->writeln('向指定用户空投结束:' . date('Y-m-d H:i:s', time()));
+
+        $output->writeln('层级奖励空投:' . date('Y-m-d H:i:s', time()));
+        $teamRewards->setParentRewards();
+        $output->writeln('层级奖励空投结束:' . date('Y-m-d H:i:s', time()));
+
         $time_total = round(microtime(true) - $GLOBALS['_beginTime'], 4);//计算耗时
         $output->writeln('定时任务执行结束,总耗时' . date('Y-m-d H:i:s', time()) . '; 耗时:' . $time_total . '秒');
     }

+ 19 - 10
application/api/logic/WelfareLoginc.php

@@ -76,16 +76,30 @@ class WelfareLoginc
         return $total;
     }
 
-    //空投Rwa发放
+    /**
+     * 向达到一定持有量的用户空投产品
+     * @param int $rwa_num //数量
+     * @param $productId   //产品ID
+     * @param $rwaProductId  //Rwa产品ID
+     * @param $isArea
+     * @param $orderId
+     * @param $price
+     * @param $mod
+     * @param $num
+     * @return int
+     */
     public static function setUserExRwaNum(int $rwa_num, $productId, $rwaProductId, $isArea, $orderId, $price, $mod, $num): int
     {   
    
         $total = 0; //总数量
         // 使用bcdiv函数进行高精度除法运算,$num除以100,保留两位小数
         $div = bcdiv($num, 100, 2);
-        $list = ProductOrder::where('status', ProductOrder::Paid)->where('product_id', $rwaProductId)->where('popular_price', '>', config('min_rwa_price'))
-        ->group('user_id')->having('total_num>='.$rwa_num)
-        ->field('id,user_id,count(num) as total_num')->select();
+        $list = ProductOrder::where('status', ProductOrder::Paid)
+            ->where('product_id', $rwaProductId)
+            ->where('popular_price', '>', config('min_rwa_price'))
+            ->group('user_id')->having('total_num>='.$rwa_num)
+            ->field('id,user_id,count(num) as total_num')
+            ->select();
         $user = new UserModel();
         foreach($list as $order){
                 //根据$mod的值决定是否需要对用户的rwa_num进行乘以$div的运算
@@ -117,7 +131,7 @@ class WelfareLoginc
      *
      * @return mixed 返回订单设置结果
      */
-    private static function setUserProductOrder(int $num, $isArea, $orderId, $price, $productId, $uid, $typeId)
+    public static function setUserProductOrder(int $num, $isArea, $orderId, $price, $productId, $uid, $typeId)
     {
         // 判断是否需要区域信息
         if(empty($isArea)){
@@ -132,9 +146,4 @@ class WelfareLoginc
         // 返回订单设置结果
         return $result;
     }
-
-
-
-   
-  
 }

+ 68 - 50
application/common/logic/AirdropLogic.php

@@ -4,6 +4,7 @@
 namespace app\common\logic;
 
 use app\common\model\Config;
+use app\common\model\ProductOrder;
 use app\common\model\UserAirdrop;
 use app\api\logic\WelfareLoginc;
 use app\common\model\ProductPopular;
@@ -12,6 +13,7 @@ use app\common\model\LedgerWalletModel;
 use app\common\model\TimedTaskLogModel;
 use app\common\model\UserModel;
 use app\common\model\UserPathModel;
+use app\common\model\UserWelfare;
 use fast\Action;
 use fast\Asset;
 use fast\MembershipLevel;
@@ -77,78 +79,94 @@ class AirdropLogic
 
 
 
+    /**
+     * 超级福利发放层级奖励
+     *
+     * 分享 3 个拿 10 层,分享 10 个拿 31 层
+     */
     public function setParentRewards()
     {
-        //查找会员资产列表
-        $info_list = UserAirdrop::where('type_id', UserAirdrop::typeSuperWeal)
+        //
+        $info = UserAirdrop::where('type_id', UserAirdrop::typeSuperWeal)
             ->where('user_id', '>', 0)
             ->where('status', UserAirdrop::NORMAL)
-            ->select();
-        if(empty($info_list)){
+            ->find();
+        if(empty($info)){
             (new Output())->writeln("本次没有层级奖励数据:");
             return false;
         }
-        foreach ($info_list as $info){
-            $user_info = UserModel::where('id', $info['user_id'])->find();
-            if($user_info->is_super == 0){
-                (new UserAirdrop)->updateDate($info['id'], UserAirdrop::STOP, '会员未领超级福利');
-            }
-            if($user_info->parent_id == 0){
-                (new UserAirdrop)->updateDate($info['id'], UserAirdrop::STOP, '会员无上级');
-            }
-            $parents_info = UserPathModel::where('p.user_id', $info['user_id'])
-                ->alias('p')
-                ->join('user u', 'u.id = p.parent_id', 'left')
-                ->field('u.id, u.is_super, u.direct_super,u.parent_id, p.distance')
-                ->where('u.is_super', 1)
-                ->order('p.distance asc')
-                ->select();
-            if(empty($parents_info)){
-                (new UserAirdrop)->updateDate($info['id'], UserAirdrop::STOP, '所有上级无超级福利');
-            }
-            $level = 0;
-            $send_user_ids = [];//需要发放的会员ID列表
-            //分享 3 个拿 10 层,分享 10 个拿 31 层
-            foreach ($parents_info as $parent){
-                if($parent['direct_super'] >= 3 && $parent['distance'] <= 10){
-                    $send_user_ids[] = $parent['parent_id'];
-                }else if($parent['direct_super'] >= 10 && $parent['distance'] <= 31){
-                        $send_user_ids[] = $parent['parent_id'];
-                }
-            }
-            if(empty($send_user_ids)){
-                (new UserAirdrop)->updateDate($info['id'], UserAirdrop::STOP, '所有上级都未满足发放条件');
-            }
 
-            
+        $user_welfare = UserWelfare::getIsWelfare();
+        if(empty($user_welfare)){
+            (new Output())->writeln("空投参数未配置:");
+            return false;
+        }
+        if($user_welfare['is_super'] == 0){
+            (new Output())->writeln("超级福利未开启:");
+            return false;
         }
 
+        $user_info = UserModel::where('id', $info['user_id'])->find();
+        if($user_info->is_super == 0){
+            (new UserAirdrop)->updateDate($info['id'], UserAirdrop::STOP, '会员未领超级福利');
+            return false;
+        }
+        if($user_info->parent_id == 0){
+            (new UserAirdrop)->updateDate($info['id'], UserAirdrop::STOP, '会员无上级');
+            return false;
+        }
+        $parents_info = UserPathModel::where('p.user_id', $info['user_id'])
+            ->alias('p')
+            ->join('user u', 'u.id = p.parent_id', 'left')
+            ->field('u.id, u.is_super, u.direct_super,u.parent_id, p.distance')
+            ->where('u.is_super', 1)
+            ->order('p.distance asc')
+            ->select();
+        if(empty($parents_info)){
+            (new UserAirdrop)->updateDate($info['id'], UserAirdrop::STOP, '所有上级无超级福利');
+        }
+        $level = 0;
+        $send_user_ids = [];//需要发放的会员ID列表
+        //分享 3 个拿 10 层,分享 10 个拿 31 层
+        foreach ($parents_info as $parent){
+            if($parent['direct_super'] >= 3 && $parent['distance'] <= 10){
+                $send_user_ids[] = $parent['parent_id'];
+            }else if($parent['direct_super'] >= 10 && $parent['distance'] <= 31){
+                $send_user_ids[] = $parent['parent_id'];
+            }
+        }
+        if(empty($send_user_ids)){
+            (new UserAirdrop)->updateDate($info['id'], UserAirdrop::STOP, '所有上级都未满足发放条件');
+            return false;
+        }
 
         // 获取指定产品的热门信息
-        $result = ProductPopular::getPopularByTime($info_list['product_id'], 'zh', $info_list->start_time);
+        $result = ProductPopular::getPopularByTime($user_welfare['super_product_id'], 'zh', $info->start_time);
 
         // 检查库存是否足够
-        if(!$result || $info_list->total_num > $result->stock) {
+        if(!$result || count($send_user_ids) > $result->stock) {
             // 如果库存不足,输出信息并返回false
             (new Output())->writeln("本次执行库存不足:");
             return false;
         }
-
-        // 更新用户福利信息
-        WelfareLoginc::setUserExRwaNum(
-            $info_list['rwa_num'],
-            $info_list['product_id'],
-            $result->is_area,  $result->id, $result->price,
-            $info_list['rwa_mod'],
-            $info_list['num']
-        );
+        $num = $user_welfare['parent_rate'];
+        if(!($num > 0)){
+            (new Output())->writeln("上级发放比例配置有误:" . $num);
+            return false;
+        }
+        foreach ($send_user_ids as $user_id){
+            $rs = WelfareLoginc::setUserProductOrder($num, $result['is_area'], $info['user_id'], $result['price'], $result['product_id'], $user_id, ProductOrder::Airdrop);
+            if($rs && $result['price'] >= config('min_rwa_price')){
+                (new UserModel())->updateForRwaNum($user_id, UserModel::getByParentId($user_id), $num, '+');
+            }
+        }
 
         // 更新信息列表的状态和备注
-        $info_list->status = UserAirdrop::STOP;
-        $info_list->remark = '总发放'.$info_list->total_num.'套';
+        $info->status = UserAirdrop::STOP;
+        $info->remark = '共'.count($send_user_ids).'人,总发放'.count($send_user_ids) * $num.'套';
 
         // 保存更新后的信息列表
-        return $info_list->save();
+        return $info->save();
     }
 
     /**