add ticket tool for AGI
This commit is contained in:
parent
aaeb3cf31e
commit
29cc20207f
62
hesabixCore/src/AiTool/TicketService.php
Normal file
62
hesabixCore/src/AiTool/TicketService.php
Normal file
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
namespace App\AiTool;
|
||||
|
||||
use App\Cog\TicketService as CogTicketService;
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
class TicketService
|
||||
{
|
||||
public function __construct(
|
||||
private readonly CogTicketService $cogTicketService
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* دریافت لیست تیکتهای کاربر
|
||||
*/
|
||||
public function getUserTickets(UserInterface $user): array
|
||||
{
|
||||
try {
|
||||
return $this->cogTicketService->getUserTickets($user);
|
||||
} catch (\Exception $e) {
|
||||
return [
|
||||
'error' => 'خطا در دریافت لیست تیکتها: ' . $e->getMessage()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ایجاد یا بهروزرسانی تیکت
|
||||
*/
|
||||
public function createOrUpdateTicket(array $params, array $files, UserInterface $user, string $id = ''): array
|
||||
{
|
||||
try {
|
||||
return $this->cogTicketService->createOrUpdateTicket($params, $files, $user, $id);
|
||||
} catch (\Exception $e) {
|
||||
return [
|
||||
'error' => 'خطا در ایجاد/بهروزرسانی تیکت: ' . $e->getMessage()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* دریافت جزئیات تیکت و پاسخهای آن
|
||||
*/
|
||||
public function getTicketDetails(string $id, UserInterface $user): array
|
||||
{
|
||||
if (!$id) {
|
||||
return [
|
||||
'error' => 'شناسه تیکت الزامی است'
|
||||
];
|
||||
}
|
||||
|
||||
try {
|
||||
return $this->cogTicketService->getTicketDetails($id, $user);
|
||||
} catch (\Exception $e) {
|
||||
return [
|
||||
'error' => 'خطا در دریافت جزئیات تیکت: ' . $e->getMessage()
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
193
hesabixCore/src/Cog/TicketService.php
Normal file
193
hesabixCore/src/Cog/TicketService.php
Normal file
|
@ -0,0 +1,193 @@
|
|||
<?php
|
||||
|
||||
namespace App\Cog;
|
||||
|
||||
use App\Entity\Business;
|
||||
use App\Entity\Support;
|
||||
use App\Service\Explore;
|
||||
use App\Service\Jdate;
|
||||
use App\Service\registryMGR;
|
||||
use App\Service\SMS;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
class TicketService
|
||||
{
|
||||
private const ERROR_TICKET_NOT_FOUND = ['error' => 1, 'message' => 'تیکت یافت نشد.'];
|
||||
private const ERROR_INVALID_PARAMS = ['error' => 999, 'message' => 'تمام موارد لازم را وارد کنید.'];
|
||||
|
||||
public function __construct(
|
||||
private readonly EntityManagerInterface $entityManager,
|
||||
private readonly Explore $explore,
|
||||
private readonly Jdate $jdate,
|
||||
private readonly registryMGR $registryMGR,
|
||||
private readonly SMS $sms,
|
||||
private readonly string $uploadDirectory
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list of support tickets for a user
|
||||
*/
|
||||
public function getUserTickets(UserInterface $user): array
|
||||
{
|
||||
$items = $this->entityManager->getRepository(Support::class)->findBy(
|
||||
['submitter' => $user, 'main' => 0],
|
||||
['id' => 'DESC']
|
||||
);
|
||||
|
||||
return array_map(function ($item) use ($user) {
|
||||
return $this->explore->ExploreSupportTicket($item, $user);
|
||||
}, $items);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create or update a support ticket
|
||||
*/
|
||||
public function createOrUpdateTicket(array $params, array $files, UserInterface $user, string $id = ''): array
|
||||
{
|
||||
if ($id === '') {
|
||||
return $this->createNewTicket($params, $files, $user);
|
||||
}
|
||||
|
||||
return $this->replyToTicket($params, $files, $user, $id);
|
||||
}
|
||||
|
||||
private function createNewTicket(array $params, array $files, UserInterface $user): array
|
||||
{
|
||||
if (!isset($params['title'], $params['body'])) {
|
||||
return self::ERROR_INVALID_PARAMS;
|
||||
}
|
||||
|
||||
$item = new Support();
|
||||
$item->setBody($params['body'])
|
||||
->setTitle($params['title'])
|
||||
->setDateSubmit(time())
|
||||
->setSubmitter($user)
|
||||
->setMain(0)
|
||||
->setCode($this->generateRandomString(8))
|
||||
->setState('در حال پیگیری');
|
||||
|
||||
// چک کردن مالکیت کسبوکار
|
||||
$this->handleBusinessOwnership($item, $params['bid'] ?? null, $user);
|
||||
|
||||
$this->entityManager->persist($item);
|
||||
$this->entityManager->flush();
|
||||
|
||||
$fileName = $this->handleFileUpload($files, $item->getId());
|
||||
if ($fileName) {
|
||||
$item->setFileName($fileName);
|
||||
$this->entityManager->persist($item);
|
||||
$this->entityManager->flush();
|
||||
}
|
||||
|
||||
$this->sms->send([$item->getId()], $this->registryMGR->get('sms', 'ticketRec'), $this->registryMGR->get('ticket', 'managerMobile'));
|
||||
|
||||
return [
|
||||
'error' => 0,
|
||||
'message' => 'ok',
|
||||
'url' => $item->getId(),
|
||||
'files' => $fileName
|
||||
];
|
||||
}
|
||||
|
||||
private function replyToTicket(array $params, array $files, UserInterface $user, string $id): array
|
||||
{
|
||||
if (!isset($params['body'])) {
|
||||
return self::ERROR_INVALID_PARAMS;
|
||||
}
|
||||
|
||||
$upper = $this->getTicket($id);
|
||||
if (!$upper) {
|
||||
return self::ERROR_TICKET_NOT_FOUND;
|
||||
}
|
||||
|
||||
$item = new Support();
|
||||
$item->setMain($upper->getId())
|
||||
->setBody($params['body'])
|
||||
->setTitle($upper->getTitle())
|
||||
->setDateSubmit(time())
|
||||
->setSubmitter($user)
|
||||
->setState('در حال پیگیری');
|
||||
|
||||
$this->entityManager->persist($item);
|
||||
$this->entityManager->flush();
|
||||
|
||||
$fileName = $this->handleFileUpload($files, $item->getId());
|
||||
if ($fileName) {
|
||||
$item->setFileName($fileName);
|
||||
}
|
||||
|
||||
$this->entityManager->persist($item);
|
||||
$upper->setState('در حال پیگیری');
|
||||
$this->entityManager->persist($upper);
|
||||
$this->entityManager->flush();
|
||||
|
||||
$this->sms->send([$item->getId()], $this->registryMGR->get('sms', 'ticketRec'), $this->registryMGR->get('ticket', 'managerMobile'));
|
||||
|
||||
return [
|
||||
'error' => 0,
|
||||
'message' => 'ok',
|
||||
'url' => $item->getId(),
|
||||
'files' => $fileName
|
||||
];
|
||||
}
|
||||
|
||||
private function handleBusinessOwnership(Support $support, ?string $businessId, UserInterface $user): void
|
||||
{
|
||||
if ($businessId) {
|
||||
$business = $this->entityManager->getRepository(Business::class)->find($businessId);
|
||||
if ($business && $business->getOwner() === $user) {
|
||||
$support->setBid($business);
|
||||
return;
|
||||
}
|
||||
}
|
||||
$support->setBid(null);
|
||||
}
|
||||
|
||||
private function getTicket(string $id): ?Support
|
||||
{
|
||||
return $this->entityManager->getRepository(Support::class)->find($id);
|
||||
}
|
||||
|
||||
private function generateRandomString(int $length = 32): string
|
||||
{
|
||||
return substr(str_shuffle(str_repeat('23456789ABCDEFGHJKLMNPQRSTUVWXYZ', ceil($length / 32))), 1, $length);
|
||||
}
|
||||
|
||||
private function handleFileUpload(array $files, int $ticketId): ?string
|
||||
{
|
||||
if (!file_exists($this->uploadDirectory)) {
|
||||
mkdir($this->uploadDirectory, 0777, true);
|
||||
}
|
||||
|
||||
if (!empty($files)) {
|
||||
$file = $files[0];
|
||||
$extension = $file->getClientOriginalExtension();
|
||||
$fileName = $ticketId . '.' . $extension;
|
||||
$file->move($this->uploadDirectory, $fileName);
|
||||
return $fileName;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get ticket details with its replies
|
||||
*/
|
||||
public function getTicketDetails(string $id, UserInterface $user): array
|
||||
{
|
||||
$ticket = $this->entityManager->getRepository(Support::class)->find($id);
|
||||
if (!$ticket || $ticket->getSubmitter() !== $user) {
|
||||
throw new AccessDeniedException('شما اجازه دسترسی به این تیکت را ندارید.');
|
||||
}
|
||||
|
||||
$replies = $this->entityManager->getRepository(Support::class)->findBy(['main' => $ticket->getId()]);
|
||||
$repliesArray = array_map(fn($reply) => $this->explore->ExploreSupportTicket($reply, $user), $replies);
|
||||
|
||||
return [
|
||||
'item' => $this->explore->ExploreSupportTicket($ticket, $user),
|
||||
'replays' => $repliesArray
|
||||
];
|
||||
}
|
||||
}
|
|
@ -248,139 +248,28 @@ class SupportController extends AbstractController
|
|||
}
|
||||
|
||||
#[Route('/api/support/list', name: 'app_support_list')]
|
||||
public function app_support_list(Jdate $jdate, EntityManagerInterface $entityManager, Explore $explore): JsonResponse
|
||||
public function app_support_list(TicketService $ticketService): JsonResponse
|
||||
{
|
||||
$items = $entityManager->getRepository(Support::class)->findBy(
|
||||
['submitter' => $this->getUser(), 'main' => 0],
|
||||
['id' => 'DESC']
|
||||
);
|
||||
|
||||
// استفاده از Explore برای تبدیل اشیاء به آرایه
|
||||
$serializedItems = array_map(function ($item) use ($explore, $jdate) {
|
||||
return $explore->ExploreSupportTicket($item, $this->getUser());
|
||||
}, $items);
|
||||
|
||||
return $this->json($serializedItems);
|
||||
return $this->json($ticketService->getUserTickets($this->getUser()));
|
||||
}
|
||||
|
||||
#[Route('/api/support/mod/{id}', name: 'app_support_mod')]
|
||||
public function app_support_mod(
|
||||
registryMGR $registryMGR,
|
||||
SMS $SMS,
|
||||
TicketService $ticketService,
|
||||
Request $request,
|
||||
EntityManagerInterface $entityManager,
|
||||
string $id = ''
|
||||
): JsonResponse {
|
||||
$params = $request->getPayload()->all();
|
||||
$uploadDirectory = $this->getParameter('SupportFilesDir');
|
||||
if (!file_exists($uploadDirectory)) {
|
||||
mkdir($uploadDirectory, 0777, true);
|
||||
}
|
||||
$files = $request->files->get('files') ?? [];
|
||||
|
||||
if ($id === '') {
|
||||
if (!isset($params['title'], $params['body'])) {
|
||||
return $this->json(self::ERROR_INVALID_PARAMS);
|
||||
}
|
||||
|
||||
$item = new Support();
|
||||
$item->setBody($params['body'])
|
||||
->setTitle($params['title'])
|
||||
->setDateSubmit(time())
|
||||
->setSubmitter($this->getUser())
|
||||
->setMain(0)
|
||||
->setCode($this->randomString(8))
|
||||
->setState('در حال پیگیری');
|
||||
|
||||
// چک کردن مالکیت کسبوکار
|
||||
$bid = $params['bid'] ?? null;
|
||||
if ($bid) {
|
||||
$business = $entityManager->getRepository(Business::class)->find($bid);
|
||||
if ($business && $business->getOwner() === $this->getUser()) {
|
||||
$item->setBid($business); // فقط در صورتی که کاربر مالک باشد
|
||||
} else {
|
||||
$item->setBid(null); // اگر مالک نباشد، bid خالی میماند
|
||||
}
|
||||
} else {
|
||||
$item->setBid(null); // اگر bid ارسال نشده باشد
|
||||
}
|
||||
|
||||
$entityManager->persist($item);
|
||||
$entityManager->flush();
|
||||
|
||||
$fileName = $this->handleFileUpload($request, $uploadDirectory, $item->getId());
|
||||
if ($fileName) {
|
||||
$item->setFileName($fileName);
|
||||
}
|
||||
|
||||
$entityManager->persist($item);
|
||||
$entityManager->flush();
|
||||
|
||||
$SMS->send([$item->getId()], $registryMGR->get('sms', 'ticketRec'), $registryMGR->get('ticket', 'managerMobile'));
|
||||
|
||||
return $this->json([
|
||||
'error' => 0,
|
||||
'message' => 'ok',
|
||||
'url' => $item->getId(),
|
||||
'files' => $fileName
|
||||
]);
|
||||
}
|
||||
|
||||
if (!isset($params['body'])) {
|
||||
return $this->json(self::ERROR_INVALID_PARAMS);
|
||||
}
|
||||
|
||||
$upper = $this->getTicket($entityManager, $id);
|
||||
if (!$upper) {
|
||||
return $this->json(self::ERROR_TICKET_NOT_FOUND);
|
||||
}
|
||||
|
||||
$item = new Support();
|
||||
$item->setMain($upper->getId())
|
||||
->setBody($params['body'])
|
||||
->setTitle($upper->getTitle())
|
||||
->setDateSubmit(time())
|
||||
->setSubmitter($this->getUser())
|
||||
->setState('در حال پیگیری');
|
||||
|
||||
$entityManager->persist($item);
|
||||
$entityManager->flush();
|
||||
|
||||
$fileName = $this->handleFileUpload($request, $uploadDirectory, $item->getId());
|
||||
if ($fileName) {
|
||||
$item->setFileName($fileName);
|
||||
}
|
||||
|
||||
$entityManager->persist($item);
|
||||
$upper->setState('در حال پیگیری');
|
||||
$entityManager->persist($upper);
|
||||
$entityManager->flush();
|
||||
|
||||
$SMS->send([$item->getId()], $registryMGR->get('sms', 'ticketRec'), $registryMGR->get('ticket', 'managerMobile'));
|
||||
|
||||
return $this->json([
|
||||
'error' => 0,
|
||||
'message' => 'ok',
|
||||
'url' => $item->getId(),
|
||||
'files' => $fileName
|
||||
]);
|
||||
return $this->json($ticketService->createOrUpdateTicket($params, $files, $this->getUser(), $id));
|
||||
}
|
||||
|
||||
|
||||
#[Route('/api/support/view/{id}', name: 'app_support_view')]
|
||||
public function app_support_view(EntityManagerInterface $entityManager, string $id): JsonResponse
|
||||
public function app_support_view(TicketService $ticketService, string $id): JsonResponse
|
||||
{
|
||||
$item = $this->getTicket($entityManager, $id, true);
|
||||
if (!$item) {
|
||||
throw $this->createAccessDeniedException();
|
||||
}
|
||||
|
||||
$replays = $entityManager->getRepository(Support::class)->findBy(['main' => $item->getId()]);
|
||||
$replaysArray = array_map(fn($replay) => Explore::ExploreSupportTicket($replay, $this->getUser()), $replays);
|
||||
|
||||
return $this->json([
|
||||
'item' => Explore::ExploreSupportTicket($item, $this->getUser()),
|
||||
'replays' => $replaysArray
|
||||
]);
|
||||
return $this->json($ticketService->getTicketDetails($id, $this->getUser()));
|
||||
}
|
||||
|
||||
#[Route('/api/support/download/file/{id}', name: 'app_support_download_file')]
|
||||
|
|
|
@ -335,6 +335,23 @@ class AGIService
|
|||
$cogAccountingDocService = new \App\Cog\AccountingDocService($this->em);
|
||||
$accountingDocService = new \App\AiTool\AccountingDocService($this->em, $cogAccountingDocService);
|
||||
return $accountingDocService->searchRowsAi($params, $params['acc'] ?? null);
|
||||
// ابزارهای مربوط به تیکت
|
||||
case 'getTicketsList':
|
||||
$cogTicketService = new \App\Cog\TicketService($this->em);
|
||||
$ticketService = new \App\AiTool\TicketService($this->em, $cogTicketService);
|
||||
return $ticketService->getTicketsListAi($params, $params['acc'] ?? null);
|
||||
case 'getTicketInfo':
|
||||
$cogTicketService = new \App\Cog\TicketService($this->em);
|
||||
$ticketService = new \App\AiTool\TicketService($this->em, $cogTicketService);
|
||||
return $ticketService->getTicketInfoByCode($params['code'] ?? null, $params['acc'] ?? null);
|
||||
case 'addOrUpdateTicket':
|
||||
$cogTicketService = new \App\Cog\TicketService($this->em);
|
||||
$ticketService = new \App\AiTool\TicketService($this->em, $cogTicketService);
|
||||
return $ticketService->addOrUpdateTicketAi($params, $params['acc'] ?? null, $params['code'] ?? 0);
|
||||
case 'replyToTicket':
|
||||
$cogTicketService = new \App\Cog\TicketService($this->em);
|
||||
$ticketService = new \App\AiTool\TicketService($this->em, $cogTicketService);
|
||||
return $ticketService->replyToTicketAi($params, $params['acc'] ?? null);
|
||||
default:
|
||||
return [
|
||||
'error' => 'ابزار ناشناخته: ' . $tool
|
||||
|
|
|
@ -6,6 +6,7 @@ use Doctrine\ORM\EntityManagerInterface;
|
|||
use App\Service\AGI\Promps\InventoryPromptService;
|
||||
use App\Service\AGI\Promps\BankPromptService;
|
||||
use App\Service\AGI\Promps\AccountingDocPromptService;
|
||||
use App\Service\AGI\Promps\TicketPromptService;
|
||||
|
||||
class PromptService
|
||||
{
|
||||
|
@ -15,6 +16,7 @@ class PromptService
|
|||
private $inventoryPromptService;
|
||||
private $bankPromptService;
|
||||
private $accountingDocPromptService;
|
||||
private $ticketPromptService;
|
||||
|
||||
public function __construct(
|
||||
EntityManagerInterface $entityManager,
|
||||
|
@ -22,7 +24,8 @@ class PromptService
|
|||
BasePromptService $basePromptService,
|
||||
InventoryPromptService $inventoryPromptService,
|
||||
BankPromptService $bankPromptService,
|
||||
AccountingDocPromptService $accountingDocPromptService
|
||||
AccountingDocPromptService $accountingDocPromptService,
|
||||
TicketPromptService $ticketPromptService
|
||||
) {
|
||||
$this->em = $entityManager;
|
||||
$this->personPromptService = $personPromptService;
|
||||
|
@ -30,6 +33,7 @@ class PromptService
|
|||
$this->inventoryPromptService = $inventoryPromptService;
|
||||
$this->bankPromptService = $bankPromptService;
|
||||
$this->accountingDocPromptService = $accountingDocPromptService;
|
||||
$this->ticketPromptService = $ticketPromptService;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -56,6 +60,10 @@ class PromptService
|
|||
$accountingTools = $this->accountingDocPromptService->getTools();
|
||||
$tools = array_merge($tools, $accountingTools);
|
||||
|
||||
// ابزارهای بخش تیکتها
|
||||
$ticketTools = $this->ticketPromptService->getTools();
|
||||
$tools = array_merge($tools, $ticketTools);
|
||||
|
||||
return $tools;
|
||||
}
|
||||
|
||||
|
@ -115,6 +123,9 @@ class PromptService
|
|||
// پرامپهای بخش اسناد حسابداری
|
||||
$prompts['accounting'] = $this->accountingDocPromptService->getAllAccountingDocPrompts();
|
||||
|
||||
// پرامپهای بخش تیکتها
|
||||
$prompts['ticket'] = $this->ticketPromptService->getAllTicketPrompts();
|
||||
|
||||
// در آینده بخشهای دیگر اضافه خواهند شد
|
||||
// $prompts['accounting'] = $this->accountingPromptService->getAllAccountingPrompts();
|
||||
// $prompts['reports'] = $this->reportsPromptService->getAllReportsPrompts();
|
||||
|
|
146
hesabixCore/src/Service/AGI/Promps/TicketService.php
Normal file
146
hesabixCore/src/Service/AGI/Promps/TicketService.php
Normal file
|
@ -0,0 +1,146 @@
|
|||
<?php
|
||||
|
||||
namespace App\Service\AGI\Promps;
|
||||
|
||||
class TicketService
|
||||
{
|
||||
/**
|
||||
* پرامپت برای بررسی متن تیکت و دستهبندی آن
|
||||
*/
|
||||
public function getTicketAnalysisPrompt(string $ticketBody): string
|
||||
{
|
||||
return <<<PROMPT
|
||||
لطفاً این تیکت پشتیبانی را بررسی و دستهبندی کنید:
|
||||
|
||||
متن تیکت:
|
||||
{$ticketBody}
|
||||
|
||||
لطفاً موارد زیر را مشخص کنید:
|
||||
1. موضوع اصلی تیکت
|
||||
2. اولویت (کم، متوسط، زیاد)
|
||||
3. بخش مربوطه (مالی، فنی، عمومی)
|
||||
4. پیشنهاد برای پاسخ
|
||||
PROMPT;
|
||||
}
|
||||
|
||||
/**
|
||||
* پرامپت برای تولید پیشنویس پاسخ به تیکت
|
||||
*/
|
||||
public function getDraftResponsePrompt(string $ticketBody, string $ticketTitle, array $history = []): string
|
||||
{
|
||||
$historyText = '';
|
||||
if (!empty($history)) {
|
||||
$historyText = "تاریخچه مکالمات قبلی:\n";
|
||||
foreach ($history as $message) {
|
||||
$historyText .= sprintf(
|
||||
"- %s: %s\n",
|
||||
$message['sender'],
|
||||
$message['message']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return <<<PROMPT
|
||||
لطفاً یک پیشنویس پاسخ مناسب برای این تیکت پشتیبانی آماده کنید:
|
||||
|
||||
عنوان تیکت: {$ticketTitle}
|
||||
متن تیکت:
|
||||
{$ticketBody}
|
||||
|
||||
{$historyText}
|
||||
|
||||
لطفاً یک پاسخ حرفهای و دقیق با در نظر گرفتن نکات زیر آماده کنید:
|
||||
1. لحن مؤدبانه و حرفهای
|
||||
2. پاسخگویی به تمام نکات مطرح شده در تیکت
|
||||
3. ارائه راهکارهای عملی
|
||||
4. درخواست اطلاعات تکمیلی در صورت نیاز
|
||||
PROMPT;
|
||||
}
|
||||
|
||||
/**
|
||||
* پرامپت برای پیشنهاد اقدامات بعدی برای تیکت
|
||||
*/
|
||||
public function getNextActionPrompt(string $ticketBody, string $currentStatus, array $previousActions = []): string
|
||||
{
|
||||
$previousActionsText = '';
|
||||
if (!empty($previousActions)) {
|
||||
$previousActionsText = "اقدامات قبلی:\n";
|
||||
foreach ($previousActions as $action) {
|
||||
$previousActionsText .= "- {$action}\n";
|
||||
}
|
||||
}
|
||||
|
||||
return <<<PROMPT
|
||||
لطفاً اقدامات بعدی مناسب برای این تیکت را پیشنهاد دهید:
|
||||
|
||||
متن تیکت:
|
||||
{$ticketBody}
|
||||
|
||||
وضعیت فعلی: {$currentStatus}
|
||||
{$previousActionsText}
|
||||
|
||||
لطفاً موارد زیر را مشخص کنید:
|
||||
1. آیا نیاز به ارجاع به بخش دیگری هست؟
|
||||
2. آیا نیاز به اطلاعات تکمیلی از کاربر هست؟
|
||||
3. اولویت رسیدگی به این تیکت
|
||||
4. پیشنهاد برای اقدام بعدی
|
||||
PROMPT;
|
||||
}
|
||||
|
||||
/**
|
||||
* پرامپت برای خلاصهسازی تیکت و تاریخچه آن
|
||||
*/
|
||||
public function getTicketSummaryPrompt(array $ticketHistory): string
|
||||
{
|
||||
$historyText = '';
|
||||
foreach ($ticketHistory as $entry) {
|
||||
$historyText .= sprintf(
|
||||
"- %s (%s): %s\n",
|
||||
$entry['date'],
|
||||
$entry['user'],
|
||||
$entry['message']
|
||||
);
|
||||
}
|
||||
|
||||
return <<<PROMPT
|
||||
لطفاً خلاصهای از این تیکت و تاریخچه آن تهیه کنید:
|
||||
|
||||
تاریخچه تیکت:
|
||||
{$historyText}
|
||||
|
||||
لطفاً موارد زیر را در خلاصه مشخص کنید:
|
||||
1. موضوع اصلی و مشکل گزارش شده
|
||||
2. اقدامات انجام شده
|
||||
3. وضعیت فعلی
|
||||
4. نکات مهم برای پیگیری
|
||||
PROMPT;
|
||||
}
|
||||
|
||||
/**
|
||||
* پرامپت برای دستهبندی خودکار تیکتها
|
||||
*/
|
||||
public function getTicketCategorizationPrompt(array $tickets): string
|
||||
{
|
||||
$ticketsText = '';
|
||||
foreach ($tickets as $ticket) {
|
||||
$ticketsText .= sprintf(
|
||||
"عنوان: %s\nمتن: %s\n\n",
|
||||
$ticket['title'],
|
||||
$ticket['body']
|
||||
);
|
||||
}
|
||||
|
||||
return <<<PROMPT
|
||||
لطفاً این تیکتها را بر اساس موضوع و محتوا دستهبندی کنید:
|
||||
|
||||
تیکتها:
|
||||
{$ticketsText}
|
||||
|
||||
لطفاً برای هر تیکت موارد زیر را مشخص کنید:
|
||||
1. دسته اصلی (مالی، فنی، پشتیبانی عمومی، آموزش)
|
||||
2. زیر دسته
|
||||
3. برچسبهای پیشنهادی
|
||||
4. اولویت پیشنهادی
|
||||
PROMPT;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue