|
|
@@ -29,18 +29,19 @@
|
|
|
</template>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="6">
|
|
|
- <el-statistic title="预测CPK值" :value="predictionResult.cpkPrediction" />
|
|
|
+ <el-statistic title="预测CPK值" :value="predictionResult.cpkPrediction"/>
|
|
|
<div style="font-size: 12px; color: #666; margin-top: 5px;">{{ cpkDescription }}</div>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
- <el-statistic title="预测标准差" :value="predictionResult.stdDevPrediction" />
|
|
|
+ <el-statistic title="预测标准差" :value="predictionResult.stdDevPrediction"/>
|
|
|
<div style="font-size: 12px; color: #666; margin-top: 5px;">{{ stdDevDescription }}</div>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
<div class="trend-analysis">
|
|
|
<div class="trend-title">趋势分析</div>
|
|
|
<div class="trend-content">
|
|
|
- <el-tag :type="getTrendTagType(predictionResult.trend)" v-if="predictionResult.trend && predictionResult.trend !== '0'">
|
|
|
+ <el-tag :type="getTrendTagType(predictionResult.trend)"
|
|
|
+ v-if="predictionResult.trend && predictionResult.trend !== '0'">
|
|
|
{{ predictionResult.trend }}
|
|
|
</el-tag>
|
|
|
<el-tag :type="getTrendTagType('稳定趋势')" v-else>
|
|
|
@@ -86,13 +87,13 @@
|
|
|
<span>{{ parseTime(scope.row.dataTime, '{y}-{m}-{d}') }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="目标值" align="center" prop="targetValue"/>
|
|
|
+ <el-table-column label="目标值(克)" align="center" prop="targetValue"/>
|
|
|
<el-table-column label="误差范围" align="center" prop="toleranceRange">
|
|
|
<template #default="scope">
|
|
|
<span>±{{ scope.row.toleranceRange !== null ? (scope.row.toleranceRange + '%') : '' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
-<!-- <el-table-column label="误差值" align="center" prop="toleranceValue"/>-->
|
|
|
+ <!-- <el-table-column label="误差值" align="center" prop="toleranceValue"/>-->
|
|
|
<!-- <el-table-column label="测量值" align="center" prop="measuredValue" />-->
|
|
|
<el-table-column label="CPK" align="center" prop="cpkValue"/>
|
|
|
<el-table-column label="标准差" align="center" prop="stdDeviation"/>
|
|
|
@@ -117,7 +118,7 @@
|
|
|
<el-dialog :title="title" v-model="open" style="width: 1366px;height: 768px;" append-to-body>
|
|
|
<el-form ref="capRef" :model="form" :rules="rules" label-width="120px">
|
|
|
<el-row :gutter="20">
|
|
|
- <el-col :span="8">
|
|
|
+ <el-col :span="6">
|
|
|
<el-form-item label="测量时间" prop="dataTime">
|
|
|
<el-date-picker clearable
|
|
|
v-model="form.dataTime"
|
|
|
@@ -127,13 +128,13 @@
|
|
|
</el-date-picker>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="目标值" prop="targetValue">
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="目标值(克)" prop="targetValue">
|
|
|
<el-input-number v-model="form.targetValue" placeholder="请输入目标值" :min="0" :precision="0"
|
|
|
controls-position="right"/>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="8">
|
|
|
+ <el-col :span="6">
|
|
|
<el-form-item label="偏差" prop="toleranceRange">
|
|
|
<div style="display: flex; align-items: center;">
|
|
|
<span style="margin-right: 5px;">±</span>
|
|
|
@@ -143,6 +144,11 @@
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="设备号" prop="remark">
|
|
|
+ <el-input v-model="form.remark" placeholder="请输入设备号"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
|
<!-- <el-form-item label="测量值" prop="measuredValue">-->
|
|
|
<!-- <el-input v-model="form.measuredValue" type="textarea" placeholder="测量值将通过子表录入并自动转换为JSON数组" :disabled="true" />-->
|
|
|
@@ -174,9 +180,7 @@
|
|
|
<!-- <el-form-item label="规格下限" prop="lsl">-->
|
|
|
<!-- <el-input v-model="form.lsl" placeholder="请输入规格下限" />-->
|
|
|
<!-- </el-form-item>-->
|
|
|
- <el-form-item label="设备号" prop="remark">
|
|
|
- <el-input v-model="form.remark" placeholder="请输入设备号" />
|
|
|
- </el-form-item>
|
|
|
+
|
|
|
|
|
|
<!-- 子表录入测量值 -->
|
|
|
<el-divider content-position="center">测量值输入</el-divider>
|
|
|
@@ -330,10 +334,13 @@
|
|
|
<el-col :span="8" style="height: 100%; display: flex; flex-direction: column;">
|
|
|
<div style="height: 45%; margin-bottom: 15px;">
|
|
|
<el-descriptions title="基本信息" :column="2" border size="small" style="height: 100%;">
|
|
|
- <el-descriptions-item label="测量时间">{{ parseTime(viewForm.dataTime, '{y}-{m}-{d}') }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="测量时间">{{
|
|
|
+ parseTime(viewForm.dataTime, '{y}-{m}-{d}')
|
|
|
+ }}
|
|
|
+ </el-descriptions-item>
|
|
|
<el-descriptions-item label="目标值">{{ viewForm.targetValue }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="误差范围">±{{ viewForm.toleranceRange }}%</el-descriptions-item>
|
|
|
-<!-- <el-descriptions-item label="误差值">{{ viewForm.toleranceValue }}</el-descriptions-item>-->
|
|
|
+ <!-- <el-descriptions-item label="误差值">{{ viewForm.toleranceValue }}</el-descriptions-item>-->
|
|
|
<el-descriptions-item label="规格上限">{{ viewForm.usl }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="规格下限">{{ viewForm.lsl }}</el-descriptions-item>
|
|
|
</el-descriptions>
|
|
|
@@ -359,10 +366,12 @@
|
|
|
<div style="flex: 1; overflow: hidden;">
|
|
|
<el-row :gutter="15" style="height: 100%;">
|
|
|
<el-col :span="10" style="height: 100%; display: flex; flex-direction: column;">
|
|
|
- <div style="font-size: 14px; font-weight: bold; margin-bottom: 10px;">整体质量水平评价(CPK过程能力分析)</div>
|
|
|
+ <div style="font-size: 14px; font-weight: bold; margin-bottom: 10px;">整体质量水平评价(CPK过程能力分析)
|
|
|
+ </div>
|
|
|
<div style="flex: 1; overflow: hidden;">
|
|
|
- <el-table :data="cpkEvaluation" border :row-class-name="cpkTableRowClassName" size="mini" style="font-size: 12px; width: 100%;">
|
|
|
- <el-table-column prop="cpk" label="Cpk值" width="125" ></el-table-column>
|
|
|
+ <el-table :data="cpkEvaluation" border :row-class-name="cpkTableRowClassName" size="mini"
|
|
|
+ style="font-size: 12px; width: 100%;">
|
|
|
+ <el-table-column prop="cpk" label="Cpk值" width="125"></el-table-column>
|
|
|
<el-table-column prop="level" label="水平" width="70"></el-table-column>
|
|
|
<el-table-column prop="evaluation" label="过程能力评价" width="110"></el-table-column>
|
|
|
<el-table-column prop="defectRate" label="大约对应不良率" width="118"></el-table-column>
|
|
|
@@ -373,7 +382,8 @@
|
|
|
<el-col :span="14" style="height: 100%; display: flex; flex-direction: column;">
|
|
|
<div style="font-size: 14px; font-weight: bold; margin-bottom: 10px;">重量稳定性评价(标准差分析)</div>
|
|
|
<div style="flex: 1; overflow: auto;">
|
|
|
- <el-table :data="calculatedStdDeviationEvaluation" border :row-class-name="stdDeviationTableRowClassName" size="mini" style="font-size: 12px;">
|
|
|
+ <el-table :data="calculatedStdDeviationEvaluation" border
|
|
|
+ :row-class-name="stdDeviationTableRowClassName" size="mini" style="font-size: 12px;">
|
|
|
<el-table-column prop="level" label="标准差水平" width="100"></el-table-column>
|
|
|
<el-table-column prop="stdValue" label="标准差値" width="110"></el-table-column>
|
|
|
<el-table-column prop="cpk" label="Cpk值" width="80"></el-table-column>
|
|
|
@@ -398,16 +408,16 @@
|
|
|
<!-- 标准差前5的记录弹窗 -->
|
|
|
<el-dialog title="工艺需调整机台" v-model="topStdDevOpen" width="800px" append-to-body>
|
|
|
<el-table :data="topStdDevList" stripe>
|
|
|
- <el-table-column label="序号" type="index" width="60" align="center" />
|
|
|
- <el-table-column label="设备号" align="center" >
|
|
|
+ <el-table-column label="序号" type="index" width="60" align="center"/>
|
|
|
+ <el-table-column label="设备号" align="center">
|
|
|
<template #default="scope">
|
|
|
{{ [77, 121, 63, 18, 35][scope.$index] }}
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="目标值" prop="targetValue" align="center" />
|
|
|
- <el-table-column label="标准差" prop="stdDeviation" align="center" />
|
|
|
- <el-table-column label="CPK" prop="cpkValue" align="center" />
|
|
|
- <el-table-column label="平均值" prop="meanValue" align="center" />
|
|
|
+ <el-table-column label="目标值(克)" prop="targetValue" align="center"/>
|
|
|
+ <el-table-column label="标准差" prop="stdDeviation" align="center"/>
|
|
|
+ <el-table-column label="CPK" prop="cpkValue" align="center"/>
|
|
|
+ <el-table-column label="平均值" prop="meanValue" align="center"/>
|
|
|
<el-table-column label="操作建议" align="center">
|
|
|
<template #default="scope">
|
|
|
<span v-if="parseFloat(scope.row.meanValue) > parseFloat(scope.row.targetValue)">调轻</span>
|
|
|
@@ -428,8 +438,8 @@
|
|
|
<script setup name="Cap">
|
|
|
import * as echarts from 'echarts';
|
|
|
import {addCap, delCap, getCap, listCap, updateCap} from "@/api/lean/cap";
|
|
|
-import { parseTime } from "@/utils/ruoyi";
|
|
|
-import { watch } from 'vue';
|
|
|
+import {parseTime} from "@/utils/ruoyi";
|
|
|
+import {watch} from 'vue';
|
|
|
|
|
|
const {proxy} = getCurrentInstance();
|
|
|
|
|
|
@@ -824,7 +834,7 @@ function calculatePrediction() {
|
|
|
const recentCpkValues = sortedData.slice(-5).map(item => parseFloat(item.cpkValue) || 0);
|
|
|
let cpkSum = 0;
|
|
|
for (let i = 1; i < recentCpkValues.length; i++) {
|
|
|
- cpkSum += (recentCpkValues[i] - recentCpkValues[i-1]);
|
|
|
+ cpkSum += (recentCpkValues[i] - recentCpkValues[i - 1]);
|
|
|
}
|
|
|
cpkTrend = cpkSum / (recentCpkValues.length - 1);
|
|
|
|
|
|
@@ -832,7 +842,7 @@ function calculatePrediction() {
|
|
|
const recentStdDevValues = sortedData.slice(-5).map(item => parseFloat(item.stdDeviation) || 0);
|
|
|
let stdDevSum = 0;
|
|
|
for (let i = 1; i < recentStdDevValues.length; i++) {
|
|
|
- stdDevSum += (recentStdDevValues[i] - recentStdDevValues[i-1]);
|
|
|
+ stdDevSum += (recentStdDevValues[i] - recentStdDevValues[i - 1]);
|
|
|
}
|
|
|
stdDevTrend = stdDevSum / (recentStdDevValues.length - 1);
|
|
|
}
|
|
|
@@ -1003,7 +1013,7 @@ function handleUpdate(row) {
|
|
|
|
|
|
// 为显示目的解析并保存测量值
|
|
|
measuredValues.value = parsed.map(item =>
|
|
|
- typeof item === 'object' ? item.value : item
|
|
|
+ typeof item === 'object' ? item.value : item
|
|
|
);
|
|
|
} else if (parsed.length > 0 && typeof parsed[0] === 'number') {
|
|
|
// 简单数组形式 [1,2,3,4,5]
|
|
|
@@ -1053,7 +1063,7 @@ function handleView(row) {
|
|
|
if (parsed.length > 0 && typeof parsed[0] === 'object') {
|
|
|
// 对象数组形式 [{value: 1}, {value: 2}]
|
|
|
measuredValues.value = parsed.map(item =>
|
|
|
- typeof item === 'object' ? item.value : item
|
|
|
+ typeof item === 'object' ? item.value : item
|
|
|
);
|
|
|
} else if (parsed.length > 0 && typeof parsed[0] === 'number') {
|
|
|
// 简单数组形式 [1,2,3,4,5]
|
|
|
@@ -1137,9 +1147,9 @@ function handleDelete(row) {
|
|
|
function showTopStdDev() {
|
|
|
// 按标准差降序排序,取前5条记录
|
|
|
const sortedList = [...capList.value]
|
|
|
- .filter(item => item.stdDeviation !== null && item.stdDeviation !== undefined)
|
|
|
- .sort((a, b) => parseFloat(b.stdDeviation) - parseFloat(a.stdDeviation))
|
|
|
- .slice(0, 5);
|
|
|
+ .filter(item => item.stdDeviation !== null && item.stdDeviation !== undefined)
|
|
|
+ .sort((a, b) => parseFloat(b.stdDeviation) - parseFloat(a.stdDeviation))
|
|
|
+ .slice(0, 5);
|
|
|
|
|
|
topStdDevList.value = sortedList;
|
|
|
topStdDevOpen.value = true;
|
|
|
@@ -1447,7 +1457,7 @@ function drawChart() {
|
|
|
const normalY = binCenters.map(x => {
|
|
|
// 正态分布概率密度函数
|
|
|
return (1 / (Math.sqrt(2 * Math.PI) * stdDev)) *
|
|
|
- Math.exp(-0.5 * Math.pow((x - mean) / stdDev, 2));
|
|
|
+ Math.exp(-0.5 * Math.pow((x - mean) / stdDev, 2));
|
|
|
});
|
|
|
|
|
|
// 将概率密度转换为可与直方图比较的频率
|