src/CorporateTrainingBundle/Biz/Org/Service/Impl/OrgServiceImpl.php line 16

Open in your IDE?
  1. <?php
  2. namespace CorporateTrainingBundle\Biz\Org\Service\Impl;
  3. use AppBundle\Common\ArrayToolkit;
  4. use AppBundle\Common\Exception\AccessDeniedException;
  5. use Biz\Org\Service\Impl\OrgServiceImpl as BaseOrgServiceImpl;
  6. use Biz\System\Service\CacheService;
  7. use Biz\System\Service\LogService;
  8. use Codeages\Biz\Framework\Service\Exception\NotFoundException;
  9. use CorporateTrainingBundle\Biz\ManagePermission\Service\ManagePermissionOrgService;
  10. use CorporateTrainingBundle\Biz\Org\Service\OrgService;
  11. use CorporateTrainingBundle\Common\Constant\CTConst;
  12. use CorporateTrainingBundle\Common\OrgTreeToolkit;
  13. class OrgServiceImpl extends BaseOrgServiceImpl implements OrgService
  14. {
  15.     protected $visibleOrgTreeDataLocalCacheArray = [];
  16.     /**
  17.      * @param $id
  18.      * @param $num //正数或负数
  19.      *
  20.      * @return array
  21.      *
  22.      * @throws NotFoundException
  23.      */
  24.     public function waveOrgChildrenNum($id$num)
  25.     {
  26.         $org $this->checkBeforeProccess($id);
  27.         $childrenNum = ($org['childrenNum'] + $num) < $org['childrenNum'] + $num;
  28.         return $this->getOrgDao()->update($id, ['childrenNum' => $childrenNum]);
  29.     }
  30.     public function countOrgs(array $conditions)
  31.     {
  32.         return $this->getOrgDao()->count($conditions);
  33.     }
  34.     public function getOrgBySyncId($syncId)
  35.     {
  36.         return $this->getOrgDao()->getOrgBySyncId($syncId);
  37.     }
  38.     public function findOrgsBySyncIds($syncIds)
  39.     {
  40.         return $this->getOrgDao()->findOrgsBySyncIds($syncIds);
  41.     }
  42.     public function findOrgsByOrgCodes(array $orgCodes)
  43.     {
  44.         return $this->getOrgDao()->findByOrgCodes($orgCodes);
  45.     }
  46.     public function findOrgsByCodes(array $codes)
  47.     {
  48.         return $this->getOrgDao()->findByCodes($codes);
  49.     }
  50.     public function findSelfAndParentOrgsByOrgCode($orgCode)
  51.     {
  52.         $preOrgIdArray explode('.'$orgCode);
  53.         return $this->findOrgsByIds($preOrgIdArray);
  54.     }
  55.     public function findOrgsByPrefixOrgCodes(array $orgCodes = ['1.'], $columns = [])
  56.     {
  57.         $cacheName md5(json_encode($orgCodes).'|'.json_encode($columns));
  58.         $cacheOrgs $this->getCacheService()->get($cacheName);
  59.         if (!empty($cacheOrgs)) {
  60.             return $cacheOrgs;
  61.         }
  62.         $result $this->getOrgDao()->findByPrefixOrgCodes($orgCodes$columns);
  63.         $this->getCacheService()->clear($cacheName);
  64.         $this->getCacheService()->set($cacheName$resulttime() + 60 3);
  65.         return $result;
  66.     }
  67.     public function getOrgMaxDepth($conditions)
  68.     {
  69.         return $this->getOrgDao()->getMaxDepth($conditions);
  70.     }
  71.     public function resetOrg()
  72.     {
  73.         $currentUser $this->getCurrentUser();
  74.         if ($currentUser->isSuperAdmin() || $currentUser->hasPermission('admin_org_sync_department')) {
  75.             $org $this->getOrg(CTConst::ROOT_ORG_CODE);
  76.             $this->getOrgDao()->wave([$org['id']], ['childrenNum' => -$org['childrenNum']]);
  77.             $this->getOrgDao()->update($org['id'], ['syncId' => 0]);
  78.             return $this->getOrgDao()->deleteOrgsWithoutOrgCode(CTConst::ROOT_ORG_CODE);
  79.         }
  80.         return false;
  81.     }
  82.     public function resetOrgSyncId()
  83.     {
  84.         $this->getOrgDao()->resetOrgSyncId();
  85.     }
  86.     public function buildOrgTreeByCode($orgCode)
  87.     {
  88.         if (empty($orgCode)) {
  89.             return [];
  90.         }
  91.         $orgInfo $this->getOrgByOrgCode($orgCode);
  92.         $orgs $this->findOrgsByPrefixOrgCode($orgCode);
  93.         $orgs ArrayToolkit::index($orgs'id');
  94.         for ($i CTConst::ORG_MAX_DEPTH$i >= ($orgInfo['depth'] + 1); --$i) {
  95.             foreach ($orgs as $key => $org) {
  96.                 if (!empty($org['depth']) && $org['depth'] == $i && $org['depth'] > 1) {
  97.                     $orgs[$org['parentId']]['nodes'][] = $org;
  98.                     unset($orgs[$key]);
  99.                 }
  100.             }
  101.         }
  102.         return array_values($orgs);
  103.     }
  104.     public function buildVisibleOrgTreeByOrgCodes(array $orgCodes)
  105.     {
  106.         return array_values(OrgTreeToolkit::makeTree($this->getVisibleOrgTreeDataByOrgCodes($orgCodestrue)));
  107.     }
  108.     /**
  109.      * @param $settingOrgIds
  110.      * 被设置的用户或资源的部门orgIds
  111.      * @param bool $filter
  112.      *
  113.      * @return array|mixed
  114.      *
  115.      * 部门设置特定树结构(展示管理员的管理范围及被操作用户的超出管理员权限部分的部门,部门树中超出我管理范围的部分只展示顶级)
  116.      */
  117.     public function getPermissionOrgTreeData($settingOrgIds$filter false)
  118.     {
  119.         $orgCodes $this->getCurrentUser()->getManageOrgCodes();
  120.         if (empty($orgCodes)) {
  121.             return [];
  122.         }
  123.         $cacheKey $this->getPermissionOrgTreeDataLocalCacheKey($orgCodes$settingOrgIds$filter);
  124.         if (isset($this->visibleOrgTreeDataLocalCacheArray[$cacheKey])) {
  125.             return $this->visibleOrgTreeDataLocalCacheArray[$cacheKey];
  126.         }
  127.         $orgs $this->findOrgsByPrefixOrgCodes($orgCodes);
  128.         $orgCodes ArrayToolkit::column($orgs'orgCode');
  129.         $settingOrgs $this->findOrgsByIds($settingOrgIds);
  130.         $settingOrgCodes ArrayToolkit::column($settingOrgs'orgCode');
  131.         $diffOrgCodes array_diff($settingOrgCodes$orgCodes);
  132.         if (in_array('1.'$diffOrgCodestrue)) {
  133.             $parentOrg $this->getOrgByOrgCode('1.');
  134.             $allOrgs $this->findOrgsByParentId($parentOrg['id']);
  135.             $allOrgs array_merge($allOrgs, [$parentOrg], $orgs);
  136.             if ($filter) {
  137.                 $allOrgs $this->filterOrgs($allOrgs);
  138.             }
  139.             foreach ($allOrgs as &$org) {
  140.                 $org['disableCheckbox'] = true;
  141.                 $org['selectable'] = false;
  142.             }
  143.         } else {
  144.             $diffOrgs $this->findOrgsByOrgCodes(array_values($diffOrgCodes));
  145.             $orgCodeIds $this->exploreOrgCodes($orgCodes);
  146.             $parentOrgIds array_diff($orgCodeIdsArrayToolkit::column($orgs'id'));
  147.             $parentOrgs $this->findOrgsByIds(array_values($parentOrgIds));
  148.             $allOrgs array_merge($orgs$parentOrgs$diffOrgs);
  149.             if ($filter) {
  150.                 $allOrgs $this->filterOrgs($allOrgs);
  151.             }
  152.             $diffOrgTreeOrgCodes = [];
  153.             if (!empty($diffOrgCodes)) {
  154.                 $diffOrgTree $this->findOrgsByPrefixOrgCodes($diffOrgCodes, ['orgCode']);
  155.                 $diffOrgTreeOrgCodes ArrayToolkit::column($diffOrgTree'orgCode');
  156.             }
  157.             foreach ($allOrgs as &$org) {
  158.                 if (in_array($org['id'], $parentOrgIds) || in_array($org['orgCode'], $diffOrgTreeOrgCodes)) {
  159.                     $org['selectable'] = false;
  160.                     $org['disableCheckbox'] = true;
  161.                 } else {
  162.                     $org['selectable'] = true;
  163.                     $org['disableCheckbox'] = false;
  164.                 }
  165.             }
  166.         }
  167.         $indexedAllOrgs ArrayToolkit::index($allOrgs'orgCode');
  168.         ksort($indexedAllOrgs);
  169.         $treeData array_values($indexedAllOrgs);
  170.         $this->visibleOrgTreeDataLocalCacheArray[$cacheKey] = $treeData;
  171.         return $treeData;
  172.     }
  173.     /*
  174.      * 获取可见的部门树组件数据,直线上级及所有下级
  175.      */
  176.     public function getVisibleOrgTreeDataByOrgCodes(array $orgCodes$filter false)
  177.     {
  178.         $cacheKey $this->getVisibleOrgTreeDataLocalCacheKey($orgCodes$filter);
  179.         if (isset($this->visibleOrgTreeDataLocalCacheArray[$cacheKey])) {
  180.             return $this->visibleOrgTreeDataLocalCacheArray[$cacheKey];
  181.         }
  182.         $orgs $this->findOrgsByPrefixOrgCodes($orgCodes);
  183.         $orgCodes ArrayToolkit::column($orgs'orgCode');
  184.         $orgCodeIds $this->exploreOrgCodes($orgCodes);
  185.         $parentOrgIds array_diff($orgCodeIdsArrayToolkit::column($orgs'id'));
  186.         $parentOrgs $this->findOrgsByIds(array_values($parentOrgIds));
  187.         $allOrgs array_merge($orgs$parentOrgs);
  188.         if ($filter) {
  189.             $allOrgs $this->filterOrgs($allOrgs);
  190.         }
  191.         foreach ($allOrgs as &$org) {
  192.             if (in_array($org['id'], $parentOrgIds)) {
  193.                 $org['selectable'] = false;
  194.                 $org['disableCheckbox'] = true;
  195.             } else {
  196.                 $org['selectable'] = true;
  197.                 $org['disableCheckbox'] = false;
  198.             }
  199.         }
  200.         $indexedAllOrgs ArrayToolkit::index($allOrgs'orgCode');
  201.         ksort($indexedAllOrgs);
  202.         $treeData array_values($indexedAllOrgs);
  203.         $this->visibleOrgTreeDataLocalCacheArray[$cacheKey] = $treeData;
  204.         return $treeData;
  205.     }
  206.     public function buildOrgTreeByParentId($parentId$offset$limit$filter false)
  207.     {
  208.         $orgs $this->findOrgsDataByParentId($parentId$offset$limit$filter);
  209.         if (empty($orgs)) {
  210.             return [];
  211.         }
  212.         $orgTree array_values(OrgTreeToolkit::makeTree($orgs));
  213.         $childrenCounts $this->childrenCountsByOrgIds(ArrayToolkit::column($orgs'id'));
  214.         $childrenCounts ArrayToolkit::index($childrenCounts'parentId');
  215.         $orgTree $this->findChildrenTree($orgTree[0], $parentId$childrenCounts);
  216.         return $orgTree;
  217.     }
  218.     public function findOrgsDataByParentId($parentId$offset$limit$filter false)
  219.     {
  220.         $orgs $this->searchOrgs(['parentId' => $parentId], ['orgCode' => 'ASC'], $offset$limit);
  221.         if (empty($orgs)) {
  222.             return [];
  223.         }
  224.         $parentOrg $this->getOrg($parentId);
  225.         $parentIds $this->parentOrgIdsByOrgCodes([$parentOrg['orgCode']]);
  226.         $orgs array_merge($orgs$this->findOrgsByIds(array_merge($parentIds, [$parentId])));
  227.         if ($filter) {
  228.             $orgs $this->filterOrgs($orgs);
  229.         }
  230.         foreach ($orgs as &$org) {
  231.             if (in_array($org['id'], $parentIdstrue)) {
  232.                 $org['selectable'] = false;
  233.                 $org['disableCheckbox'] = true;
  234.             } else {
  235.                 $org['selectable'] = true;
  236.                 $org['disableCheckbox'] = false;
  237.             }
  238.         }
  239.         return $orgs;
  240.     }
  241.     public function buildCanManageOrgTreeByParentId($parentId$settingOrgIds$offset$limit$filter false)
  242.     {
  243.         $orgs $this->findCanManageOrgsDataByParentId($parentId$settingOrgIds$offset$limit$filter);
  244.         if (empty($orgs)) {
  245.             return [];
  246.         }
  247.         $orgTree array_values(OrgTreeToolkit::makeTree($orgs));
  248.         $childrenCounts $this->childrenCountsByOrgIds(ArrayToolkit::column($orgs'id'));
  249.         $childrenCounts ArrayToolkit::index($childrenCounts'parentId');
  250.         $orgTree $this->findChildrenTree($orgTree[0], $parentId$childrenCounts);
  251.         return $orgTree;
  252.     }
  253.     public function findCanManageOrgsDataByParentId($parentId$settingOrgIds$offset$limit$filter false)
  254.     {
  255.         $manageOrgCodes $this->getCurrentUser()->getManageOrgCodes();
  256.         if (empty($manageOrgCodes)) {
  257.             return [];
  258.         }
  259.         list($manageOrgIds$lastOrgIds) = $this->exploreOrgCodesAndLastOrgIds($manageOrgCodes);
  260.         $noPermissionOrgIds array_values(array_filter($this->parentOrgIdsByOrgCodes($manageOrgCodes)));
  261.         $noPermissionSettingOrgIds array_intersect($noPermissionOrgIds$settingOrgIds);
  262.         $parentOrg $this->getOrg($parentId);
  263.         $parentOrgIds $this->parentOrgIdsByOrgCodes([$parentOrg['orgCode']]);
  264.         $conditions = ['parentId' => $parentId];
  265.         if (!in_array('1'$lastOrgIdstrue)) {
  266.             if (empty(array_intersect($manageOrgIds$parentOrgIds)) || (in_array(
  267.                 $parentId,
  268.                 $manageOrgIds,
  269.                 true
  270.             ) && !in_array($parentId$lastOrgIdstrue))) {
  271.                 $conditions['orgIds'] = $manageOrgIds;
  272.             }
  273.         }
  274.         $allOrgs $this->searchOrgs(
  275.             $conditions,
  276.             ['orgCode' => 'ASC'],
  277.             $offset,
  278.             $limit
  279.         );
  280.         if (empty($allOrgs)) {
  281.             return [];
  282.         }
  283.         $parentOrgs $this->findOrgsByIds($parentOrgIds);
  284.         $allOrgs array_merge($allOrgs$parentOrgs, [$parentOrg]);
  285.         if ($filter) {
  286.             $allOrgs $this->filterOrgs($allOrgs);
  287.         }
  288.         foreach ($allOrgs as &$org) {
  289.             $exploreOrgIds $this->exploreOrgCodes([$org['orgCode']]);
  290.             $exploreOrgIds array_diff($exploreOrgIds$noPermissionOrgIds);
  291.             if ((!empty($noPermissionSettingOrgIds) && !empty(
  292.                     array_intersect(
  293.                         $exploreOrgIds,
  294.                         $noPermissionSettingOrgIds
  295.                     )
  296.                     )) || in_array($org['id'], $noPermissionOrgIdstrue)) {
  297.                 $org['selectable'] = false;
  298.                 $org['disableCheckbox'] = true;
  299.             } else {
  300.                 $org['selectable'] = true;
  301.                 $org['disableCheckbox'] = false;
  302.             }
  303.         }
  304.         return $allOrgs;
  305.     }
  306.     public function findOrgsByParentId($orgId)
  307.     {
  308.         return $this->getOrgDao()->findByParentOrgId($orgId);
  309.     }
  310.     public function findOrgsByParentIds($orgIds)
  311.     {
  312.         return $this->getOrgDao()->findByParentOrgIds($orgIds);
  313.     }
  314.     public function findParentOrgIdsByOrgId($orgId)
  315.     {
  316.         $parentOrgIds = [];
  317.         $parentOrgIds $this->findParentOrgIdByIdAndCategories($orgId$parentOrgIds);
  318.         return array_merge($parentOrgIds, [$orgId]);
  319.     }
  320.     protected function findParentOrgIdByIdAndCategories($orgId, &$parentOrgIds)
  321.     {
  322.         $org $this->getOrg($orgId);
  323.         if (!= $org['parentId']) {
  324.             $parentOrg $this->getOrg($org['parentId']);
  325.             $parentOrgIds array_merge($parentOrgIds, [$parentOrg['id']]);
  326.             $this->findParentOrgIdByIdAndCategories($parentOrg['id'], $parentOrgIds);
  327.         }
  328.         return $parentOrgIds;
  329.     }
  330.     /**
  331.      * @param $orgIds
  332.      *
  333.      * @return array 过滤子部门获取顶层部门
  334.      */
  335.     public function wipeOffChildrenOrgIds($orgIds)
  336.     {
  337.         $orgs $this->findOrgsByIds($orgIds);
  338.         $orgs ArrayToolkit::index($orgs'id');
  339.         $orgIds = [];
  340.         foreach ($orgs as $org) {
  341.             if (empty($orgs[$org['parentId']])) {
  342.                 $orgIds[] = $org['id'];
  343.             }
  344.         }
  345.         return $orgIds;
  346.     }
  347.     public function wipeOffChildrenCode($codes)
  348.     {
  349.         if (empty($codes)) {
  350.             return [];
  351.         }
  352.         $orgs $this->findOrgsByCodes($codes);
  353.         $orgs ArrayToolkit::index($orgs'id');
  354.         $orgCodes = [];
  355.         foreach ($orgs as $org) {
  356.             if (empty($orgs[$org['parentId']])) {
  357.                 $orgCodes[] = $org['code'];
  358.             }
  359.         }
  360.         return $orgCodes;
  361.     }
  362.     public function childrenCountsByOrgIds($orgIds)
  363.     {
  364.         return $this->getOrgDao()->childrenCountsByOrgIds($orgIds);
  365.     }
  366.     public function deleteOrgWithoutDeleteChildren($id)
  367.     {
  368.         $org $this->getOrg($id);
  369.         if (empty($org)) {
  370.             return;
  371.         }
  372.         if ('1.' == $org['orgCode']) {
  373.             throw new AccessDeniedException('顶级部门不可删除!');
  374.         }
  375.         try {
  376.             $this->beginTransaction();
  377.             $this->getOrgDao()->delete($id);
  378.             $parentOrg $this->getOrg($org['parentId']);
  379.             $groupChildOrgs ArrayToolkit::group($this->findOrgsByPrefixOrgCode($org['orgCode']), 'parentId');
  380.             $updateFields = [];
  381.             $orgQueue = [$org];
  382.             while ($orgQueue) {
  383.                 $currentOrg array_shift($orgQueue);
  384.                 if ($currentOrg['id'] != $org['id']) {
  385.                     $updateFields[$currentOrg['id']] = [
  386.                         'parentId' => $currentOrg['parentId'] == $org['id'] ? $org['parentId'] : $currentOrg['parentId'],
  387.                         'orgCode' => $currentOrg['parentId'] == $org['id'] ? $parentOrg['orgCode'].$currentOrg['id'].'.' $updateFields[$currentOrg['parentId']]['orgCode'].$currentOrg['id'],
  388.                         'depth' => $currentOrg['depth'] - 1,
  389.                     ];
  390.                 }
  391.                 if (isset($groupChildOrgs[$currentOrg['id']])) {
  392.                     $orgQueue array_merge($orgQueue$groupChildOrgs[$currentOrg['id']]);
  393.                 }
  394.             }
  395.             $this->getOrgDao()->wave([$org['parentId']], ['childrenNum' => $org['childrenNum'] - 1]);
  396.             if ($updateFields) {
  397.                 $this->getOrgDao()->batchUpdate(array_keys($updateFields), $updateFields'id');
  398.             }
  399.             $this->getLogService()->info('org''delete_org'"删除部门{$org['name']}", ['org' => $org]);
  400.             $this->commit();
  401.         } catch (\Exception $e) {
  402.             $this->rollback();
  403.             throw $e;
  404.         }
  405.     }
  406.     protected function findChildrenTree($tree$parentId$childrenCounts)
  407.     {
  408.         if (empty($tree['nodes'])) {
  409.             return $tree;
  410.         }
  411.         $nodes $tree['nodes'];
  412.         foreach ($nodes as &$org) {
  413.             if ($org['id'] == $parentId || == count($org['nodes'])) {
  414.                 return $this->findChildrenTree($org$parentId$childrenCounts);
  415.             }
  416.             if ($org['parentId'] == $parentId && !empty($childrenCounts[$org['id']])) {
  417.                 $org['nodes'] = [['name' => '加载中···''isExist' => $childrenCounts[$org['id']]['count'] > 0]];
  418.             }
  419.         }
  420.         $tree['nodes'] = $nodes;
  421.         return $tree;
  422.     }
  423.     protected function getVisibleOrgTreeDataLocalCacheKey($orgCodes$filter)
  424.     {
  425.         return md5(json_encode($orgCodes).'|'.($filter '1' '0'));
  426.     }
  427.     protected function getPermissionOrgTreeDataLocalCacheKey($orgCodes$settingOrgIds$filter)
  428.     {
  429.         return md5(json_encode($settingOrgIds).'|'.json_encode($orgCodes).'|'.($filter '1' '0'));
  430.     }
  431.     protected function filterOrgs($orgs)
  432.     {
  433.         foreach ($orgs as $key => $org) {
  434.             $orgs[$key] = ArrayToolkit::parts(
  435.                 $org,
  436.                 [
  437.                     'id',
  438.                     'name',
  439.                     'parentId',
  440.                     'seq',
  441.                     'orgCode',
  442.                     'code',
  443.                     'depth',
  444.                 ]
  445.             );
  446.         }
  447.         return $orgs;
  448.     }
  449.     protected function exploreOrgCodes(array $orgCodes)
  450.     {
  451.         $orgIds = [];
  452.         foreach ($orgCodes as $orgCode) {
  453.             $orgIds[] = array_filter(explode('.'$orgCode));
  454.         }
  455.         if (!empty($orgIds)) {
  456.             $orgIds array_merge(...$orgIds);
  457.         }
  458.         return array_unique($orgIds);
  459.     }
  460.     protected function exploreOrgCodesAndLastOrgIds(array $orgCodes)
  461.     {
  462.         $orgGroup = [];
  463.         $lastIds = [];
  464.         foreach ($orgCodes as $orgCode) {
  465.             $orgIds array_filter(explode('.'$orgCode));
  466.             $orgGroup[] = $orgIds;
  467.             $lastIds[] = end($orgIds);
  468.         }
  469.         $orgAllIds = !empty($orgGroup) ? array_merge(...$orgGroup) : [];
  470.         return [array_unique($orgAllIds), $lastIds];
  471.     }
  472.     protected function parentOrgIdsByOrgCodes($orgCodes)
  473.     {
  474.         $orgIds = [];
  475.         foreach ($orgCodes as $orgCode) {
  476.             $orgArr array_filter(explode('.'$orgCode));
  477.             array_pop($orgArr);
  478.             $orgIds[] = $orgArr;
  479.         }
  480.         $orgIds array_merge(...$orgIds);
  481.         return array_unique($orgIds);
  482.     }
  483.     public function filterCurrentUserManageOrgsByOrgs(array $orgs)
  484.     {
  485.         $orgIds $this->getCurrentUser()->getManageOrgIds();
  486.         if (empty($orgIds) || empty($orgs)) {
  487.             return [];
  488.         }
  489.         $manageOrgs = [];
  490.         foreach ($orgs as $org) {
  491.             $orgCodeExplode explode('.'$org['orgCode'] ?? '');
  492.             $intersectIds array_intersect($orgCodeExplode$orgIds);
  493.             if (empty($intersectIds)) {
  494.                 continue;
  495.             }
  496.             $manageOrgs[] = $org;
  497.         }
  498.         return $manageOrgs;
  499.     }
  500.     /**
  501.      * @return array
  502.      */
  503.     public function findCurrentUserManageOrgIds()
  504.     {
  505.         $manageOrgIds $this->getCurrentUser()->getManageOrgIds();
  506.         if (empty($manageOrgIds)) {
  507.             return [];
  508.         }
  509.         $orgs $this->findOrgsByIds($manageOrgIds, ['orgCode']);
  510.         if (empty($orgs)) {
  511.             return [];
  512.         }
  513.         $orgCodes ArrayToolkit::column($orgs'orgCode');
  514.         $manageOrgs $this->findOrgsByPrefixOrgCodes($orgCodes, ['id']);
  515.         if (empty($manageOrgs)) {
  516.             return [];
  517.         }
  518.         return ArrayToolkit::column($manageOrgs'id');
  519.     }
  520.     /**
  521.      * @return ManagePermissionOrgService
  522.      */
  523.     protected function getManagePermissionService()
  524.     {
  525.         return $this->createService('CorporateTrainingBundle:ManagePermission:ManagePermissionOrgService');
  526.     }
  527.     /**
  528.      * @return LogService
  529.      */
  530.     protected function getLogService()
  531.     {
  532.         return $this->createService('System:LogService');
  533.     }
  534.     /**
  535.      * @return CacheService
  536.      */
  537.     protected function getCacheService()
  538.     {
  539.         return $this->createService('System:CacheService');
  540.     }
  541. }