- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/lib/internals/counter/collector/projectcollector.php
- Класс: BitrixTasksInternalsCounterCollectorProjectCollector
- Вызов: ProjectCollector::recountComments
private function recountComments(array $groupIds = [], array $taskIds = [], array $userIds = []): array
{
$statement = [
'join' => [
Counter::getJoinForRecountCommentsByType(Enum::PROJECT_NAME, [])
],
'filter' => [
Counter::getConditionForRecountComments()
],
];
$filter = [];
$joinFilter = [];
$joinFilter[] = "SU.GROUP_ID = T.GROUP_ID";
if (count($userIds) === 1)
{
$joinFilter[] = 'SU.USER_ID = '. (int) array_shift($userIds);
}
elseif (count($userIds) > 1)
{
$joinFilter[] = 'SU.USER_ID IN ('. implode(',', $userIds) .')';
}
if (count($groupIds) === 1)
{
$groupId = (int) array_shift($groupIds);
$filter[] = 'T.GROUP_ID = '. $groupId;
$joinFilter[] = 'SU.GROUP_ID = '. $groupId;
}
elseif (count($groupIds) > 1)
{
$filter[] = 'T.GROUP_ID IN ('. implode(',', $groupIds) .')';
$joinFilter[] = 'SU.GROUP_ID IN ('. implode(',', $groupIds) .')';
}
if (!empty($taskIds))
{
$filter[] = 'T.ID IN ('. implode(',', $taskIds) .')';
}
$filter[] = "(
FM.POST_DATE >= SU.DATE_CREATE
OR TM.USER_ID IS NOT NULL
)";
$filter[] = "(
(
FM.AUTHOR_ID <> SU.USER_ID
AND (
BUF.UF_TASK_COMMENT_TYPE IS NULL OR BUF.UF_TASK_COMMENT_TYPE <> ". Comment::TYPE_EXPIRED ."
)
)
OR
(
BUF.UF_TASK_COMMENT_TYPE = ". Comment::TYPE_EXPIRED_SOON ."
)
)";
$filter[] = "FM.NEW_TOPIC = 'N'";
$startCounterDate = COption::GetOptionString("tasks", "tasksDropCommentCounters", null);
if ($startCounterDate)
{
$filter[] = "FM.POST_DATE > '". $startCounterDate ."'";
}
$join = implode('nr', $statement['join']);
$filter = array_merge($filter, $statement['filter']);
$filter = implode(' AND ', $filter);
$joinFilter = implode(' AND ', $joinFilter);
$sql = "
SELECT
T.ID as ID,
T.GROUP_ID as GROUP_ID,
SU.USER_ID as USER_ID,
COUNT(DISTINCT FM.ID) AS COUNT
FROM b_tasks T
INNER JOIN b_sonet_user2group SU
ON {$joinFilter}
LEFT JOIN b_tasks_viewed TV
ON TV.TASK_ID = T.ID AND TV.USER_ID = SU.USER_ID
INNER JOIN b_forum_message FM
ON FM.TOPIC_ID = T.FORUM_TOPIC_ID
LEFT JOIN b_uts_forum_message BUF
ON BUF.VALUE_ID = FM.ID
LEFT JOIN b_tasks_member TM
ON TM.TASK_ID = T.ID AND TM.USER_ID = SU.USER_ID
{$join}
WHERE
{$filter}
GROUP BY T.ID, SU.USER_ID
";
$res = Application::getConnection()->query($sql);
$rows = $res->fetchAll();
$counters = [];
foreach ($rows as $row)
{
$counters[] = [
'USER_ID' => (int) $row['USER_ID'],
'TASK_ID' => (int) $row['ID'],
'GROUP_ID' => (int) $row['GROUP_ID'],
'TYPE' => CounterDictionary::COUNTER_GROUP_COMMENTS,
'VALUE' => (int) $row['COUNT']
];
}
return $counters;
}