Задача:
получить список задач всех подчиненных пользователя, исключая те задачи, в которых он является участником (постановщик/наблюдатель/соисполнитель).
Т.е. те задачи которые Руководитель не видит в своем списке задач.
1. написал SQL (работает):
Код |
---|
SELECT
_query.TASK_ID as `ID`
FR OM
(
SEL ECT
`TASK_ID`, `USER_ID`
FR OM
`b_tasks_member`
WH ERE `USER_ID` in (774,680,775)
AND
-- исключаем задачи, где руководитель является участником --
`TASK_ID` NOT IN (
SEL ECT
`TASK_ID`
FR OM
`b_tasks_member`
WHERE `USER_ID` = 775
)
ORDER BY
`TASK_ID` DESC
) AS _query
GROUP BY _query.`TASK_ID` |
Теперь нужно его переложить в API.
Вот что у меня получилось:
Код |
---|
use Bitrix\Tasks\Internals\Task\MemberTable
use Bitrix\Tasks\Internals\TaskTable;
$params = array(
'!=ZOMBIE' => 'Y', // не удаленные задачи
"MEMBER_LIST.USER_ID" => array(774,680,775), // ID подчиненных
'!=MEMBER_LIST.TASK_ID' => array(1,2,3), // ID задач (исключаем задачи, где руководитель является участником)
);
$db = TaskTable::getList($params);
|
Код рабочий, но что мне не нравится в этом коде:
1. перед ним приходится делать два запроса:1.1. что бы получить это: MEMBER_LIST.TASK_ID' => array(1,2,3), // ID задач (исключаем задачи, где руководитель является участником)
Скрытый текст |
---|
Код |
---|
private static function getChiefTasksIDs(): array
{
$arResult = [];
$arTasks = [];
if (Loader::includeModule('tasks')){
$db = MemberTable::getList(array(
'order' => ['TASK_ID' => 'ASC'],
'filter' => array(
'LOGIC' => 'AND',
[
array('=USER_ID' => self::$userId),
]
)
));
$arTasks = $db->FetchAll();
}
if(is_array($arTasks) && !empty(count($arTasks))){
$taskIds = array_column($arTasks, 'TASK_ID');
$arResult = array_unique($taskIds);
}
return $arResult;
} |
|
1.2. что бы получить это:
"MEMBER_LIST.USER_ID" => array(774,680,775), // ID подчиненных
Скрытый текст |
---|
Код |
---|
/**
* Полный Список подчиненных сотрудников
* @param $userId
* @return array
* @throws LoaderException
*/
private static function getBitrixUserSubEmployees($userId): array{
$arResult = array();
if (Loader::includeModule('intranet'))
{
$dbUsers = \CIntranetUtils::GetSubordinateEmployees($userId, true);
while($arUser = $dbUsers->GetNext()){
$arResult[] = $arUser['ID'];
}
}
return $arResult;
} |
|
2. Результат выборки полученный в коде пп 1.1. будет постоянно увеличиваться.