WIN-2308041133\Administrator 1 týždeň pred
rodič
commit
5c856807a7

+ 193 - 0
app/services/order/StoreOrderSuccessServices.php

@@ -149,6 +149,7 @@ class StoreOrderSuccessServices extends BaseServices
         $issueService->setCoupon($coupon, $user);
         return true;
     }
+//   发放分销奖励()
     public function spreadReward($spread_uid, $orderInfo){
         try {
             // 获取上级的分销等级
@@ -198,4 +199,196 @@ class StoreOrderSuccessServices extends BaseServices
         }
     }
 
+    /**
+     * 发放核销订单线路奖励
+     * 针对分销等级为4的用户,统计其直推下级团队中门店核销订单数量
+     * 当两条线都达到200单时,奖励verific_reward金额
+     * 当第三条线达到200单时,再奖励more_reward金额
+     * 第四条及以后达到200单,每次奖励more_reward金额
+     * @param int $spread_uid 分销等级为4的用户UID
+     * @return bool
+     */
+    public function verifyLineReward($spread_uid){
+        try {
+            // 获取用户的分销等级ID
+            $agent_level_id = User::where('uid', $spread_uid)->value('agent_level');
+            if (!$agent_level_id) {
+                return false;
+            }
+
+            // 获取分销等级的grade字段
+            $agentLevelInfo = \app\model\agent\AgentLevel::where('id', $agent_level_id)->find();
+            if (!$agentLevelInfo) {
+                return false;
+            }
+            $agentGrade = $agentLevelInfo->grade;
+            
+            // 只处理分销等级为4的用户
+            if ($agentGrade != 4) {
+                return false;
+            }
+
+            // 获取该用户的所有直推下级
+            $directUsers = User::where('spread_uid', $spread_uid)
+                ->column('uid');
+
+            if (empty($directUsers)) {
+                return false;
+            }
+
+            // 收集所有需要统计的用户(包括直推下级及其所有下级)
+            $allLineUsers = [];
+            foreach ($directUsers as $directUid) {
+                $lineUsers = $this->getAllTeamUsers($directUid);
+                $allLineUsers[] = $lineUsers;
+            }
+
+            if (empty($allLineUsers)) {
+                return false;
+            }
+
+            // 统计每条线的核销订单数量
+            $lineVerifyCounts = [];
+            foreach ($allLineUsers as $lineUsers) {
+                if (empty($lineUsers)) {
+                    $lineVerifyCounts[] = 0;
+                    continue;
+                }
+                // 查询这些用户拥有的门店的核销订单总量
+                $totalVerifyNum = \app\model\system\store\SystemStore::whereIn('uid', $lineUsers)
+                    ->sum('verify_num');
+                $lineVerifyCounts[] = (int)$totalVerifyNum;
+            }
+
+            // 统计达到200单的线路数量
+            $qualifiedLines = 0;
+            foreach ($lineVerifyCounts as $count) {
+                if ($count >= 200) {
+                    $qualifiedLines++;
+                }
+            }
+
+            if ($qualifiedLines < 2) {
+                return false;
+            }
+
+            // 获取奖励配置
+            $verificReward = sys_config('verific_reward', 0);
+            $moreReward = sys_config('more_reward', 0);
+
+            if ($verificReward <= 0 && $moreReward <= 0) {
+                return false;
+            }
+
+            // 查询用户已发放的奖励记录
+            $rewardRecords = \app\model\user\UserBrokerage::where('uid', $spread_uid)
+                ->where('type', 'get_brokerage')
+                ->where('title', 'like', '%核销线路奖励%')
+                ->column('id', 'number');
+
+            // 计算应该发放的奖励
+            $verificRewardCount = 0; // verific_reward应该发放的次数(最多1次)
+            $moreRewardCount = 0;    // more_reward应该发放的次数
+
+            if ($qualifiedLines >= 2) {
+                $verificRewardCount = 1;
+                // 超过2条线,每多一条线发放一次more_reward
+                $moreRewardCount = $qualifiedLines - 2;
+            }
+
+            // 查询已发放的verific_reward次数
+            $issuedVerificCount = 0;
+            foreach ($rewardRecords as $amount => $id) {
+                if (abs($amount - $verificReward) < 0.01) {
+                    $issuedVerificCount++;
+                }
+            }
+
+            // 查询已发放的more_reward次数
+            $issuedMoreCount = 0;
+            foreach ($rewardRecords as $amount => $id) {
+                if (abs($amount - $moreReward) < 0.01) {
+                    $issuedMoreCount++;
+                }
+            }
+
+            // 判断是否需要发放奖励
+            $needVerificReward = $verificRewardCount > $issuedVerificCount;
+            $needMoreReward = $moreRewardCount > $issuedMoreCount;
+
+            if (!$needVerificReward && !$needMoreReward) {
+                return false;
+            }
+
+            /** @var UserServices $userServices */
+            $userServices = app()->make(UserServices::class);
+            /** @var UserBrokerageServices $userBrokerageServices */
+            $userBrokerageServices = app()->make(UserBrokerageServices::class);
+            $balance = $userServices->value(['uid' => $spread_uid], 'brokerage_price');
+
+            // 发放verific_reward(两条线达标奖励)
+            if ($needVerificReward && $verificReward > 0) {
+                $userBrokerageServices->income('line_two_reward', $spread_uid, [
+                    'pay_price' => 0,
+                    'number' => $verificReward,
+                ], bcadd((string)$balance, (string)$verificReward, 2), 0);
+                $userServices->bcInc($spread_uid, 'brokerage_price', $verificReward, 'uid');
+                $balance = bcadd((string)$balance, (string)$verificReward, 2);
+            }
+
+            // 发放more_reward(第三条及以上线达标,可能多次)
+            if ($needMoreReward && $moreReward > 0) {
+                $needIssueMoreCount = $moreRewardCount - $issuedMoreCount;
+                for ($i = 0; $i < $needIssueMoreCount; $i++) {
+                    $userBrokerageServices->income('line_more_reward', $spread_uid, [
+                        'pay_price' => 0,
+                        'number' => $moreReward,
+                    ], bcadd((string)$balance, (string)$moreReward, 2), 0);
+                    $userServices->bcInc($spread_uid, 'brokerage_price', $moreReward, 'uid');
+                    $balance = bcadd((string)$balance, (string)$moreReward, 2);
+                }
+            }
+
+            return true;
+        } catch (\Exception $e) {
+            @file_put_contents("quanju.txt", json_encode($e->getMessage())."-verifyLineReward报错内容\r\n", 8);
+            @file_put_contents("quanju.txt", json_encode($e->getLine())."-verifyLineReward报错位置\r\n", 8);
+            @file_put_contents("quanju.txt", json_encode($e->getFile())."-verifyLineReward报错文件\r\n", 8);
+            throw $e;
+        }
+    }
+
+    /**
+     * 获取用户的所有下级(递归查询团队)
+     * @param int $uid 用户UID
+     * @return array 所有下级UID数组
+     */
+    private function getAllTeamUsers($uid){
+        $allUsers = [];
+        $this->getTeamUsersRecursive($uid, $allUsers);
+        return $allUsers;
+    }
+
+    /**
+     * 递归获取用户的所有下级
+     * @param int $uid 当前用户UID
+     * @param array &$allUsers 已收集的用户数组(引用传递)
+     */
+    private function getTeamUsersRecursive($uid, &$allUsers){
+        // 查询该用户的直接下级
+        $directUsers = User::where('spread_uid', $uid)
+            ->column('uid');
+
+        if (empty($directUsers)) {
+            return;
+        }
+
+        foreach ($directUsers as $userUid) {
+            $allUsers[] = $userUid;
+            // 递归查询该用户的下级
+            $this->getTeamUsersRecursive($userUid, $allUsers);
+        }
+    }
+
+
 }

+ 14 - 0
app/services/user/UserBrokerageServices.php

@@ -148,6 +148,20 @@ class UserBrokerageServices extends BaseServices
             'status' => 1,
             'pm' => 1
         ],
+        'line_two_reward' => [
+            'title' => '获得两条核销线路达标奖励',
+            'type' => 'line_two_reward',
+            'mark' => '两条核销线路达标(各200单),奖励佣金{%number%}元',
+            'status' => 1,
+            'pm' => 1
+        ],
+        'line_more_reward' => [
+            'title' => '获得多条核销线路达标奖励',
+            'type' => 'line_more_reward',
+            'mark' => '第三条及以上核销线路达标(200单),奖励佣金{%number%}元',
+            'status' => 1,
+            'pm' => 1
+        ],
     ];