559 lines
18 KiB
Plaintext
559 lines
18 KiB
Plaintext
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: zef
|
|
* Date: 2018/11/23
|
|
* Time: 10:23
|
|
*/
|
|
|
|
namespace App;
|
|
|
|
use App\Users;
|
|
use App\AgentMoneylog;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Cache;
|
|
class Agent extends Model {
|
|
|
|
protected $table = 'agent';
|
|
public $timestamps = false;
|
|
const CREATED_AT = 'created_time';
|
|
protected $appends = [
|
|
'phone',
|
|
'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 ($value == 'admin' && $is_admin == 1){
|
|
return '';
|
|
}else{
|
|
return self::hasOne('App\Users', 'id', 'user_id')->value('phone');
|
|
}
|
|
}
|
|
|
|
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('App\Users', 'id', 'user_id')->value('parent_id');
|
|
}
|
|
}
|
|
|
|
public function getNicknameAttribute() {
|
|
$value = $this->attributes['username'];
|
|
$is_admin = $this->attributes['is_admin'];
|
|
if ($value == 'admin' && $is_admin == 1){
|
|
return '超级管理员';
|
|
}else{
|
|
return self::hasOne('App\Users', '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->username;
|
|
}else{
|
|
return '无';
|
|
}
|
|
}
|
|
|
|
public function getAgentNameAttribute() {
|
|
$value = $this->attributes['level'];
|
|
if ($value > 0){
|
|
$p = '';
|
|
switch ($value) {
|
|
case 1:
|
|
$p = '一级代理商';
|
|
break;
|
|
case 2:
|
|
$p = '二级代理商';
|
|
break;
|
|
case 3:
|
|
$p = '三级代理商';
|
|
break;
|
|
case 4:
|
|
$p = '四级代理商';
|
|
break;
|
|
default:
|
|
$p = '未知';
|
|
}
|
|
|
|
return $p;
|
|
}else{
|
|
return '无';
|
|
}
|
|
}
|
|
|
|
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 ($level == 1 && $is_admin == 0) {
|
|
$son_level = 2;
|
|
} else if ($level == 2 && $is_admin == 0) {
|
|
$son_level = 3;
|
|
} else if ($level == 3 && $is_admin == 0) {
|
|
$son_level = 4;
|
|
}else{
|
|
$son_level = 5;
|
|
}
|
|
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'];
|
|
|
|
if ($value == 1) {
|
|
$_level = '一级代理商';
|
|
} 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('App\Users','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() {
|
|
if (session()->get('access_token')) {
|
|
$access_token = session()->get('access_token');
|
|
return session()->get($access_token);
|
|
}else{
|
|
return session()->get('user_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('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();
|
|
return $p->id;
|
|
}else{
|
|
$_p_info = DB::table('users')->where('id' , $parent)->first();
|
|
if ($_p_info!=null && !empty($_p_info)) {
|
|
if ($_p_info->agent_id > 0){
|
|
return $_p_info->agent_id;
|
|
}else if ($_p_info->agent_id == 0 && $_p_info->agent_note_id>0) {
|
|
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, $type, $change, $relate_id, $memo = '' , $son_user_id = 0) {
|
|
|
|
$change = number_format($change, 2, '.', '');
|
|
|
|
if (bc_comp($change, '0') === 0) {
|
|
throw new \Exception('变动数量不能为0');
|
|
}
|
|
|
|
$before = $agent->money;
|
|
$after = bc_add($before, $change , 8);
|
|
|
|
DB::table('agent')->where('id' , $agent->id)->update(['money'=>$after]);
|
|
|
|
//记录余额专用流水明细
|
|
$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->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 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(?, lavel_path)', [$agent_id])->get();
|
|
Cache::put("child_agents:{$agent_id}", $child_agents, 5);
|
|
return $child_agents;
|
|
}
|
|
|
|
}
|