56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
from ...sync_system.strategy import DefaultSyncStrategy
|
|
from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection
|
|
from schemas.supplier.supplier import SupplierDetailResponse
|
|
|
|
|
|
class SupplierSyncStrategy(DefaultSyncStrategy[SupplierDetailResponse]):
|
|
"""
|
|
Supplier 同步策略(基础数据,仅拉取)。
|
|
|
|
注意:Supplier 数据量大(约 60000 条),同步耗时较长。
|
|
建议通过 datasource.handler_configs 控制 handler 参数,例如:
|
|
- remote_datasource.handler_configs.supplier.load_mode = "persisted_only"
|
|
API handler 跳过远端拉取,仅使用持久化数据。
|
|
"""
|
|
|
|
schema = SupplierDetailResponse
|
|
|
|
default_config = StrategyConfig(
|
|
auto_bind=True,
|
|
auto_bind_fields=["credit_code"],
|
|
depend_fields={},
|
|
local_orphan_action=OrphanAction.NONE,
|
|
remote_orphan_action=OrphanAction.CREATE_LOCAL,
|
|
update_direction=UpdateDirection.PULL,
|
|
)
|
|
|
|
def _needs_update(
|
|
self,
|
|
source_node,
|
|
target_node,
|
|
resolved_data=None,
|
|
) -> bool:
|
|
"""Supplier 更新忽略 id 字段差异。"""
|
|
if resolved_data is None:
|
|
raise ValueError(f"[{self.node_type}] resolved_data is required for differential sync.")
|
|
|
|
source_data = resolved_data
|
|
target_data = target_node.get_data()
|
|
if source_data is None or target_data is None:
|
|
return False
|
|
|
|
is_different = False
|
|
diffs = []
|
|
for k, v1 in source_data.items():
|
|
if k == "id":
|
|
continue
|
|
v2 = target_data.get(k)
|
|
if v1 != v2:
|
|
is_different = True
|
|
diffs.append(f"{k}: {v1} != {v2}")
|
|
|
|
if is_different and diffs:
|
|
print(f" [DEBUG] [{self.node_type}] Node diff detected: {', '.join(diffs[:5])}")
|
|
|
|
return is_different
|