From 96f70cb646634640e9b057b165bdd1d5e66a5395 Mon Sep 17 00:00:00 2001 From: dv Date: Fri, 27 Mar 2026 16:25:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 4 +- .env | 1 + bot/handlers/view_tickets.py | 134 ++++++++++++++++++++++++++++++----- bot/keyboards.py | 17 ++++- config.py | 2 + data/support.db-shm | Bin 32768 -> 32768 bytes data/support.db-wal | Bin 5800992 -> 5800992 bytes external/intradesk_api.py | 105 +++++++++++++++++++++++++++ main.py | 13 ++++ 9 files changed, 257 insertions(+), 19 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 15bae42..dd0d9ef 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -8,7 +8,9 @@ "Bash(python -c \"from maxapi import Bot; import inspect; print\\(inspect.signature\\(Bot.edit_message\\)\\)\")", "Bash(python -c \"from maxapi.types.updates.message_callback import MessageCallback; print\\([m for m in dir\\(MessageCallback\\) if not m.startswith\\(''_''\\)]\\)\")", "Bash(python -c \"from maxapi.types import SendedMessage; print\\(SendedMessage.__fields__ if hasattr\\(SendedMessage, ''__fields__''\\) else dir\\(SendedMessage\\)\\)\")", - "Bash(python -c \"from maxapi.context import State; s = State\\(\\); print\\(type\\(s\\), dir\\(s\\)\\)\")" + "Bash(python -c \"from maxapi.context import State; s = State\\(\\); print\\(type\\(s\\), dir\\(s\\)\\)\")", + "Bash(python -c \"import maxapi; print\\(maxapi.__file__\\)\")", + "Bash(find C:UsersProfessionalAppDataLocalProgramsPythonPython313Libsite-packagesmaxapi -name command.py -o -name *command*)" ] } } diff --git a/.env b/.env index a48ce5e..d281505 100644 --- a/.env +++ b/.env @@ -23,3 +23,4 @@ INTRADESK_CHANGES_API_KEY=26221B839B6643E68345FD26BF INTRADESK_DEFAULT_SERVICE=84681/84683/ # ID типа заявки (Настройки → Заявки → Типы заявок → ID) INTRADESK_DEFAULT_TASK_TYPE=21026 +INTRADESK_CLOSE_STATUS_ID=68045 \ No newline at end of file diff --git a/bot/handlers/view_tickets.py b/bot/handlers/view_tickets.py index 1dbcaa7..154eaf2 100644 --- a/bot/handlers/view_tickets.py +++ b/bot/handlers/view_tickets.py @@ -18,8 +18,9 @@ from maxapi.dispatcher import Router from maxapi.filters import F from maxapi.types.updates.message_callback import MessageCallback +import config from bot.filters import PayloadStartsWith -from bot.keyboards import iticket_detail_kb, main_menu_kb, menu_only_kb +from bot.keyboards import comment_input_kb, iticket_detail_kb, main_menu_kb, menu_only_kb from bot.send_helper import bot_reply, bot_send from bot.states import CommentStates from database.connection import get_db @@ -27,7 +28,9 @@ from database.queries.intradesk import get_intradesk_contact_id_for_phone from database.queries.organizations import get_organization from external.intradesk_api import ( add_task_comment, + close_task, get_client_open_tasks, + get_task_comments, get_task_last_comment, invalidate_client_cache, invalidate_task_comment, @@ -218,6 +221,23 @@ async def cb_iticket_detail( await event.answer(notification="") + # Если пришли сюда из комментарийного флоу (кнопка «Назад») — + # удаляем промпт-сообщение и сбрасываем state, сохраняя кэш задач. + state = await context.get_state() + if state == CommentStates.waiting_text: + d = await context.get_data() + for mid in (d.get("flow_message_ids") or []): + try: + await event.bot.delete_message(message_id=mid) + except Exception: + pass + await context.set_state(None) + await context.set_data({ + "tasks": d.get("tasks"), + "page": d.get("page"), + "total": d.get("total"), + }) + # Ищем задачу в кэше контекста (загружена при показе списка) data = await context.get_data() task = next((t for t in (data.get("tasks") or []) if t.get("id") == task_id), None) @@ -244,28 +264,104 @@ async def cb_iticket_detail( if task.get("name"): lines += ["", f"📄 {task['name']}"] - # Последний комментарий — отдельный запрос к history API - comment = await get_task_last_comment(task["id"]) - if comment and comment.get("text"): - ctext = comment["text"] - if len(ctext) > 500: - ctext = ctext[:500] + "…" - lines += [ - "", - f"💭 Последний комментарий ({comment['date']}):", - f" {ctext}", - f" — {comment['author']}", - ] + if task.get("description"): + desc = task["description"] + if len(desc) > 600: + desc = desc[:600] + "…" + lines += ["", "📝 Описание:", desc] + + # Последние 10 комментариев из history API + comments = await get_task_comments(task["id"], count=10) + if comments: + lines += ["", f"💬 Комментарии ({len(comments)}):"] + for c in comments: + ctext = c["text"] + if len(ctext) > 300: + ctext = ctext[:300] + "…" + lines += [ + "", + f"─" * 16, + f"{c['date']} — {c['author']}", + ctext, + ] + else: + lines += ["", "💬 Комментариев нет"] await bot_reply( event, text="\n".join(lines), - attachments=[iticket_detail_kb(task_id=task["id"])], + attachments=[iticket_detail_kb(task_id=task["id"], can_close=bool(config.INTRADESK_CLOSE_STATUS_ID))], user_id=bot_user["max_user_id"], chat_id=event.message.recipient.chat_id if event.message else None, ) +# ── Закрыть заявку ──────────────────────────────────────────────────────────── + +@router.message_callback(PayloadStartsWith("iticket_close:")) +async def cb_close_ticket( + event: MessageCallback, context: BaseContext, bot_user: dict +) -> None: + try: + task_id = int(event.callback.payload.split(":")[1]) + except (IndexError, ValueError): + await event.answer(notification="Ошибка") + return + + await event.answer(notification="") + + # Ищем задачу в кэше + data = await context.get_data() + task = next((t for t in (data.get("tasks") or []) if t.get("id") == task_id), None) + task_number = task.get("task_number") if task else None + + if not task_number: + await bot_reply( + event, + text="⚠️ Не удалось определить номер заявки. Вернитесь к списку.", + attachments=[iticket_detail_kb()], + user_id=bot_user["max_user_id"], + chat_id=event.message.recipient.chat_id if event.message else None, + ) + return + + # Получаем contact_person_id + intradesk_id: int | None = None + contact_person_id: int | None = None + if bot_user.get("org_id"): + org = await get_organization(bot_user["org_id"]) + intradesk_id = org.get("intradesk_id") if org else None + if intradesk_id and bot_user.get("phone"): + db = get_db() + contact_person_id = await get_intradesk_contact_id_for_phone( + db, intradesk_id, bot_user["phone"] + ) + + ok = await close_task(task_number=task_number, contact_person_id=contact_person_id) + + if ok: + # Сбрасываем кэш — задача теперь закрыта + invalidate_task_comment(task_id) + if intradesk_id: + invalidate_client_cache(intradesk_id) + num_str = f" #{task_number}" if task_number else "" + await bot_reply( + event, + text=f"✅ Заявка{num_str} закрыта.", + attachments=[menu_only_kb()], + user_id=bot_user["max_user_id"], + chat_id=event.message.recipient.chat_id if event.message else None, + ) + else: + await bot_reply( + event, + text="⚠️ Не удалось закрыть заявку. Попробуйте позже.", + attachments=[iticket_detail_kb(task_id=task_id, can_close=bool(config.INTRADESK_CLOSE_STATUS_ID))], + user_id=bot_user["max_user_id"], + chat_id=event.message.recipient.chat_id if event.message else None, + ) + + # ── Оставить комментарий ────────────────────────────────────────────────────── @router.message_callback(PayloadStartsWith("iticket_comment:")) @@ -280,7 +376,7 @@ async def cb_add_comment( await event.answer(notification="") - # Ищем task_number в кэше контекста + # Ищем task_number в кэше контекста; сохраняем кэш задач для кнопки «Назад» data = await context.get_data() task = next((t for t in (data.get("tasks") or []) if t.get("id") == task_id), None) task_number = task.get("task_number") if task else None @@ -290,6 +386,10 @@ async def cb_add_comment( "comment_task_id": task_id, "comment_task_number": task_number, "flow_message_ids": [], + # Сохраняем кэш списка чтобы кнопка «Назад» нашла задачу + "tasks": data.get("tasks"), + "page": data.get("page"), + "total": data.get("total"), }) chat_id = event.message.recipient.chat_id if event.message else None @@ -303,9 +403,9 @@ async def cb_add_comment( user_id=bot_user["max_user_id"], text=( f"💬 Напишите комментарий{num_str}:\n\n" - "Для отмены нажмите «🏠 Главное меню»." + "Отправьте текстовое сообщение или нажмите «← Назад к заявке» для отмены." ), - attachments=[menu_only_kb()], + attachments=[comment_input_kb(task_id)], ) # Сохраняем mid для возможной очистки if mid: diff --git a/bot/keyboards.py b/bot/keyboards.py index d5f86bd..0239aa7 100644 --- a/bot/keyboards.py +++ b/bot/keyboards.py @@ -118,7 +118,7 @@ def intradesk_tasks_list_kb( return builder.as_markup() -def iticket_detail_kb(task_id: int | None = None) -> Attachment: +def iticket_detail_kb(task_id: int | None = None, can_close: bool = False) -> Attachment: """Клавиатура внутри карточки Intradesk-задачи.""" builder = InlineKeyboardBuilder() if task_id is not None: @@ -126,11 +126,26 @@ def iticket_detail_kb(task_id: int | None = None) -> Attachment: text="💬 Оставить комментарий", payload=f"iticket_comment:{task_id}", )) + if task_id is not None and can_close: + builder.row(CallbackButton( + text="🔒 Закрыть заявку", + payload=f"iticket_close:{task_id}", + )) builder.row(CallbackButton(text="← К списку заявок", payload="itickets_page:0")) builder.row(CallbackButton(text="🏠 Главное меню", payload="main_menu")) return builder.as_markup() +def comment_input_kb(task_id: int) -> Attachment: + """Клавиатура при вводе комментария — кнопка назад и меню.""" + return ( + InlineKeyboardBuilder() + .row(CallbackButton(text="← Назад к заявке", payload=f"iticket_detail:{task_id}")) + .row(CallbackButton(text="🏠 Главное меню", payload="main_menu")) + .as_markup() + ) + + def ticket_detail_kb(page: int = 0) -> Attachment: return ( InlineKeyboardBuilder() diff --git a/config.py b/config.py index ef27343..cb61ad9 100644 --- a/config.py +++ b/config.py @@ -38,6 +38,8 @@ INTRADESK_CHANGES_API_KEY: str = os.environ.get("INTRADESK_CHANGES_API_KEY", "") INTRADESK_DEFAULT_SERVICE: str = os.environ.get("INTRADESK_DEFAULT_SERVICE", "") # ID типа заявки по умолчанию (Настройки → Заявки → Типы заявок → ID) INTRADESK_DEFAULT_TASK_TYPE: str = os.environ.get("INTRADESK_DEFAULT_TASK_TYPE", "") +# ID статуса «Выполнена» для кнопки «Закрыть заявку» (Настройки → Справочники → Статусы → ID) +INTRADESK_CLOSE_STATUS_ID: str = os.environ.get("INTRADESK_CLOSE_STATUS_ID", "") # ID группы исполнителей для фильтрации заявок INTRADESK_EXECUTOR_GROUP: str = os.environ.get("INTRADESK_EXECUTOR_GROUP", "") # Список ID исполнителей через запятую (доп. фильтр) diff --git a/data/support.db-shm b/data/support.db-shm index bc52efb1fb87a6ce7a325b5cabb7767462223d18..a94623628797bc435aa56a49eed46094b213c9da 100644 GIT binary patch delta 720 zcmchTyHAs06vn^b+twI@mqrsAObA1~ta2@Kv!V$0tNaN~ zx7qYZ3r`-)N^0;?OFe$>(nyeI?h~Sob{^5mW1iAOjAuNjpFxI6 z@RA8$@tQZxFw1*%KFEdWsZ1{7u~bnl#kw*+cX=!}58X^ky{3%S*one3r8v35HOjex zi(4}Ju8O_frj7>g5a1q7wD5pd!aSsd2v1~bTb+y2OCNDwFu)Kaj4~#JU&=m3l4;)Z NjyY1KnU{7$!5(`ciw^(* delta 213 zcmZo@U}|V!s+V}A%K!q*K+MR%AfN&ymN79f91WS*`7CbkkKNW63J)0tB^yK@V$QlE zY)h(ou;D;L325$rBmfm>VvyU|IGttl6t*mz%^TQi7$^U8;@d3b{DO7z1~#_MzdS@3 m!91Yc8TQGC!mTzhVmrdL`9PEvGf?~x)8;)1Y&7_O{Hn?jfi8K=oXi0~|qoT@&|yNP z{)KmMTzKrq$18iBd2~?}S~wB(e1L@qx!0|*P6-0>bq^@M_Vo*840mXIlbE3;spZqv z{_XW>++N%Z`&NB*Ec}}jXnSgfBGC4pS15SLIXTizkN;ISjPdT3N@=IkxigI`uK1-A z*C>^QKW?boc<@56kC0R}vg%f(BCF;dYh?;Hi;d%wWa<>6n90v~G7Ll6xJv_7*Bcd2 z{nli+Z1nyOC)SiE`DGX1D7&7|4%;?vujQ->$xbVq+N$hiQ+Y>@Og@B-=ceYS_v!({ za~4s>3_}+hDHCO&%*h5*GSy%_mU~goQ>9~<)tvcPv|r8%jdJcas&2#YtKa%;8j`b4 zIPw`kk*JGJW`o&e<4#Xc-`3zt8LOy{wgTK&FCDo0Zlse_a}*QPoo&s8`c)09nS6Mg=ab#T)<%Hxn;3QPv0!Ajef zS9eY4<}6R2(hz(ZtEj+R4)lxn>=^gctQYItbw{Mtq%?x7Fq567iQM91MN-FC>ockU z96s84w1r4Vx{M&sa^3m|#mS?Iv%I5i0?I;MUQFIBB zNMsFn-FTRY{I>fMAqk5hYJ|JWq6zMPHrmVQ)u=KvA_$30+AdOJGRY;Y72pM@Of8xm z;O+rF8u`Tr-~SmYg+({ygzO>Zx%B>3hq<+vW%mVz!*Vuq)t6% zcav_CcUKQkE+my`&uk+1pM_zAyKO|jQ!m!jUm1@Ugg&twiB+n*B+*^s9kn_Qt7d!p z?4VrTXa~hsi-k5AxOcy^8M°F4G?1~Yg4SlXXqAP9Mfnu%EaV^soxm;Wt91w| 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 CnY-cu delta 117784 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

`5Di%ZT0HX^Br#4CS>%|DMAK7V1O*jH; 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 None: def invalidate_task_comment(task_id: int) -> None: """Сбросить кэш истории конкретной задачи после добавления комментария.""" _cache.pop(f"task_comment:{task_id}", None) + _cache_delete_prefix(f"task_comments:{task_id}:") logger.debug("cache invalidated for task_id=%s", task_id) @@ -144,6 +145,56 @@ async def get_task_last_comment(task_id: int) -> dict | None: return result +async def get_task_comments(task_id: int, count: int = 10) -> list[dict]: + """ + Получить последние комментарии к заявке. + + Возвращает список {text, author, date}, до count штук, новые сначала. + Результат кэшируется на _TTL_TASK_COMMENT секунд. + """ + ck = f"task_comments:{task_id}:{count}" + hit, cached = _cache_get(ck) + if hit: + return cached + + api_key = config.INTRADESK_TASKS_API_KEY + if not api_key: + return [] + + url = ( + f"{config.INTRADESK_BASE_URL.rstrip('/')}" + f"/taskhistory/api/v2.0/lifetime/{task_id}/full" + f"?ApiKey={api_key}&sortDirection=Desc&top={count * 3}&events=50" + ) + try: + async with httpx.AsyncClient() as client: + resp = await client.get(url, timeout=15.0) + if resp.status_code != 200: + logger.warning("get_task_comments task=%s → HTTP %s", task_id, resp.status_code) + return [] + data = resp.json() + except Exception as exc: + logger.warning("get_task_comments error: %s", exc) + return [] + + result: list[dict] = [] + for entry in data.get("data") or []: + for ev in (entry.get("events") or {}).get("data") or []: + if ev.get("blockname") == "comment" and ev.get("type") == 50: + raw_date = entry.get("eventat") or "" + result.append({ + "text": _strip_html(ev.get("stringvalue") or ""), + "author": entry.get("username") or "—", + "date": raw_date[:16].replace("T", " "), + }) + break # одна запись = одно событие комментария + if len(result) >= count: + break + + _cache_set(ck, result, _TTL_TASK_COMMENT) + return result + + async def count_client_open_tasks(client_id: int) -> int: """ Количество незакрытых заявок клиента. @@ -297,6 +348,7 @@ async def get_client_open_tasks( "id": t.get("id"), "task_number": t.get("tasknumber"), "name": t.get("name") or "", + "description": _strip_html(t.get("description") or ""), "status_name": dicts_map.get(status_id, "") if status_id else "", "created_at": t.get("createdat") or "", "updated_at": t.get("updatedat") or "", @@ -389,6 +441,59 @@ async def add_task_comment( return False +async def close_task( + task_number: int, + contact_person_id: int | None = None, +) -> bool: + """ + Закрыть заявку — установить статус INTRADESK_CLOSE_STATUS_ID (PUT /changes/v3/tasks). + + Возвращает True при успехе, False при ошибке или незаданном статусе. + """ + status_id = config.INTRADESK_CLOSE_STATUS_ID + if not status_id: + logger.warning("close_task: INTRADESK_CLOSE_STATUS_ID не задан") + return False + + key = config.INTRADESK_CHANGES_API_KEY + if not key: + logger.warning("close_task: INTRADESK_CHANGES_API_KEY не задан") + return False + + blocks: dict[str, str] = { + "status": json.dumps({"value": int(status_id)}, ensure_ascii=False), + } + body = {"number": task_number, "blocks": blocks, "Channel": "api"} + url = f"{config.INTRADESK_BASE_URL.rstrip('/')}/changes/v3/tasks?ApiKey={key}" + if contact_person_id is not None: + url += f"&userid={contact_person_id}" + + if config.DRY_RUN: + print( + "\n[DRY-RUN] close_task — запрос НЕ отправлен\n" + f" PUT {url}\n" + f" Body: {json.dumps(body, ensure_ascii=False, indent=2)}\n" + ) + return False + + try: + async with httpx.AsyncClient() as client: + resp = await client.put( + url, + json=body, + headers={"Content-Type": "application/json"}, + timeout=20.0, + ) + if resp.status_code not in (200, 201): + logger.error("close_task → HTTP %s: %s", resp.status_code, resp.text[:500]) + return False + logger.info("close_task ok: task_number=%s", task_number) + return True + except Exception as exc: + logger.exception("close_task error: %s", exc) + return False + + async def create_intradesk_task( name: str, description: str, diff --git a/main.py b/main.py index 60e1cf2..83719d6 100644 --- a/main.py +++ b/main.py @@ -7,6 +7,7 @@ setup_logging() # до всех остальных импортов from database.connection import init_db from bot.setup import create_bot_and_dispatcher from admin.app import create_admin_app +from maxapi.types.command import BotCommand import config @@ -23,6 +24,18 @@ async def main() -> None: await init_db() bot, dp = create_bot_and_dispatcher() + + # Регистрируем команды — появляются в меню кнопки "/" в поле ввода + try: + await bot.set_my_commands( + BotCommand(name="start", description="Главное меню"), + BotCommand(name="menu", description="Показать меню"), + BotCommand(name="cancel", description="Отменить текущее действие"), + ) + except Exception as e: + import logging + logging.getLogger(__name__).warning("set_my_commands failed: %s", e) + admin_app = create_admin_app() server = uvicorn.Server(