// +---------------------------------------------------------------------- declare (strict_types=1); namespace app\api\model\dealer; use think\Paginator; use app\common\library\helper; use app\api\model\dealer\User as DealerUserModel; use app\common\model\dealer\Referee as RefereeModel; /** * 分销商推荐关系模型 * Class Referee * @package app\api\model\dealer */ class Referee extends RefereeModel { /** * 隐藏字段 * @var array */ protected $hidden = [ 'store_id', 'create_time' ]; /** * 获取我的团队列表 * @param int $dealerId 分销商ID * @param array $param * @return array|mixed|Paginator * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getList(int $dealerId, array $param = []): Paginator { // 获取列表记录 $list = parent::getList($dealerId, $param); // 获取被推荐人的下级成员数量 return !$list->isEmpty() ? $this->getSubTeamNum($list) : $list; } /** * 获取被推荐人的下级成员数量 * @param mixed $list 我的团队列表 * @return mixed * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ private function getSubTeamNum($list) { // 被推荐人ID集 $userIds = helper::getArrayColumn($list, 'user_id'); // 获取分销商列表 $mdoel = new DealerUserModel; $dealerList = $mdoel->getListByUserIds($userIds); // 整理到我的团队列表 $dealerList = helper::arrayColumn2Key($dealerList, 'user_id'); foreach ($list as &$item) { $item['subDealer'] = $dealerList[$item['user_id']] ?? null; } return $list; } /** * 创建推荐关系 * @param int $userId 用户ID * @param int $refereeId 推荐人ID * @return bool * @throws \think\Exception * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function createRelation(int $userId, int $refereeId): bool { // 分销商基本设置 $setting = Setting::getItem('basic'); // 是否开启分销功能 if (!$setting['is_open']) { return false; } // 自分享 if ($userId == $refereeId) { return false; } // # 记录一级推荐关系 // 判断当前用户是否已存在推荐关系 if (self::isExistReferee($userId)) { return false; } // 判断推荐人是否为分销商 if (!User::isDealerUser($refereeId)) { return false; } // 新增关系记录 $model = new self; $model->add($refereeId, $userId, 1); // # 记录二级推荐关系 if ($setting['level'] >= 2) { // 二级分销商id $referee2Id = self::getRefereeUserId($refereeId, 1, true); // 新增关系记录 $referee2Id > 0 && $model->add($referee2Id, $userId, 2); } // # 记录三级推荐关系 if ($setting['level'] == 3) { // 三级分销商id $referee3Id = self::getRefereeUserId($refereeId, 2, true); // 新增关系记录 $referee3Id > 0 && $model->add($referee3Id, $userId, 3); } return true; } /** * 新增关系记录 * @param int $dealerId 分销商ID * @param int $userId 用户ID * @param int $level 等级 * @return bool */ private function add(int $dealerId, int $userId, int $level = 1): bool { // 新增推荐关系 $this->insert([ 'dealer_id' => $dealerId, 'user_id' => $userId, 'level' => $level, 'store_id' => self::$storeId, 'create_time' => time(), ]); // 记录分销商成员数量 User::setMemberInc($dealerId, $level); return true; } /** * 是否已存在推荐关系 * @param int $userId * @return bool */ private static function isExistReferee(int $userId): bool { return (bool)self::get(['user_id' => $userId]); } }