first commit
This commit is contained in:
47
backend/app/services/parser_service.py
Normal file
47
backend/app/services/parser_service.py
Normal file
@@ -0,0 +1,47 @@
|
||||
"""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] = []
|
||||
|
||||
for item in items:
|
||||
if not item or not item.get("amount"):
|
||||
continue
|
||||
|
||||
try:
|
||||
trade_time = datetime.fromisoformat(item["trade_time"])
|
||||
except (ValueError, KeyError):
|
||||
trade_time = datetime.now()
|
||||
|
||||
direction_str = item.get("direction", "out")
|
||||
direction = Direction.in_ if direction_str == "in" else Direction.out
|
||||
|
||||
record = TransactionRecord(
|
||||
case_id=case_id,
|
||||
evidence_image_id=image_id,
|
||||
source_app=source_app,
|
||||
trade_time=trade_time,
|
||||
amount=float(item.get("amount", 0)),
|
||||
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", "")),
|
||||
confidence=float(item.get("confidence", 0.5)),
|
||||
)
|
||||
records.append(record)
|
||||
|
||||
return records
|
||||
Reference in New Issue
Block a user