WIN-2308041133\Administrator 1 주 전
부모
커밋
09db5da71a

+ 5 - 0
app/api/controller/v1/admin/StoreOrderController.php

@@ -574,7 +574,12 @@ class StoreOrderController
                 ], bcadd((string)$balance, (string)$brokeragePrice, 2), $orderInfo['id'] ?? 0);
                 $userServices->bcInc($uid, 'brokerage_price', $brokeragePrice, 'uid');
             }
+
         }
+
+        // 更新门店核销订单数量
+        \app\model\system\store\SystemStore::where('uid', $uid)->inc('verify_num');
+
         return app('json')->success(410189);
     }
 

+ 106 - 3
app/services/order/StoreOrderSuccessServices.php

@@ -187,6 +187,9 @@ class StoreOrderSuccessServices extends BaseServices
                         'number' => $brokerageAmount,
                     ], bcadd((string)$balance, (string)$brokerageAmount, 2), $orderInfo['id'] ?? 0);
                     $userServices->bcInc($spread_uid, 'brokerage_price', $brokerageAmount, 'uid');
+
+                    // 发放平级奖励
+                    $this->issueSameLevelReward($spread_uid, $brokerageAmount);
                 }
             }
 
@@ -200,7 +203,7 @@ class StoreOrderSuccessServices extends BaseServices
     }
 
     /**
-     * 发放核销订单线路奖励
+     * 发放核销订单线路奖励   定时任务
      * 针对分销等级为4的用户,统计其直推下级团队中门店核销订单数量
      * 当两条线都达到200单时,奖励verific_reward金额
      * 当第三条线达到200单时,再奖励more_reward金额
@@ -329,11 +332,13 @@ class StoreOrderSuccessServices extends BaseServices
             // 发放verific_reward(两条线达标奖励)
             if ($needVerificReward && $verificReward > 0) {
                 $userBrokerageServices->income('line_two_reward', $spread_uid, [
-                    'pay_price' => 0,
+//                    '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);
+                // 发放平级奖励
+                $this->issueSameLevelReward($spread_uid, $verificReward);
             }
 
             // 发放more_reward(第三条及以上线达标,可能多次)
@@ -341,11 +346,13 @@ class StoreOrderSuccessServices extends BaseServices
                 $needIssueMoreCount = $moreRewardCount - $issuedMoreCount;
                 for ($i = 0; $i < $needIssueMoreCount; $i++) {
                     $userBrokerageServices->income('line_more_reward', $spread_uid, [
-                        'pay_price' => 0,
+//                        '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);
+                    // 发放平级奖励
+                    $this->issueSameLevelReward($spread_uid, $moreReward);
                 }
             }
 
@@ -390,5 +397,101 @@ class StoreOrderSuccessServices extends BaseServices
         }
     }
 
+    /**
+     * 发放平级奖励
+     * 无限向上查找上级,如果上级的分销等级等于指定等级,发放平级奖励
+     * @param int $rewardUid 获得奖励的用户UID
+     * @param float $rewardAmount 奖励金额
+     * @param int $agentLevelId 分销等级ID
+     * @param float $sameLevelRatio 平级奖励比例
+     * @return bool
+     */
+    public function sameLevelReward($rewardUid, $rewardAmount, $agentLevelId, $sameLevelRatio){
+        try {
+            if ($rewardAmount <= 0 || $sameLevelRatio <= 0) {
+                return false;
+            }
+
+            /** @var UserServices $userServices */
+            $userServices = app()->make(UserServices::class);
+            /** @var UserBrokerageServices $userBrokerageServices */
+            $userBrokerageServices = app()->make(UserBrokerageServices::class);
+
+            // 计算平级奖励金额:奖励金额 * 平级比例 / 100
+            $sameLevelAmount = bcmul((string)$rewardAmount, (string)($sameLevelRatio / 100), 2);
+            if ($sameLevelAmount <= 0) {
+                return false;
+            }
+
+            // 从奖励用户开始,无限向上查找上级
+            $currentUid = $rewardUid;
+            while ($currentUid > 0) {
+                // 查询当前用户的上级
+                $spreadUid = User::where('uid', $currentUid)->value('spread_uid');
+                if (!$spreadUid || $spreadUid <= 0) {
+                    break;
+                }
+
+                // 查询上级的分销等级
+                $spreadAgentLevelId = User::where('uid', $spreadUid)->value('agent_level');
+                if (!$spreadAgentLevelId) {
+                    $currentUid = $spreadUid;
+                    continue;
+                }
+
+                // 如果上级的分销等级ID等于指定的等级ID,发放平级奖励
+                if ($spreadAgentLevelId == $agentLevelId) {
+                    $balance = $userServices->value(['uid' => $spreadUid], 'brokerage_price');
+                    $userBrokerageServices->income('get_same_level_reward', $spreadUid, [
+                        'pay_price' => 0,
+                        'number' => $sameLevelAmount,
+                    ], bcadd((string)$balance, (string)$sameLevelAmount, 2), 0);
+                    $userServices->bcInc($spreadUid, 'brokerage_price', $sameLevelAmount, 'uid');
+                }
+
+                // 继续向上查找
+                $currentUid = $spreadUid;
+            }
+
+            return true;
+        } catch (\Exception $e) {
+            @file_put_contents("quanju.txt", json_encode($e->getMessage())."-sameLevelReward报错内容\r\n", 8);
+            @file_put_contents("quanju.txt", json_encode($e->getLine())."-sameLevelReward报错位置\r\n", 8);
+            @file_put_contents("quanju.txt", json_encode($e->getFile())."-sameLevelReward报错文件\r\n", 8);
+            throw $e;
+        }
+    }
+
+    /**
+     * 发放平级奖励(内部调用方法)
+     * 查询所有设置平级奖的等级并发放奖励
+     * @param int $rewardUid 获得奖励的用户UID
+     * @param float $rewardAmount 奖励金额
+     * @return bool
+     */
+    private function issueSameLevelReward($rewardUid, $rewardAmount){
+        try {
+            // 查询所有设置了平级奖的分销等级(equal_award > 0)
+            $agentLevelsWithAward = \app\model\agent\AgentLevel::where('equal_award', '>', 0)
+                ->column('equal_award', 'id');
+
+            if (empty($agentLevelsWithAward)) {
+                return false;
+            }
+
+            // 遍历所有设置了平级奖的等级,发放奖励
+            foreach ($agentLevelsWithAward as $agentLevelId => $equalAward) {
+                $this->sameLevelReward($rewardUid, $rewardAmount, $agentLevelId, $equalAward);
+            }
+
+            return true;
+        } catch (\Exception $e) {
+            @file_put_contents("quanju.txt", json_encode($e->getMessage())."-issueSameLevelReward报错内容\r\n", 8);
+            @file_put_contents("quanju.txt", json_encode($e->getLine())."-issueSameLevelReward报错位置\r\n", 8);
+            @file_put_contents("quanju.txt", json_encode($e->getFile())."-issueSameLevelReward报错文件\r\n", 8);
+            throw $e;
+        }
+    }
+
 
 }

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

@@ -162,6 +162,13 @@ class UserBrokerageServices extends BaseServices
             'status' => 1,
             'pm' => 1
         ],
+        'get_same_level_reward' => [
+            'title' => '获得平级奖励',
+            'type' => 'same_level_reward',
+            'mark' => '平级奖励,奖励佣金{%number%}元',
+            'status' => 1,
+            'pm' => 1
+        ],
     ];