Files
fund-tracer/backend/app/services/parser_service.py

59 lines
2.0 KiB
Python
Raw Normal View History

2026-03-11 16:28:04 +08:00
"""Parse raw OCR / multimodal extraction results into TransactionRecord instances."""
from datetime import datetime
from uuid import UUID
from app.models.transaction import TransactionRecord, Direction
from app.models.evidence_image import SourceApp
def parse_extracted_fields(
raw: dict | list,
case_id: UUID,
image_id: UUID,
source_app: SourceApp,
) -> list[TransactionRecord]:
"""Convert raw extraction dict(s) into TransactionRecord ORM objects."""
items = raw if isinstance(raw, list) else [raw]
records: list[TransactionRecord] = []
2026-03-12 12:32:29 +08:00
for idx, item in enumerate(items):
2026-03-11 16:28:04 +08:00
if not item or not item.get("amount"):
continue
2026-03-12 12:32:29 +08:00
raw_trade_time = item.get("trade_time")
2026-03-11 16:28:04 +08:00
try:
2026-03-12 12:32:29 +08:00
if isinstance(raw_trade_time, datetime):
trade_time = raw_trade_time
elif isinstance(raw_trade_time, str):
trade_time = datetime.fromisoformat(raw_trade_time)
else:
raise TypeError("trade_time is not str/datetime")
except (ValueError, KeyError, TypeError):
2026-03-11 16:28:04 +08:00
trade_time = datetime.now()
direction_str = item.get("direction", "out")
direction = Direction.in_ if direction_str == "in" else Direction.out
2026-03-12 12:32:29 +08:00
try:
amount = float(item.get("amount", 0))
confidence = float(item.get("confidence", 0.5))
except Exception:
raise
2026-03-11 16:28:04 +08:00
record = TransactionRecord(
case_id=case_id,
evidence_image_id=image_id,
source_app=source_app,
trade_time=trade_time,
2026-03-12 12:32:29 +08:00
amount=amount,
2026-03-11 16:28:04 +08:00
direction=direction,
counterparty_name=str(item.get("counterparty_name", "")),
counterparty_account=str(item.get("counterparty_account", "")),
self_account_tail_no=str(item.get("self_account_tail_no", "")),
order_no=str(item.get("order_no", "")),
remark=str(item.get("remark", "")),
2026-03-12 12:32:29 +08:00
confidence=confidence,
2026-03-11 16:28:04 +08:00
)
records.append(record)
return records