|
|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|