mirror of
https://github.com/huge-dream/django-vue3-admin.git
synced 2026-09-26 22:31:19 +00:00
67 lines
2.2 KiB
Python
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])
|