добавил гигачада и заворачивание в проверку чека, если данные для QR распознались

This commit is contained in:
2025-12-23 07:37:35 +03:00
parent b5b9504019
commit 9441579a34
7 changed files with 223 additions and 101 deletions

View File

@@ -9,7 +9,7 @@ import numpy as np
# Импортируем модули
from imgproc import preprocess_image
from parser import parse_receipt_text, ParsedItem
from parser import parse_receipt_text, ParsedItem, extract_fiscal_data
from ocr import ocr_engine
from qr_manager import detect_and_decode_qr, fetch_data_from_api
# Импортируем новый модуль
@@ -77,28 +77,38 @@ async def recognize_receipt(image: UploadFile = File(...)):
else:
logger.info("QR code not found. Proceeding to OCR.")
# --- ЭТАП 2: Yandex Vision Strategy (Cloud OCR) ---
# Проверяем, настроен ли Яндекс
# --- ЭТАП 2: OCR + Virtual QR Strategy ---
if yandex_engine.oauth_token and yandex_engine.folder_id:
logger.info("--- Stage 2: Yandex Vision OCR ---")
# Яндекс принимает сырые байты картинки (Base64), ему не нужен наш препроцессинг
logger.info("--- Stage 2: Yandex Vision OCR + Virtual QR ---")
yandex_text = yandex_engine.recognize(content)
if yandex_text and len(yandex_text) > 10:
logger.info(f"Yandex OCR success. Text length: {len(yandex_text)}")
logger.info(f"Yandex RAW OUTPUT:\n{yandex_text}")
logger.info(f"OCR success. Raw text length: {len(yandex_text)}")
# Попытка собрать виртуальный QR из текста
virtual_qr = extract_fiscal_data(yandex_text)
if virtual_qr:
logger.info(f"Virtual QR constructed: {virtual_qr}")
api_items = fetch_data_from_api(virtual_qr)
if api_items:
logger.info(f"Success: Retrieved {len(api_items)} items via Virtual QR API.")
return RecognitionResult(
source="virtual_qr_api",
items=api_items,
raw_text=yandex_text
)
# Если виртуальный QR не сработал, пробуем Regex
yandex_items = parse_receipt_text(yandex_text)
logger.info(f"Parsed items preview: {yandex_items[:3]}...")
# Если Regex не нашел позиций (как в нашем случае со счетом)
# Если Regex пуст — вызываем LLM (GigaChat / YandexGPT)
if not yandex_items:
logger.info("Regex found nothing. Calling YandexGPT for semantic parsing...")
logger.info("Regex found nothing. Calling LLM Manager...")
iam_token = yandex_engine._get_iam_token()
yandex_items = llm_parser.parse_with_llm(yandex_text, iam_token)
logger.info(f"Semantic parsed items preview: {yandex_items[:3]}...")
yandex_items = llm_parser.parse_with_priority(yandex_text, iam_token)
return RecognitionResult(
source="yandex_vision",
source="yandex_vision_llm",
items=yandex_items,
raw_text=yandex_text
)