|
|
@@ -170,7 +170,7 @@
|
|
|
<!-- 子表录入测量值 -->
|
|
|
<el-divider content-position="center">测量值输入</el-divider>
|
|
|
<div style="margin-bottom: 10px;">
|
|
|
- <el-button type="primary" icon="Plus" @click="handleAddMeasuredValueGroup">添加测量值(1行10個)</el-button>
|
|
|
+ <el-button type="primary" icon="Plus" @click="handleAddMeasuredValueGroup">添加测量值(1行10个)</el-button>
|
|
|
<el-button type="danger" icon="Delete" @click="handleDeleteMeasuredValue">删除选中测量值</el-button>
|
|
|
</div>
|
|
|
<el-table :data="measuredValueList" :row-class-name="rowMeasuredValueIndex"
|
|
|
@@ -308,8 +308,8 @@
|
|
|
</el-dialog>
|
|
|
|
|
|
<!-- 查看白坯布重量分析对话框 -->
|
|
|
- <el-dialog :title="title" v-model="viewOpen" fullscreen append-to-body>
|
|
|
- <div style="height: 100%; display: flex; flex-direction: column;">
|
|
|
+ <el-dialog :title="title" v-model="viewOpen" width="1500px" height="800px" append-to-body>
|
|
|
+ <div style="display: flex; flex-direction: column; height: 100%;">
|
|
|
<!-- 图表和信息区域 -->
|
|
|
<div style="height: 300px; flex-shrink: 0; margin-bottom: 15px;">
|
|
|
<el-row :gutter="15" style="height: 100%;">
|
|
|
@@ -348,28 +348,28 @@
|
|
|
<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="flex: 1; overflow: auto;">
|
|
|
- <el-table :data="cpkEvaluation" border :row-class-name="cpkTableRowClassName" size="mini" style="font-size: 12px;">
|
|
|
- <el-table-column prop="cpk" label="Cpk值" ></el-table-column>
|
|
|
+ <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-column prop="level" label="水平" width="70"></el-table-column>
|
|
|
- <el-table-column prop="evaluation" label="过程能力评价"></el-table-column>
|
|
|
- <el-table-column prop="defectRate" label="大约对应不良率"></el-table-column>
|
|
|
- <el-table-column prop="description" label="说明" width="320"></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>
|
|
|
+ <el-table-column prop="description" label="说明"></el-table-column>
|
|
|
</el-table>
|
|
|
</div>
|
|
|
</el-col>
|
|
|
<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="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-column prop="level" label="标准差水平"></el-table-column>
|
|
|
- <el-table-column prop="stdValue" label="标准差値"></el-table-column>
|
|
|
+ <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>
|
|
|
- <el-table-column prop="evaluation" label="过程能力评价"></el-table-column>
|
|
|
- <el-table-column prop="stability" label="稳定性状态"></el-table-column>
|
|
|
- <el-table-column prop="defectRate" label="大约不良率"></el-table-column>
|
|
|
- <el-table-column prop="description" label="含义与行动建议" width="420"></el-table-column>
|
|
|
+ <el-table-column prop="evaluation" label="过程能力评价" width="120"></el-table-column>
|
|
|
+ <el-table-column prop="stability" label="稳定性状态" width="100"></el-table-column>
|
|
|
+ <el-table-column prop="defectRate" label="大约不良率" width="100"></el-table-column>
|
|
|
+ <el-table-column prop="description" label="含义与行动建议"></el-table-column>
|
|
|
</el-table>
|
|
|
</div>
|
|
|
</el-col>
|
|
|
@@ -592,12 +592,12 @@ function drawCpkTrendChart() {
|
|
|
const dates = [];
|
|
|
const cpkValues = [];
|
|
|
|
|
|
- // 按时间排序データ
|
|
|
+ // 按时间排序数据
|
|
|
const sortedData = [...capList.value].sort((a, b) => {
|
|
|
return new Date(a.dataTime) - new Date(b.dataTime);
|
|
|
});
|
|
|
|
|
|
- // 提取CPK值と対応日付
|
|
|
+ // 提取CPK值与对应日期
|
|
|
sortedData.forEach(item => {
|
|
|
if (item.cpkValue !== null && item.cpkValue !== undefined) {
|
|
|
dates.push(parseTime(item.dataTime, '{y}-{m}-{d}'));
|
|
|
@@ -673,7 +673,7 @@ function drawStdDevTrendChart() {
|
|
|
return new Date(a.dataTime) - new Date(b.dataTime);
|
|
|
});
|
|
|
|
|
|
- // 提取标准偏差值与对应日期
|
|
|
+ // 提取标准差值与对应日期
|
|
|
sortedData.forEach(item => {
|
|
|
if (item.stdDeviation !== null && item.stdDeviation !== undefined) {
|
|
|
dates.push(parseTime(item.dataTime, '{y}-{m}-{d}'));
|
|
|
@@ -879,15 +879,15 @@ function handleUpdate(row) {
|
|
|
const _bwId = row.bwId || ids.value;
|
|
|
getCap(_bwId).then(response => {
|
|
|
form.value = response.data;
|
|
|
- // 解析测定值JSON配列
|
|
|
+ // 解析测量值JSON数组
|
|
|
try {
|
|
|
if (form.value.measuredValue) {
|
|
|
- // 2つの形式をサポート:単純な配列形式 [1,2,3,4,5] とオブジェクト配列形式 [{value: 1}, {value: 2}]
|
|
|
+ // 支持两种格式:简单数组形式 [1,2,3,4,5] 和对象数组形式 [{value: 1}, {value: 2}]
|
|
|
const parsed = JSON.parse(form.value.measuredValue);
|
|
|
if (Array.isArray(parsed)) {
|
|
|
if (parsed.length > 0 && typeof parsed[0] === 'object') {
|
|
|
- // オブジェクト配列形式 [{value: 1}, {value: 2}]
|
|
|
- // 1行10個の形式に変換
|
|
|
+ // 对象数组形式 [{value: 1}, {value: 2}]
|
|
|
+ // 转换为1行10个的形式
|
|
|
measuredValueList.value = [];
|
|
|
for (let i = 0; i < parsed.length; i += 10) {
|
|
|
let obj = {};
|
|
|
@@ -901,13 +901,13 @@ function handleUpdate(row) {
|
|
|
measuredValueList.value.push(obj);
|
|
|
}
|
|
|
|
|
|
- // 表示用に测定值を解析して保存
|
|
|
+ // 为显示目的解析并保存测量值
|
|
|
measuredValues.value = parsed.map(item =>
|
|
|
typeof item === 'object' ? item.value : item
|
|
|
);
|
|
|
} else if (parsed.length > 0 && typeof parsed[0] === 'number') {
|
|
|
- // 単純な配列形式 [1,2,3,4,5]
|
|
|
- // 1行10個の形式に変換
|
|
|
+ // 简单数组形式 [1,2,3,4,5]
|
|
|
+ // 转换为1行10个的形式
|
|
|
measuredValueList.value = [];
|
|
|
for (let i = 0; i < parsed.length; i += 10) {
|
|
|
let obj = {};
|
|
|
@@ -917,24 +917,24 @@ function handleUpdate(row) {
|
|
|
measuredValueList.value.push(obj);
|
|
|
}
|
|
|
|
|
|
- // 表示用に测定值を解析して保存
|
|
|
+ // 为显示目的解析并保存测量值
|
|
|
measuredValues.value = [...parsed];
|
|
|
} else {
|
|
|
- // 空配列またはその他の場合
|
|
|
+ // 空数组或其他情况
|
|
|
measuredValueList.value = [];
|
|
|
measuredValues.value = [];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} catch (e) {
|
|
|
- console.error("测定值JSONの解析に失敗しました", e);
|
|
|
+ console.error("测量值JSON解析失败", e);
|
|
|
measuredValueList.value = [];
|
|
|
measuredValues.value = [];
|
|
|
}
|
|
|
open.value = true;
|
|
|
title.value = "编辑白坯布重量分析";
|
|
|
|
|
|
- // データをロードした後、統計値を計算
|
|
|
+ // 数据加载后,计算统计值
|
|
|
nextTick(() => {
|
|
|
calculateStatistics();
|
|
|
});
|
|
|
@@ -945,18 +945,18 @@ function handleUpdate(row) {
|
|
|
function handleView(row) {
|
|
|
viewForm.value = {...row};
|
|
|
|
|
|
- // 解析测定值JSON配列
|
|
|
+ // 解析测量值JSON数组
|
|
|
try {
|
|
|
if (viewForm.value.measuredValue) {
|
|
|
const parsed = JSON.parse(viewForm.value.measuredValue);
|
|
|
if (Array.isArray(parsed)) {
|
|
|
if (parsed.length > 0 && typeof parsed[0] === 'object') {
|
|
|
- // オブジェクト配列形式 [{value: 1}, {value: 2}]
|
|
|
+ // 对象数组形式 [{value: 1}, {value: 2}]
|
|
|
measuredValues.value = parsed.map(item =>
|
|
|
typeof item === 'object' ? item.value : item
|
|
|
);
|
|
|
} else if (parsed.length > 0 && typeof parsed[0] === 'number') {
|
|
|
- // 単純な配列形式 [1,2,3,4,5]
|
|
|
+ // 简单数组形式 [1,2,3,4,5]
|
|
|
measuredValues.value = [...parsed];
|
|
|
} else {
|
|
|
measuredValues.value = [];
|
|
|
@@ -964,14 +964,14 @@ function handleView(row) {
|
|
|
}
|
|
|
}
|
|
|
} catch (e) {
|
|
|
- console.error("测定值JSONの解析に失敗しました", e);
|
|
|
+ console.error("测量值JSON解析失败", e);
|
|
|
measuredValues.value = [];
|
|
|
}
|
|
|
|
|
|
viewOpen.value = true;
|
|
|
title.value = "白坯布重量分析详情";
|
|
|
|
|
|
- // ダイアログを開いた後、グラフを描画
|
|
|
+ // 对话框打开后、图表绘制
|
|
|
nextTick(() => {
|
|
|
setTimeout(() => {
|
|
|
drawChart();
|
|
|
@@ -983,17 +983,16 @@ function handleView(row) {
|
|
|
function submitForm() {
|
|
|
proxy.$refs["capRef"].validate(valid => {
|
|
|
if (valid) {
|
|
|
- // 誤差値を計算:目標値*(1+誤差範囲%) - 目標値*(1-誤差範囲%)
|
|
|
+ // 计算误差值:目标值*(1+误差范围%) - 目标值*(1-误差范围%)
|
|
|
if (form.value.targetValue !== null && form.value.toleranceRange !== null) {
|
|
|
const upperLimit = form.value.targetValue * (1 + form.value.toleranceRange / 100);
|
|
|
const lowerLimit = form.value.targetValue * (1 - form.value.toleranceRange / 100);
|
|
|
form.value.toleranceValue = (upperLimit - lowerLimit).toFixed(4);
|
|
|
}
|
|
|
|
|
|
- // 测定值サブテーブルデータを単純な配列形式 [1,2,3,4,5] に変換
|
|
|
let simpleArray = [];
|
|
|
|
|
|
- // 遍历すべての行、収集すべての非空の测量值
|
|
|
+ // 遍历所有行,收集所有非空的测量值
|
|
|
measuredValueList.value.forEach(row => {
|
|
|
for (let i = 1; i <= 10; i++) {
|
|
|
const value = row[`value${i}`];
|
|
|
@@ -1025,7 +1024,7 @@ function submitForm() {
|
|
|
/** 删除按钮操作 */
|
|
|
function handleDelete(row) {
|
|
|
const _bwIds = row.bwId || ids.value;
|
|
|
- proxy.$modal.confirm('白坯布重量分析番号 "' + _bwIds + '" のデータ項目を削除しますか?').then(function () {
|
|
|
+ proxy.$modal.confirm('白坯布重量分析编号 "' + _bwIds + '" 的数据项是否删除?').then(function () {
|
|
|
return delCap(_bwIds);
|
|
|
}).then(() => {
|
|
|
getList();
|
|
|
@@ -1055,10 +1054,10 @@ function handleAddMeasuredValue() {
|
|
|
measuredValueList.value.push(obj);
|
|
|
}
|
|
|
|
|
|
-/** 测定值添加按钮操作(1行10個) */
|
|
|
+/** 测定值添加按钮操作(1行10个) */
|
|
|
function handleAddMeasuredValueGroup() {
|
|
|
let obj = {};
|
|
|
- // 使用目標値をデフォルト値、もし目標値が空ならnullを使用
|
|
|
+ // 使用目标值作为默认值,如果目标值为空则使用null
|
|
|
const defaultValue = form.value.targetValue !== null ? form.value.targetValue : null;
|
|
|
obj.value1 = defaultValue;
|
|
|
obj.value2 = defaultValue;
|
|
|
@@ -1076,7 +1075,7 @@ function handleAddMeasuredValueGroup() {
|
|
|
/** 测定值删除按钮操作 */
|
|
|
function handleDeleteMeasuredValue() {
|
|
|
if (checkedMeasuredValues.value.length == 0) {
|
|
|
- proxy.$modal.msgError("请选择要删除的测定值数据");
|
|
|
+ proxy.$modal.msgError("请选择要删除的测量值数据");
|
|
|
} else {
|
|
|
const measuredValues = measuredValueList.value;
|
|
|
const checkedValues = checkedMeasuredValues.value;
|
|
|
@@ -1084,7 +1083,7 @@ function handleDeleteMeasuredValue() {
|
|
|
return checkedValues.indexOf(item.index) == -1
|
|
|
});
|
|
|
|
|
|
- // 削除後、再計算統計値
|
|
|
+ // 删除后,重新计算统计值
|
|
|
calculateStatistics();
|
|
|
}
|
|
|
}
|
|
|
@@ -1092,37 +1091,37 @@ function handleDeleteMeasuredValue() {
|
|
|
/** 单一测定值删除 */
|
|
|
function deleteSingleMeasuredValue(index) {
|
|
|
measuredValueList.value.splice(index, 1);
|
|
|
- // 削除後、再計算統計値
|
|
|
+ // 删除后,重新计算统计值
|
|
|
calculateStatistics();
|
|
|
}
|
|
|
|
|
|
-// 根据CPK值確定行のクラス名
|
|
|
+// 根据CPK值确定行的类名
|
|
|
function tableRowClassName({row, rowIndex}) {
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
-// CPK評価テーブル行クラス名
|
|
|
+// CPK评价表格行类名
|
|
|
function cpkTableRowClassName({row, rowIndex}) {
|
|
|
- // 現在のviewForm中のcpkValue値に基づいてどの行をハイライトするかを決定
|
|
|
+ // 根据当前viewForm中的cpkValue值确定要高亮哪一行
|
|
|
if (viewForm.value.cpkValue !== null && viewForm.value.cpkValue !== undefined) {
|
|
|
const cpkValue = parseFloat(viewForm.value.cpkValue);
|
|
|
|
|
|
if (cpkValue < 1.0 && rowIndex === 0) {
|
|
|
- return 'cpk-current-row'; // Cpk < 1.0 対応第一行
|
|
|
+ return 'cpk-current-row'; // Cpk < 1.0 对应第一行
|
|
|
} else if (cpkValue >= 1.0 && cpkValue < 1.33 && rowIndex === 1) {
|
|
|
- return 'cpk-current-row'; // 1.0 ≤ Cpk < 1.33 対応第二行
|
|
|
+ return 'cpk-current-row'; // 1.0 ≤ Cpk < 1.33 对应第二行
|
|
|
} else if (cpkValue >= 1.33 && cpkValue < 1.67 && rowIndex === 2) {
|
|
|
- return 'cpk-current-row'; // 1.33 ≤ Cpk < 1.67 対応第三行
|
|
|
+ return 'cpk-current-row'; // 1.33 ≤ Cpk < 1.67 对应第三行
|
|
|
} else if (cpkValue >= 1.67 && rowIndex === 3) {
|
|
|
- return 'cpk-current-row'; // Cpk ≥ 1.67 対応第四行
|
|
|
+ return 'cpk-current-row'; // Cpk ≥ 1.67 对应第四行
|
|
|
}
|
|
|
}
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
-// 标准偏差評価テーブル行クラス名
|
|
|
+// 标准偏差评价表格行类名
|
|
|
function stdDeviationTableRowClassName({row, rowIndex}) {
|
|
|
- // 根据当前viewForm中のstdDeviation値来确定应该高亮哪一行
|
|
|
+ // 根据当前viewForm中的stdDeviation值来确定应该高亮哪一行
|
|
|
if (viewForm.value.stdDeviation !== null && viewForm.value.stdDeviation !== undefined) {
|
|
|
const stdDeviation = parseFloat(viewForm.value.stdDeviation);
|
|
|
|
|
|
@@ -1160,10 +1159,10 @@ function handleMeasuredValueChanged() {
|
|
|
|
|
|
/** 统计值计算 */
|
|
|
function calculateStatistics() {
|
|
|
- // すべての有効な测定值を取得
|
|
|
+ // 获取所有有效的测量值
|
|
|
let validValues = [];
|
|
|
|
|
|
- // 遍历すべての行、収集すべての非空の测量值
|
|
|
+ // 遍历所有行,收集所有非空的测量值
|
|
|
measuredValueList.value.forEach(row => {
|
|
|
for (let i = 1; i <= 10; i++) {
|
|
|
const value = row[`value${i}`];
|
|
|
@@ -1174,7 +1173,7 @@ function calculateStatistics() {
|
|
|
});
|
|
|
|
|
|
if (validValues.length === 0) {
|
|
|
- // 有効な値がない場合、統計フィールドをクリア
|
|
|
+ // 如果没有有效值,则清空统计字段
|
|
|
form.value.meanValue = null;
|
|
|
form.value.maxValue = null;
|
|
|
form.value.minValue = null;
|
|
|
@@ -1182,29 +1181,29 @@ function calculateStatistics() {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 平均值を計算
|
|
|
+ // 计算平均值
|
|
|
const mean = validValues.reduce((sum, value) => sum + value, 0) / validValues.length;
|
|
|
form.value.meanValue = mean.toFixed(4);
|
|
|
|
|
|
- // 最大值と最小值を計算
|
|
|
+ // 计算最大值和最小值
|
|
|
form.value.maxValue = Math.max(...validValues);
|
|
|
form.value.minValue = Math.min(...validValues);
|
|
|
|
|
|
- // 标准偏差を計算
|
|
|
+ // 计算标准偏差
|
|
|
const squaredDiffs = validValues.map(value => Math.pow(value - mean, 2));
|
|
|
const avgSquaredDiff = squaredDiffs.reduce((sum, value) => sum + value, 0) / validValues.length;
|
|
|
form.value.stdDeviation = Math.sqrt(avgSquaredDiff).toFixed(4);
|
|
|
|
|
|
- // 目標値と誤差範囲が設定されている場合、过程能力指数を計算
|
|
|
+ // 当目标值和误差范围已设置时,计算过程能力指数
|
|
|
if (form.value.targetValue !== null && form.value.toleranceRange !== null) {
|
|
|
- // 修正:誤差範囲はパーセントであり、適切に規格上下限を計算する必要がある
|
|
|
- const usl = form.value.targetValue * (1 + form.value.toleranceRange / 100); // 規格上限
|
|
|
- const lsl = form.value.targetValue * (1 - form.value.toleranceRange / 100); // 規格下限
|
|
|
+ // 修正:误差范围是百分比,需要适当地计算规格上下限
|
|
|
+ const usl = form.value.targetValue * (1 + form.value.toleranceRange / 100); // 规格上限
|
|
|
+ const lsl = form.value.targetValue * (1 - form.value.toleranceRange / 100); // 规格下限
|
|
|
|
|
|
form.value.usl = usl.toFixed(4);
|
|
|
form.value.lsl = lsl.toFixed(4);
|
|
|
|
|
|
- // 过程能力指数を計算
|
|
|
+ // 计算过程能力指数
|
|
|
const stdDev = parseFloat(form.value.stdDeviation);
|
|
|
if (stdDev !== 0) {
|
|
|
// CPU = (USL - mean) / (3 * σ)
|
|
|
@@ -1243,7 +1242,7 @@ function drawChart() {
|
|
|
// 数据准备
|
|
|
const values = measuredValues.value.filter(val => val !== null && val !== undefined);
|
|
|
if (values.length === 0) {
|
|
|
- console.warn('有効な测定值データがありません');
|
|
|
+ console.warn('没有有效的测量值数据');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -1252,7 +1251,7 @@ function drawChart() {
|
|
|
const maxValue = Math.max(...values);
|
|
|
const range = maxValue - minValue;
|
|
|
|
|
|
- // 平均值と标准偏差を計算
|
|
|
+ // 计算平均值和标准差
|
|
|
const mean = values.reduce((sum, val) => sum + val, 0) / values.length;
|
|
|
const squaredDiffs = values.map(val => Math.pow(val - mean, 2));
|
|
|
const avgSquaredDiff = squaredDiffs.reduce((sum, val) => sum + val, 0) / values.length;
|
|
|
@@ -1378,7 +1377,7 @@ function drawChart() {
|
|
|
],
|
|
|
series: [
|
|
|
{
|
|
|
- name: "测定值分布",
|
|
|
+ name: "测量值分布",
|
|
|
data: counts,
|
|
|
type: "bar",
|
|
|
smooth: true,
|