Compare commits
3 Commits
ba96470c8e
...
80ab64e428
| Author | SHA1 | Date | |
|---|---|---|---|
| 80ab64e428 | |||
| fded64ef8f | |||
| 6e2da3f3c2 |
@@ -240,6 +240,7 @@ import {PaginationDTO, Response} from '../enums';
|
|||||||
* @property {string} description
|
* @property {string} description
|
||||||
* @property {Array<RawMaterialNutrientDTO>} raw_material_nutrients
|
* @property {Array<RawMaterialNutrientDTO>} raw_material_nutrients
|
||||||
* @property {number} [reference_price] - 参考价格(kg/元)
|
* @property {number} [reference_price] - 参考价格(kg/元)
|
||||||
|
* @property {number} [max_addition_ratio] - 最大添加比例(%)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -264,6 +265,7 @@ import {PaginationDTO, Response} from '../enums';
|
|||||||
* @property {string} name - 原料名称
|
* @property {string} name - 原料名称
|
||||||
* @property {string} [description] - 描述
|
* @property {string} [description] - 描述
|
||||||
* @property {number} [reference_price] - 参考价格(kg/元)
|
* @property {number} [reference_price] - 参考价格(kg/元)
|
||||||
|
* @property {number} [max_addition_ratio] - 最大添加比例(%)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -271,6 +273,7 @@ import {PaginationDTO, Response} from '../enums';
|
|||||||
* @property {string} name - 原料名称
|
* @property {string} name - 原料名称
|
||||||
* @property {string} [description] - 描述
|
* @property {string} [description] - 描述
|
||||||
* @property {number} [reference_price] - 参考价格(kg/元)
|
* @property {number} [reference_price] - 参考价格(kg/元)
|
||||||
|
* @property {number} [max_addition_ratio] - 最大添加比例(%)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// --- Recipe ---
|
// --- Recipe ---
|
||||||
@@ -278,7 +281,7 @@ import {PaginationDTO, Response} from '../enums';
|
|||||||
/**
|
/**
|
||||||
* @typedef {object} RecipeIngredientDto
|
* @typedef {object} RecipeIngredientDto
|
||||||
* @property {number} raw_material_id - 原料ID
|
* @property {number} raw_material_id - 原料ID
|
||||||
* @property {number} [percentage] - 原料在配方中的百分比 (0-1之间)
|
* @property {number} [percentage] - 原料在配方中的百分比 (0-100之间)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
<el-form-item label="参考价格(kg/元)" prop="reference_price">
|
<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-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>
|
||||||
|
<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-form-item label="描述" prop="description">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="formData.description"
|
v-model="formData.description"
|
||||||
@@ -37,7 +40,8 @@ export default {
|
|||||||
default: () => ({
|
default: () => ({
|
||||||
name: '',
|
name: '',
|
||||||
description: '',
|
description: '',
|
||||||
reference_price: 0, // 新增参考价格默认值
|
reference_price: 0,
|
||||||
|
max_addition_ratio: 0,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -47,7 +51,8 @@ export default {
|
|||||||
const formData = reactive({
|
const formData = reactive({
|
||||||
name: '',
|
name: '',
|
||||||
description: '',
|
description: '',
|
||||||
reference_price: 0, // 新增参考价格
|
reference_price: 0,
|
||||||
|
max_addition_ratio: 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
// 监听 initialData 变化,用于编辑模式下初始化表单
|
// 监听 initialData 变化,用于编辑模式下初始化表单
|
||||||
@@ -57,7 +62,8 @@ export default {
|
|||||||
if (newVal) {
|
if (newVal) {
|
||||||
formData.name = newVal.name || '';
|
formData.name = newVal.name || '';
|
||||||
formData.description = newVal.description || '';
|
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 }
|
{ immediate: true, deep: true }
|
||||||
@@ -73,6 +79,10 @@ export default {
|
|||||||
{ type: 'number', message: '参考价格必须是数字', trigger: 'change' },
|
{ type: 'number', message: '参考价格必须是数字', trigger: 'change' },
|
||||||
{ min: 0, type: 'number', message: '参考价格不能小于0', 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 = () => {
|
const submitForm = () => {
|
||||||
@@ -96,7 +106,8 @@ export default {
|
|||||||
// 手动重置 formData,因为 resetFields 不会重置未绑定 prop 的字段
|
// 手动重置 formData,因为 resetFields 不会重置未绑定 prop 的字段
|
||||||
formData.name = '';
|
formData.name = '';
|
||||||
formData.description = '';
|
formData.description = '';
|
||||||
formData.reference_price = 0; // 重置参考价格
|
formData.reference_price = 0;
|
||||||
|
formData.max_addition_ratio = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -40,6 +40,12 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="name" label="原料名称" width="150"></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="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 prop="description" label="描述"></el-table-column>
|
||||||
<el-table-column label="操作">
|
<el-table-column label="操作">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -185,6 +191,13 @@ export default {
|
|||||||
emit('edit-nutrients', row); // 触发 edit-nutrients 事件
|
emit('edit-nutrients', row); // 触发 edit-nutrients 事件
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const formatMaxAdditionRatio = (row, column, cellValue) => {
|
||||||
|
if (typeof cellValue === 'number') {
|
||||||
|
return cellValue.toFixed(2);
|
||||||
|
}
|
||||||
|
return cellValue;
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
fetchRawMaterials();
|
fetchRawMaterials();
|
||||||
});
|
});
|
||||||
@@ -206,6 +219,7 @@ export default {
|
|||||||
handleDelete,
|
handleDelete,
|
||||||
handleEditNutrients,
|
handleEditNutrients,
|
||||||
fetchRawMaterials, // 将方法暴露出去
|
fetchRawMaterials, // 将方法暴露出去
|
||||||
|
formatMaxAdditionRatio,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<el-table-column prop="name" label="原料名称" />
|
<el-table-column prop="name" label="原料名称" />
|
||||||
<el-table-column prop="percentage" label="占比">
|
<el-table-column prop="percentage" label="占比">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ (scope.row.percentage * 100).toFixed(4) }}%
|
{{ scope.row.percentage.toFixed(2) }}%
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
<el-table-column prop="name" label="原料名称" />
|
<el-table-column prop="name" label="原料名称" />
|
||||||
<el-table-column label="占比">
|
<el-table-column label="占比">
|
||||||
<template #default="scope">
|
<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>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作">
|
<el-table-column label="操作">
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
<el-table-column prop="name" label="营养素名称" />
|
<el-table-column prop="name" label="营养素名称" />
|
||||||
<el-table-column prop="value" label="总含量">
|
<el-table-column prop="value" label="总含量">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.value.toFixed(4) }}
|
{{ scope.row.value.toFixed(2) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -111,7 +111,7 @@ export default {
|
|||||||
ingredients.forEach(ing => {
|
ingredients.forEach(ing => {
|
||||||
if (ing.raw_material_nutrients) {
|
if (ing.raw_material_nutrients) {
|
||||||
ing.raw_material_nutrients.forEach(nutrient => {
|
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)) {
|
if (summary.has(nutrient.nutrient_name)) {
|
||||||
summary.set(nutrient.nutrient_name, summary.get(nutrient.nutrient_name) + contribution);
|
summary.set(nutrient.nutrient_name, summary.get(nutrient.nutrient_name) + contribution);
|
||||||
} else {
|
} else {
|
||||||
@@ -213,11 +213,11 @@ export default {
|
|||||||
|
|
||||||
// 保存配方
|
// 保存配方
|
||||||
const handleSaveRecipe = async () => {
|
const handleSaveRecipe = async () => {
|
||||||
// 验证占比总和是否为1
|
// 验证占比总和是否为100
|
||||||
const totalPercentage = localIngredientDetails.value.reduce((sum, ing) => sum + ing.percentage, 0);
|
const totalPercentage = localIngredientDetails.value.reduce((sum, ing) => sum + ing.percentage, 0);
|
||||||
|
|
||||||
if (Math.abs(totalPercentage - 1) > 0.001) { // 允许浮点数误差
|
if (Math.abs(totalPercentage - 100) > 0.001) { // 允许浮点数误差
|
||||||
ElMessage.error(`原料总占比必须为100%,当前为${(totalPercentage * 100).toFixed(2)}%`);
|
ElMessage.error(`原料总占比必须为100%,当前为${totalPercentage.toFixed(2)}%`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user