database->query("SET NAMES utf8"); $query = "select w.id from vtiger_crmentity e left join vtiger_ws_entity w on w.name = e.setype where e.deleted = 0 and e.crmid = ?"; $result = $adb->pquery($query, array($crmid)); if ($adb->num_rows($result) == 0) { $output = 'Запись с id = '.$crmid.' не найдена'; $logstring = date("Y-m-d H:i:s").' '.$output; file_put_contents('logs/UpdateEntity.log', $logstring.PHP_EOL, FILE_APPEND); throw new WebServiceException(WebServiceErrorCode::$INVALIDID, $output); } $prefix = $adb->query_result($result, 0, 'id'); $element = json_decode($element, true); // Проверяем, что переданы данные для обновления if (empty($element) || count($element) == 0) { $logstring = date("Y-m-d H:i:s").' Пустой массив полей для записи '.$crmid.', обновление пропущено'.PHP_EOL; file_put_contents('logs/UpdateEntity.log', $logstring.PHP_EOL, FILE_APPEND); return 'NO_CHANGES'; } // Добавляем ID записи $element['id'] = $prefix.'x'.$crmid; try { $entity = vtws_revise($element, $current_user); $logstring = date('Y-m-d H:i:s').' Запись обновлена'.PHP_EOL; file_put_contents('logs/UpdateEntity.log', $logstring, FILE_APPEND); $output = 'YES'; } catch (WebServiceException $ex) { $output = $ex->getMessage(); $logstring = date('Y-m-d H:i:s').' '.$output.PHP_EOL; file_put_contents('logs/UpdateEntity.log', $logstring, FILE_APPEND); throw new WebServiceException(WebServiceErrorCode::$INVALIDID, 'Ошибка при сохранении изменений в базе - см. журнал ошибок'); } return $output; } /** * Обновление заявки ответом от RAG системы * @param int $ticketid - ID заявки в CRM * @param string $rag_response - ответ от RAG системы * @param string $status - новый статус заявки (опционально) * @param object $user - пользователь CRM (опционально) * @return string - результат обновления */ function vtws_updateRAGTicket($ticketid, $rag_response, $status = null, $user = false) { $logstring = date("Y-m-d H:i:s").' Обновление RAG заявки '.$ticketid.' ответом: '.substr($rag_response, 0, 100).'...'; file_put_contents('logs/UpdateRAGTicket.log', $logstring.PHP_EOL, FILE_APPEND); if(empty($ticketid) or empty($rag_response)){ $logstring = date("Y-m-d H:i:s").' Не указано одно из обязательных полей: ID заявки или ответ RAG'; file_put_contents('logs/UpdateRAGTicket.log', $logstring.PHP_EOL, FILE_APPEND); throw new WebServiceException(WebServiceErrorCode::$INVALIDID, "Не заполнены обязательные поля"); } global $adb, $current_user; // Устанавливаем правильную кодировку для соединения с базой данных $adb->database->query("SET NAMES utf8"); // Проверяем существование заявки $query = "select w.id from vtiger_crmentity e left join vtiger_ws_entity w on w.name = e.setype where e.deleted = 0 and e.crmid = ? and e.setype = 'HelpDesk'"; $result = $adb->pquery($query, array($ticketid)); if ($adb->num_rows($result) == 0) { $output = 'Заявка с id = '.$ticketid.' не найдена'; $logstring = date("Y-m-d H:i:s").' '.$output; file_put_contents('logs/UpdateRAGTicket.log', $logstring.PHP_EOL, FILE_APPEND); throw new WebServiceException(WebServiceErrorCode::$INVALIDID, $output); } $prefix = $adb->query_result($result, 0, 'id'); // Подготавливаем данные для обновления $element = array( 'solution' => $rag_response, // Записываем ответ RAG в поле solution 'update_log' => 'Ответ получен от RAG системы: ' . date('Y-m-d H:i:s') ); // Если указан статус, обновляем его if (!empty($status)) { $element['status'] = $status; } $element['id'] = $prefix.'x'.$ticketid; try { $logstring = date('Y-m-d H:i:s').' Пытаемся обновить заявку с данными: '.json_encode($element).PHP_EOL; file_put_contents('logs/UpdateRAGTicket.log', $logstring, FILE_APPEND); // Обновляем заявку напрямую через SQL $update_query = "UPDATE vtiger_troubletickets SET solution = ?, update_log = ?"; $update_params = array($rag_response, $element['update_log']); if (!empty($status)) { $update_query .= ", status = ?"; $update_params[] = $status; } $update_query .= " WHERE ticketid = ?"; $update_params[] = $ticketid; $adb->pquery($update_query, $update_params); $logstring = date('Y-m-d H:i:s').' RAG заявка обновлена через SQL'.PHP_EOL; file_put_contents('logs/UpdateRAGTicket.log', $logstring, FILE_APPEND); $output = 'YES'; } catch (Exception $ex) { $output = $ex->getMessage(); $logstring = date('Y-m-d H:i:s').' Exception: '.$output.PHP_EOL; file_put_contents('logs/UpdateRAGTicket.log', $logstring, FILE_APPEND); throw new Exception('Ошибка при обновлении RAG заявки: '.$output); } return $output; }