src/CorporateTrainingBundle/Biz/User/Service/Impl/UserServiceImpl.php line 17

Open in your IDE?
  1. <?php
  2. namespace CorporateTrainingBundle\Biz\User\Service\Impl;
  3. use AppBundle\Common\ArrayToolkit;
  4. use Biz\System\Service\SessionService;
  5. use Biz\User\Service\Impl\UserServiceImpl as BaseServiceImpl;
  6. use Biz\User\Service\NotificationService;
  7. use Biz\User\Service\TokenService;
  8. use Codeages\Biz\Framework\Event\Event;
  9. use CorporateTrainingBundle\Biz\Post\Service\PostService;
  10. use CorporateTrainingBundle\Biz\User\Service\UserService;
  11. use CorporateTrainingBundle\Common\Constant\CTConst;
  12. use PostMapPlugin\Biz\Rank\Service\RankService;
  13. use Topxia\Service\Common\ServiceKernel;
  14. class UserServiceImpl extends BaseServiceImpl implements UserService
  15. {
  16.     public function getUserWithOrgScopes($id)
  17.     {
  18.         $user $this->getUserDao()->get($id);
  19.         if (!($user)) {
  20.             return null;
  21.         }
  22.         $user UserSerialize::unserialize($user);
  23.         $user['lineOrgIds'] = $this->getUserlineOrgIds($user);
  24.         $user['manageOrgIds'] = $this->getUserManageOrgIds($user);
  25.         $user['manageOrgCodes'] = $this->getUserManageOrgCodes($user);
  26.         return $user;
  27.     }
  28.     public function searchUsers(array $conditions, array $orderBy$start$limit$columns = [])
  29.     {
  30.         if (isset($conditions['nickname'])) {
  31.             $conditions['nickname'] = strtoupper($conditions['nickname']);
  32.         }
  33.         if (empty($conditions['locked']) && empty($conditions['noNeedLocked'])) {
  34.             $conditions['locked'] = 0;
  35.         }
  36.         if (empty($conditions['type'])) {
  37.             $conditions['excludeTypes'] = ['deleted''system'];
  38.         }
  39.         if (isset($conditions['type']) && $conditions['type'] === 'all') {
  40.             unset($conditions['type']);
  41.         }
  42.         unset($conditions['noNeedLocked']);
  43.         $users $this->getUserDao()->searchUsers($conditions$orderBy$start$limit$columns);
  44.         return UserSerialize::unserializes($users);
  45.     }
  46.     public function findDeletedUsers()
  47.     {
  48.         return $this->getUserDao()->findDeleteUsers();
  49.     }
  50.     public function findDeletedAndLockedUsers()
  51.     {
  52.         return $this->getUserDao()->findDeletedAndLockedUsers();
  53.     }
  54.     public function findDeletedAndLockedUsersByIds($userIds)
  55.     {
  56.         return $this->getUserDao()->findDeletedAndLockedUsersByIds($userIds);
  57.     }
  58.     public function findUsersByNicknames($nicknames)
  59.     {
  60.         return $this->getUserDao()->findByNicknames($nicknames);
  61.     }
  62.     public function findByVerifiedMobiles(array $verifiedMobiles)
  63.     {
  64.         return $this->getUserDao()->findByVerifiedMobiles($verifiedMobiles);
  65.     }
  66.     public function findByEmails(array $emails)
  67.     {
  68.         return $this->getUserDao()->findByEmails($emails);
  69.     }
  70.     public function findByIds(array $ids)
  71.     {
  72.         return $this->getUserDao()->findByIds($ids);
  73.     }
  74.     public function findUserIdsByConditions($conditions)
  75.     {
  76.         if (empty($conditions['locked'])) {
  77.             $conditions['locked'] = 0;
  78.         }
  79.         if (empty($conditions['type'])) {
  80.             $conditions['noType'] = 'deleted';
  81.         }
  82.         if (isset($conditions['userIds']) && count($conditions['userIds']) > 15000) {
  83.             $existIds $conditions['userIds'];
  84.             unset($conditions['userIds']);
  85.             $userIds $this->getUserDao()->search($conditions, [], 0PHP_INT_MAX, ['id']);
  86.             $userIds array_intersect($existIdsarray_column($userIds'id'));
  87.             return empty($userIds) ? [-1] : $userIds;
  88.         }
  89.         $userIds $this->getUserDao()->search($conditions, [], 0PHP_INT_MAX, ['id']);
  90.         return empty($userIds) ? [-1] : array_column($userIds'id');
  91.     }
  92.     public function initPassword($id$newPassword)
  93.     {
  94.         $connection $this->getKernel()->getConnection();
  95.         $connection->beginTransaction();
  96.         $user $this->getUserDao()->get($id);
  97.         try {
  98.             $init = [
  99.                 'pwdInit' => '1',
  100.                 'type' => 'init' == $user['type'] ? 'default' $user['type'],
  101.             ];
  102.             $this->getAuthService()->changePassword($idnull$newPassword);
  103.             $this->getUserDao()->update($id$init);
  104.             $connection->commit();
  105.         } catch (\Exception $e) {
  106.             $connection->rollback();
  107.             throw $e;
  108.         }
  109.         return $this->getUserDao()->update($id$init);
  110.     }
  111.     public function changePwdInit($id)
  112.     {
  113.         $init = [
  114.             'pwdInit' => '1',
  115.         ];
  116.         return $this->getUserDao()->update($id$init);
  117.     }
  118.     public function readGuide($id)
  119.     {
  120.         $user $this->getUser($id);
  121.         if (empty($user)) {
  122.             throw $this->createNotFoundException('User'$id'用户不存在');
  123.         }
  124.         return $this->getUserDao()->update($id, ['readGuide' => 1]);
  125.     }
  126.     public function changeUserPost($id$postId)
  127.     {
  128.         $user $this->getUser($id);
  129.         if (empty($user)) {
  130.             throw $this->createNotFoundException('User'$id'用户不存在');
  131.         }
  132.         $post $this->getPostService()->getPost($postId);
  133.         if (empty($post)) {
  134.             throw $this->createNotFoundException('Post'$id'岗位不存在');
  135.         }
  136.         $updatedUser $this->getUserDao()->update($id, ['postId' => $postId]);
  137.         $this->getPostMemberService()->becomePostMember($user['id'], $post['id']);
  138.         $this->dispatchEvent('user.change_post', new Event($updatedUser, ['oldUser' => $user]));
  139.         $this->getLogService()->info('user''post_change'"修改用户{$user['nickname']}岗位为{$post['name']}成功");
  140.         return $updatedUser;
  141.     }
  142.     public function findUserProfilesByTrueName($truename)
  143.     {
  144.         if (empty($truename)) {
  145.             return null;
  146.         }
  147.         return $this->getProfileDao()->findByTrueName($truename);
  148.     }
  149.     public function statisticsOrgUserNumGroupByOrgId()
  150.     {
  151.         return $this->getUserDao()->statisticsOrgUserNumGroupByOrgId();
  152.     }
  153.     public function statisticsPostUserNumGroupByPostId()
  154.     {
  155.         return $this->getUserDao()->statisticsPostUserNumGroupByPostId();
  156.     }
  157.     public function batchUpdatePost($ids$postId)
  158.     {
  159.         $ids explode(','$ids);
  160.         $connection $this->getKernel()->getConnection();
  161.         $connection->beginTransaction();
  162.         try {
  163.             foreach ($ids as $id) {
  164.                 $this->changeUserPost($id$postId);
  165.             }
  166.             $connection->commit();
  167.         } catch (\Exception $e) {
  168.             $connection->rollback();
  169.             throw $e;
  170.         }
  171.     }
  172.     public function countUsersByLockedStatus()
  173.     {
  174.         return [
  175.             'enable' => $this->countUsers(['locked' => 0'noType' => 'system']),
  176.             'disable' => $this->countUsers(['locked' => 1]),
  177.         ];
  178.     }
  179.     public function isOverMaxUsersNumber()
  180.     {
  181.         return true;
  182.     }
  183.     public function getMaxUsersNumber()
  184.     {
  185.         return $this->getSettingService()->get('max_users_number'0);
  186.     }
  187.     public function changeUserOrgs($userId$orgCodes)
  188.     {
  189.         $user $this->getUser($userId);
  190.         if (empty($user) || ($user['orgCodes'] == $orgCodes)) {
  191.             return [];
  192.         }
  193.         $orgCodes $this->filterOrgCodes($orgCodes);
  194.         $orgs $this->getOrgService()->findOrgsByOrgCodes($orgCodes);
  195.         $existOrgCodes ArrayToolkit::column($orgs'orgCode');
  196.         if (array_diff($orgCodes$existOrgCodes)) {
  197.             throw $this->createNotFoundException('Org Not Found');
  198.         }
  199.         $this->getKernel()->getConnection()->beginTransaction();
  200.         try {
  201.             $fields = [
  202.                 'orgCodes' => empty($orgCodes) ? [1.] : ArrayToolkit::column($orgs'orgCode'),
  203.                 'orgIds' => empty($orgCodes) ? [1] : ArrayToolkit::column($orgs'id'),
  204.             ];
  205.             $this->getUserDao()->update($userId$fields);
  206.             $this->getUserOrgService()->setUserOrgs($userId$orgs);
  207.             $this->getKernel()->getConnection()->commit();
  208.         } catch (\Exception $e) {
  209.             $this->getKernel()->getConnection()->rollBack();
  210.             throw $e;
  211.         }
  212.         return $user;
  213.     }
  214.     public function getUserBindByTypeAndFromId($type$fromId)
  215.     {
  216.         return $this->getUserBindDao()->getByTypeAndFromId($this->getUserBindType($type), $fromId);
  217.     }
  218.     public function getUserBindByTypeAndUserId($type$toId)
  219.     {
  220.         $user $this->getUserDao()->get($toId);
  221.         if (empty($user)) {
  222.             throw $this->createNotFoundException("User#{$toId} Not Found");
  223.         }
  224.         if (!$this->typeInOAuthClient($type)) {
  225.             throw $this->createInvalidArgumentException('Invalid Type');
  226.         }
  227.         return $this->getUserBindDao()->getByToIdAndType($this->getUserBindType($type), $toId);
  228.     }
  229.     public function bindUser($type$fromId$toId$token)
  230.     {
  231.         $user $this->getUserDao()->get($toId);
  232.         if (empty($user)) {
  233.             throw $this->createNotFoundException("User#{$toId} Not Found");
  234.         }
  235.         if (!$this->typeInOAuthClient($type)) {
  236.             throw $this->createInvalidArgumentException('Invalid Type');
  237.         }
  238.         if ('weixinweb' == $type || 'weixinmob' == $type) {
  239.             $type 'weixin';
  240.         }
  241.         if ('dingtalkweb' == $type || 'dingtalkmob' == $type) {
  242.             $type 'dingtalk';
  243.         }
  244.         if ('feishuweb' == $type || 'feishumob' == $type) {
  245.             $type 'feishu';
  246.         }
  247.         if ($this->isUserBound($toId$type)) {
  248.             throw $this->createAccessDeniedException('account already bound');
  249.         }
  250.         $bind $this->getUserBindDao()->create([
  251.             'type' => $type,
  252.             'fromId' => $fromId,
  253.             'toId' => $toId,
  254.             'token' => empty($token['token']) ? '' $token['token'],
  255.             'createdTime' => time(),
  256.             'expiredTime' => empty($token['expiredTime']) ? $token['expiredTime'],
  257.         ]);
  258.         $this->dispatchEvent('user.bind', new Event($bind));
  259.     }
  260.     public function isUserBound($userId$type)
  261.     {
  262.         $bind $this->getUserBindDao()->getByToIdAndType($this->getUserBindType($type), $userId);
  263.         return !empty($bind) ? true false;
  264.     }
  265.     public function batchUpdateOrgs($userIds$orgCodes)
  266.     {
  267.         $currentUser $this->getCurrentUser();
  268.         $userIds $this->filterUserIds($userIds);
  269.         foreach ($userIds as $userId) {
  270.             if ($currentUser['id'] == $userId) {
  271.                 continue;
  272.             }
  273.             $this->changeUserOrgs($userId$orgCodes);
  274.         }
  275.     }
  276.     public function batchLockUser(array $userIds)
  277.     {
  278.         if (!$this->getCurrentUser()->hasPermission('admin_user_lock')) {
  279.             throw $this->createAccessDeniedException($this->trans('admin.role.no_permission'));
  280.         }
  281.         $currentUser $this->getCurrentUser();
  282.         $userIds array_diff($userIds, [$currentUser['id']]);
  283.         if (empty($userIds)) {
  284.             return;
  285.         }
  286.         $users $this->searchUsers(
  287.             ['userIds' => $userIds'locked' => 0],
  288.             [],
  289.             0,
  290.             count($userIds),
  291.             ['id']
  292.         );
  293.         foreach ($users as $user) {
  294.             $this->lockUser($user['id']);
  295.             $this->kickUserLogout($user['id']);
  296.         }
  297.     }
  298.     public function batchDeleteUser($userIds)
  299.     {
  300.         $currentUser $this->getCurrentUser();
  301.         foreach ($userIds as $userId) {
  302.             if ($currentUser['id'] == $userId) {
  303.                 continue;
  304.             }
  305.             $this->deleteUser($userId);
  306.         }
  307.     }
  308.     public function batchWaveUserNotificationNum(array $userIds)
  309.     {
  310.         if (empty($userIds)) {
  311.             return;
  312.         }
  313.         $this->getUserDao()->wave($userIds, ['newNotificationNum' => 1]);
  314.     }
  315.     public function findUserIdsByNickNameOrTrueName($name)
  316.     {
  317.         $userIdsByNickname $this->getUserDao()->findUserIds(['nickname' => $name]);
  318.         $userIdsByNickname ArrayToolkit::column($userIdsByNickname'id');
  319.         $userIdsByTruename $this->getProfileDao()->findUserIds(['truename' => $name]);
  320.         $userIdsByTruename ArrayToolkit::column($userIdsByTruename'id');
  321.         return array_merge($userIdsByNickname$userIdsByTruename);
  322.     }
  323.     /**
  324.      * 批量设置讲师
  325.      *
  326.      * @param $userIds
  327.      */
  328.     public function batchSetTeachers($userIds)
  329.     {
  330.         if (empty($userIds)) {
  331.             return;
  332.         }
  333.         $users $this->searchUsers(['userIds' => $userIds], [], 0count($userIds), ['id''roles']);
  334.         $updateUsers = [];
  335.         foreach ($users as $user) {
  336.             if (in_array('ROLE_TEACHER'$user['roles'])) {
  337.                 continue;
  338.             }
  339.             $updateUsers[$user['id']] = ['roles' => array_merge($user['roles'], ['ROLE_TEACHER'])];
  340.         }
  341.         if (empty($updateUsers)) {
  342.             return;
  343.         }
  344.         $this->getUserDao()->batchUpdate(array_keys($updateUsers), $updateUsers'id');
  345.         $this->getLogService()->info('user''user_batch_set_teacher''批量设置讲师'.json_encode($userIds));
  346.     }
  347.     /**
  348.      * 批量设置管理范围
  349.      *
  350.      * @param $userIds
  351.      * @param $orgIds
  352.      */
  353.     public function batchSetUserManagePermissions($userIds$orgIds)
  354.     {
  355.         if (empty($userIds)) {
  356.             return;
  357.         }
  358.         foreach ($userIds as $userId) {
  359.             $manageOrgIds $this->getManagePermissionService()->findUserManageOrgIdsByUserId($userId);
  360.             if (!$this->getManagePermissionService()->checkOrgManagePermission($orgIds$manageOrgIds)) {
  361.                 continue;
  362.             }
  363.             $this->getManagePermissionOrgService()->setUserManagePermissionOrgs($userId$orgIds);
  364.         }
  365.         $this->getLogService()->info('user''user_batch_set_permissions''批量设置管理范围'.json_encode($userIds));
  366.     }
  367.     public function getTotalUserCount(array $conditions)
  368.     {
  369.         $conditions['locked'] = 0;
  370.         $conditions['noType'] = 'system';
  371.         $userCount $this->countUsers(ArrayToolkit::parts($conditions, ['locked''noType']));
  372.         $userIncreaseCount $this->countUsers(ArrayToolkit::parts($conditions, ['startTime''noType']));
  373.         $conditions['locked'] = 1;
  374.         $userIncreaseLockedCount $this->countUsers(ArrayToolkit::parts($conditions, ['locked''updatedTime_GE''noType']));
  375.         return $userCount $userIncreaseCount $userIncreaseLockedCount;
  376.     }
  377.     protected function kickUserLogout($userId)
  378.     {
  379.         $this->getSessionService()->clearByUserId($userId);
  380.         $tokens $this->getTokenService()->findTokensByUserIdAndType($userId'mobile_login');
  381.         if (!empty($tokens)) {
  382.             foreach ($tokens as $token) {
  383.                 $this->getTokenService()->destoryToken($token['token']);
  384.             }
  385.         }
  386.     }
  387.     protected function filterOrgCodes($orgCodes)
  388.     {
  389.         if (is_array($orgCodes)) {
  390.             return $orgCodes;
  391.         } else {
  392.             return explode('|'$orgCodes);
  393.         }
  394.     }
  395.     protected function filterUserIds($userIds)
  396.     {
  397.         if (is_array($userIds)) {
  398.             return $userIds;
  399.         } else {
  400.             return explode(','$userIds);
  401.         }
  402.     }
  403.     public function initOrgsRelation()
  404.     {
  405.         $org $this->getOrgService()->getOrgByOrgCode(CTConst::ROOT_ORG_CODE);
  406.         $users $this->searchUsers([], [], 0PHP_INT_MAX);
  407.         if (!empty($users)) {
  408.             foreach ($users as $user) {
  409.                 $this->getUserOrgService()->setUserOrgs($user['id'], [$org]);
  410.             }
  411.         }
  412.         return $this->getUserDao()->initOrgsRelation();
  413.     }
  414.     public function initSystemUsers()
  415.     {
  416.         $users = [
  417.             [
  418.                 'type' => 'system',
  419.                 'roles' => ['ROLE_USER''ROLE_SUPER_ADMIN'],
  420.             ],
  421.         ];
  422.         foreach ($users as $user) {
  423.             $existsUser $this->getUserDao()->getUserByType($user['type']);
  424.             if (!empty($existsUser)) {
  425.                 continue;
  426.             }
  427.             $user['nickname'] = $this->generateNickname($user).'(系统用户)';
  428.             $user['emailVerified'] = 1;
  429.             $user['password'] = $this->getRandomChar();
  430.             $user['email'] = $this->generateEmail($user);
  431.             $user['salt'] = base_convert(sha1(uniqid(mt_rand(), true)), 1636);
  432.             $user['password'] = $this->getPasswordEncoder()->encodePassword($user['password'], $user['salt']);
  433.             $user UserSerialize::unserialize(
  434.                 $this->getUserDao()->create(UserSerialize::serialize($user))
  435.             );
  436.             $profile = [];
  437.             $profile['id'] = $user['id'];
  438.             $this->getProfileDao()->create($profile);
  439.         }
  440.     }
  441.     public function updateUserHireDate($userId$hireDate)
  442.     {
  443.         return $this->getUserDao()->update($userId, ['hireDate' => $hireDate]);
  444.     }
  445.     public function findFollowersByFromId($fromId)
  446.     {
  447.         return $this->getFriendDao()->findFollowingsByFromId($fromId);
  448.     }
  449.     public function sortPromoteUser($ids)
  450.     {
  451.         if (!empty($ids)) {
  452.             foreach ($ids as $index => $id) {
  453.                 $this->promoteUser($id$index 1);
  454.             }
  455.         }
  456.     }
  457.     public function getUserCustomColumns($id)
  458.     {
  459.         $profile $this->getUserProfile($id);
  460.         $customColumns $profile['custom_column'];
  461.         $defaultColumns = [
  462.             'onlineCourse',
  463.             'offlineCourse',
  464.             'classroom',
  465.             'postCourse',
  466.             'projectPlan',
  467.             'offlineActivity',
  468.         ];
  469.         return !empty($customColumns) ? $customColumns $defaultColumns;
  470.     }
  471.     public function updateUserCustomColumns($id$columns)
  472.     {
  473.         $this->updateUserProfile($id, ['custom_column' => $columns]);
  474.         return $this->getUserCustomColumns($id);
  475.     }
  476.     public function updateUserBind($id$fields)
  477.     {
  478.         return $this->getUserBindDao()->update($id$fields);
  479.     }
  480.     public function getDingTalkUsers($userIds)
  481.     {
  482.         return $this->getUserBindDao()->search(['type' => 'dingtalk''toIds' => $userIds], [], 0PHP_INT_MAX);
  483.     }
  484.     public function searchUserBinds($conditions$orderBys$start$limit$columns = [])
  485.     {
  486.         return $this->getUserBindDao()->search($conditions$orderBys$start$limit$columns);
  487.     }
  488.     public function countUserBinds($conditions)
  489.     {
  490.         return $this->getUserBindDao()->count($conditions);
  491.     }
  492.     public function batchDeleteUserBinds($conditions)
  493.     {
  494.         try {
  495.             $this->beginTransaction();
  496.             $this->getUserBindDao()->batchDelete($conditions);
  497.             $this->commit();
  498.         } catch (\Exception $e) {
  499.             $this->rollback();
  500.             throw $e;
  501.         }
  502.         return true;
  503.     }
  504.     public function batchSetPostAndManagePermissionsAndRolesAndOrgCodes($userIds$fields)
  505.     {
  506.         if (empty($userIds)) {
  507.             return;
  508.         }
  509.         $currentUser $this->getCurrentUser();
  510.         try {
  511.             $this->beginTransaction();
  512.             foreach ($userIds as $userId) {
  513.                 if (in_array('post'$fields['types'], true) && !empty($fields['postId'])) {
  514.                     $this->changeUserPost($userId$fields['postId']);
  515.                 }
  516.                 if (in_array('roles'$fields['types'], true) && !empty($fields['roles']) && $userId != $currentUser->getId()) {
  517.                     $this->changeUserRolesBatchDedicated($userId$fields['roles']);
  518.                 }
  519.                 if (in_array('org'$fields['types'], true) && $userId != $currentUser->getId()) {
  520.                     $this->changeUserOrgBatchDedicated($userId$fields['orgIds']);
  521.                 }
  522.                 if (in_array('orgCode'$fields['types'], true) && $userId != $currentUser->getId()) {
  523.                     $this->changeUserOrgCodeBatchDedicated($userId$fields['orgCodes']);
  524.                 }
  525.             }
  526.             $this->commit();
  527.         } catch (\Exception $e) {
  528.             $this->rollback();
  529.             throw $e;
  530.         }
  531.     }
  532.     public function findUserFromIdsByType($type$userIds)
  533.     {
  534.         if (empty($userIds) || $userIds === [-1]) {
  535.             return [];
  536.         }
  537.         $users $this->getUserBindDao()->search(['type' => $type'toIds' => $userIds], [], 0count($userIds), ['fromId']);
  538.         return ArrayToolkit::column($users'fromId');
  539.     }
  540.     public function statisticsDistinctOrgUserNumGroupByOrgId()
  541.     {
  542.         return $this->getUserDao()->statisticsDistinctOrgUserNumGroupByOrgId();
  543.     }
  544.     public function findUserIdsByManageOrgIds($orgIds)
  545.     {
  546.         return $this->getUserOrgService()->findUserIdsByOrgIds($orgIds);
  547.     }
  548.     public function pickIdsByTruenameOrNicknameOrMobile($keyword)
  549.     {
  550.         return ArrayToolkit::uniqueValue(array_merge(
  551.             $this->getUserDao()->pickIdsByLikeNickname($keyword),
  552.             $this->getProfileDao()->pickIdsByLikeTruename($keyword),
  553.             $this->getUserDao()->pickIdsByLikeVerifiedMobile($keyword)
  554.         ));
  555.     }
  556.     public function pickIdsByPostId($postId)
  557.     {
  558.         return $this->getUserDao()->pickIdsByPostId($postId);
  559.     }
  560.     private function changeUserOrgCodeBatchDedicated($userId$orgCodes)
  561.     {
  562.         if ($this->getCurrentUser()->getId() == $userId) {
  563.             return;
  564.         }
  565.         $orgCodes explode(','$orgCodes);
  566.         $this->changeUserOrgs($userId$orgCodes);
  567.     }
  568.     private function changeUserOrgBatchDedicated($userId$orgIds)
  569.     {
  570.         $orgIds explode(','$orgIds);
  571.         $user $this->getUser($userId);
  572.         $user['manageOrgIds'] = $this->getManagePermissionService()->findUserManageOrgIdsByUserId($userId);
  573.         if (!$this->getManagePermissionService()->checkOrgManagePermission($orgIds$user['manageOrgIds'])) {
  574.             throw $this->createAccessDeniedException($this->trans('admin.manage.org_permission_beyond_error'));
  575.         }
  576.         $this->getManagePermissionOrgService()->setUserManagePermissionOrgs($userId$orgIds);
  577.     }
  578.     private function changeUserRolesBatchDedicated($userId$roles)
  579.     {
  580.         $currentUser $this->getCurrentUser();
  581.         $currentUserProfile $this->getUserProfile($currentUser['id']);
  582.         if (in_array('ROLE_TRAINING_ADMIN'$roles) && !in_array('ROLE_TEACHER'$roles)) {
  583.             $roles[] = 'ROLE_TEACHER';
  584.         }
  585.         $this->changeUserRoles($userId$roles);
  586.         if (!empty($roles)) {
  587.             $roleSet $this->getRoleService()->searchRoles([], 'created'09999);
  588.             $rolesByIndexCode = \AppBundle\Common\ArrayToolkit::index($roleSet'code');
  589.             $roleNames $this->getRoleNames($roles$rolesByIndexCode);
  590.             $message = [
  591.                 'userId' => $currentUser['id'],
  592.                 'userName' => !empty($currentUserProfile['truename']) ? $currentUserProfile['truename'] : $currentUser['nickname'],
  593.                 'role' => implode(','$roleNames),
  594.             ];
  595.             $this->getNotifiactionService()->notify($userId'role'$message);
  596.         }
  597.     }
  598.     protected function getRoleNames($roles$roleSet)
  599.     {
  600.         $roleNames = [];
  601.         $roles array_unique($roles);
  602.         global $kernel;
  603.         $userRoleDict $kernel->getContainer()->get('codeages_plugin.dict_twig_extension')->getDict('userRole');
  604.         $roleDictCodes array_keys($userRoleDict);
  605.         foreach ($roles as $role) {
  606.             if (in_array($role$roleDictCodes)) {
  607.                 $roleNames[] = $userRoleDict[$role];
  608.             } elseif ('ROLE_BACKEND' === $role) {
  609.                 continue;
  610.             } else {
  611.                 $role $roleSet[$role];
  612.                 $roleNames[] = $role['name'];
  613.             }
  614.         }
  615.         return $roleNames;
  616.     }
  617.     private function getUserBindType($type)
  618.     {
  619.         if ('workwechatweb' == $type || 'workwechatmob' == $type || 'work_wechat' == $type) {
  620.             $type 'work_wechat';
  621.         }
  622.         if ('weixinweb' == $type || 'weixinmob' == $type || 'weixin' == $type) {
  623.             $type 'weixin';
  624.         }
  625.         if ('dingtalkweb' == $type || 'dingtalkmob' == $type || 'dingtalk' == $type) {
  626.             $type 'dingtalk';
  627.         }
  628.         if ('feishuweb' == $type || 'feishumob' == $type || 'feishu' == $type) {
  629.             $type 'feishu';
  630.         }
  631.         return $type;
  632.     }
  633.     protected function convertOAuthType($type)
  634.     {
  635.         if ('weixinweb' == $type || 'weixinmob' == $type) {
  636.             $type 'weixin';
  637.         }
  638.         if ('dingtalkweb' == $type || 'dingtalkmob' == $type) {
  639.             $type 'dingtalk';
  640.         }
  641.         return $type;
  642.     }
  643.     /*
  644.      * 返回用户直属部门及直线向上所有父级部门id
  645.      */
  646.     protected function getUserLineOrgIds($user)
  647.     {
  648.         $orgIds = [];
  649.         foreach ($user['orgCodes'] as $orgCode) {
  650.             $orgIds array_merge($orgIdsexplode('.'substr($orgCode0, -1)));
  651.         }
  652.         return array_unique($orgIds);
  653.     }
  654.     /*
  655.      * 返回用户管理范围部门id
  656.      */
  657.     protected function getUserManageOrgIds($user)
  658.     {
  659.         return $this->getManagePermissionService()->findUserManageOrgIdsByUserId($user['id']);
  660.     }
  661.     /*
  662.      * 返回用户管理范围部门code
  663.      */
  664.     protected function getUserManageOrgCodes($user)
  665.     {
  666.         return $this->getManagePermissionService()->findUserManageOrgCodesByUserId($user['id']);
  667.     }
  668.     protected function getManagePermissionService()
  669.     {
  670.         return $this->createService('ManagePermission:ManagePermissionOrgService');
  671.     }
  672.     protected function getAuthService()
  673.     {
  674.         return $this->createService('User:AuthService');
  675.     }
  676.     /**
  677.      * @return PostService
  678.      */
  679.     protected function getPostService()
  680.     {
  681.         return $this->createService('CorporateTrainingBundle:Post:PostService');
  682.     }
  683.     /**
  684.      * @return RankService
  685.      */
  686.     protected function getRankService()
  687.     {
  688.         return $this->createService('PostMapPlugin:Rank:RankService');
  689.     }
  690.     /**
  691.      * @return \CorporateTrainingBundle\Biz\User\Service\UserOrgService
  692.      */
  693.     protected function getUserOrgService()
  694.     {
  695.         return $this->createService('User:UserOrgService');
  696.     }
  697.     protected function getPostMemberService()
  698.     {
  699.         return $this->createService('CorporateTrainingBundle:Post:PostMemberService');
  700.     }
  701.     /**
  702.      * @return SessionService
  703.      */
  704.     protected function getSessionService()
  705.     {
  706.         return $this->createService('System:SessionService');
  707.     }
  708.     /**
  709.      * @return TokenService
  710.      */
  711.     protected function getTokenService()
  712.     {
  713.         return $this->createService('User:TokenService');
  714.     }
  715.     /**
  716.      * @return NotificationService
  717.      */
  718.     protected function getNotifiactionService()
  719.     {
  720.         return $this->createService('User:NotificationService');
  721.     }
  722. }
  723. class UserSerialize
  724. {
  725.     public static function serialize(array $user)
  726.     {
  727.         return $user;
  728.     }
  729.     public static function unserialize(array $user null)
  730.     {
  731.         if (empty($user)) {
  732.             return;
  733.         }
  734.         $user self::_userRolesSort($user);
  735.         return $user;
  736.     }
  737.     public static function unserializes(array $users)
  738.     {
  739.         return array_map(
  740.             function ($user) {
  741.                 return UserSerialize::unserialize($user);
  742.             },
  743.             $users
  744.         );
  745.     }
  746.     private static function _userRolesSort($user)
  747.     {
  748.         if (!empty($user['roles'][1]) && 'ROLE_USER' == $user['roles'][1]) {
  749.             $temp $user['roles'][1];
  750.             $user['roles'][1] = $user['roles'][0];
  751.             $user['roles'][0] = $temp;
  752.         }
  753.         //交换学员角色跟roles数组第0个的位置;
  754.         return $user;
  755.     }
  756. }