解决了部分detail load效率问题和load失败终止pipeline问题
This commit is contained in:
@@ -17,26 +17,53 @@ from schemas.contract_settlement.contract_settlement_detail import (
|
||||
ContractSettlementDetailCreate,
|
||||
ContractSettlementDetailUpdate
|
||||
)
|
||||
from ..project.api_handler import ProjectApiHandler
|
||||
|
||||
|
||||
class ContractSettlementDetailApiHandler(BaseApiHandler):
|
||||
"""合同结算明细 API Handler"""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
def __init__(self, **handler_config: Any):
|
||||
super().__init__(**handler_config)
|
||||
self._node_type = "contract_settlement_detail"
|
||||
self._node_class = ContractSettlementDetailSyncNode
|
||||
self._schema = ContractSettlementDetailResponse
|
||||
self.update_schemas = [ContractSettlementDetailCreate, ContractSettlementDetailUpdate]
|
||||
|
||||
async def load(self) -> List[SyncNode]:
|
||||
"""加载合同结算明细列表(依赖 ContractSettlement)"""
|
||||
|
||||
def _use_aggregate_load(self) -> bool:
|
||||
return str(self.handler_config.get("load_method", "legacy")).lower() == "aggregate"
|
||||
|
||||
async def _load_via_project_aggregate(self) -> List[SyncNode]:
|
||||
projects = self._collection.filter(node_type="project")
|
||||
project_ids = [project.data_id for project in projects if project.data_id]
|
||||
if not project_ids:
|
||||
return []
|
||||
|
||||
all_details: List[SyncNode] = []
|
||||
aggregate_limit = int(self.handler_config.get("aggregate_limit", 10000))
|
||||
for project_id in project_ids:
|
||||
aggregate = await ProjectApiHandler.get_aggregate(
|
||||
self.api_client,
|
||||
project_id,
|
||||
domains=["contract_settlement_details"],
|
||||
limit=aggregate_limit,
|
||||
)
|
||||
truncated = set(aggregate.get("meta", {}).get("truncated_domains", []))
|
||||
if "contract_settlement_details" in truncated:
|
||||
raise RuntimeError(
|
||||
f"project aggregate truncated domain contract_settlement_details for project {project_id}"
|
||||
)
|
||||
for detail_data in aggregate.get("data", {}).get("contract_settlement_details", []):
|
||||
all_details.append(self._create_node(dict(detail_data)))
|
||||
return all_details
|
||||
|
||||
async def _load_via_legacy_list(self) -> List[SyncNode]:
|
||||
settlements = self._collection.filter(node_type="contract_settlement")
|
||||
settlement_ids = [s.data_id for s in settlements if s.data_id]
|
||||
|
||||
|
||||
if not settlement_ids:
|
||||
return []
|
||||
|
||||
|
||||
all_details = []
|
||||
for settlement_id in settlement_ids:
|
||||
try:
|
||||
@@ -46,9 +73,15 @@ class ContractSettlementDetailApiHandler(BaseApiHandler):
|
||||
all_details.append(self._create_node(detail_data))
|
||||
except Exception as e:
|
||||
print(f"❌ Failed to load settlement details for {settlement_id}: {e}")
|
||||
|
||||
|
||||
return all_details
|
||||
|
||||
async def load(self) -> List[SyncNode]:
|
||||
"""加载合同结算明细列表(依赖 ContractSettlement)"""
|
||||
if self._use_aggregate_load():
|
||||
return await self._load_via_project_aggregate()
|
||||
return await self._load_via_legacy_list()
|
||||
|
||||
async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]:
|
||||
"""批量创建合同结算明细"""
|
||||
from pydantic import ValidationError
|
||||
|
||||
Reference in New Issue
Block a user