Files
ecm_sync_system/sync_state_machine/domain/units/jsonl_handler.py
T
strepsiades 4a9c444b10 first commit
2026-03-09 16:31:42 +08:00

61 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Units Domain - JSONL Handler"""
import json
import re
from typing import List
from ...datasource import BaseJsonlHandler, JsonlDataSource
from .sync_node import UnitsSyncNode, SyncNode
from schemas.project_extensions.generator_unit import GeneratorUnitProject
class UnitsJsonlHandler(BaseJsonlHandler):
"""机组 JSONL Handler"""
def __init__(self, datasource: JsonlDataSource):
super().__init__(datasource, "units", UnitsSyncNode, GeneratorUnitProject)
async def load(self) -> List['SyncNode']:
"""加载机组数据(支持 generator_unit_N.jsonl 与 units_N.jsonl"""
nodes: List[SyncNode] = []
seen_ids: set[str] = set()
if not self.datasource.dir_path.exists():
return nodes
# 查找所有匹配的文件:generator_unit_N.jsonl 或 units_N.jsonl
patterns = (
re.compile(r"^generator_unit_\d+\.jsonl$"),
re.compile(r"^units_\d+\.jsonl$"),
)
for file_path in self.datasource.dir_path.iterdir():
if not any(pattern.match(file_path.name) for pattern in patterns):
continue
# 读取文件
with open(file_path, "r", encoding="utf-8") as f:
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
try:
item = json.loads(line)
item_id = self.extract_id(item)
if item_id and item_id in seen_ids:
continue
# 创建节点
node = self.create_node(item)
nodes.append(node)
# 同时加载到缓存
if item_id:
seen_ids.add(item_id)
bucket = self.datasource._data.setdefault(self.node_type, {})
bucket[item_id] = item
except json.JSONDecodeError as e:
print(f"Warning: Invalid JSON in {file_path.name}:{line_num}: {e}")
return nodes