265 lines
19 KiB
HTML
265 lines
19 KiB
HTML
<!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="{"$preview":{"width":1440,"height":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>
|