后台同步任务超时后可覆盖启动,前端阻塞时显示提示而非静默隐藏
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1,13 +1,16 @@
|
|||||||
"""Data collector — fetch OHLCV from akshare and upsert into daily_bars."""
|
"""Data collector — fetch OHLCV from akshare and upsert into daily_bars."""
|
||||||
import threading
|
import threading
|
||||||
|
import time
|
||||||
from datetime import date
|
from datetime import date
|
||||||
from app.database import SessionLocal
|
from app.database import SessionLocal
|
||||||
from app.models import DailyBar, Contract
|
from app.models import DailyBar, Contract
|
||||||
from app.engine.lock_strategy import compute_amp_5d
|
from app.engine.lock_strategy import compute_amp_5d
|
||||||
|
|
||||||
_progress = {"running": False, "label": "", "done": 0, "total": 0, "result": 0, "finished": False, "error": ""}
|
_progress = {"running": False, "label": "", "done": 0, "total": 0, "result": 0, "finished": False, "error": "", "started_at": 0}
|
||||||
_lock = threading.Lock()
|
_lock = threading.Lock()
|
||||||
|
|
||||||
|
STALE_SECONDS = 120
|
||||||
|
|
||||||
|
|
||||||
def get_progress() -> dict:
|
def get_progress() -> dict:
|
||||||
with _lock:
|
with _lock:
|
||||||
@@ -16,9 +19,10 @@ def get_progress() -> dict:
|
|||||||
|
|
||||||
def _start_bg(target, label):
|
def _start_bg(target, label):
|
||||||
with _lock:
|
with _lock:
|
||||||
if _progress["running"]:
|
now = time.time()
|
||||||
|
if _progress["running"] and (now - _progress["started_at"]) < STALE_SECONDS:
|
||||||
return False
|
return False
|
||||||
_progress.update(running=True, finished=False, label=label, done=0, total=0, error="")
|
_progress.update(running=True, finished=False, label=label, done=0, total=0, error="", started_at=now)
|
||||||
|
|
||||||
def _run():
|
def _run():
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -265,7 +265,14 @@ function startSync(url) {
|
|||||||
fetch(url, { method: 'POST' })
|
fetch(url, { method: 'POST' })
|
||||||
.then(function(r) { return r.json(); })
|
.then(function(r) { return r.json(); })
|
||||||
.then(function(data) {
|
.then(function(data) {
|
||||||
if (!data.ok) { hideProgress(); return; }
|
if (!data.ok) {
|
||||||
|
document.getElementById('sync-progress-label').textContent = '已有同步任务进行中,请稍后再试';
|
||||||
|
document.getElementById('sync-progress-pct').textContent = '';
|
||||||
|
document.getElementById('sync-progress-bar').style.width = '0%';
|
||||||
|
document.getElementById('sync-progress').insertAdjacentHTML('beforeend',
|
||||||
|
'<button onclick="hideProgress()" style="display:block;margin-top:10px;padding:4px 14px;border:1px solid var(--border);border-radius:5px;background:var(--surface);color:var(--fg);cursor:pointer;font-size:0.8rem;">关闭</button>');
|
||||||
|
return;
|
||||||
|
}
|
||||||
syncTimer = setInterval(pollProgress, 500);
|
syncTimer = setInterval(pollProgress, 500);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user