bonus-ui/src/views/dish/material/components/MaterialDialog.vue

493 lines
16 KiB
Vue

<template>
<el-dialog
:title="title + ' - 原料'"
:visible.sync="visible"
width="1000px"
append-to-body
:close-on-click-modal="false"
:destroy-on-close="true"
@close="handleClose"
>
<el-tabs v-model="activeTab">
<el-tab-pane label="基础信息" name="basic">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="原料名称" prop="materialName">
<el-input
v-model="form.materialName"
placeholder="请输入原料名称"
maxlength="40"
show-word-limit
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属区域" prop="region">
<el-select v-model="form.region" placeholder="请选择所属区域" style="width: 100%">
<el-option label="宏源大厦" value="宏源大厦" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="原料类别" prop="materialType">
<el-select v-model="form.materialType" placeholder="请选择原料类别" style="width: 100%">
<el-option label="蔬菜类-宏源大厦" value="蔬菜类-宏源大厦" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计量类型" prop="measureType">
<el-select v-model="form.measureType" placeholder="请选择计量类型" style="width: 100%">
<el-option label="按份" value="按份" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="原料单位" prop="unit">
<el-select v-model="form.unit" placeholder="请选择原料单位" style="width: 100%">
<el-option label="条" value="条" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="原料进价" prop="purchasePrice">
<el-input
v-model="form.purchasePrice"
placeholder="请输入原料进价"
@input="handleNumericInput('purchasePrice', $event)"
@blur="formatNumericValue('purchasePrice')"
>
<template slot="append">元</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="条码" prop="barcode">
<el-input
v-model="form.barcode"
placeholder="请输入条码"
maxlength="20"
show-word-limit
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="营养信息类别" prop="phoneticType">
<el-select v-model="form.phoneticType" placeholder="请选择营养信息类别" style="width: 100%">
<el-option label="植物油/植物油" value="植物油/植物油" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="营养信息" prop="phoneticInfo">
<el-select v-model="form.phoneticInfo" placeholder="请选择营养信息" style="width: 100%">
<el-option label="辣椒油" value="辣椒油" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保质期" prop="shelfLife">
<el-input-number
v-model="form.shelfLife"
:min="0"
:max="999"
style="width: 120px"
/>
<el-select v-model="form.shelfLifeUnit" style="width: 100px; margin-left: 10px">
<el-option label="按年" value="年" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="采购上限价格" prop="maxPrice">
<el-input
v-model="form.maxPrice"
placeholder="请输入采购上限价格"
@input="handleNumericInput('maxPrice', $event)"
@blur="formatNumericValue('maxPrice')"
>
<template slot="append">元</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否需要检测" prop="needInspection">
<el-select v-model="form.needInspection" placeholder="请选择是否需要检测" style="width: 100%">
<el-option label="是" value="是" />
<el-option label="否" value="否" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="供应资格证书" prop="qualificationCert">
<el-select v-model="form.qualificationCert" placeholder="请选择供应资格证书" style="width: 100%">
<el-option label="请选择供应资格证书" value="" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="要求检测机构" prop="inspectionOrg">
<el-select v-model="form.inspectionOrg" placeholder="请选择要求检测机构" style="width: 100%">
<el-option label="自检" value="自检" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="要求检测项目" prop="inspectionItems">
<el-select v-model="form.inspectionItems" placeholder="请选择要求检测项目" style="width: 100%">
<el-option label="农残" value="农残" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="加工方法" prop="processingMethods">
<div class="method-input-group">
<div v-for="(method, index) in form.processingMethods" :key="index" class="method-input-item">
<el-input
v-model="form.processingMethods[index]"
:placeholder="'请输入加工方法' + (index + 1)"
>
<template slot="append">
<el-button v-if="index === form.processingMethods.length - 1" @click="addProcessingMethod">增加</el-button>
<el-button v-else @click="removeProcessingMethod(index)" type="danger">删除</el-button>
</template>
</el-input>
</div>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="切配方法" prop="cuttingMethods">
<div class="method-input-group">
<div v-for="(method, index) in form.cuttingMethods" :key="index" class="method-input-item">
<el-input
v-model="form.cuttingMethods[index]"
:placeholder="'请输入切配方法' + (index + 1)"
>
<template slot="append">
<el-button v-if="index === form.cuttingMethods.length - 1" @click="addCuttingMethod">增加</el-button>
<el-button v-else @click="removeCuttingMethod(index)" type="danger">删除</el-button>
</template>
</el-input>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<h3>营养信息</h3>
<el-row :gutter="20" class="nutrition-info">
<el-col :span="12" v-for="(item, index) in nutritionFields" :key="index">
<el-form-item :label="item.label" :prop="'nutrition.' + item.prop">
<el-input
v-model="form.nutrition[item.prop]"
:placeholder="'请输入' + item.label"
@input="handleNumericInput('nutrition.' + item.prop, $event)"
@blur="formatNumericValue('nutrition.' + item.prop)"
>
<template slot="append">{{item.unit}}</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="原料识别注册图" name="image">
<!-- 这里添加图片上传组件 -->
</el-tab-pane>
</el-tabs>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script>
export default {
name: "MaterialDialog",
props: {
title: {
type: String,
default: '新增'
},
visible: {
type: Boolean,
default: false
}
},
data() {
return {
activeTab: 'basic',
form: {
materialName: '',
region: '',
materialType: '',
measureType: '',
unit: '',
barcode: '',
purchasePrice: '',
phoneticType: '',
phoneticInfo: '',
shelfLife: 0,
shelfLifeUnit: '年',
maxPrice: '',
needInspection: '是',
qualificationCert: '',
inspectionOrg: '',
inspectionItems: '',
processingMethods: [''],
cuttingMethods: [''],
nutrition: {
ediblePart: '',
water: '',
heat: '',
protein: '',
fat: '',
carbohydrate: '',
dietaryFiber: '',
cholesterol: '',
ash: '',
vitaminA: '',
carotene: '',
retinol: '',
thiamine: '',
riboflavin: '',
niacin: '',
vitaminC: '',
vitaminE: '',
calcium: '',
phosphorus: '',
potassium: '',
sodium: '',
magnesium: '',
iron: '',
zinc: '',
selenium: '',
copper: '',
manganese: '',
iodine: ''
}
},
rules: {
materialName: [{ required: true, message: '请输入原料名称', trigger: 'blur' }],
region: [{ required: true, message: '请选择所属区域', trigger: 'change' }],
materialType: [{ required: true, message: '请选择原料类别', trigger: 'change' }]
},
nutritionFields: [
{ label: '可食部分', prop: 'ediblePart', unit: 'g/100g' },
{ label: '水分', prop: 'water', unit: 'g/100g' },
{ label: '热量', prop: 'heat', unit: '千卡/100g' },
{ label: '蛋白质', prop: 'protein', unit: 'g/100g' },
{ label: '脂肪', prop: 'fat', unit: 'g/100g' },
{ label: '碳水化合物', prop: 'carbohydrate', unit: 'g/100g' },
{ label: '膳食纤维', prop: 'dietaryFiber', unit: 'g/100g' },
{ label: '胆固醇', prop: 'cholesterol', unit: 'mg/100g' },
{ label: '灰分', prop: 'ash', unit: 'g/100g' },
{ label: '维生素A', prop: 'vitaminA', unit: 'μg/100g' },
{ label: '胡萝卜素', prop: 'carotene', unit: 'μg/100g' },
{ label: '视黄醇', prop: 'retinol', unit: 'μg/100g' },
{ label: '硫胺素', prop: 'thiamine', unit: 'mg/100g' },
{ label: '核黄素', prop: 'riboflavin', unit: 'mg/100g' },
{ label: '烟酸/尼克酸', prop: 'niacin', unit: 'mg/100g' },
{ label: '维生素C', prop: 'vitaminC', unit: 'mg/100g' },
{ label: '维生素E', prop: 'vitaminE', unit: 'mg/100g' },
{ label: '钙', prop: 'calcium', unit: 'mg/100g' },
{ label: '磷', prop: 'phosphorus', unit: 'mg/100g' },
{ label: '钾', prop: 'potassium', unit: 'mg/100g' },
{ label: '钠', prop: 'sodium', unit: 'mg/100g' },
{ label: '镁', prop: 'magnesium', unit: 'mg/100g' },
{ label: '铁', prop: 'iron', unit: 'mg/100g' },
{ label: '锌', prop: 'zinc', unit: 'mg/100g' },
{ label: '硒', prop: 'selenium', unit: 'μg/100g' },
{ label: '铜', prop: 'copper', unit: 'mg/100g' },
{ label: '锰', prop: 'manganese', unit: 'mg/100g' },
{ label: '碘', prop: 'iodine', unit: 'μg/100g' }
]
};
},
computed: {
// Remove dialogVisible computed property
},
methods: {
handleNumericInput(field, event) {
const value = event.target.value;
// 只允许输入数字和小数点
let newValue = value.replace(/[^\d.]/g, '');
// 确保只有一个小数点
const parts = newValue.split('.');
if (parts.length > 2) {
newValue = parts[0] + '.' + parts.slice(1).join('');
}
// 限制小数点后最多两位
if (parts.length === 2 && parts[1].length > 2) {
newValue = parts[0] + '.' + parts[1].substring(0, 2);
}
// 设置字段值
if (field.includes('.')) {
const [obj, prop] = field.split('.');
this.form[obj][prop] = newValue;
} else {
this.form[field] = newValue;
}
},
formatNumericValue(field) {
let value;
if (field.includes('.')) {
const [obj, prop] = field.split('.');
value = this.form[obj][prop];
} else {
value = this.form[field];
}
if (!value || value === '' || value === '.') {
value = '0.00';
} else {
value = parseFloat(value).toFixed(2);
}
if (field.includes('.')) {
const [obj, prop] = field.split('.');
this.form[obj][prop] = value;
} else {
this.form[field] = value;
}
},
addProcessingMethod() {
this.form.processingMethods.push('');
},
removeProcessingMethod(index) {
this.form.processingMethods.splice(index, 1);
},
addCuttingMethod() {
this.form.cuttingMethods.push('');
},
removeCuttingMethod(index) {
this.form.cuttingMethods.splice(index, 1);
},
submitForm() {
this.$refs.form.validate(valid => {
if (valid) {
this.$emit('submit', this.form);
}
});
},
handleClose() {
this.$emit('update:visible', false);
this.$nextTick(() => {
this.reset();
});
},
cancel() {
this.$emit('update:visible', false);
this.$nextTick(() => {
this.reset();
});
},
reset() {
this.form = {
materialName: '',
region: '',
materialType: '',
measureType: '',
unit: '',
barcode: '',
purchasePrice: '',
phoneticType: '',
phoneticInfo: '',
shelfLife: 0,
shelfLifeUnit: '年',
maxPrice: '',
needInspection: '是',
qualificationCert: '',
inspectionOrg: '',
inspectionItems: '',
processingMethods: [''],
cuttingMethods: [''],
nutrition: {
ediblePart: '',
water: '',
heat: '',
protein: '',
fat: '',
carbohydrate: '',
dietaryFiber: '',
cholesterol: '',
ash: '',
vitaminA: '',
carotene: '',
retinol: '',
thiamine: '',
riboflavin: '',
niacin: '',
vitaminC: '',
vitaminE: '',
calcium: '',
phosphorus: '',
potassium: '',
sodium: '',
magnesium: '',
iron: '',
zinc: '',
selenium: '',
copper: '',
manganese: '',
iodine: ''
}
};
}
}
};
</script>
<style lang="scss" scoped>
</style>