705 lines
22 KiB
PHP
705 lines
22 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: zef
|
|
* Date: 2018/11/23
|
|
* Time: 10:23
|
|
*/
|
|
|
|
namespace App;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Carbon;
|
|
use App\{Users, AgentMoneylog};
|
|
|
|
class Agent extends Model
|
|
{
|
|
protected $table = 'agent';
|
|
public $timestamps = false;
|
|
const CREATED_AT = 'created_time';
|
|
|
|
protected $appends = [
|
|
'phone',
|
|
'email',
|
|
'parent_id',
|
|
'nickname',
|
|
'parent_agent_name',
|
|
'agent_name',
|
|
'son_level',
|
|
'max_pro_loss',
|
|
'max_pro_ser',
|
|
'self_info'
|
|
];
|
|
|
|
const AGENT_TYPE = 1; //后台调节法币账户余额
|
|
|
|
public function getPhoneAttribute()
|
|
{
|
|
//$value = $this->attributes['username'];
|
|
$is_admin = $this->attributes['is_admin'];
|
|
if ($is_admin == 1) {
|
|
return '';
|
|
} else {
|
|
return self::hasOne(Users::class, 'id', 'user_id')->value('phone');
|
|
}
|
|
}
|
|
|
|
public function getEmailAttribute()
|
|
{
|
|
|
|
$is_admin = $this->attributes['is_admin'];
|
|
if ($is_admin == 1) {
|
|
return '';
|
|
} else {
|
|
return self::hasOne(Users::class, 'id', 'user_id')->value('email');
|
|
}
|
|
}
|
|
|
|
public function getParentIdAttribute()
|
|
{
|
|
$value = $this->attributes['username'];
|
|
$is_admin = $this->attributes['is_admin'];
|
|
if ($value == 'admin' && $is_admin == 1) {
|
|
return 0;
|
|
} else {
|
|
return self::hasOne(Users::class, 'id', 'user_id')->value('parent_id');
|
|
}
|
|
}
|
|
|
|
public function getNicknameAttribute()
|
|
{
|
|
$value = $this->attributes['username'];
|
|
$is_admin = $this->attributes['is_admin'];
|
|
if ($is_admin == 1) {
|
|
return '超管';
|
|
} else {
|
|
return self::hasOne(Users::class, 'id', 'user_id')->value('nickname');
|
|
}
|
|
}
|
|
|
|
public function getRegTimeAttribute()
|
|
{
|
|
$value = $this->attributes['reg_time'];
|
|
if ($value > 0) {
|
|
return date('Y-m-d H:i:s', $value);
|
|
} else {
|
|
return '无';
|
|
}
|
|
}
|
|
|
|
public function getLockTimeAttribute()
|
|
{
|
|
$value = $this->attributes['lock_time'];
|
|
if ($value > 0) {
|
|
return date('Y-m-d H:i:s', $value);
|
|
} else {
|
|
return '无';
|
|
}
|
|
}
|
|
|
|
public function getProLossAttribute()
|
|
{
|
|
$value = $this->attributes['pro_loss'];
|
|
if ($value > 0) {
|
|
return $value;
|
|
} else {
|
|
return '0.00';
|
|
}
|
|
}
|
|
|
|
public function getProSerAttribute()
|
|
{
|
|
$value = $this->attributes['pro_ser'];
|
|
if ($value > 0) {
|
|
return $value;
|
|
} else {
|
|
return '0.00';
|
|
}
|
|
}
|
|
|
|
public function getParentAgentNameAttribute()
|
|
{
|
|
$value = $this->attributes['parent_agent_id'];
|
|
if ($value > 0) {
|
|
$p = self::getAgentById($value);
|
|
return $p?$p->username:'';
|
|
} else {
|
|
return '无';
|
|
}
|
|
}
|
|
|
|
public function getAgentNameAttribute()
|
|
{
|
|
$value = $this->attributes['level'];
|
|
if ($value > 0) {
|
|
$p = $value . '级代理商';
|
|
return $p;
|
|
}else if($value == 0){
|
|
return '超级';
|
|
}else {
|
|
return '无';
|
|
}
|
|
}
|
|
|
|
public static function getAllChildAgent($agent_id, $refresh = false)
|
|
{
|
|
if ($refresh) {
|
|
$child_agents = self::getRealChildAgent($agent_id);
|
|
} else {
|
|
if (Cache::has("child_agents:{$agent_id}")) {
|
|
$child_agents = Cache::get("child_agents:{$agent_id}");
|
|
} else {
|
|
$child_agents = self::getRealChildAgent($agent_id);
|
|
}
|
|
}
|
|
return $child_agents;
|
|
}
|
|
|
|
private static function getRealChildAgent($agent_id)
|
|
{
|
|
$child_agents = self::whereRaw('find_in_set(?, agent_path)', [$agent_id])->get();
|
|
Cache::put("child_agents:{$agent_id}", $child_agents, Carbon::now()->addMinutes(5));
|
|
return $child_agents;
|
|
}
|
|
|
|
public function getSonLevelAttribute()
|
|
{
|
|
$level = $this->attributes['level'];
|
|
$is_admin = $this->attributes['is_admin'];
|
|
if ($level >= 0 && $is_admin >= 0) {
|
|
|
|
if ($level == 0 && $is_admin == 1) {
|
|
$son_level = 1;
|
|
} else if ($is_admin == 0) {
|
|
$son_level = $level + 1;
|
|
}
|
|
return $son_level;
|
|
} else {
|
|
return '无';
|
|
}
|
|
}
|
|
|
|
public function getMaxProLossAttribute()
|
|
{
|
|
$value = $this->attributes['pro_loss'];
|
|
$p_id = $this->attributes['parent_agent_id'];
|
|
$p_info = self::getAgentById($p_id);
|
|
if ($p_info != null) {
|
|
return $p_info['pro_loss'];
|
|
} else {
|
|
return $value;
|
|
}
|
|
}
|
|
|
|
public function getMaxProSerAttribute()
|
|
{
|
|
$value = $this->attributes['pro_ser'];
|
|
$p_id = $this->attributes['parent_agent_id'];
|
|
$p_info = self::getAgentById($p_id);
|
|
if ($p_info != null) {
|
|
return $p_info['pro_ser'];
|
|
} else {
|
|
return $value;
|
|
}
|
|
}
|
|
|
|
public function getPasswordAttribute()
|
|
{
|
|
return '**********';
|
|
}
|
|
|
|
public function getSelfInfoAttribute()
|
|
{
|
|
$value = $this->attributes['level'];
|
|
$agent_max_level = Setting::getValueByKey('agent_max_level', 4);
|
|
if ($value > 0 && $value <= $agent_max_level) {
|
|
$_level = $value . '级代理商';
|
|
// } else if ($value == 2) {
|
|
// $_level = '二级代理商';
|
|
// } else if ($value == 3) {
|
|
// $_level = '三级代理商';
|
|
// } else if ($value == 4) {
|
|
// $_level = '四级代理商';
|
|
} else {
|
|
$_level = '超级代理商';
|
|
}
|
|
|
|
return $_level;
|
|
}
|
|
|
|
public function user()
|
|
{
|
|
if ($this->is_admin != 1) {
|
|
return $this->belongsTo(Users::class, 'user_id', 'id');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $mobile
|
|
* @return string
|
|
*/
|
|
public static function getUserByUsername($username)
|
|
{
|
|
if (empty($username)) return "";
|
|
return self::where("username", $username)->first();
|
|
}
|
|
|
|
/**
|
|
* @param $mobile
|
|
* @return string
|
|
*/
|
|
public static function getAgentById($id = 0)
|
|
{
|
|
if ($id == 0) return "";
|
|
return self::where("id", $id)->first();
|
|
}
|
|
|
|
public static function getAgentId()
|
|
{
|
|
|
|
return session()->get('agent_id');
|
|
|
|
}
|
|
|
|
/**
|
|
* @return 获取该用户的代理商信息
|
|
*/
|
|
public static function getAgent()
|
|
{
|
|
return self::getAgentById(self::getAgentId());
|
|
}
|
|
|
|
/**
|
|
* @param $obj
|
|
* @return mixed
|
|
*/
|
|
public static function object2array($obj)
|
|
{
|
|
return json_decode(json_encode($obj), true);
|
|
}
|
|
|
|
/**
|
|
* @param $obj
|
|
*/
|
|
public static function updateSession($agent)
|
|
{
|
|
if ($agent != null) {
|
|
$access_token = md5($agent->id . $agent->username . $agent->reg_time);
|
|
session()->put($access_token, $agent->id);
|
|
session()->put('access_token', $access_token);
|
|
return $access_token;
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $obj
|
|
*/
|
|
public static function delSession($request)
|
|
{
|
|
|
|
if ($request->session()->has('agent_id')) {
|
|
|
|
session()->put('agent_id', '');
|
|
session()->put('agent_username', '');
|
|
|
|
return true;
|
|
} elseif (session()->has('access_token')) {
|
|
$access_token = session()->get('access_token');
|
|
session()->put($access_token, '');
|
|
session()->put('access_token', '');
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 注册的时候,获取上级用户的上级代理商
|
|
*/
|
|
public static function reg_get_agent_id_by_parentid($parent = 0)
|
|
{
|
|
if ($parent == 0) {
|
|
//无上级是,获取admin的id
|
|
// $p = self::where('is_admin', 1)->where('level', 0)->first();
|
|
// var_dump($p);
|
|
// return $p->id;
|
|
return 0;
|
|
} else {
|
|
$_p_info = DB::table('users')->where('id', $parent)->first();
|
|
if ($_p_info != null && !empty($_p_info)) {
|
|
//如果该用户是代理商,返回该用户的代理商id
|
|
if ($_p_info->agent_id > 0) {
|
|
return $_p_info->agent_id;
|
|
} else if ($_p_info->agent_id == 0 && $_p_info->agent_note_id > 0) {
|
|
//如果该用户不是代理商,但是用户属于某个代理商,返回所属代理商id
|
|
return $_p_info->agent_note_id;
|
|
} else {
|
|
//其他情况,
|
|
$p = self::where('is_admin', 1)->where('level', 0)->first();
|
|
return $p->id;
|
|
}
|
|
} else {
|
|
//无上级是,获取admin的id
|
|
$p = self::where('is_admin', 1)->where('level', 0)->first();
|
|
return $p->id;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 获取用户的代理商管理数组
|
|
* @return array
|
|
*/
|
|
public static function getUserParentAgent($user_id = 0)
|
|
{
|
|
|
|
if ($user_id == 0) {
|
|
return [];
|
|
} else {
|
|
$agent_note = DB::table('users')->where("id", $user_id)->select("agent_note_id")->first();
|
|
if (!empty($agent_note) && $agent_note->agent_note_id == 0) {
|
|
return [];
|
|
} else {
|
|
$arr = [];
|
|
$_zero = self::getAgentById($agent_note->agent_note_id);
|
|
|
|
//上级代理商
|
|
if ($_zero != null && !empty($_zero)) {
|
|
if ($_zero->admin != 1) {
|
|
$_z = [];
|
|
$_z['agent_id'] = $_zero->id;
|
|
$_z['user_id'] = $_zero->user_id;
|
|
$_z['is_admin'] = $_zero->is_admin;
|
|
$_z['level'] = $_zero->level;
|
|
$_z['pro_loss'] = $_zero->pro_loss;
|
|
$_z['pro_ser'] = $_zero->pro_ser;
|
|
$arr[] = $_z;
|
|
}
|
|
|
|
//上上级代理商
|
|
if ($_zero->parent_agent_id > 0) {
|
|
$_two = self::getAgentById($_zero->parent_agent_id);
|
|
if ($_two->admin != 1) {
|
|
$_t = [];
|
|
$_t['agent_id'] = $_two->id;
|
|
$_t['user_id'] = $_two->user_id;
|
|
$_t['is_admin'] = $_two->is_admin;
|
|
$_t['level'] = $_two->level;
|
|
$_t['pro_loss'] = bcsub($_two->pro_loss, $_zero->pro_loss, 2);
|
|
$_t['pro_ser'] = bcsub($_two->pro_ser, $_zero->pro_ser, 2);
|
|
$arr[] = $_t;
|
|
}
|
|
|
|
//上上上级代理商
|
|
if ($_two->parent_agent_id > 0) {
|
|
$_three = self::getAgentById($_two->parent_agent_id);
|
|
if ($_three->admin != 1) {
|
|
$_th = [];
|
|
$_th['agent_id'] = $_three->id;
|
|
$_th['user_id'] = $_three->user_id;
|
|
$_th['is_admin'] = $_three->is_admin;
|
|
$_th['level'] = $_three->level;
|
|
$_th['pro_loss'] = bcsub($_three->pro_loss, $_two->pro_loss, 2);
|
|
$_th['pro_ser'] = bcsub($_three->pro_ser, $_two->pro_ser, 2);
|
|
$arr[] = $_th;
|
|
}
|
|
|
|
//上上上上级代理商
|
|
if ($_three->parent_agent_id > 0) {
|
|
$_four = self::getAgentById($_three->parent_agent_id);
|
|
if ($_four->admin != 1) {
|
|
$_f = [];
|
|
$_f['agent_id'] = $_four->id;
|
|
$_f['user_id'] = $_four->user_id;
|
|
$_f['is_admin'] = $_four->is_admin;
|
|
$_f['level'] = $_four->level;
|
|
$_f['pro_loss'] = bcsub($_four->pro_loss, $_three->pro_loss, 2);
|
|
$_f['pro_ser'] = bcsub($_four->pro_ser, $_three->pro_ser, 2);
|
|
$arr[] = $_f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $arr;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 改变用户余额并记录日志
|
|
*
|
|
* @param App\User $user 要改变余额的用户模型实例
|
|
* @param integer $type 类型:1.头寸收益,2.手续费收益
|
|
* @param float $change 变动数量:正数为添加,负数为减少
|
|
* @param integer $relate_id 关联Id
|
|
* @param string $memo 备注
|
|
* @return true|string
|
|
*/
|
|
public static function change_agent_money($agent_id, $type, $change, $relate_id, $memo = '', $son_user_id = 0,$legal_id)
|
|
{
|
|
|
|
|
|
//记录余额专用流水明细
|
|
$moneyLog = new AgentMoneylog();
|
|
$moneyLog->agent_id = $agent_id;
|
|
$moneyLog->type = $type;
|
|
$moneyLog->relate_id = $relate_id;
|
|
//$moneyLog->before = $before ?? 0;
|
|
$moneyLog->change = $change;
|
|
//$moneyLog->after = $after;
|
|
$moneyLog->memo = $memo;
|
|
$moneyLog->son_user_id = $son_user_id;
|
|
$moneyLog->legal_id = $legal_id;
|
|
|
|
$moneyLog->created_time = time();
|
|
$moneyLog->save();
|
|
}
|
|
|
|
/**
|
|
* 根据指定日期获取所在周的起始时间和结束时间
|
|
*/
|
|
public static function get_weekinfo_by_date($date)
|
|
{
|
|
$idx = strftime("%u", strtotime($date));
|
|
$mon_idx = $idx - 1;
|
|
$sun_idx = $idx - 7;
|
|
return array(
|
|
'week_start_day' => strftime('%Y-%m-%d', strtotime($date) - $mon_idx * 86400),
|
|
'week_end_day' => strftime('%Y-%m-%d', strtotime($date) - $sun_idx * 86400),
|
|
);
|
|
}
|
|
/**
|
|
* 根据指定日期获取所在月的起始时间和结束时间
|
|
*/
|
|
public static function get_monthinfo_by_date($date)
|
|
{
|
|
$ret = array();
|
|
$timestamp = strtotime($date);
|
|
$mdays = date('t', $timestamp);
|
|
return array(
|
|
'month_start_day' => date('Y-m-1', $timestamp),
|
|
'month_end_day' => date('Y-m-' . $mdays, $timestamp)
|
|
);
|
|
}
|
|
/**
|
|
* 获取指定日期之间的各个周
|
|
*/
|
|
public static function get_weeks($sdate, $edate)
|
|
{
|
|
$range_arr = array();
|
|
// 检查日期有效性
|
|
self::check_date(array($sdate, $edate));
|
|
// 计算各个周的起始时间
|
|
do {
|
|
$weekinfo = self::get_weekinfo_by_date($sdate);
|
|
$end_day = $weekinfo['week_end_day'];
|
|
$start = self::substr_date($weekinfo['week_start_day']);
|
|
$end = self::substr_date($weekinfo['week_end_day']);
|
|
$range = "{$start}/{$end}";
|
|
$range_arr[] = $range;
|
|
$sdate = date('Y-m-d', strtotime($sdate) + 7 * 86400);
|
|
} while ($end_day < $edate);
|
|
return $range_arr;
|
|
}
|
|
|
|
/**
|
|
* 获取指定日期之间的各个月
|
|
*/
|
|
public static function get_months($sdate, $edate)
|
|
{
|
|
$range_arr = array();
|
|
do {
|
|
$monthinfo = self::get_monthinfo_by_date($sdate);
|
|
$end_day = $monthinfo['month_end_day'];
|
|
$start = self::substr_date($monthinfo['month_start_day']);
|
|
$end = self::substr_date($monthinfo['month_end_day']);
|
|
$range = "{$start} ~ {$end}";
|
|
$range_arr[] = $range;
|
|
$sdate = date('Y-m-d', strtotime($sdate . '+1 month'));
|
|
} while ($end_day < $edate);
|
|
return $range_arr;
|
|
}
|
|
|
|
/**
|
|
* 截取日期中的月份和日
|
|
* @param string $date
|
|
* @return string $date
|
|
*/
|
|
public static function substr_date($date)
|
|
{
|
|
if (!$date) return FALSE;
|
|
return date('Y-m-d', strtotime($date));
|
|
}
|
|
|
|
/**
|
|
* 检查日期的有效性 YYYY-mm-dd
|
|
* @param array $date_arr
|
|
* @return boolean
|
|
*/
|
|
public static function check_date($date_arr)
|
|
{
|
|
$invalid_date_arr = array();
|
|
foreach ($date_arr as $row) {
|
|
$timestamp = strtotime($row);
|
|
$standard = date('Y-m-d', $timestamp);
|
|
if ($standard != $row) $invalid_date_arr[] = $row;
|
|
}
|
|
if (!empty($invalid_date_arr)) {
|
|
die("invalid date -> " . print_r($invalid_date_arr, TRUE));
|
|
}
|
|
}
|
|
|
|
/**获取我自己四级代理商所有的id 待优化
|
|
*
|
|
*/
|
|
public static function getLevel4AgentId($agent_id, $id_list = [], $level = 0)
|
|
{
|
|
if ($level == 4) {
|
|
return $id_list;
|
|
}
|
|
|
|
$agent_list = static::where('parent_agent_id', $agent_id)->get();
|
|
|
|
if (!$agent_list) {
|
|
return $id_list;
|
|
}
|
|
|
|
$level += 1;
|
|
|
|
foreach ($agent_list as $agent) {
|
|
$id_list[] = $agent->id;
|
|
$id_list = static::getLevel4AgentId($agent->id, $id_list, $level);
|
|
}
|
|
return $id_list;
|
|
}
|
|
|
|
//获取用户的代理商关系
|
|
public static function agentPath($parent = 0)
|
|
{
|
|
|
|
if ($parent == 0) {
|
|
//无上级是,获取admin的id
|
|
// $p = self::where('is_admin', 1)->where('level', 0)->first();
|
|
// return $p->id;
|
|
return 0;
|
|
} else {
|
|
$_p_info = Users::find($parent);
|
|
if (!empty($_p_info)) {
|
|
if ($_p_info->agent_id > 0) {
|
|
//
|
|
$agent = self::find($_p_info->agent_id);
|
|
|
|
return $agent ? $agent->agent_path : $_p_info->agent_path;
|
|
} else {
|
|
|
|
return $_p_info->agent_path;
|
|
}
|
|
} else {
|
|
//无上级是,获取admin的id
|
|
$p = self::where('is_admin', 1)->where('level', 0)->first();
|
|
return $p->id;
|
|
}
|
|
}
|
|
}
|
|
|
|
//结算测试
|
|
public static function dojie($lever_ids) {
|
|
|
|
LeverTransaction::where('status' , LeverTransaction::CLOSED)
|
|
->where('settled' , 0)
|
|
->whereIn('id',$lever_ids)
|
|
->chunk(100, function($lever_transactions) {
|
|
foreach ($lever_transactions as $key => $trade) {
|
|
try {
|
|
DB::transaction(function () use ($trade) {
|
|
//取出该用户的代理商关系数组
|
|
$agent_path=$trade->agent_path;
|
|
|
|
|
|
$_p_arr =explode(',', $agent_path);
|
|
//var_dump($_p_arr);
|
|
|
|
if (!empty($_p_arr)) {
|
|
|
|
$da=[];
|
|
foreach($_p_arr as $k=>$v){
|
|
$agent=Agent::getAgentById($v);
|
|
|
|
$da[$k]['agent_id']=$v;
|
|
$da[$k]['pro_loss']=$agent->pro_loss;
|
|
$da[$k]['pro_ser']=$agent->pro_ser;
|
|
|
|
}
|
|
|
|
//var_dump($da);exit;
|
|
|
|
//极差收益
|
|
foreach ($da as $k=>$val){
|
|
|
|
if($k==0){
|
|
$pro_loss=$val['pro_loss'];
|
|
$pro_ser=$val['pro_ser'];
|
|
}else{
|
|
$n=$k-1;
|
|
$pro_loss=bc_sub($val['pro_loss'],$da[$n]['pro_loss']);
|
|
$pro_ser=bc_sub($val['pro_ser'],$da[$n]['pro_ser']);
|
|
}
|
|
|
|
//头寸收益
|
|
if ($pro_loss > 0){
|
|
//盈亏收益 . 头寸收益是反的,需要取相反数
|
|
$_base_money =bc_mul($trade->fact_profits , -1);
|
|
$change = bc_mul($_base_money , $pro_loss/100);
|
|
|
|
Agent::change_agent_money(
|
|
$val['agent_id'] ,
|
|
1 ,
|
|
$change,
|
|
$trade->id,
|
|
'您的下级用户'.$trade->user_id.'的订单产生的头寸收益为'.$change.'。订单编号为'.$trade->id,
|
|
$trade->user_id,
|
|
$trade->legal
|
|
);
|
|
}
|
|
|
|
//手续费收益
|
|
if ($pro_ser >0){
|
|
//手续费收益
|
|
$change = bc_mul($trade->trade_fee ,$pro_ser/100);
|
|
|
|
Agent::change_agent_money(
|
|
$val['agent_id'],
|
|
2 ,
|
|
$change,
|
|
$trade->id,
|
|
'您的下级用户'.$trade->user_id.'的订单产生的手续费收益为'.$change.'。订单编号为'.$trade->id,
|
|
$trade->user_id,
|
|
$trade->legal
|
|
);
|
|
}
|
|
|
|
}
|
|
}
|
|
LeverTransaction::where('id' , $trade->id)->update(['settled' =>1]);
|
|
});
|
|
|
|
} catch (\Exception $e) {
|
|
echo 'File :' . $e->getFile() . PHP_EOL;
|
|
echo 'Line :' . $e->getLine() . PHP_EOL;
|
|
echo 'Msg :' . $e->getMessage(). PHP_EOL;
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
}
|
|
}
|