状态灯修复: waiting_relogin/qr_expired新增强制'等待扫码'黄灯(优先于进程判定,runner等扫码时进程活着但非运行); 未知状态如实显示不再误标已收工

This commit is contained in:
mzl92
2026-08-31 14:50:09 +08:00
parent a711b9d42c
commit fb865e40a6
2 changed files with 11 additions and 1 deletions
+9 -1
View File
@@ -339,13 +339,21 @@ app.get('/api/task-status', requireAuth, async (req, res) => {
let s = null;
try { s = JSON.parse(fs.readFileSync(path.join(stateDir, `state-${acct}.json`), 'utf8')); } catch (_) {}
const isAlive = alive(acct);
// 等待扫码优先于"进程活着=运行中": 登录过期时runner进程活着但只是在等扫码
if (s && s.date === bjToday && (s.status === 'waiting_relogin' || s.status === 'qr_expired')) {
out[acct] = {
state: 'waiting', text: '等待扫码',
detail: s.status === 'qr_expired' ? '二维码已过期,需重启任务' : (isAlive ? '登录过期,群里扫码后自动复工' : '扫码监听进程已退出,需人工处理'),
};
continue;
}
if (isAlive) { out[acct] = { state: 'running', text: '运行中', chatLeft: s && s.chatLeft }; continue; }
if (!s || s.date !== bjToday) { out[acct] = { state: 'idle', text: '今日未运行' }; continue; }
if (s.status === 'running') out[acct] = { state: 'stopped', text: '已停止', detail: '状态未更新(进程已退出)' };
else if (s.status === 'stopped_by_user') out[acct] = { state: 'stopped', text: '手动停止' };
else if (doneSet.has(s.status)) out[acct] = { state: 'done', text: '已收工', chatLeft: s.chatLeft };
else if (errSet.has(s.status)) out[acct] = { state: 'error', text: '异常停止', detail: s.status };
else out[acct] = { state: 'done', text: '已收工', chatLeft: s.chatLeft };
else out[acct] = { state: 'stopped', text: `已停止(${s.status})` }; // 未知状态如实显示,不再误标"已收工"
}
res.json(out);
});