params = $params; } public function handle() { try { //获取关联等级用户 $userRelationData = make(UserLevelRelationRepository::class)->findBy('uid', $this->params['user_id'], ['relation_uid', 'relation_level']); if (empty($userRelationData)) { return ''; } //获取基础仓库 $this->getBaseRepo($this->params['amount']); $this->setUserRecursion($userRelationData); } catch (\Throwable $e) { logger('CrashLogJob', [$e->getMessage(), 1]); } } /** * 递归计算佣金和返佣 * * @param $userRelationData * @param $ruleData * @param $perfRatio * @return void */ private function setUserRecursion($userRelationData, $relationLevel = 1) { //业绩金额 $perfAmount = $this->amount * $this->perfRatio[$relationLevel]; //获取用户累计业绩 $historyPerf = $this->rebatRepo->sumUserTotalPerf($userRelationData->relation_uid); $perfTotal = $perfAmount + (float)$historyPerf; //获取用户vip等级 $userVipLevel = $this->userRepo->findBy('code', $userRelationData->relation_uid, ['vip_level']); //返佣金额 $rebateAmount = $this->getRebateAmount($perfAmount, $this->ruleData, $userVipLevel->vip_level, $perfTotal, $rebateRatio); $setRebateOrder = [ 'order_sn' => make(CommonService::class)->createOrderSn('RO'), 'rebate_amount' => $rebateAmount, 'rebate_ratio' => $rebateRatio, 'perf_amount' => $perfAmount, 'perf_ratio' => $this->perfRatio[$relationLevel], 'uid' => $userRelationData->relation_uid, 'quilt_uid' => $this->params['user_id'], 'amount' => $this->amount, 'user_vip_level' => $userVipLevel->vip_level, 'rebate_level' => $relationLevel, 'perf_total' => $perfTotal ]; Db::beginTransaction(); try { $result = UserModel::where('code', $userRelationData->relation_uid)->increment('balance', $rebateAmount); if (!$result) { Db::rollBack(); return logger('RebateUserJob', [$setRebateOrder, 3]); } $result1 = RebateOrderMmdel::insert($setRebateOrder); if (!$result1) { Db::rollBack(); return logger('RebateUserJob:', [$setRebateOrder, 4]); } Db::commit(); // 帐变流水 $changeData = [ 'user_uid' => $userRelationData->relation_uid, 'currency_type' => ChangeLogConstant::CHANGE_AMOUNT, 'amount' => $rebateAmount, 'way' => ChangeLogConstant::WAY_1, 'type' => ChangeLogConstant::TYPE_3, ]; make(QueueService::class)->saveChangeLogJob($changeData); if ($relationLevel == 4) { return logger('CrashLogJob', ['本轮返佣计算结束']); } $userRelationData = make(UserLevelRelationRepository::class)->findBy('uid', $userRelationData->relation_uid, ['relation_uid', 'relation_level']); $this->setUserRecursion($userRelationData, ++$relationLevel); } catch (\Throwable $e) { logger('CrashLogJob', [$e->getMessage(), 2]); Db::rollBack(); } } /** * 获取基础仓库信息 * * @return void */ private function getBaseRepo($amount) { $this->userRepo = make(UserRepository::class); $this->rebatRepo =make(RebateOrderRepository::class); $this->amount = $amount; //佣金规则 $this->ruleData = make(CommissionRulesRepository::class)->all(['min_perf', 'max_perf', 'grade', 'rebate_ratio']); //业绩比例 $perfRatio = make(ConfigRepoistory::class)->get('perf_ratio', 'rule'); $this->perfRatio = json_decode($perfRatio, true); } /** * 计算返佣金额 * * @param $amount * @param $ruleData * @param $userVipLevel * @param $rebateRatio * @return float|int */ private function getRebateAmount($amount, $ruleData, $userVipLevel, $perfTotal, &$rebateRatio) { $rebateAmount = 0; foreach ($ruleData as $val) { if ($val['grade'] == $userVipLevel && ($perfTotal > $val['min_perf'] && $perfTotal <= $val['max_perf'])) { $rebateAmount = sprintf("%01.2f", $amount * $val['rebate_ratio']); $rebateRatio = $val['rebate_ratio']; } } return $rebateAmount; } }