WIN-2308041133\Administrator 4 months ago
parent
commit
6e2d4c12ff
1 changed files with 80 additions and 0 deletions
  1. 80 0
      app/models/store/StoreOrder.php

+ 80 - 0
app/models/store/StoreOrder.php

@@ -9,6 +9,7 @@ namespace app\models\store;
 
 use app\admin\model\system\ShippingTemplatesFree;
 use app\admin\model\system\ShippingTemplatesRegion;
+use app\models\system\SystemUserLevel;
 use crmeb\basic\BaseModel;
 use think\db\exception\DataNotFoundException;
 use think\db\exception\DbException;
@@ -863,9 +864,88 @@ class StoreOrder extends BaseModel
         UserBill::expend('购买商品', $order['uid'], 'now_money', 'pay_money', $order['pay_price'], $order['id'], $now_money, '支付' . floatval($order['pay_price']) . '元购买商品');
         //支付成功后
         event('OrderPaySuccess', [$order, $formId]);
+        $type = User::where('uid', $order['uid'])->value('is_first');
+        if ($type == 1){
+            self::team_rewards($order, 2); //分发团队奖励 2复购
+        }else{
+            self::team_rewards($order, 1); //分发团队奖励 1首单
+        }
         $res = $res1 && $resPink && UserSpread::setSpreadSure($order['uid']) && User::backOrderBrokerage($order);
         return false !== $res;
     }
+//    分发团队奖励  1首单 2复购
+    public function team_rewards($order, $type)
+    {
+        try {
+            $user_spread_group = $this->get_spread_user($order['uid']);  //获取所有上级id
+            $group_info = User::where('uid', 'in', $user_spread_group)->column('uid,level');  //获取所有上级信息
+            // 提取所有level组成新数组
+            $groupIds = array_column($group_info, 'level');
+            // 统计每个level出现的次数
+            $levelCounts = array_count_values($groupIds);
+            $model = new User();
+            if ($type == 1) {
+                $field = 'first_ratio';
+                $title = '首单奖励';
+            }elseif ($type == 2){
+                $field = 'ratio';
+                $title = '复购奖励';
+            }
+            foreach ($levelCounts as $k => $v) {  //遍历所有等级
+
+                $level_group = User::where('level', $k)->column('uid,nickname,brokerage_price,level');  //获取这个等级的所有用户
+                $make = app()->make(SystemUserLevel::class);
+                $level = $make->where('level',$k)->find();  //用户等级
+                if ($level) {
+                    $ratio = bcmul($level[$field],0.01,2);  //奖励比例
+                    $award_price = bcmul($order['pay_price'], $ratio, 2);  //奖励金额
+                    $user_award = bcdiv($award_price,$v,2); //每个用户奖励金额
+                    foreach ($level_group as $key => $value){
+                        $after = bcadd($value['brokerage_price'], $user_award, 2);  //更新用户奖励金额
+                        $mark = $value.'获得分账健康币'.$title . ':' . $award_price . '元';
+                        $res = UserBill::income('获得分账健康币', $value['uid'], 'brokerage_price', 'spread_award', $award_price, $order['id'], $after, $mark, 0);
+                        User::where('uid', $value['uid'])->update(['brokerage_price' => $after]);
+                    }
+
+                }
+            }
+        } catch (Exception $e) {
+            @file_put_contents('quanju.txt', $e->getMessage() . "-团队奖励错误信息\r\n", 8);
+            @file_put_contents('quanju.txt', $e->getLine() . "-团队奖励错误位置\r\n", 8);
+        }
+    }
+    //获取所有上级id
+    public function get_spread_user($id, $init = true, $parentMap = null)
+    {
+        if ($init) {
+            // 获取所有用户的上级映射 (uid => spread_uid)
+            $us = \app\admin\model\user\User::column('spread_uid', 'uid');
+            $parentMap = $us;  // 存储 uid->上级ID 的映射
+            $id = (array)$id; // 确保ID转为数组
+        }
+
+        $result = []; // 存储所有上级ID
+        $visited = []; // 防止循环引用
+        $queue = (array)$id; // 初始化队列
+
+        while (!empty($queue)) {
+            $current = array_shift($queue); // 取出当前用户ID
+
+            // 如果当前用户未处理过且有上级
+            if (!isset($visited[$current]) && isset($parentMap[$current]) && $parentMap[$current] > 0) {
+                $parentId = $parentMap[$current]; // 获取直接上级ID
+                $visited[$current] = true; // 标记当前用户已访问
+
+                // 避免重复处理
+                if (!isset($visited[$parentId])) {
+                    $result[] = $parentId; // 添加到结果
+                    $queue[] = $parentId; // 将上级加入队列继续查找
+                }
+            }
+        }
+
+        return array_unique($result); // 返回去重后的上级ID列表
+    }
 
     /*
      * 线下支付消息通知