留学万象
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

363 lines
13 KiB

2 years ago
<?php
namespace app\admin\controller\shopro\commission;
use think\Db;
use app\admin\controller\shopro\Base;
use addons\shopro\library\commission\Log as LogLibrary;
use addons\shopro\exception\Exception;
/**
* 分销商管理
*
*/
class Agent extends Base
{
// protected $relationSearch = true;
/**
* @var \app\admin\model\shopro\commission\Agent
*/
protected $model = null;
public function _initialize()
{
parent::_initialize();
$this->model = new \app\admin\model\shopro\commission\Agent;
$this->userModel = new \app\admin\model\shopro\user\User;
}
/**
* 查看
*/
public function index()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isAjax()) {
$nobuildfields = ['nickname', 'mobile'];
list($where, $sort, $order, $offset, $limit) = $this->custombuildparams(null, $nobuildfields);
$total = $this->buildSearch()
->where($where)
->order($sort, $order)
->count();
$list = $this->buildSearch()
->with(['user' => function ($query) {
return $query->withField('id, avatar, nickname, mobile, child_user_count, child_user_count_1, total_consume');
}, 'agent_level' => function ($query) {
return $query->withField('image, name, level, commission_rules');
}, 'parent_agent' => function ($query) {
return $query->withField('id, avatar, nickname');
}])
->where($where)
->order($sort, $order)
->limit($offset, $limit)
->select();
$result = array("total" => $total, "rows" => $list);
$this->success('查看分销商', null, $result);
}
return $this->view->fetch();
}
/**
* 查看团队
*/
public function team()
{
$this->request->filter(['strip_tags']);
if ($this->request->isAjax()) {
$filter = json_decode($this->request->get("filter", ''), true);
$parent_user_id = $filter && isset($filter['parent_user_id']) ? $filter['parent_user_id'] : 0;
$nobuildfields = ['level'];
list($where, $sort, $order, $offset, $limit) = $this->custombuildparams(null, $nobuildfields);
$sort = $sort == 'user_id' ? 'id' : $sort; // 这里用的是 userModel , sort 会自动取 this->model 的主键(user_id)
$total = $this->buildUserSearch()
->where($where)
->order($sort, $order)
->count();
$list = $this->buildUserSearch()
->with(['agent.agentLevel'])
->where($where)
->order($sort, $order)
->limit($offset, $limit)
->select();
$parentUser = $this->userModel->with(['agent.agentLevel'])->where('id', $parent_user_id)->find();
$result = array("total" => $total, "rows" => $list, 'parent_user' => $parentUser);
$this->success('查看分销商', null, $result);
}
return $this->view->fetch();
}
/**
* 分销商详情
*/
public function profile($id)
{
$row = $this->model->with(['user' => function ($query) {
return $query->withField('id, avatar, nickname, mobile, child_user_count, child_user_count_1, child_user_count_2, total_consume');
}, 'agent_level' => function ($query) {
return $query->withField('image, name, level, commission_rules');
}, 'parent_agent' => function ($query) {
return $query->withField('id, avatar, nickname');
}])->where('user_id', $id)->find();
if (!$row) {
$this->error('未找到分销商');
}
if ($this->request->isAjax()) {
$this->success('分销商详情', null, $row);
}
$this->assignconfig('row', $row);
return $this->view->fetch();
}
/**
* 更新信息
*/
public function update($id)
{
$agent = new \addons\shopro\library\commission\Agent($id);
if (!$agent->agent) {
$this->error('未找到分销商');
}
$key = $this->request->post('key');
$value = $this->request->post('value');
$data = null;
$runUpgradeAgent = true; // 升级当前分销商
$runUpgradeLastAgentId = 0; // 升级原分销商
$result = Db::transaction(function () use ($agent, $key, $value, &$data, &$runUpgradeAgent, &$runUpgradeLastAgentId) {
switch ($key) {
case 'status': // 变更分销商状态
$data = $value;
if ($value === 'normal' && $agent->user->parent_user_id === 0 && $agent->agent->parent_agent_id !== 0) {
$agent->user->parent_user_id = $agent->agent->parent_agent_id;
$agent->user->save();
\addons\shopro\library\commission\Log::write($agent->agent->parent_agent_id, 'share', ['user' => $agent->user], ['oper_type' => 'user', 'oper_id' => $agent->user->id]);
}
break;
case 'level': // 变更分销商等级
$data = \app\admin\model\shopro\commission\Level::get($value);
if (!$data) {
throw new Exception('未找到该等级');
}
break;
case 'level_status': // 审核分销商升级
if ($agent->agent->level_status == 0) {
throw new Exception('该分销商没有审核升级条件');
} else {
$level = \app\admin\model\shopro\commission\Level::get(['level' => $agent->agent->level_status]);
if ($value != 0) {
if ($level) {
$data['level'] = $level;
$data['action'] = 'agree';
$agent->agent->level = $level->level;
$agent->agent->save();
} else {
throw new Exception('该等级不存在');
}
} else {
$data['action'] = 'reject';
}
$value = 0;
}
break;
case 'parent_agent_id': // 变更分销商上级
$data = null;
if ($agent->agent->parent_agent_id == $value) {
throw new Exception('请勿重复选择');
}
if ($agent->agent->user_id == $value) {
throw new Exception('不能绑定本人');
}
if ($value != 0) {
$data = \app\admin\model\shopro\user\User::get($value);
if (!$data) {
throw new Exception('未找到该分销商');
}
if (!$this->checkChangeParentAgent($agent->agent->user_id, $value)) {
throw new Exception('不能绑定该分销商');
}
}
$runUpgradeLastAgentId = $agent->agent->parent_agent_id;
$agent->user->parent_user_id = $value;
$agent->user->save();
break;
case 'upgrade_lock':
case 'apply_info':
case 'info_status':
if ($value === '') {
$value = null;
}
$data = $value;
$runUpgradeAgent = false;
break;
}
return $agent->agent->allowField('status,level,apply_info,parent_agent_id,upgrade_lock,info_status,level_status')->save([
$key => $value
]);
});
if ($result) {
if ($runUpgradeAgent) {
$agent = new \addons\shopro\library\commission\Agent($agent->agent->user_id);
$agent->asyncAgentUpgrade($agent->agent->user_id);
if ($runUpgradeLastAgentId) {
$agent->asyncAgentUpgrade($runUpgradeLastAgentId);
}
}
LogLibrary::write($agent->agent->user_id, 'agent', ['type' => $key, $key => $data]);
return $this->success('更新成功', null, $agent->agent);
} else {
return $this->error('更新失败');
}
}
/**
* 选择
*/
public function select()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isAjax()) {
//如果发送的来源是Selectpage,则转发到Selectpage
if ($this->request->request('keyField')) {
return $this->selectpage();
}
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
$searchWhere = $this->request->request('searchWhere');
$total = $this->model
->where($where)
->whereOr('id', '=', $searchWhere)
->whereOr('nickname', 'like', "%$searchWhere%")
->whereOr('mobile', 'like', "%$searchWhere%")
->order($sort, $order)
->field('id, nickname, mobile, avatar')
->count();
$list = $this->model
->where($where)
->whereOr('id', '=', $searchWhere)
->whereOr('nickname', 'like', "%$searchWhere%")
->whereOr('mobile', 'like', "%$searchWhere%")
->order($sort, $order)
->field('id, nickname, mobile, avatar')
->limit($offset, $limit)
->select();
$result = array("total" => $total, "rows" => $list);
$this->success('选择用户', null, $result);
}
return $this->view->fetch();
}
/**
* 分销商搜索
*/
public function buildSearch()
{
$filter = $this->request->get("filter", '');
$filter = (array)json_decode($filter, true);
$filter = $filter ? $filter : [];
$nickname = isset($filter['nickname']) ? $filter['nickname'] : '';
$mobile = isset($filter['mobile']) ? $filter['mobile'] : '';
$name = $this->model->getQuery()->getTable();
$tableName = $name . '.';
$agents = $this->model;
if ($nickname || $mobile) {
$agents = $agents->whereExists(function ($query) use ($nickname, $mobile, $tableName) {
$userTableName = (new \app\admin\model\User())->getQuery()->getTable();
$query = $query->table($userTableName)->where($userTableName . '.id=' . $tableName . 'user_id');
if ($nickname) {
$query = $query->where('nickname', 'like', "%{$nickname}%");
}
if ($mobile) {
$query = $query->where('mobile', 'like', "%{$mobile}%");
}
return $query;
});
}
return $agents;
}
/**
* 用户 team 搜索
*/
public function buildUserSearch()
{
$filter = $this->request->get("filter", '');
$filter = (array)json_decode($filter, true);
$filter = $filter ? $filter : [];
$level = isset($filter['level']) ? $filter['level'] : '';
$name = $this->userModel->getQuery()->getTable();
$tableName = $name . '.';
$users = $this->userModel;
if ($level) {
$users = $users->whereExists(function ($query) use ($level, $tableName) {
$agentTableName = (new \app\admin\model\shopro\commission\Agent())->getQuery()->getTable();
$query = $query->table($agentTableName)->where($tableName . 'id=' . $agentTableName . '.user_id')
->where('level', $level);
return $query;
});
}
return $users;
}
// 递归往上找推荐人,防止出现推荐闭环
private function checkChangeParentAgent($agentId, $parentAgentId)
{
if ($agentId === $parentAgentId) {
return false;
}
if ($parentAgentId == 0) {
return true;
}
$parentAgent = \app\admin\model\shopro\commission\Agent::get($parentAgentId);
if ($parentAgent) {
if ($parentAgent->parent_agent_id === 0) {
return true;
} else {
return $this->checkChangeParentAgent($agentId, $parentAgent->parent_agent_id);
}
}
return false;
}
}