You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuetify表格中动态计算的Cpk值无法渲染问题求助

问题描述

我正在渲染一个包含多组数据的表格,其中仅Cpk值需要手动计算获取,是唯一需要动态更新的字段。我尝试用计算属性实现Cpk的计算,但表格始终无法渲染出Cpk值。相关代码如下:

<template>
    <v-container>
        <v-data-table
            :headers="headers"
            :items="processes"
            class="elevation-1"
        >
            <template #[`item.cpk`]="{ item }">
                <v-chip
                    :color="getColor(item.cpk)"
                    dark
                >
                    {{ item.cpk }}
                </v-chip>
            </template>
        </v-data-table>
    </v-container>
</template>

<script>
import core from "../../api/repositories/core";

export default {
    name: "Dashboard",

    created() {
        this.minuendValues();
        this.subtrahendValues();
        console.log('Data')
    },

    data() {
        return {
            headers: [
                {
                    text: 'Process Name',
                    align: 'left',
                    sortable: false,
                    value: 'name'
                },
                {text: 'Part Number', value: 'partNumber'},
                {text: 'Operation Name', value: 'operationName'},
                {text: 'Data Collection Title', value: 'dataCollectionTitle'},
                {text: 'Cpk', value: 'cpk'}
            ],
            processes: [
                {
                    name: 'EXC RHAD',
                    partNumber: '770404',
                    operationName: 'RHAD Impregnation',
                    dataCollectionTitle: 'Wet Weight',
                    cpk: this.minuendCPK,
                },
                {
                    name: 'EXC RHAD',
                    partNumber: '770404',
                    operationName: 'RHAD Impregnation',
                    dataCollectionTitle: 'Dry Weight',
                    cpk: this.subtrahendCPK,
                },

            ],

            requestData: [],

            // CPK value variables
            minuendCPK: '',
            subtrahendCPK: ''
        }
    },
    computed: {
        minuendCpk() {
            return this.calculateCpk(776, 716, this.calculateDataAverage(this.requestData), this.calculateStandardDeviation(this.requestData));
        },
        subtrahendCpk() {
            return this.calculateCpk(776, 716, this.calculateDataAverage(this.requestData), this.calculateStandardDeviation(this.requestData));
        }
    },
    methods: {
        async minuendValues() {
            try {
                const {data} = await core.getMinuendValues();
                console.log(data);
                this.requestData = data;
                this.minuendCPK = this.minuendCpk;

            } catch (e) {
                console.log("error: ", e);
            }
        },
        async subtrahendValues() {
            try {
                const {data} = await core.getSubtrahendValues();
                console.log(data);
                this.requestData = data;
                this.subtrahendCPK = this.subtrahendCpk;
            } catch (e) {
                console.log("error: ", e);
            }
        },

        calculateDataAverage(data) {
            const mean = (data.reduce((acc, obj) => acc + parseInt(obj.DataCollectionValue), 0) /  data.length).toFixed(2);


            return mean;
        },

        calculateStandardDeviation(data) {
            const mean = this.calculateDataAverage(data);

            const variance = data.reduce((acc, obj) => acc + Math.pow(parseInt(obj.DataCollectionValue) - mean, 2), 0) / data.length;

            const stdDev = Math.sqrt(variance).toFixed(2);

            return stdDev;
        },

        // Process capability rules
        calculateCpk(usl, lsl, mean, standardDeviation) {
            let tempX;
            let tempY;
            tempX = (usl - mean) / (3 * standardDeviation);
            tempY = (mean - lsl) / (3 * standardDeviation);

            return Math.min(tempX, tempY).toFixed(2);
        },

        getColor(cpk) {
            if (cpk > 1.33) {
                return 'green';
            }
            else if (cpk >= 1 && cpk <= 1.329) {
                return 'orange';
            }
            else {
                return 'red';
            }
        },

    }
}
</script>

<style scoped>

</style>

问题原因

  1. processes无响应式关联:初始化时cpk字段仅一次性赋值了空字符串,后续minuendCPK/subtrahendCPK更新时,processes内的对象不会同步变化。
  2. 请求数据互相覆盖:两个异步方法共用requestData变量,后执行的请求会覆盖先请求的数据,导致Cpk计算逻辑混乱。
  3. 空数据计算异常:异步请求完成前requestData为空数组,计算平均值/标准差会出现除以0的错误,导致Cpk结果无效。

修复方案

1. 拆分请求数据存储

将requestData拆分为两个变量,分别存储两组请求结果:

data() {
  return {
    // ...其他数据
    minuendData: [],
    subtrahendData: []
  }
}

2. 修改异步方法,分别存储数据

async minuendValues() {
  try {
    const {data} = await core.getMinuendValues();
    this.minuendData = data;
  } catch (e) {
    console.log("error: ", e);
  }
},
async subtrahendValues() {
  try {
    const {data} = await core.getSubtrahendValues();
    this.subtrahendData = data;
  } catch (e) {
    console.log("error: ", e);
  }
}

3. 调整计算属性,关联对应数据并处理空值

将processes改为计算属性,自动同步最新Cpk值:

computed: {
  minuendCpk() {
    if (!this.minuendData.length) return '';
    return this.calculateCpk(776, 716, this.calculateDataAverage(this.minuendData), this.calculateStandardDeviation(this.minuendData));
  },
  subtrahendCpk() {
    if (!this.subtrahendData.length) return '';
    return this.calculateCpk(776, 716, this.calculateDataAverage(this.subtrahendData), this.calculateStandardDeviation(this.subtrahendData));
  },
  processes() {
    return [
      {
        name: 'EXC RHAD',
        partNumber: '770404',
        operationName: 'RHAD Impregnation',
        dataCollectionTitle: 'Wet Weight',
        cpk: this.minuendCpk,
      },
      {
        name: 'EXC RHAD',
        partNumber: '770404',
        operationName: 'RHAD Impregnation',
        dataCollectionTitle: 'Dry Weight',
        cpk: this.subtrahendCpk,
      },
    ]
  }
}

4. 优化计算方法,避免空数组错误

calculateDataAverage(data) {
  if (!data.length) return 0;
  const sum = data.reduce((acc, obj) => acc + parseInt(obj.DataCollectionValue), 0);
  const mean = (sum / data.length).toFixed(2);
  return mean;
}

5. 完善颜色判断逻辑,处理空值

getColor(cpk) {
  if (!cpk) return 'gray';
  const cpkNum = parseFloat(cpk);
  if (cpkNum > 1.33) {
    return 'green';
  } else if (cpkNum >= 1 && cpkNum <= 1.329) {
    return 'orange';
  } else {
    return 'red';
  }
}

内容的提问来源于stack exchange,提问作者Broco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:27:03