bztang-admin/plugins/team-dividend/src/models/TeamDividendAgencyModel.php

466 lines
15 KiB
PHP
Raw 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 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['cultural_level_id'])) {
$result = $result->where('cultural_level_id', $parame['cultural_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(['*']);
},
'culturalLevel' => function($query){
return $query->select(['id','level_name','level_weight','level_type','dividend_ratio','award_ratio','culate_model']);
},
'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 function culturalLevel(){
return $this->hasOne(TeamDividendLevelModel::class, 'id', 'cultural_level_id');
}
public static function getAgencyInfoByUid($uid)
{
return self::uniacid()
->with(['hasOneLevel'=>function($query){
// $query->select(['id','award_gratitude','award_ratio','dividend_ratio','level_weight','level_type','commission_ratio']);
},'culturalLevel'=>function($query){
// $query->select(['id','award_gratitude','award_ratio','dividend_ratio','level_weight','level_type','commission_ratio']);
}])
->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(function($query) use ($level){
$query->where('level',$level)
->orWhere('cultural_level_id',$level);
})
// ->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;
}
/**
* Common: 判断:当前等级是否为用户成为过的经销商中 等级最小的
* Author: wu-hui
* Time: 2023/10/26 18:03
* @param $uid
* @param $teamLevelId
* @return bool
*/
public function isMinLevel($uid,$teamLevelId){
$allLv = Uplog::uniacid()
->select([
'yz_team_dividend_uplog.after_level_id',
'yz_team_dividend_level.level_weight',
'yz_team_dividend_level.id',
])
->join('yz_team_dividend_level','yz_team_dividend_level.id','yz_team_dividend_uplog.after_level_id')
->where('uid',$uid)
->groupBy('after_level_id')
->get()
->toArray();
// 判断:当前等级是否为最小等级
$minWeight = (int)min(array_column($allLv,'level_weight'));// 最小权重值
$weightList = array_column($allLv,'level_weight','after_level_id');
return (boolean)((int)$minWeight == (int)$weightList[$teamLevelId]);
}
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);
}
}
}
}