415 lines
13 KiB
PHP
415 lines
13 KiB
PHP
<?php
|
||
|
||
|
||
namespace Yunshop\TeamDividend\models;
|
||
|
||
|
||
use app\backend\models\BackendModel;
|
||
use app\common\models\member\MemberChildren;
|
||
use app\common\models\MemberShopInfo;
|
||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Illuminate\Validation\Rule;
|
||
use Yunshop\TeamDividend\observers\DealerObserver;
|
||
use Yunshop\TeamDividend\services\UpgradeService;
|
||
|
||
class TeamDividendAgencyModel extends BackendModel
|
||
{
|
||
use SoftDeletes;
|
||
public $table = 'yz_team_dividend_agency';
|
||
|
||
public $guarded = [''];
|
||
|
||
protected $attributes = [
|
||
'subordinate_num' => 0
|
||
];
|
||
|
||
public static function boot()
|
||
{
|
||
parent::boot();
|
||
self::observe(new DealerObserver());
|
||
}
|
||
|
||
public function rules()
|
||
{
|
||
$rules = [
|
||
'uniacid' => 'required',
|
||
'uid' => [
|
||
Rule::unique($this->table)->where('uniacid', \YunShop::app()->uniacid)->whereNull('deleted_at')->ignore($this->id),
|
||
'required'
|
||
],
|
||
'level' => 'required',
|
||
'parent_id' => 'required',
|
||
// 'relation' => 'required',
|
||
];
|
||
return $rules;
|
||
}
|
||
|
||
public function atributeNames()
|
||
{
|
||
return [
|
||
'uniacid' => '公众号ID',
|
||
'uid' => '会员ID',
|
||
'level' => '经销商等级',
|
||
'parent_id' => '会员上级ID',
|
||
'relation' => '会员关系链'
|
||
];
|
||
}
|
||
|
||
|
||
/**
|
||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||
*/
|
||
public function toParent()
|
||
{
|
||
return $this->belongsTo('app\common\models\Member', 'parent_id', 'uid');
|
||
}
|
||
|
||
|
||
public function hasOneMemberParent()
|
||
{
|
||
return $this->hasOne(\app\common\models\member\MemberParent::class, 'member_id', 'uid');
|
||
}
|
||
|
||
/**
|
||
* 等级1:1关系
|
||
*
|
||
* @return mixed
|
||
*/
|
||
public function hasOneLevel()
|
||
{
|
||
return $this->hasOne('Yunshop\TeamDividend\models\TeamDividendLevelModel', 'id', 'level');
|
||
}
|
||
|
||
/**
|
||
* 会员1:1关系
|
||
*
|
||
* @return mixed
|
||
*/
|
||
public function hasOneMember()
|
||
{
|
||
return $this->hasOne('app\common\models\Member', 'uid', 'uid');
|
||
}
|
||
|
||
public function hasManyTeamDividend()
|
||
{
|
||
return $this->hasMany(TeamDividendModel::class, 'member_id', 'uid');
|
||
}
|
||
|
||
/*
|
||
* 上下级 1:n 关系
|
||
*
|
||
* */
|
||
public function hasManyChildren()
|
||
{
|
||
return $this->hasMany(MemberChildren::class, 'member_id', 'uid');
|
||
}
|
||
|
||
public static function searchAgency($parame)
|
||
{
|
||
$result = self::uniacid()->select(['yz_team_dividend_agency.*'])
|
||
->join('yz_member', 'yz_team_dividend_agency.uid', '=', 'yz_member.member_id')
|
||
->whereNull('yz_member.deleted_at');
|
||
|
||
if (!empty($parame['realname'])) {
|
||
$result = $result->whereHas('hasOneMember', function ($query) use ($parame) {
|
||
$query->where('nickname', 'like', "%{$parame['realname']}%")
|
||
->orWhere('realname', 'like', "%{$parame['realname']}%")
|
||
->orWhere('mobile', 'like', "%{$parame['realname']}%");
|
||
});
|
||
}
|
||
|
||
if (!empty($parame['level_id'])) {
|
||
$result = $result->where('level', $parame['level_id']);
|
||
}
|
||
|
||
if (!empty($parame['member_id'])) {
|
||
$result = $result->whereHas('hasOneMember', function ($query) use ($parame) {
|
||
$query->where('uid', $parame['member_id']);
|
||
});
|
||
}
|
||
|
||
if (isset($parame['searchtime']) && $parame['searchtime'] == 2) {
|
||
if ($parame['times']['start'] != '请选择' && $parame['times']['end'] != '请选择') {
|
||
$range = [strtotime($parame['times']['start']), strtotime($parame['times']['end'])];
|
||
|
||
$result = $result->whereBetween('yz_team_dividend_agency.created_at', $range);
|
||
}
|
||
}
|
||
|
||
$result = $result->with(
|
||
['hasOneLevel' => function($query){
|
||
return $query->select(['*']);
|
||
},'hasOneMember' => function($query){
|
||
return $query->select(['*']);
|
||
},'toParent' => function($query){
|
||
return $query->select('uid', 'realname', 'mobile');
|
||
},'hasManyTeamDividend' => function($query){
|
||
return $query->selectRaw('member_id, status, sum(dividend_amount) as total_amount')->groupBy('member_id','status');
|
||
}])->orderBy('id', 'desc');
|
||
|
||
return $result;
|
||
}
|
||
|
||
|
||
public static function getAgencyInfoByUid($uid)
|
||
{
|
||
return self::uniacid()
|
||
->with('hasOneLevel')
|
||
->where('uid', $uid)
|
||
->first();
|
||
}
|
||
|
||
public static function updatedAgentById($data, $id)
|
||
{
|
||
self::uniacid()
|
||
->where('id', $id)
|
||
->update($data);
|
||
|
||
}
|
||
|
||
public static function getAgentByUidId($membeId)
|
||
{
|
||
return self::uniacid()
|
||
->where('uid',$membeId);
|
||
}
|
||
|
||
public static function getFirstAgencyNum($uid)
|
||
{
|
||
return self::uniacid()
|
||
->where('parent_id', $uid)
|
||
->count(DB::raw("distinct(uid)"));
|
||
}
|
||
|
||
public static function getThridAgencyNum($uid)
|
||
{
|
||
return self::uniacid()
|
||
->whereRaw('FIND_IN_SET(?,relation)' , [$uid])
|
||
->count();
|
||
}
|
||
|
||
public static function getFirstAgency($uid)
|
||
{
|
||
return self::uniacid()
|
||
->where('parent_id', $uid)
|
||
->get();
|
||
}
|
||
|
||
/**
|
||
* 统计下级团队人数
|
||
*
|
||
* @return mixed
|
||
*/
|
||
public static function getChildNumByPrantId()
|
||
{
|
||
return self::selectRaw('parent_id, count(parent_id) as total')
|
||
->uniacid()
|
||
->groupBy('parent_id')
|
||
->get();
|
||
}
|
||
|
||
public static function daletedAgency($id)
|
||
{
|
||
return self::where('id', $id)
|
||
->delete();
|
||
}
|
||
public static function getLevelNumAgency($pid, $level)
|
||
{
|
||
if (!$uids = MemberShopInfo::uniacid()->where('parent_id',$pid)->pluck('member_id')->toArray()){
|
||
return 0;
|
||
}
|
||
return self::uniacid()->whereIn('uid',$uids)->where('level', $level)->count(DB::raw("distinct(uid)"));
|
||
// return self::uniacid()
|
||
// ->where('parent_id', $pid)
|
||
// ->where('level', $level)
|
||
// ->count();
|
||
}
|
||
public static function getuid($id)
|
||
{
|
||
return self::select('uid')
|
||
->where('id', $id)
|
||
->first();
|
||
}
|
||
|
||
public static function getMemberAutoWithdrawByUid($uid)
|
||
{
|
||
$set = \Setting::get('plugin.team_dividend');
|
||
|
||
if ($set['withdraw_type']) {
|
||
return self::uniacid()
|
||
->where('uid', $uid)
|
||
->whereHas('hasOneLevel', function ($q) {
|
||
$q->where('auto_withdraw_period','>', 0);
|
||
})
|
||
->with('hasOneLevel')
|
||
->first();
|
||
}
|
||
return self::uniacid()
|
||
->where('uid', $uid)
|
||
->whereHas('hasOneLevel', function ($q) {
|
||
$q->where('auto_withdraw_day' ,'>', 0);
|
||
})
|
||
->with('hasOneLevel')
|
||
->first();
|
||
|
||
}
|
||
public static function getAgencyByMemberId($memberID)
|
||
{
|
||
return self::uniacid()
|
||
->join('yz_team_dividend_level', 'yz_team_dividend_agency.level', '=', 'yz_team_dividend_level.id')
|
||
->where('uid', $memberID);
|
||
}
|
||
|
||
public function agencyLevel()
|
||
{
|
||
return $this->belongsTo('Yunshop\TeamDividend\models\TeamDividendLevelModel', 'level', 'id');
|
||
}
|
||
|
||
public static function getAgentByMemberId($memberID)
|
||
{
|
||
return self::uniacid()
|
||
->with('agencyLevel')
|
||
->where('uid', $memberID);
|
||
}
|
||
|
||
/**
|
||
* @param $agent
|
||
* @param $is_black
|
||
* @param int $type 0-后台/其他,1-爱心值加速池清零设置操作
|
||
* @return bool|void
|
||
* 设置/取消黑名单
|
||
*/
|
||
public function setBlack($agent, $is_black, $type = 0)
|
||
{
|
||
$is_black = $is_black ? 1 : 0;
|
||
if ($agent->is_black == $is_black) {
|
||
return true;
|
||
}
|
||
$agent->is_black = $is_black;
|
||
$agent->black_time = time();
|
||
$agent->save();
|
||
TeamDividendBlackLog::create([
|
||
'uniacid' => \YunShop::app()->uniacid,
|
||
'agent_id' => $agent->id,
|
||
'uid' => $agent->uid,
|
||
'is_black' => $is_black,
|
||
'type' => $type
|
||
]);
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
public function addTeamAgency($agentData){
|
||
// 其他验证
|
||
$agency_model = new \Yunshop\TeamDividend\admin\models\TeamDividendAgencyModel();
|
||
$agency_model->fill($agentData);
|
||
$validator = $agency_model->validator();
|
||
if ($validator->fails()) {
|
||
throw new \Exception($validator->messages()->first());
|
||
} else {
|
||
if ($agency_model->save()) {
|
||
// 升级后等级
|
||
$c_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($agentData['level']);
|
||
// 升级前等级
|
||
$o_level = NULL;
|
||
// 升级日志
|
||
Uplog::addLog($agency_model, $o_level, $c_level);
|
||
|
||
|
||
// if((int)$agentData['cultural_level_id'] > 0){
|
||
// // 升级后等级
|
||
// $c_c_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find((int)$agentData['cultural_level_id']);
|
||
// // 升级前等级
|
||
// $o_c_level = NULL;
|
||
// // 升级日志
|
||
// Uplog::addLog($agency_model, $o_c_level, $c_c_level);
|
||
// }
|
||
|
||
|
||
//签合同
|
||
$data=[
|
||
'member_id'=>$agentData['uid'],
|
||
'created_at' => time(),
|
||
];
|
||
event(new \app\common\events\plugin\TeamDividendEvent($data));
|
||
//激活码
|
||
$upgrade_set = (new UpgradeService())->getUpgradeById($agentData['level']);
|
||
|
||
if ($upgrade_set) {
|
||
$set = \Setting::get('plugin.team_dividend');
|
||
if ($set['is_activation_code'] && $upgrade_set[0]->code_num) {
|
||
$level_list = TeamDividendLevelModel::getList()->get();
|
||
$code_num = unserialize($upgrade_set[0]->code_num);
|
||
foreach($level_list as $key => $level) {
|
||
if($code_num['level_'.$level->id]) {
|
||
(new UpgradeService())->senCode($agentData['uid'], $code_num['level_'.$level->id], $level->id, $level->level_name);
|
||
}
|
||
}
|
||
\Log::debug('激活码');
|
||
}
|
||
}
|
||
(new UpgradeService())->becomeAgencyNotify($agentData['uid']);
|
||
|
||
}else{
|
||
throw new \Exception('添加失败');
|
||
}
|
||
}
|
||
}
|
||
|
||
public function changeLevel($id,$levelId,$leveType){
|
||
$agency = TeamDividendAgencyModel::find($id);
|
||
|
||
// 等级类型:''=普通等级,cultural=文创等级
|
||
// if((string)$leveType == 'cultural'){
|
||
// $level = $agency->cultural_level_id;
|
||
// $agency->cultural_level_id = $levelId;
|
||
// $agency->cultural_upgrade_at = time();
|
||
// }else{
|
||
$level = $agency->level;
|
||
$agency->level = $levelId;
|
||
$agency->upgrade_at = time();
|
||
// }
|
||
|
||
// 升级后等级
|
||
$c_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($leveType == 'cultural' ? $agency->cultural_level_id : $agency->level);
|
||
// 升级前等级
|
||
$o_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($level);
|
||
|
||
|
||
if($c_level && $o_level && $c_level->level_type != $o_level->level_type ){
|
||
// 非默认等级 且 类型不一致,升级失败
|
||
return false;
|
||
}
|
||
|
||
|
||
if ($agency->save()) {
|
||
// 升级日志
|
||
Uplog::addLog($agency, $o_level, $c_level);
|
||
|
||
if ($c_level->level_weight > $o_level->level_weight) {
|
||
//激活码
|
||
$upgrade_set = (new UpgradeService())->getUpgradeById($agency->level);
|
||
|
||
if ($upgrade_set) {
|
||
$set = \Setting::get('plugin.team_dividend');
|
||
if ($set['is_activation_code'] && $upgrade_set[0]->code_num) {
|
||
$level_list = TeamDividendLevelModel::getList()->get();
|
||
$code_num = (is_array($upgrade_set[0]->code_num) ? $upgrade_set[0]->code_num : unserialize($upgrade_set[0]->code_num)) ?: [];
|
||
foreach($level_list as $key => $level) {
|
||
if($code_num['level_'.$level->id]) {
|
||
(new UpgradeService())->senCode($agency->uid, $code_num['level_'.$level->id], $level->id, $level->level_name);
|
||
}
|
||
}
|
||
\Log::debug('激活码');
|
||
}
|
||
}
|
||
|
||
//代理商升级通知
|
||
(new UpgradeService())->agencyUpgradeNotify($agency->uid, $o_level->level_name, $o_level->dividend_ratio_name, $agency->level);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
} |