diff --git a/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue b/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue index cbc942fc..d98d2daa 100644 --- a/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue +++ b/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue @@ -264,7 +264,7 @@ const TREND_GROUPS = [ ] // V_VBDA_GAUGE 厚度曲线:4 个图,列名来自 DDL -// 厚度图纵轴显示实测/设定值百分比,速度图保持原单位 +// 厚度列是相对设定值的偏差百分比,图中以 100% 为目标值;速度图保持原单位 const GAUGE_COLS = [ { col: 'THICK0', title: '入口测厚仪 [%]' }, { col: 'THICK1', title: '1架出口厚度 [%]' }, @@ -313,14 +313,33 @@ function calcYRange(vals) { return { min: parseFloat((min - pad).toFixed(4)), max: parseFloat((max + pad).toFixed(4)) } } +/** + * 厚度百分比图专用纵轴范围:实测列在带头/带尾存在测厚仪不在带上的离群值 + * (可达 ±1000% 以上),直接用全量 min/max 会把纵轴撑爆, + * 导致实际值、目标值、上下限挤成几条横线无法分辨。 + * 这里对实测值取 2%~98% 分位数,再并入上下限/目标线所在区间。 + */ +function calcPercentRange(yVals, bandVals) { + const nums = yVals.filter(v => v != null && isFinite(Number(v))).map(Number).sort((a, b) => a - b) + const band = bandVals.filter(v => v != null && isFinite(Number(v))).map(Number) + if (!nums.length && !band.length) return {} + const lo = nums.length ? nums[Math.floor(nums.length * 0.02)] : Infinity + const hi = nums.length ? nums[Math.min(nums.length - 1, Math.ceil(nums.length * 0.98))] : -Infinity + const min = Math.min(lo, ...band) + const max = Math.max(hi, ...band) + const pad = (max - min) * 0.15 || Math.abs(max) * 0.2 || 1 + return { min: parseFloat((min - pad).toFixed(3)), max: parseFloat((max + pad).toFixed(3)) } +} + /** * 生成折线图 option。 * extras: [{ name, data, color, dash }] — 上下限或参考线 * yAxisSuffix: 纵轴标签后缀,如 '%' + * yRange: 可选 { min, max },不传则按全量数据自适应 */ -function makeLine(title, xData, yData, extras = [], yAxisSuffix = '') { +function makeLine(title, xData, yData, extras = [], yAxisSuffix = '', yRange = null) { const allVals = [yData, ...extras.map(e => e.data)].flat() - const range = calcYRange(allVals) + const range = yRange || calcYRange(allVals) const hasExtras = extras.length > 0 const mainSeries = { name: title, type: 'line', smooth: false, symbol: 'none', @@ -622,7 +641,7 @@ export default { }, // ── 厚度曲线 (V_VBDA_GAUGE) ────────────────── - // 有参考值的厚度图纵轴显示百分比:实测值 / 设定值 × 100 + // 厚度列为相对设定值的偏差百分比,纵轴以 100% 为目标值显示 renderGaugeCharts() { const rows = this.gaugeRows if (!rows || !rows.length) return @@ -635,12 +654,14 @@ export default { const refCol = refColMap[col] if (refCol) { - // ── 厚度图:转为百分比(实测 / 设定 × 100) ── + // ── 厚度图:THICKx 本身就是相对设定值的偏差百分比 ── + // 实测数据验证(卷 26061045000):THICK0≈-3.0 而 THICK0REF=3.0mm, + // 绝对厚度不可能为负,故 THICKx 是偏差%,纵轴画 100 + 偏差 const yData = rows.map(r => { const v = getRowVal(r, col) const rv = getRowVal(r, refCol) if (v == null || rv == null || rv === 0) return null - return parseFloat(((v / rv) * 100).toFixed(3)) + return parseFloat((100 + v).toFixed(3)) }) const extras = [] // 目标值恒为 100% @@ -648,24 +669,25 @@ export default { const rv = getRowVal(r, refCol) return (rv != null && rv !== 0) ? 100 : null }) - // 上限百分比 = (REF + TOPLIMIT) / REF × 100 + // TOPLIMIT/BOTLIMIT 同为偏差限百分比,且逐行变化 + // (头尾加减速段约 ±2.5%,稳态段收紧到约 ±1%),不是 mm 偏差量 const upData = rows.map(r => { const rv = getRowVal(r, refCol) const tl = getRowVal(r, 'TOPLIMIT') if (rv == null || rv === 0) return null - return parseFloat(((rv + (tl ?? 3)) / rv * 100).toFixed(3)) + return parseFloat((100 + (tl ?? 3)).toFixed(3)) }) - // 下限百分比 = (REF + BOTLIMIT) / REF × 100 const loData = rows.map(r => { const rv = getRowVal(r, refCol) const bl = getRowVal(r, 'BOTLIMIT') if (rv == null || rv === 0) return null - return parseFloat(((rv + (bl ?? -3)) / rv * 100).toFixed(3)) + return parseFloat((100 + (bl ?? -3)).toFixed(3)) }) if (refLine.some(v => v != null)) extras.push({ name: '目标值(100%)', data: refLine, color: '#909399', dash: false }) if (upData.some(v => v != null)) extras.push({ name: '上限', data: upData, color: '#F56C6C', dash: true }) if (loData.some(v => v != null)) extras.push({ name: '下限', data: loData, color: '#67C23A', dash: true }) - return this.makeChart(ref, makeLine(title, xData, yData, extras, '%')) + const yRange = calcPercentRange(yData, [...refLine, ...upData, ...loData]) + return this.makeChart(ref, makeLine(title, xData, yData, extras, '%', yRange)) } else { // ── 速度等无参考值的图:保持原始单位 ── const yData = rows.map(r => {