持久化任务恢复
利用 localStorage 存储 task_id,即使页面意外刷新,onMounted 钩子也能自动找回进度并恢复轮询。
CoalBaseLayout.vue 是系统的“控制塔”。它负责收集复杂的化学动力学参数(如 NMR 结构参数、升温速率等),通过 WebSocket-like 轮询机制 监控后端高性能计算引擎状态,并处理计算结果的实时回填与可视化触发。
由于 CPD 动力学模拟涉及高阶微分方程组(ODE)的数值求解,耗时较长,组件采用了“提交-轮询-状态同步”的非阻塞架构。
持久化任务恢复
利用 localStorage 存储 task_id,即使页面意外刷新,onMounted 钩子也能自动找回进度并恢复轮询。
前端降采样保护
在提交至 Redis 消息队列前,对超过 400 点的实验曲线进行等间隔采样,防止网络拥塞与内存溢出。
多模态参数同步
支持理想升温(动力学模式)与实验曲线(使用表格模式)的动态切换,并实时同步 UI 状态至 Payload。
原子级状态回填
计算完成后,支持将后端优化的 13C NMR 参数自动回填至输入框,实现“分析-优化-再分析”的闭环。
JSON.parse(JSON.stringify()) 深拷贝,消除 Vue Proxy 对 Celery 序列化的干扰。/api/simulate,获取后端分发的唯一任务标识 task_id。/api/task_status 接口。startJobTimer 实时展示计算耗时,增强用户感知。simResult 并激活图表模块。/** * @description 保护性降采样:防止大数据量导致 Celery 任务序列化过载 */if (rawTable.length > 400) { const step = Math.ceil(rawTable.length / 400); const sampled = []; for (let i = 0; i < rawTable.length; i += step) { sampled.push(rawTable[i]); } // 关键:补偿逻辑,确保最后一个温度点(终温点)不丢失 const lastRow = rawTable[rawTable.length - 1]; if (JSON.stringify(sampled[sampled.length - 1]) !== JSON.stringify(lastRow)) { sampled.push(lastRow); } submitPayload.table_data = sampled;}/** * @description 状态机逻辑处理:处理 completed, error, processing 三种核心状态 */const startPolling = (taskId: string, token: string) => { pollTimer = window.setInterval(async () => { const statusRes = await axios.get(`/api/task_status/${taskId}`); const { status, result } = statusRes.data;
if (status === 'completed') { stopAllTimers(); // 数据回填:将后端建议的参数同步到 params 响应式对象 if (result?.data_front) Object.assign(params, result.data_front); showCharts.value = true; } // ... 错误处理逻辑 }, 2000);};/** * @description 挂载检查:解决“刷新即丢失”的痛点 */onMounted(() => { const savedTaskId = localStorage.getItem('pending_cpd_task_id'); if (savedTaskId) { // 自动进入“运行中”状态,并重新建立轮询链路 isRunning.value = true; startPolling(savedTaskId, token); }});组件内部维护了 20 余个物理参数,分为以下几个核心维度:
| 维度 | 参数示例 | 物理意义 |
|---|---|---|
| 结构参数 (NMR) | p0, c0, sigp1 | 煤结构的配位数、芳香分率等 |
| 动力学 (Kinetics) | ab, eb0, ag | 桥键断裂及气体析出的指前因子与活化能 |
| 工况 (Operation) | press_pa, kT, T_max | 环境压力、升温速率、最高温度 |