Compare commits

...

3 Commits

Author SHA1 Message Date
80ab64e428 优化展示 2025-11-27 16:41:24 +08:00
fded64ef8f 优化展示 2025-11-27 16:27:59 +08:00
6e2da3f3c2 优化展示 2025-11-27 15:50:37 +08:00
4 changed files with 40 additions and 12 deletions

View File

@@ -240,6 +240,7 @@ import {PaginationDTO, Response} from '../enums';
* @property {string} description
* @property {Array<RawMaterialNutrientDTO>} raw_material_nutrients
* @property {number} [reference_price] - 参考价格(kg/元)
* @property {number} [max_addition_ratio] - 最大添加比例(%)
*/
/**
@@ -264,6 +265,7 @@ import {PaginationDTO, Response} from '../enums';
* @property {string} name - 原料名称
* @property {string} [description] - 描述
* @property {number} [reference_price] - 参考价格(kg/元)
* @property {number} [max_addition_ratio] - 最大添加比例(%)
*/
/**
@@ -271,6 +273,7 @@ import {PaginationDTO, Response} from '../enums';
* @property {string} name - 原料名称
* @property {string} [description] - 描述
* @property {number} [reference_price] - 参考价格(kg/元)
* @property {number} [max_addition_ratio] - 最大添加比例(%)
*/
// --- Recipe ---
@@ -278,7 +281,7 @@ import {PaginationDTO, Response} from '../enums';
/**
* @typedef {object} RecipeIngredientDto
* @property {number} raw_material_id - 原料ID
* @property {number} [percentage] - 原料在配方中的百分比 (0-1之间)
* @property {number} [percentage] - 原料在配方中的百分比 (0-100之间)
*/
/**

View File

@@ -6,6 +6,9 @@
<el-form-item label="参考价格(kg/元)" prop="reference_price">
<el-input-number v-model="formData.reference_price" :min="0" :precision="2" :step="0.01" controls-position="right" style="width: 100%;"></el-input-number>
</el-form-item>
<el-form-item label="最大添加比例(%)" prop="max_addition_ratio">
<el-input-number v-model="formData.max_addition_ratio" :min="0" :max="100" :precision="2" :step="1" controls-position="right" style="width: 100%;"></el-input-number>
</el-form-item>
<el-form-item label="描述" prop="description">
<el-input
v-model="formData.description"
@@ -37,7 +40,8 @@ export default {
default: () => ({
name: '',
description: '',
reference_price: 0, // 新增参考价格默认值
reference_price: 0,
max_addition_ratio: 0,
}),
},
},
@@ -47,7 +51,8 @@ export default {
const formData = reactive({
name: '',
description: '',
reference_price: 0, // 新增参考价格
reference_price: 0,
max_addition_ratio: 0,
});
// 监听 initialData 变化,用于编辑模式下初始化表单
@@ -57,7 +62,8 @@ export default {
if (newVal) {
formData.name = newVal.name || '';
formData.description = newVal.description || '';
formData.reference_price = newVal.reference_price || 0; // 初始化参考价格
formData.reference_price = newVal.reference_price || 0;
formData.max_addition_ratio = newVal.max_addition_ratio || 0;
}
},
{ immediate: true, deep: true }
@@ -73,6 +79,10 @@ export default {
{ type: 'number', message: '参考价格必须是数字', trigger: 'change' },
{ min: 0, type: 'number', message: '参考价格不能小于0', trigger: 'change' },
],
max_addition_ratio: [
{ required: true, message: '请输入最大添加比例', trigger: 'change' },
{ type: 'number', min: 0, max: 100, message: '比例必须在 0 到 100 之间', trigger: 'change' },
],
};
const submitForm = () => {
@@ -96,7 +106,8 @@ export default {
// 手动重置 formData因为 resetFields 不会重置未绑定 prop 的字段
formData.name = '';
formData.description = '';
formData.reference_price = 0; // 重置参考价格
formData.reference_price = 0;
formData.max_addition_ratio = 0;
};
return {

View File

@@ -40,6 +40,12 @@
</el-table-column>
<el-table-column prop="name" label="原料名称" width="150"></el-table-column>
<el-table-column prop="reference_price" label="参考价格(kg/元)" width="180"></el-table-column>
<el-table-column
prop="max_addition_ratio"
label="最大添加比例(%)"
width="180"
:formatter="formatMaxAdditionRatio"
></el-table-column>
<el-table-column prop="description" label="描述"></el-table-column>
<el-table-column label="操作">
<template #default="scope">
@@ -185,6 +191,13 @@ export default {
emit('edit-nutrients', row); // 触发 edit-nutrients 事件
};
const formatMaxAdditionRatio = (row, column, cellValue) => {
if (typeof cellValue === 'number') {
return cellValue.toFixed(2);
}
return cellValue;
};
onMounted(() => {
fetchRawMaterials();
});
@@ -206,6 +219,7 @@ export default {
handleDelete,
handleEditNutrients,
fetchRawMaterials, // 将方法暴露出去
formatMaxAdditionRatio,
};
},
};

View File

@@ -25,7 +25,7 @@
<el-table-column prop="name" label="原料名称" />
<el-table-column prop="percentage" label="占比">
<template #default="scope">
{{ (scope.row.percentage * 100).toFixed(4) }}%
{{ scope.row.percentage.toFixed(2) }}%
</template>
</el-table-column>
</el-table>
@@ -35,7 +35,7 @@
<el-table-column prop="name" label="原料名称" />
<el-table-column label="占比">
<template #default="scope">
<el-input-number v-model="scope.row.percentage" :min="0" :max="1" :step="0.0001" :precision="4" @change="updateNutrientSummary"></el-input-number>
<el-input-number v-model="scope.row.percentage" :min="0" :max="100" :step="1" :precision="2" @change="updateNutrientSummary"></el-input-number>
</template>
</el-table-column>
<el-table-column label="操作">
@@ -57,7 +57,7 @@
<el-table-column prop="name" label="营养素名称" />
<el-table-column prop="value" label="总含量">
<template #default="scope">
{{ scope.row.value.toFixed(4) }}
{{ scope.row.value.toFixed(2) }}
</template>
</el-table-column>
</el-table>
@@ -111,7 +111,7 @@ export default {
ingredients.forEach(ing => {
if (ing.raw_material_nutrients) {
ing.raw_material_nutrients.forEach(nutrient => {
const contribution = nutrient.value * ing.percentage;
const contribution = nutrient.value * (ing.percentage / 100); // 修正:计算时需要将百分比转换为小数
if (summary.has(nutrient.nutrient_name)) {
summary.set(nutrient.nutrient_name, summary.get(nutrient.nutrient_name) + contribution);
} else {
@@ -213,11 +213,11 @@ export default {
// 保存配方
const handleSaveRecipe = async () => {
// 验证占比总和是否为1
// 验证占比总和是否为100
const totalPercentage = localIngredientDetails.value.reduce((sum, ing) => sum + ing.percentage, 0);
if (Math.abs(totalPercentage - 1) > 0.001) { // 允许浮点数误差
ElMessage.error(`原料总占比必须为100%,当前为${(totalPercentage * 100).toFixed(2)}%`);
if (Math.abs(totalPercentage - 100) > 0.001) { // 允许浮点数误差
ElMessage.error(`原料总占比必须为100%,当前为${totalPercentage.toFixed(2)}%`);
return;
}