Files
yuanshuai c91a64fddb
CI / Python 3.12 (push) Waiting to run
CI / Python 3.9 (push) Waiting to run
chore(repo): initialize team collaboration repository
2026-07-27 20:40:12 +08:00

265 lines
19 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="stylesheet" href="_ds/industry-22c874fd-9888-4e99-8234-d60d39b3d719/styles.css">
<script src="_ds/industry-22c874fd-9888-4e99-8234-d60d39b3d719/_ds_bundle.js"></script>
<style>
body{margin:0;background:#f2f2f3;min-width:1280px}
*{scrollbar-width:thin;scrollbar-color:var(--color-accent-300) transparent}
a{color:#5980a6}a:hover{color:#416180}
@keyframes omIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes omScan{to{background-position:28px 0}}
@keyframes omDraw{to{stroke-dashoffset:0}}
@keyframes omGrow{from{width:0}}
@keyframes omPulse{0%,100%{opacity:1}50%{opacity:.3}}
</style>
</helmet>
<dc-import name="ConsoleNav" active="tasks" hint-size="100%,92px"></dc-import>
<div data-screen-label="任务中心" style="max-width:1400px;margin:0 auto;padding:22px 24px 64px;font-family:var(--font-body);animation:omIn .5s cubic-bezier(.2,.7,.2,1) both">
<div style="display:flex;align-items:flex-end;gap:16px;margin-bottom:18px">
<div>
<div style="font-size:10px;letter-spacing:.18em;color:var(--color-accent-700);font-weight:500">02 · TASKS</div>
<h2 style="margin:2px 0 0;font-size:30px">任务中心</h2>
<div class="text-muted" style="font-size:12.5px;margin-top:2px">创建 · 队列 · 预约 · 破坏性任务必须绑定允许的 DUT 序列号</div>
</div>
<span style="margin-left:auto"></span>
<span class="tag tag-neutral">运行 2</span>
<span class="tag tag-neutral">队列 3</span>
<span class="tag tag-neutral">今日完成 4</span>
</div>
<div class="card blueprint" style-hover="border-color:var(--color-accent-400);box-shadow:var(--shadow-sm)" style="transition:border-color .15s ease,box-shadow .15s ease;padding:0;gap:0;margin-bottom:20px">
<i class="corner tl"></i><i class="corner tr"></i><i class="corner bl"></i><i class="corner br"></i>
<div style="display:flex;align-items:center;gap:10px;padding:12px 18px;border-bottom:1px solid var(--color-divider)">
<h5 style="margin:0;letter-spacing:.03em">创建任务 · NEW RUN</h5>
<span class="text-muted" style="font-size:11.5px">固件 A/B 循环回归</span>
<span style="margin-left:auto;font-family:ui-monospace,Menlo,monospace;font-size:10px;color:var(--color-neutral-500)">工作流签名 8e02…c4 · 已审核 v3</span>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr 1.15fr">
<div style="padding:16px 18px;border-right:1px solid var(--color-divider)">
<div style="display:flex;align-items:baseline;gap:8px;margin-bottom:12px"><span style="font-family:var(--font-heading);font-weight:600;font-size:22px;color:var(--color-accent-700)">01</span><span style="font-size:10.5px;letter-spacing:.14em;color:var(--color-neutral-600)">资产绑定</span></div>
<div class="field" style="margin-bottom:10px"><label>测试主机</label>
<select class="input" style="font-size:13px"><option>WS-05 · HOST-A03 · Win11 22631</option><option>WS-04 · HOST-L01 · Ubuntu 22.04</option></select>
</div>
<div class="field" style="margin-bottom:10px"><label>DUT(被测设备)</label>
<select class="input" style="font-size:13px"><option>SAMPLE-006 · NV-E1T92 · 1.92TB U.2</option><option>SAMPLE-003 · NV-E960 · 960GB M.2</option></select>
</div>
<div style="border:1px solid var(--color-divider);padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:10.5px;line-height:1.8;color:var(--color-neutral-700)">SN S6XNNA0T609 · 允许破坏性写入<br>P/E 磨损 12% · 生命周期 测试专用<br>带外 OOB-05 已配对 ✓</div>
</div>
<div style="padding:16px 18px;border-right:1px solid var(--color-divider)">
<div style="display:flex;align-items:baseline;gap:8px;margin-bottom:12px"><span style="font-family:var(--font-heading);font-weight:600;font-size:22px;color:var(--color-accent-700)">02</span><span style="font-size:10.5px;letter-spacing:.14em;color:var(--color-neutral-600)">固件 A / B</span></div>
<div class="field" style="margin-bottom:10px"><label>固件 A · 基线</label>
<select class="input" style="font-size:13px"><option>FW_3.2.1 · 已审批</option><option>FW_3.1.9 · 已审批</option></select>
</div>
<div class="field" style="margin-bottom:10px"><label>固件 B · 候选</label>
<select class="input" style="font-size:13px"><option>FW_3.3.0-rc3 · 待审批</option><option>FW_3.3.0-rc2 · 已审批</option></select>
</div>
<div style="border:1px solid var(--color-divider);padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:10.5px;line-height:1.8;color:var(--color-neutral-700)">A sha256 4bd1…08ce ✓<br>B sha256 9f2c…41aa ✓<br><span style="color:#8a2e22">B 尚未审批 — 启动前需固件负责人批准</span></div>
</div>
<div style="padding:16px 18px;border-right:1px solid var(--color-divider)">
<div style="display:flex;align-items:baseline;gap:8px;margin-bottom:12px"><span style="font-family:var(--font-heading);font-weight:600;font-size:22px;color:var(--color-accent-700)">03</span><span style="font-size:10.5px;letter-spacing:.14em;color:var(--color-neutral-600)">模板与参数</span></div>
<div class="field" style="margin-bottom:10px"><label>工作流模板(已审核)</label>
<select class="input" style="font-size:13px"><option>fw_ab_powerstate_regression · v3</option><option>fw_coldboot_matrix · v2</option><option>fw_retention_72h · v1</option></select>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:10px">
<div class="field"><label>循环次数</label><input class="input" value="100" style="font-size:13px"></div>
<div class="field"><label>检查点间隔</label><select class="input" style="font-size:13px"><option>每循环</option><option>每 5 循环</option></select></div>
</div>
<div class="field" style="margin-bottom:10px"><label>失败重试策略</label>
<select class="input" style="font-size:13px"><option>esc-default-v2 · 分级恢复,破坏性步骤不自动重试</option><option>conservative · 任何失败即安全停止</option></select>
</div>
<div class="field"><label>报告接收人</label><input class="input" value="fw-team@corp, lab-lead@corp" style="font-size:13px"></div>
</div>
<div style="padding:16px 18px;background:var(--color-neutral-100)">
<div style="display:flex;align-items:baseline;gap:8px;margin-bottom:12px"><span style="font-family:var(--font-heading);font-weight:600;font-size:22px;color:var(--color-accent-700)">04</span><span style="font-size:10.5px;letter-spacing:.14em;color:var(--color-neutral-600)">安全与预检</span></div>
<label style="display:flex;gap:9px;align-items:flex-start;font-size:12.5px;margin-bottom:8px;cursor:pointer"><input type="checkbox" checked style="accent-color:#5980a6;margin-top:2px"><span>允许破坏性写入(覆盖数据区)<br><span style="font-family:ui-monospace,Menlo,monospace;font-size:10px;color:var(--color-neutral-600)">allowed_dut_serials: ["S6XNNA0T609"]</span></span></label>
<label style="display:flex;gap:9px;align-items:center;font-size:12.5px;margin-bottom:12px;cursor:pointer"><input type="checkbox" checked style="accent-color:#5980a6"><span>系统盘保护已启用 · 非白名单序列号拒绝写入</span></label>
<div style="border:1px solid var(--color-divider);background:var(--color-bg);padding:10px 12px;margin-bottom:12px">
<div style="display:flex;align-items:center;margin-bottom:6px"><span style="font-size:10px;letter-spacing:.12em;color:var(--color-neutral-600)">环境预检 · PRECHECK</span><span style="margin-left:auto;font-family:ui-monospace,Menlo,monospace;font-size:10px;color:{{ pcColor }}">{{ pcNote }}</span></div>
<div style="display:flex;flex-direction:column;font-family:ui-monospace,Menlo,monospace;font-size:11px">
<sc-for list="{{ checks }}" as="ck" hint-placeholder-count="6">
<div style="display:flex;gap:8px;align-items:center;padding:3.5px 0"><span style="{{ ck.iconStyle }}">{{ ck.icon }}</span><span style="{{ ck.txtStyle }}">{{ ck.name }}</span><span style="margin-left:auto;color:var(--color-neutral-500);font-size:10px">{{ ck.note }}</span></div>
</sc-for>
</div>
</div>
<sc-if value="{{ started }}" hint-placeholder-val="{{ false }}">
<div style="border:1px solid var(--color-accent-600);background:var(--color-accent-100);color:var(--color-accent-800);padding:9px 12px;font-size:12.5px;margin-bottom:10px">✓ 已入队 <span style="font-family:ui-monospace,Menlo,monospace">{{ startedRun }}</span> · WS-05 · 正在执行 · <a href="LiveRun.dc.html">跟踪 →</a></div>
</sc-if>
<div style="display:flex;gap:10px">
<button class="btn btn-secondary" onClick="{{ runPrecheck }}" disabled="{{ pcBusy }}" style="flex:1">运行预检</button>
<button class="btn btn-primary" onClick="{{ start }}" disabled="{{ startDisabled }}" style="flex:1.4;gap:7px">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polygon points="6 3 20 12 6 21 6 3"></polygon></svg>
启动 / 预约任务
</button>
</div>
</div>
</div>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:18px;align-items:start">
<div class="card blueprint" style-hover="border-color:var(--color-accent-400);box-shadow:var(--shadow-sm)" style="transition:border-color .15s ease,box-shadow .15s ease;padding:14px 16px;gap:8px">
<i class="corner tl"></i><i class="corner tr"></i><i class="corner bl"></i><i class="corner br"></i>
<div style="display:flex;align-items:center"><h6 style="margin:0;color:var(--color-neutral-700)">队列 · QUEUE 3</h6><span style="margin-left:auto;font-size:10.5px;color:var(--color-neutral-500)">调度策略:优先级 + 维护窗口避让</span></div>
<table class="table">
<thead><tr><th></th><th>任务</th><th>工位 / DUT</th><th>计划</th><th>状态</th><th></th></tr></thead>
<tbody>
<tr>
<td><span class="tag tag-accent">P1</span></td>
<td><div style="font-size:12.5px">fw_coldboot_matrix · 500 次冷启动</div><div style="font-family:ui-monospace,Menlo,monospace;font-size:10px;color:var(--color-neutral-500)">FW_3.3.0-rc2(B)</div></td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">WS-05 · SAMPLE-006</td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">今日 22:00</td>
<td><span class="tag tag-outline">已预约</span></td>
<td><button class="btn btn-ghost" style="font-size:11.5px">取消</button></td>
</tr>
<tr>
<td><span class="tag tag-neutral">P2</span></td>
<td><div style="font-size:12.5px">fw_ab 从检查点续跑 · cycle 41→100</div><div style="font-family:ui-monospace,Menlo,monospace;font-size:10px;color:var(--color-neutral-500)">FW_3.3.0-rc2(B)</div></td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">WS-03 · SAMPLE-002</td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">恢复后自动</td>
<td><span style="font-size:10.5px;padding:3px 9px;background:var(--color-accent-200);color:var(--color-accent-800);animation:omPulse 1.4s infinite">等待恢复</span></td>
<td><button class="btn btn-ghost" style="font-size:11.5px">改期</button></td>
</tr>
<tr>
<td><span class="tag tag-neutral">P3</span></td>
<td><div style="font-size:12.5px">incoming_qc_quick · 来料抽检 12 盘</div><div style="font-family:ui-monospace,Menlo,monospace;font-size:10px;color:var(--color-neutral-500)">批次 B2607-11</div></td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">WS-04 · 批量</td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">明日 06:00</td>
<td><span class="tag tag-outline">已预约</span></td>
<td><button class="btn btn-ghost" style="font-size:11.5px">改期</button></td>
</tr>
</tbody>
</table>
</div>
<div class="card blueprint" style-hover="border-color:var(--color-accent-400);box-shadow:var(--shadow-sm)" style="transition:border-color .15s ease,box-shadow .15s ease;padding:14px 16px;gap:8px">
<i class="corner tl"></i><i class="corner tr"></i><i class="corner bl"></i><i class="corner br"></i>
<div style="display:flex;align-items:center"><h6 style="margin:0;color:var(--color-neutral-700)">最近完成 · RECENT</h6><a href="Compare.dc.html" style="margin-left:auto;font-size:11.5px">全部报告 →</a></div>
<table class="table">
<thead><tr><th>RUN</th><th>模板</th><th>结果</th><th>循环</th><th>介入</th><th>报告</th></tr></thead>
<tbody>
<tr>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11.5px">run-…0726-0007</td>
<td style="font-size:12.5px">fw_ab_powerstate</td>
<td><span style="font-family:ui-monospace,Menlo,monospace;font-size:10px;padding:2px 8px;background:var(--color-accent-800);color:#f2f2f3">FAILED_DUT</span></td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">97/100</td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">1</td>
<td><a href="Evidence.dc.html" style="font-size:12px">证据</a> · <a href="Compare.dc.html" style="font-size:12px">A/B</a></td>
</tr>
<tr>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11.5px">run-…0726-0011</td>
<td style="font-size:12.5px">fw_retention_72h 段2</td>
<td><span style="font-family:ui-monospace,Menlo,monospace;font-size:10px;padding:2px 8px;border:1px dashed var(--color-neutral-500);color:var(--color-neutral-700)">UNKNOWN</span></td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">50/50</td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">0</td>
<td><a href="Evidence.dc.html" style="font-size:12px">证据</a></td>
</tr>
<tr>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11.5px">run-…0725-0003</td>
<td style="font-size:12.5px">fw_ab_powerstate</td>
<td><span style="font-family:ui-monospace,Menlo,monospace;font-size:10px;padding:2px 8px;border:1px solid var(--color-accent-400);color:var(--color-accent-700)">PASSED</span></td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">100/100</td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">0</td>
<td><a href="Compare.dc.html" style="font-size:12px">A/B</a></td>
</tr>
<tr>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11.5px">run-…0725-0018</td>
<td style="font-size:12.5px">fw_coldboot_matrix</td>
<td><span style="font-family:ui-monospace,Menlo,monospace;font-size:10px;padding:2px 8px;background:repeating-linear-gradient(135deg,rgba(29,31,32,.12) 0 2px,transparent 2px 5px);border:1px solid var(--color-divider);color:var(--color-neutral-800)">FAILED_INFRA</span></td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">88/100</td>
<td style="font-family:ui-monospace,Menlo,monospace;font-size:11px">0</td>
<td><a href="Evidence.dc.html" style="font-size:12px">证据</a></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props="{&quot;$preview&quot;:{&quot;width&quot;:1440,&quot;height&quot;:920}}">
class Component extends DCLogic {
state = { checks: Array(6).fill('idle'), pc: 'idle', started: false, startedRun: '', error: '' };
_names = [
{ name: 'DUT 序列号白名单绑定', note: 'S6XNNA0T609' },
{ name: '系统盘 / 分区保护', note: '启动盘已排除' },
{ name: '磁盘空间 · 日志目录', note: '812G 可用' },
{ name: '带外控制器 OOB-05', note: 'Power/Reset/温度' },
{ name: '工具链版本 · 许可证', note: 'fio 3.36 · nvme-cli 2.9.1' },
{ name: '时间同步 · 网络', note: 'NTP 偏差 4ms' }
];
async runPrecheck() {
if (this.state.pc === 'running') return;
this.setState({ checks: Array(6).fill('run'), pc: 'running', started: false, error: '' });
try {
const response = await fetch('/api/v1/preflight', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: '{}'
});
if (!response.ok) throw new Error('预检服务返回 ' + response.status);
const result = await response.json();
this._names = result.checks.map(c => ({ name: c.name, note: c.note }));
this.setState({
checks: result.checks.map(c => c.passed ? 'ok' : 'bad'),
pc: result.passed ? 'done' : 'failed'
});
} catch (error) {
this.setState({ checks: Array(6).fill('bad'), pc: 'failed', error: error.message || 'API 不可用' });
}
}
async start() {
if (this.state.pc !== 'done' || this.state.started) return;
this.setState({ started: true, error: '' });
try {
const response = await fetch('/api/v1/runs', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ loops: 8, inject_failure: true, created_by: 'console' })
});
if (!response.ok) throw new Error('创建任务失败: ' + response.status);
const run = await response.json();
localStorage.setItem('flashops.activeRunId', run.id);
this.setState({ startedRun: run.id });
} catch (error) {
this.setState({ started: false, error: error.message || '任务创建失败' });
}
}
renderVals() {
const mono = { fontFamily: 'ui-monospace,Menlo,monospace' };
const checks = this._names.map((n, i) => {
const st = this.state.checks[i];
return {
...n,
icon: st === 'ok' ? '✓' : st === 'bad' ? '×' : st === 'run' ? '●' : '·',
iconStyle: { width: '14px', textAlign: 'center', color: st === 'ok' ? 'var(--color-accent-700)' : st === 'bad' ? '#8a2e22' : st === 'run' ? 'var(--color-accent)' : 'var(--color-neutral-400)', animation: st === 'run' ? 'omPulse .8s infinite' : 'none' },
txtStyle: { color: st === 'idle' ? 'var(--color-neutral-500)' : 'var(--color-text)' }
};
});
const pc = this.state.pc;
return {
checks,
pcBusy: pc === 'running',
pcNote: pc === 'idle' ? '未运行' : pc === 'running' ? '检查中…' : pc === 'done' ? '6/6 通过 · API 已确认' : (this.state.error || '存在阻断项'),
pcColor: pc === 'done' ? 'var(--color-accent-700)' : 'var(--color-neutral-500)',
startDisabled: pc !== 'done' || this.state.started,
started: this.state.started,
startedRun: this.state.startedRun || '正在分配…',
runPrecheck: () => this.runPrecheck(),
start: () => this.start()
};
}
}
</script>
</body>
</html>