246 lines
8.5 KiB
PHP
246 lines
8.5 KiB
PHP
<?php
|
||
|
||
namespace App\Jobs;
|
||
|
||
use Illuminate\Bus\Queueable;
|
||
use Illuminate\Queue\SerializesModels;
|
||
use Illuminate\Queue\InteractsWithQueue;
|
||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||
use Illuminate\Foundation\Bus\Dispatchable;
|
||
use App\Models\Live\Viewer;
|
||
use App\Models\Live\Asset;
|
||
use App\Models\Live\AssetLog;
|
||
use App\Models\Live\ViewerShare;
|
||
use App\Models\ShareFund;
|
||
use App\Models\ShareFundLog;
|
||
class MakeShareCash implements ShouldQueue
|
||
{
|
||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||
public $tries = 1;
|
||
protected $viewer_id;
|
||
protected $sharer_id;
|
||
/**
|
||
* Create a new job instance.
|
||
*
|
||
* @return void
|
||
*/
|
||
public function __construct($param)
|
||
{
|
||
$this->viewer_id = $param['viewer_id'];
|
||
$this->sharer_id = $param['sharer_id'];
|
||
}
|
||
|
||
/**
|
||
* Execute the job.
|
||
*
|
||
* @return void
|
||
*/
|
||
public function handle()
|
||
{
|
||
//查找分享者
|
||
try {
|
||
//判断用户是否存在
|
||
$viewer = Viewer::find($this->sharer_id);
|
||
if (empty($viewer)) {
|
||
throw new \Exception("分享者不存在", 500);
|
||
}else{
|
||
//检查是否已经生成过转账记录
|
||
$result = $this->checkMakeShareCash($this->viewer_id, $viewer->id);
|
||
if (empty($result)) {
|
||
//用户生成分享金额
|
||
$result = $this->makeShareCash($viewer, $type='main', null, $this->viewer_id);
|
||
if ($result) {
|
||
//寻找上级分享人
|
||
$this->getShareRoleViewer($viewer, $this->viewer_id);
|
||
}
|
||
}
|
||
}
|
||
|
||
} catch (\Exception $e) {
|
||
\Log::error($e->getMessage().';line-'.$e->getLine());
|
||
}
|
||
}
|
||
|
||
public function checkMakeShareCash($register_viewer_id, $viewer_id)
|
||
{
|
||
$result = AssetLog::where('viewer_id', $viewer_id)->where('log_id', $register_viewer_id)->exists();
|
||
return $result;
|
||
}
|
||
|
||
public function getShareRoleViewer($viewer, $register_viewer_id)
|
||
{
|
||
|
||
$sharer_id = ViewerShare::where('viewer_id', $viewer->id)->where('type', 1)->value('sharer_id');
|
||
|
||
if ($sharer_id) {
|
||
$sharer = Viewer::find($sharer_id);
|
||
if (empty($sharer)) {
|
||
return ;
|
||
}
|
||
//产生共享基金
|
||
$this->makeShareFund($sharer, $viewer, $register_viewer_id);
|
||
// $result = $this->checkMakeShareCash($register_viewer_id, $sharer_id);
|
||
// if (empty($result)) {
|
||
// $result = $this->makeShareCash($sharer, $type="minor", $viewer, $register_viewer_id);
|
||
// }
|
||
$viewer = $sharer;
|
||
}
|
||
}
|
||
/**
|
||
* viewer 分享者
|
||
* type 分享类型 直接或者间接
|
||
* $previous_viewer 上一级分享人
|
||
*/
|
||
public function makeShareCash($viewer, $type, $previous_viewer=null, $register_viewer_id)
|
||
{
|
||
try {
|
||
//开启事务
|
||
\DB::beginTransaction();
|
||
//判断用户是否存在
|
||
if (empty($viewer)) {
|
||
throw new \Exception("分享者不存在", 500);
|
||
}
|
||
//判断是否有分享角色
|
||
$share_role = $viewer->shareRole();
|
||
if (empty($share_role)) {
|
||
throw new \Exception('分享者没有分享角色', 500);
|
||
}
|
||
//收益金额
|
||
$rule = $share_role->rule();
|
||
if ($type == 'main') {
|
||
$share_values = $rule['share_values'];
|
||
}else{
|
||
$previous_viewer_role = $previous_viewer->shareRole();
|
||
if (empty($previous_viewer)) {
|
||
throw new \Exception("上一级分享人没有分享角色,viewer_id: ".$previous_viewer->id, 1);
|
||
}
|
||
$previous_viewer_role_name = $previous_viewer_role->name;
|
||
switch ($previous_viewer_role_name) {
|
||
case '普通推广员':
|
||
$key = 'pt_share_values';
|
||
break;
|
||
case '铜牌推广员':
|
||
$key = 'tp_share_values';
|
||
break;
|
||
case '银牌推广员':
|
||
$key = 'yp_share_values';
|
||
break;
|
||
default:
|
||
$key = '';
|
||
break;
|
||
}
|
||
if ($key) {
|
||
$share_values = $rule[$key];
|
||
}else{
|
||
throw new \Exception('分享者的上一级没有对应身份', 500);
|
||
}
|
||
}
|
||
if ($share_values == 0) {
|
||
throw new \Exception('分享者没有分享收益金额', 500);
|
||
}
|
||
$asset = Asset::firstOrCreate(['viewer_id'=>$viewer->id]);
|
||
// $asset->increment('share_cash', $share_values);
|
||
$score = (($asset->share_cash * 100) + ($asset->cash * 100)) / 100;
|
||
//生成收益记录
|
||
$this->storeAssetLog($viewer->id, $share_values, $score, $register_viewer_id);
|
||
//提交事务
|
||
\DB::commit();
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
//回滚事务
|
||
\DB::rollBack();
|
||
\Log::error($e->getMessage().';line-'.$e->getLine());
|
||
return false;
|
||
}
|
||
}
|
||
public function storeAssetLog($viewer_id, $share_values, $score, $register_viewer_id)
|
||
{
|
||
$log = new AssetLog;
|
||
$log->viewer_id = $viewer_id;
|
||
$log->num = $share_values;
|
||
$log->type = 2;
|
||
$log->log_id = $register_viewer_id;
|
||
$log->score = $score;
|
||
$log->save();
|
||
return ;
|
||
}
|
||
|
||
public function makeShareFund($viewer, $previous_viewer, $register_viewer_id)
|
||
{
|
||
try {
|
||
//开启事务
|
||
\DB::beginTransaction();
|
||
//判断用户是否存在
|
||
if (empty($viewer)) {
|
||
throw new \Exception("分享者不存在", 500);
|
||
}
|
||
//判断是否有分享角色
|
||
$share_role = $viewer->shareRole();
|
||
if (empty($share_role)) {
|
||
throw new \Exception('分享者没有分享角色', 500);
|
||
}
|
||
//收益金额
|
||
$rule = $share_role->rule();
|
||
$viewer_role_name = $share_role->name;
|
||
$previous_viewer_role = $previous_viewer->shareRole();
|
||
$previous_viewer_role_name = $previous_viewer_role->name;
|
||
switch ($previous_viewer_role_name) {
|
||
case '普通推广员':
|
||
$key = 'pt_share_values';
|
||
break;
|
||
case '铜牌推广员':
|
||
$key = 'tp_share_values';
|
||
break;
|
||
case '银牌推广员':
|
||
$key = 'yp_share_values';
|
||
break;
|
||
default:
|
||
$key = '';
|
||
break;
|
||
}
|
||
//共享金额
|
||
if ($key) {
|
||
$share_values =isset($rule[$key])?$rule[$key]:0;
|
||
}else{
|
||
throw new \Exception('分享者的上一级没有对应身份', 500);
|
||
}
|
||
if ($share_values == 0) {
|
||
throw new \Exception('分享者没有分享收益金额', 500);
|
||
}
|
||
//生成共享基金
|
||
$share_fund = ShareFund::first();
|
||
if (empty($share_fund)) {
|
||
$share_fund = new ShareFund;
|
||
$share_fund->balance_amount = 0;
|
||
$share_fund->withdraw_amount = 0;
|
||
$share_fund->save();
|
||
}
|
||
$share_fund->increment('balance_amount', $share_values);
|
||
//生成收益记录
|
||
$this->storeShareFundLog($viewer->id, $share_values, $share_fund->balance_amount, $register_viewer_id);
|
||
//提交事务
|
||
\DB::commit();
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
//回滚事务
|
||
\DB::rollBack();
|
||
\Log::error($e->getMessage().';line-'.$e->getLine());
|
||
return false;
|
||
}
|
||
}
|
||
|
||
|
||
public function storeShareFundLog($viewer_id, $share_values, $balance_amount, $register_viewer_id)
|
||
{
|
||
$log = new ShareFundLog;
|
||
$log->viewer_id = $viewer_id;
|
||
$log->value = $share_values;
|
||
$log->type = 'gain';
|
||
$log->other_viewer_id = $register_viewer_id;
|
||
$log->balance_amount = $balance_amount;
|
||
$log->status = 1;
|
||
$log->save();
|
||
return ;
|
||
}
|
||
}
|