| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- <?php
- namespace App\Jobs;
- use App\Constants\ChangeLogConstant;
- use App\Model\RebateOrderMmdel;
- use App\Model\UserModel;
- use App\Repositories\CommissionRulesRepository;
- use App\Repositories\ConfigRepoistory;
- use App\Repositories\RebateOrderRepository;
- use App\Repositories\Service\CommonService;
- use App\Repositories\Service\QueueService;
- use App\Repositories\UserLevelRelationRepository;
- use App\Repositories\UserRepository;
- use Hyperf\AsyncQueue\Job;
- use Hyperf\DbConnection\Db;
- /**
- * 计算返佣
- */
- class RebateUserJob extends Job
- {
- public $params;
- private $perfRati;
- private $rebatRepo;
- private $ruleData;
- private $amount;
- public function __construct($params)
- {
- // 这里最好是普通数据,不要使用携带 IO 的对象,比如 PDO 对象
- $this->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;
- }
- }
|