feat(追踪系统): 添加手动设置起始钢卷功能
- 后端添加设置起始钢卷API和钢卷查询API - 前端实现起始钢卷选择界面和状态管理 - 优化追踪逻辑自动加载后续钢卷 - 添加本地存储保持起始钢卷设置
This commit is contained in:
@@ -92,6 +92,8 @@ class OpcService:
|
||||
self.event_log: List[str] = []
|
||||
self._stop_event = asyncio.Event()
|
||||
self._task: Optional[asyncio.Task] = None
|
||||
self._need_fetch_next_batch: bool = False
|
||||
self._need_initial_load: bool = False
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
def _load_trackmap_nodes(self) -> Dict[str, str]:
|
||||
@@ -569,6 +571,32 @@ class OpcService:
|
||||
|
||||
return value
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
def set_manual_start_coil(self, coilid: str):
|
||||
"""Set manual starting coil ID for tracking and load initial coils.
|
||||
|
||||
Args:
|
||||
coilid: The coil ID to start tracking from
|
||||
"""
|
||||
self.first_coilid = coilid
|
||||
self.last_tracked_coilid = None
|
||||
self.end_coilid = None
|
||||
self.tracking_ended = False
|
||||
self.signal1_coils = []
|
||||
self._log(f"Manual start coil set to: {coilid}")
|
||||
|
||||
# Clear any existing temp track data
|
||||
try:
|
||||
from sqlite_sync import sqlite_clear_coil_track
|
||||
sqlite_clear_coil_track()
|
||||
self._log("Cleared temp track data for manual start")
|
||||
except Exception as exc:
|
||||
self._log(f"Failed to clear temp track data: {exc}")
|
||||
|
||||
# 标记需要自动读取起始钢卷(由外部调用_handle_signal1)
|
||||
self._need_initial_load = True
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
async def _handle_signal1(self):
|
||||
"""Handle signal1: fetch next 4 coils from Oracle PDI table and save to SQLite temp table."""
|
||||
from sqlite_sync import sqlite_save_coils_to_track, sqlite_clear_coil_track
|
||||
@@ -663,7 +691,12 @@ class OpcService:
|
||||
|
||||
self.last_tracked_coilid = coils[0]["coilid"]
|
||||
|
||||
self._log(f"Signal1: Saved {len(coils)} coils, next_start: {self.first_coilid}, last_tracked: {self.last_tracked_coilid}")
|
||||
# 详细日志:显示当前读取的4个钢卷信息
|
||||
coil_details = []
|
||||
for i, coil in enumerate(coils):
|
||||
coil_details.append(f"pos{i+1}:{coil['coilid']}(seq:{coil['sequencenb']})")
|
||||
|
||||
self._log(f"Signal1: Saved {len(coils)} coils [{', '.join(coil_details)}], next_start: {self.first_coilid}, last_tracked: {self.last_tracked_coilid}")
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
await loop.run_in_executor(None, _do_fetch)
|
||||
@@ -760,7 +793,7 @@ class OpcService:
|
||||
conn.commit()
|
||||
self._log(f"Signal2: Updated 4 positions (coils: {coil_count})")
|
||||
|
||||
# 检查是否还有更多钢卷可以追踪
|
||||
# 检查是否还有更多钢卷可以追踪,如果有则自动读取下一批
|
||||
self._log(f"Signal2: Checking remaining coils, first_coilid={repr(self.first_coilid)}")
|
||||
|
||||
if self.first_coilid:
|
||||
@@ -779,15 +812,10 @@ class OpcService:
|
||||
self.last_tracked_coilid = self.first_coilid
|
||||
self.tracking_ended = True
|
||||
self._log(f"Signal2: No more coils, tracking ended, end_coilid={self.end_coilid}")
|
||||
elif remaining_count >= 2:
|
||||
# 有2个以上钢卷,保持 first_coilid 不变,让 Signal1 处理
|
||||
self._log(f"Signal2: >=2 coils remain, first_coilid unchanged, waiting for Signal1")
|
||||
else:
|
||||
# 只有一个钢卷时先展示为“7(1个)”,下一次重复信号再清空到 NULL
|
||||
self._log(
|
||||
f"Signal2: One coil remains ({all_remaining[0][0]}), "
|
||||
"waiting one more cycle before final clear"
|
||||
)
|
||||
# 还有钢卷,标记需要自动读取下一批
|
||||
self._log(f"Signal2: Will auto-trigger Signal1 logic to fetch next batch of coils")
|
||||
self._need_fetch_next_batch = True
|
||||
except Exception as exc:
|
||||
self._log(f"Signal2: Check next coils failed: {exc}")
|
||||
finally:
|
||||
@@ -800,6 +828,15 @@ class OpcService:
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
await loop.run_in_executor(None, _do_update)
|
||||
|
||||
# 如果标记需要读取下一批,则调用Signal1的逻辑
|
||||
if hasattr(self, '_need_fetch_next_batch') and self._need_fetch_next_batch:
|
||||
self._need_fetch_next_batch = False
|
||||
try:
|
||||
await self._handle_signal1()
|
||||
self._log("Signal2: Successfully fetched next batch of coils")
|
||||
except Exception as exc:
|
||||
self._log(f"Signal2: Failed to fetch next batch: {exc}")
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
async def _update_oracle(self, position: Any, data: Dict[str, Any]):
|
||||
|
||||
Reference in New Issue
Block a user