_ops_rebuild.mjs 1.6 KB

12345678910111213141516171819202122232425262728293031323334
  1. // P92-4:触发 /ops/api/rebuild(等同控制台「执行重算」)→ 轮询 /ops/api/state 与 /api/fleet 直到数据恢复
  2. const GW = 'http://106.120.102.238:28084'
  3. const t0 = Date.now()
  4. const stamp = () => ((Date.now() - t0) / 1000).toFixed(0).padStart(4) + 's'
  5. async function post(path, body) {
  6. const r = await fetch(GW + path, {
  7. method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body || {}),
  8. })
  9. const txt = await r.text()
  10. return { status: r.status, txt: txt.slice(0, 200) }
  11. }
  12. async function get(path) {
  13. try { const r = await fetch(GW + path); const b = await r.text(); return { status: r.status, len: b.length, txt: b } }
  14. catch (e) { return { status: 0, len: 0, txt: String(e) } }
  15. }
  16. console.log(stamp() + ' 前:/api/fleet ->', (await get('/api/fleet')).status)
  17. const before = await get('/ops/api/state')
  18. let st = null
  19. try { st = JSON.parse(before.txt) } catch { /* ignore */ }
  20. console.log(stamp() + ' 触发 rebuild:', JSON.stringify(await post('/ops/api/rebuild', { skip_scada: true, with_verify: false })))
  21. let ok = false
  22. for (let i = 0; i < 80; i++) {
  23. await new Promise((r) => setTimeout(r, 15000))
  24. const f = await get('/api/fleet')
  25. const s = await get('/ops/api/state')
  26. let busy = '?'
  27. try { const j = JSON.parse(s.txt); busy = JSON.stringify(j.running ?? j.busy ?? j.rebuild ?? '-') } catch { /* ignore */ }
  28. console.log(stamp() + ' fleet=' + f.status + '(' + f.len + 'B) state=' + s.status + ' busy=' + busy)
  29. if (f.status === 200 && f.len > 50000) { ok = true; break }
  30. }
  31. console.log(stamp() + ' 结论: ' + (ok ? '数据已恢复 ✓(可以复跑判据)' : '仍未恢复 ✗'))