feat: 自动化增加起止时间 + 本轮每次测试明细表
- 显示自动化开始/结束时间 - 测试信息区新增本轮测试明细表(序号、状态、关键字段) - 方便对照平均值是否计算正确
This commit is contained in:
@@ -251,6 +251,27 @@ def get_automation_averages(dnt_id: int, since: str = None) -> dict:
|
||||
return {}
|
||||
|
||||
|
||||
def get_automation_records(dnt_id: int, since: str) -> list[dict]:
|
||||
"""获取本轮自动化测试的所有记录(含 serialnet 状态)"""
|
||||
conn = get_conn()
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"SELECT t.*, sn.state as sn_state "
|
||||
"FROM tb_state_tst t "
|
||||
"LEFT JOIN tb_serialnet sn ON sn.dnt_id = t.dnt_id "
|
||||
" AND sn.state IN (2,3) "
|
||||
" AND sn.update_time >= t.create_time "
|
||||
" AND sn.update_time < DATE_ADD(t.create_time, INTERVAL 1 SECOND) "
|
||||
"WHERE t.dnt_id=%s AND t.create_time >= %s "
|
||||
"ORDER BY t.id ASC",
|
||||
(dnt_id, since),
|
||||
)
|
||||
return cur.fetchall()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
# ─── 用户管理 ──────────────────────────────────────────────────────
|
||||
|
||||
def get_user_by_username(username: str) -> dict | None:
|
||||
|
||||
@@ -8,6 +8,7 @@ from app.models import (
|
||||
get_serialnet_stats,
|
||||
get_latest_test_state,
|
||||
get_automation_averages,
|
||||
get_automation_records,
|
||||
clear_serialnet_records,
|
||||
insert_log,
|
||||
)
|
||||
@@ -116,8 +117,10 @@ def api_automation_progress(dnt_id):
|
||||
stats = get_serialnet_stats(dnt_id)
|
||||
latest = get_latest_test_state(dnt_id)
|
||||
averages = get_automation_averages(dnt_id, since if since else None)
|
||||
records = get_automation_records(dnt_id, since) if since else []
|
||||
return jsonify({
|
||||
"stats": stats,
|
||||
"latest": latest,
|
||||
"averages": averages,
|
||||
"records": records,
|
||||
})
|
||||
|
||||
@@ -50,6 +50,11 @@ async function startAuto() {
|
||||
autoRemaining = count;
|
||||
autoStartTime = new Date().toISOString(); // 记录开始时间
|
||||
|
||||
// 显示开始时间
|
||||
document.getElementById("auto-time").style.display = "block";
|
||||
document.getElementById("time-start").textContent = new Date().toLocaleString();
|
||||
document.getElementById("time-end").textContent = "-";
|
||||
|
||||
// 清空显示
|
||||
resetAverages();
|
||||
document.getElementById("latest-result").innerHTML = '<p class="placeholder">等待测试...</p>';
|
||||
@@ -59,6 +64,10 @@ async function startAuto() {
|
||||
document.getElementById("stat-failed").textContent = "0";
|
||||
document.getElementById("stat-remaining").textContent = count;
|
||||
|
||||
// 清空测试明细
|
||||
document.querySelector("#records-table tbody").innerHTML = "";
|
||||
document.getElementById("records-empty").style.display = "block";
|
||||
|
||||
const btn = document.getElementById("btn-auto");
|
||||
btn.textContent = "结束";
|
||||
btn.className = "btn-stop";
|
||||
@@ -88,6 +97,8 @@ function stopAuto() {
|
||||
autoRunning = false;
|
||||
clearInterval(pollInterval);
|
||||
pollInterval = null;
|
||||
// 记录结束时间
|
||||
document.getElementById("time-end").textContent = new Date().toLocaleString();
|
||||
// 清除所有超时计时器
|
||||
for (const id in timeoutTimers) {
|
||||
clearTimeout(timeoutTimers[id]);
|
||||
@@ -125,6 +136,11 @@ async function pollProgress() {
|
||||
renderAverages(data.averages);
|
||||
}
|
||||
|
||||
// 显示本轮测试明细
|
||||
if (data.records) {
|
||||
renderRecords(data.records);
|
||||
}
|
||||
|
||||
// 自动插入下一条 0xB0
|
||||
if (autoRemaining > 0) {
|
||||
// 检查是否还有 pending 的记录,没有则插入新的
|
||||
@@ -216,3 +232,31 @@ function resetAverages() {
|
||||
document.getElementById("avg-" + id).textContent = "-";
|
||||
});
|
||||
}
|
||||
|
||||
// ─── 显示本轮测试明细 ──────────────────────────
|
||||
|
||||
function renderRecords(records) {
|
||||
if (!records || !records.length) {
|
||||
document.getElementById("records-empty").style.display = "block";
|
||||
document.getElementById("records-table").style.display = "none";
|
||||
return;
|
||||
}
|
||||
document.getElementById("records-empty").style.display = "none";
|
||||
document.getElementById("records-table").style.display = "";
|
||||
|
||||
const tbody = document.querySelector("#records-table tbody");
|
||||
tbody.innerHTML = records.map((r, i) => `
|
||||
<tr>
|
||||
<td>${i + 1}</td>
|
||||
<td style="color:${r.sn_state === 2 ? '#27ae60' : r.sn_state === 3 ? '#e74c3c' : '#888'}">
|
||||
${r.sn_state === 2 ? 'OK' : r.sn_state === 3 ? '超时' : '?'}
|
||||
</td>
|
||||
<td>${r.ppvalue?.toFixed(2) || '-'}</td>
|
||||
<td>${r.idle_freq || '-'}</td>
|
||||
<td>${r.enter_dist || '-'}</td>
|
||||
<td>${r.exit_dist || '-'}</td>
|
||||
<td>${toSpeed(r.enter_speed)}</td>
|
||||
<td>${r.create_time || '-'}</td>
|
||||
</tr>
|
||||
`).join("");
|
||||
}
|
||||
|
||||
@@ -36,6 +36,9 @@
|
||||
<span>失败:<strong id="stat-failed">0</strong></span>
|
||||
<span>剩余:<strong id="stat-remaining">0</strong></span>
|
||||
</div>
|
||||
<div class="auto-time" id="auto-time" style="display:none;margin-top:8px;font-size:12px;color:#888;">
|
||||
开始:<span id="time-start">-</span> 结束:<span id="time-end">-</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -56,6 +59,19 @@
|
||||
<tr><td>平均进入速度</td><td id="avg-enter-speed">-</td><td>m/s</td></tr>
|
||||
<tr><td>平均离开速度</td><td id="avg-exit-speed">-</td><td>m/s</td></tr>
|
||||
</table>
|
||||
|
||||
<h3 style="margin-top:20px;">本轮测试明细</h3>
|
||||
<div id="records-container" style="max-height:400px;overflow-y:auto;">
|
||||
<table id="records-table" style="font-size:11px;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th><th>串口状态</th><th>峰峰值(V)</th><th>开始频率</th><th>进入距离</th><th>离开距离</th><th>速度(m/s)</th><th>时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
<p id="records-empty" class="placeholder">暂无记录</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user