Files
django-vue3-admin/backend/plugins/eip_sync/sync/manager.py
T

67 lines
2.2 KiB
Python

from __future__ import annotations
from typing import Any, Dict, List, Optional
from django.utils import timezone
from sync.base import SyncOperationResult, SyncStatus
from sync.factory import SyncFactory
from sync.logger import SyncLogger
from sync.models import SyncRecord
class SyncManager:
"""Routes inbound EIP webhooks to registered adapters."""
SUCCESS_MESSAGE_MISC = "物料信息已成功抛转至PIS"
def __init__(self):
self.logger = SyncLogger()
def process_eip_webhook(self, adapter_name: str, data: Dict[str, Any]) -> Dict[str, Any]:
if adapter_name not in SyncFactory.list_adapters():
return {"Status": "fail", "Message": f"未知的适配器: {adapter_name}"}
adapter = SyncFactory.create(adapter_name)
op = adapter.push_to_local(data)
self._persist_record(op)
self.logger.log_sync(op)
if op.status == SyncStatus.SUCCESS:
message = (
self.SUCCESS_MESSAGE_MISC if adapter_name == "misc_material" else "同步成功"
)
return {"Status": "success", "Message": message}
return {"Status": "fail", "Message": op.error_message or "同步失败"}
def _persist_record(self, op: SyncOperationResult) -> None:
completed_at = timezone.now()
SyncRecord.objects.create(
adapter_name=op.adapter_name,
direction=op.direction.value,
external_id=op.external_id or "",
payload=op.payload,
response=op.response,
status=op.status.value,
error_message=op.error_message or "",
retry_count=op.retry_count,
completed_at=completed_at,
)
def get_sync_history(
self,
adapter_name: Optional[str] = None,
direction: Optional[str] = None,
status: Optional[str] = None,
limit: int = 100,
) -> List[SyncRecord]:
qs = SyncRecord.objects.all()
if adapter_name:
qs = qs.filter(adapter_name=adapter_name)
if direction:
qs = qs.filter(direction=direction)
if status:
qs = qs.filter(status=status)
return list(qs[:limit])