love_php/app/Jobs/MakeShareCash.php
2026-04-02 09:20:51 +08:00

246 lines
8.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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 ;
}
}