dao = $dao; } /** * @param int $userId * @return SharedProsperityUserEntity */ public function getSharedProsperityUserEntityByUserId(int $userId): SharedProsperityUserEntity { $entityList = $this->getSharedProsperityUserEntityListByUserIdList([$userId]); $entity = array_shift($entityList); if ($entity instanceof SharedProsperityUserEntity) { return $entity; } else { /** @var SharedProsperityUserEntity */ return SharedProsperityUserEntity::newInstance(); } } /** * @param array $userIdList * @return SharedProsperityUserEntity[] */ public function getSharedProsperityUserEntityListByUserIdList(array $userIdList): array { return $this->dao->getSharedProsperityUserEntityListByUserIdList($userIdList); } public function create($data) { return $this->dao->create($data); } /** * @param SharedProsperityUserEntity $sharedProsperityUserEntity * @return SharedProsperityUserEntity */ public function createByEntity(SharedProsperityUserEntity $sharedProsperityUserEntity): SharedProsperityUserEntity { $result = $this->create($sharedProsperityUserEntity->toUnderlineArray())->toArray(); /** @var SharedProsperityUserEntity $entity */ $entity = SharedProsperityUserEntity::newInstance($result); return $entity; } /** * @param $id * @param $data * @return int */ public function update($id, $data): int { try { return $this->dao->update($id, $data); } catch (DbException $e) { return 0; } } /** * @param SharedProsperityUserEntity $sharedProsperityUserEntity * @return SharedProsperityUserEntity */ public function updateByEntity(SharedProsperityUserEntity $sharedProsperityUserEntity): SharedProsperityUserEntity { if (empty($sharedProsperityUserEntity->getId())) { return SharedProsperityUserEntity::newInstance(); } $result = $this->update($sharedProsperityUserEntity->getId(), $sharedProsperityUserEntity->toUnderlineArray()); if ($result > 0) { return $this->getSharedProsperityUserEntityByUserId($sharedProsperityUserEntity->getUserId()); } return SharedProsperityUserEntity::newInstance(); } /** * 绑定 上级 * @param int $userId * @param int $parentId * @return bool */ public function bindParentId(int $userId, int $parentId): bool { $sharedProsperityUserEntity = $this->getSharedProsperityUserEntityByUserId($userId); if (empty($sharedProsperityUserEntity->getUserId())) { return false; } $sharedProsperityUserEntityByParentId = $this->getSharedProsperityUserEntityByUserId($parentId); if (empty($sharedProsperityUserEntityByParentId->getUserId())) { return false; } $sharedProsperityUserEntity = $this->updateByEntity($sharedProsperityUserEntity->setParentId($sharedProsperityUserEntityByParentId->getUserId())); if (empty($sharedProsperityUserEntity->getId())) { return false; } return true; } /** * 获取直推用户列表,并计算每个直推用户的团队总人数和团队总业绩(包含自己) * 返回三个列表:全部直推、大部门(团队业绩最大的直推用户)、小部门(其余直推用户) * 同时返回统计数据:我的部门总人数、总业绩、小部门业绩总和、大部门业绩总和 * @param int $userId * @return array */ public function getTeam(int $userId): array { // 获取直推用户 $list = $this->dao->getDirectByUserId($userId); if (empty($list)) { // 没有直推用户,仍然返回统计数据(我的部门总人数和总业绩) $myTeamUserIds = $this->dao->getAllSubordinateUserIds($userId, true); $myTeamTotalCount = count($myTeamUserIds); $myTeamPvSum = $this->dao->getTeamPvSumWithSelf($userId); return [ 'all_direct' => [], 'big_department' => [], 'small_department' => [], 'stats' => [ 'my_team_total_count' => $myTeamTotalCount, 'my_team_pv_sum' => $myTeamPvSum, 'small_department_pv_sum' => 0, 'big_department_pv_sum' => 0, ] ]; } // 收集所有直推用户ID $userIds = array_column($list, 'user_id'); // 获取用户详细信息(昵称、头像、注册时间) /** @var UserDao $userDao */ $userDao = app()->make(UserDao::class); $userEntities = $userDao->getUserEntityListByUidList($userIds); $userMap = []; foreach ($userEntities as $userEntity) { $userMap[$userEntity->getUid()] = [ 'nickname' => $userEntity->getNickname(), 'avatar' => $userEntity->getAvatar(), 'create_time' => $userEntity->getCreateTime(), ]; } // 计算每个直推用户的团队总人数和团队总业绩 $maxPv = 0; $maxPvIndex = -1; foreach ($list as $index => &$item) { $teamUserIds = $this->dao->getAllSubordinateUserIds($item['user_id'], true); $teamTotalCount = count($teamUserIds); $teamPvSum = $this->dao->getTeamPvSumWithSelf($item['user_id']); $item['team_total_count'] = $teamTotalCount; $item['team_pv_sum'] = $teamPvSum; // 补充用户信息 if (isset($userMap[$item['user_id']])) { $item['nickname'] = $userMap[$item['user_id']]['nickname']; $item['avatar'] = $userMap[$item['user_id']]['avatar']; $item['create_time'] = $userMap[$item['user_id']]['create_time']; } else { $item['nickname'] = ''; $item['avatar'] = ''; $item['create_time'] = ''; } // 找出团队业绩最大的直推用户 if ($teamPvSum > $maxPv) { $maxPv = $teamPvSum; $maxPvIndex = $index; } } unset($item); // 分割大部门和小部门 $bigDepartment = []; $smallDepartment = []; if ($maxPvIndex >= 0) { $bigDepartment[] = $list[$maxPvIndex]; foreach ($list as $index => $item) { if ($index !== $maxPvIndex) { $smallDepartment[] = $item; } } } else { // 没有直推用户(理论上不会发生) $smallDepartment = $list; } // 计算统计数据 $myTeamUserIds = $this->dao->getAllSubordinateUserIds($userId, true); $myTeamTotalCount = count($myTeamUserIds); $myTeamPvSum = $this->dao->getTeamPvSumWithSelf($userId); $smallDepartmentPvSum = 0; foreach ($smallDepartment as $item) { $smallDepartmentPvSum += $item['team_pv_sum']; } $bigDepartmentPvSum = 0; foreach ($bigDepartment as $item) { $bigDepartmentPvSum += $item['team_pv_sum']; } return [ 'all_direct' => $list, 'big_department' => $bigDepartment, 'small_department' => $smallDepartment, 'stats' => [ 'my_team_total_count' => $myTeamTotalCount, 'my_team_pv_sum' => $myTeamPvSum, 'small_department_pv_sum' => $smallDepartmentPvSum, 'big_department_pv_sum' => $bigDepartmentPvSum, ] ]; } }