@redesupar

Как сделать правильный фильтр задач в б24 коробке?

В общем смысл моего скрипта такой, добавлять нового пользователя в наблюдатели в закрытых задачах определенного пользователя. По факту у меня стоит фильтр задач где пользователь является ответственным или же постановщиком в закрытой задаче, но есть проблема с фильтром, он ищет чисто по первому субфильтру, второй ни как не подставляется
Весь код

global $USER;

if (empty($_POST["OLDUSER"]) || empty($_POST["NEWUSER"])) {
    echo "Не указаны ID пользователей.";
    exit;
}

$oldUserId = intval($_POST["OLDUSER"]);
$newUserId = intval($_POST["NEWUSER"]);
$creationDateFrom = $_POST['CREATION_DATE_FROM'];
$creationDateTo = $_POST['CREATION_DATE_TO'];
$oldUser = CUser::GetByID($oldUserId)->Fetch();
$newUser = CUser::GetByID($newUserId)->Fetch();

if (!$oldUser) {
    echo "Не найден старый пользователь с таким ID";
    exit;
} elseif (!$newUser) {
    echo "Не найден новый пользователь с таким ID";
    exit;
}

$creationDateFrom = !empty($creationDateFrom) ? ConvertTimeStamp(strtotime($creationDateFrom), "FULL") : null;
$creationDateTo = !empty($creationDateTo) ? ConvertTimeStamp(strtotime($creationDateTo) + 86400, "FULL") : null;

if (!$creationDateFrom || !$creationDateTo) {
    echo "Не указаны даты создания задач.";
    exit;
}

$filter = array(
    '::LOGIC' => 'AND',
    '>=CREATED_DATE' => $creationDateFrom,
    '<=CREATED_DATE' => $creationDateTo,
    '::SUBFILTER-1' => array(
        '::LOGIC' => 'OR',
        'RESPONSIBLE_ID' => $oldUserId,
        'REAL_STATUS' => array(CTasks::STATE_COMPLETED),
    ),
    '::SUBFILTER-2' => array(
        'CREATED_BY' => $oldUserId,
        'REAL_STATUS' => array(CTasks::STATE_COMPLETED),
    ),
);

$res = CTasks::GetList([], $filter);
$tasksUpdated = 0;
$messages = [];

while ($arTask = $res->GetNext()) {
    $taskId = $arTask["ID"];
    $taskItem = new CTaskItem($taskId, $USER->GetID());
    $taskData = $taskItem->getData();
    
    $auditors = $taskData["AUDITORS"] ?? [];
    
    if (!in_array($newUserId, $auditors)) {
        $auditors[] = $newUserId;
        $obTask = new CTasks;
        $updateFields = [
            "AUDITORS" => $auditors
        ];

        $success = $obTask->Update($taskId, $updateFields);

        if ($success) {
            $messages[] = "Задача с ID $taskId: Новый наблюдатель добавлен.";
            $tasksUpdated++;
        } else {
            if ($e = $APPLICATION->GetException()) {
                $messages[] = "Ошибка при обновлении задачи ID $taskId: " . htmlspecialchars($e->GetString());
            }
        }
    } else {
        $messages[] = "Задача с ID $taskId: Наблюдатель с ID $newUserId уже существует.";
    }
}

if ($tasksUpdated === 0) {
    $messages[] = "Не найдено задач для обновления.";
}

echo implode("<br>", $messages);


пробовал разным подходом, например так делаю но долго грузит и добавляет наблюдателя абсолютно во всех задачах не важно что там пользователь $olduser является ли постановщик/ответственным

$filter = array(
    '::LOGIC' => 'AND',
    '>=CREATED_DATE' => $creationDateFrom,
    '<=CREATED_DATE' => $creationDateTo,
    '::SUBFILTER' => array(
        '::LOGIC' => 'OR',
        '::SUBFILTER-1' => array(
            'RESPONSIBLE_ID' => $oldUserId,
    '>=CREATED_DATE' => $creationDateFrom,
    '<=CREATED_DATE' => $creationDateTo,
            'REAL_STATUS' => array(CTasks::STATE_COMPLETED),
        ),
        '::SUBFILTER-2' => array(
            'CREATED_BY' => $oldUserId,
    '>=CREATED_DATE' => $creationDateFrom,
    '<=CREATED_DATE' => $creationDateTo,
            'REAL_STATUS' => array(CTasks::STATE_COMPLETED),
        ),
    ),
);
  • Вопрос задан
  • 23 просмотра
Решения вопроса 1
@redesupar Автор вопроса
В общем решил сделать другим путём, сначала запускаю поиск по ответственным, потом по наблюдателям, насколько это правильно или производительней незнаю.
КОД
global $USER;

if (empty($_POST["OLDUSER"]) || empty($_POST["NEWUSER"])) {
    echo "Не указаны ID пользователей.";
    exit;
}

$oldUserId = intval($_POST["OLDUSER"]);
$newUserId = intval($_POST["NEWUSER"]);
$creationDateFrom = $_POST['CREATION_DATE_FROM'];
$creationDateTo = $_POST['CREATION_DATE_TO'];
$oldUser = CUser::GetByID($oldUserId)->Fetch();
$newUser = CUser::GetByID($newUserId)->Fetch();

if (!$oldUser) {
    echo "Не найден старый пользователь с таким ID";
    exit;
} elseif (!$newUser) {
    echo "Не найден новый пользователь с таким ID";
    exit;
}

$creationDateFrom = !empty($creationDateFrom) ? ConvertTimeStamp(strtotime($creationDateFrom), "FULL") : null;
$creationDateTo = !empty($creationDateTo) ? ConvertTimeStamp(strtotime($creationDateTo) + 86400, "FULL") : null;

if (!$creationDateFrom || !$creationDateTo) {
    echo "Не указаны даты создания задач.";
    exit;
}

// Первый этап: ищем задачи, где старый пользователь является ответственным
$filterForResponsible = array(
    '::LOGIC' => 'AND',
    '>=CREATED_DATE' => $creationDateFrom,
    '<=CREATED_DATE' => $creationDateTo,
    'RESPONSIBLE_ID' => $oldUserId,
    'REAL_STATUS' => array(CTasks::STATE_COMPLETED),
);

// Обновляем наблюдателей
$messages = [];
$tasksUpdated = processTasks($filterForResponsible, $newUserId, $USER->GetID(), $messages);

if ($tasksUpdated === 0) {
    // Второй этап: ищем задачи, где старый пользователь является постановщиком
    $filterForCreator = array(
        '::LOGIC' => 'AND',
        '>=CREATED_DATE' => $creationDateFrom,
        '<=CREATED_DATE' => $creationDateTo,
        'CREATED_BY' => $oldUserId,
        'REAL_STATUS' => array(CTasks::STATE_COMPLETED),
    );

    $tasksUpdated += processTasks($filterForCreator, $newUserId, $USER->GetID(), $messages);
}

if ($tasksUpdated === 0) {
    $messages[] = "Не найдено задач для обновления.";
}

echo implode("<br>", $messages);

function processTasks($filter, $newUserId, $currentUserId, &$messages) {
    $res = CTasks::GetList([], $filter);
    $tasksUpdated = 0;

    while ($arTask = $res->GetNext()) {
        $taskId = $arTask["ID"];
        $taskItem = new CTaskItem($taskId, $currentUserId);
        $taskData = $taskItem->getData();
        
        $auditors = $taskData["AUDITORS"] ?? [];

        if (!in_array($newUserId, $auditors)) {
            $auditors[] = $newUserId;
            $obTask = new CTasks;
            $updateFields = [
                "AUDITORS" => $auditors
            ];

            $success = $obTask->Update($taskId, $updateFields);

            if ($success) {
                $messages[] = "Задача с ID $taskId: Новый наблюдатель добавлен.";
                $tasksUpdated++;
            } else {
                if ($e = $APPLICATION->GetException()) {
                    $messages[] = "Ошибка при обновлении задачи ID $taskId: " . htmlspecialchars($e->GetString());
                }
            }
        } else {
            $messages[] = "Задача с ID $taskId: Наблюдатель с ID $newUserId уже существует.";
        }
    }

    return $tasksUpdated;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы