菜品菜谱-营养信息

This commit is contained in:
lSun 2025-03-06 13:08:28 +08:00
parent 02109c8d45
commit 78db95b0fe
3 changed files with 1317 additions and 0 deletions

92
src/api/dish/material.js Normal file
View File

@ -0,0 +1,92 @@
import request from '@/utils/request'
// 原料类别
export function systemMaterialTreeApi(data) {
return request({
url: '/smart-canteen/api/v1/menumaterialcategory/tree/list',
method: 'post',
headers: {
"merchant-id":"378915229716713472",
},
data: data
})
}
// 系统区域权限树
export function systemAreaTreeApi(data) {
return request({
url: '/smart-canteen/api/v2/alloc/area/system-auth/tree',
method: 'post',
headers: {
"merchant-id":"378915229716713472",
},
data: data
})
}
// 查询区域列表
export function getMaterialListApi(data) {
return request({
url: '/smart-canteen/api/v1/menumaterial/page',
method: 'post',
headers: {
"merchant-id":"378915229716713472",
},
data: data
})
}
// 根据区域id查询区域名称
export function getMaterialNameApi(data) {
return request({
url: '/smart-canteen/api/v2/alloc/area/get-area-name',
method: 'post',
headers: {
"merchant-id":"378915229716713472",
},
data: data
})
}
// 查询区域(食堂,档口,餐线)编号
export function getMaterialNumApi(data) {
return request({
url: 'smart-canteen/api/v2/alloc/canteen/get-canteen-num',
method: 'post',
headers: {
"merchant-id":"378915229716713472",
},
data: data
})
}
// 新增区域
export function addMaterialApi(data) {
return request({
url: 'smart-canteen/api/v2/alloc/area/add',
method: 'post',
headers: {
"merchant-id":"378915229716713472",
},
data: data
})
}
//修改区域
export function updateMaterialApi(data) {
return request({
url: 'smart-canteen/api/v2/alloc/area/update',
method: 'post',
headers: {
"merchant-id":"378915229716713472",
},
data: data
})
}
//删除区域
export function removeMaterialApi(data) {
return request({
url: 'smart-canteen/api/v2/alloc/area/remove',
method: 'post',
headers: {
"merchant-id":"378915229716713472",
},
data: data
})
}

View File

@ -0,0 +1,492 @@
<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>

View File

@ -0,0 +1,733 @@
<template>
<!-- 类型管理 -->
<div class="app-container" id="toolsType">
<el-row :gutter="20">
<!--树数据-->
<el-col :span="5" :xs="24">
<div class="head-container">
原料类别
<el-input
v-model="materialName"
placeholder="请输入关键字进行搜索"
clearable
maxlength="50"
size="small"
prefix-icon="el-icon-search"
style="margin-bottom: 20px"
/>
</div>
<div class="head-container" style>
<el-tree
style="height: 700px; overflow: scroll"
:data="treeOptions"
:props="defaultProps"
:expand-on-click-node="false"
:filter-node-method="filterNode"
ref="tree"
node-key="id"
:default-expand-all="false"
highlight-current
@node-click="handleNodeClick"
>
<span
class="custom-tree-node"
slot-scope="{ node, data }"
@mousemove="onMousemove(data)"
@mouseleave="onMouseleave()"
>
<span v-if="isMousemoveId === data.id && node.label.length > 10">{{
node.label.slice(0, 10) + "..."
}}</span>
<span v-else>{{ node.label }}</span>
<span class="btn-items" v-if="isMousemoveId === data.id">
<el-button
type="text"
size="mini"
icon="el-icon-plus"
@click.stop="() => appendTreeNode(data)"
>
</el-button>
<el-button
type="text"
size="mini"
icon="el-icon-edit-outline"
style="color: #67c23a"
v-if="data.id !== 0"
@click.stop="() => editTreeNode(data)"
>
</el-button>
<el-button
type="text"
size="mini"
icon="el-icon-delete"
style="color: #f56c6c"
v-if="data.parentId != '-1'"
@click.stop="() => removeTreeNode(data)"
>
</el-button>
</span>
</span>
</el-tree>
</div>
</el-col>
<!--用户数据-->
<el-col :span="19" :xs="24">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="原料名称" prop="keyword">
<el-input
v-model="queryParams.keyword"
placeholder="请输入原料名称"
clearable
style="width: 240px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="条码" prop="keyword">
<el-input
v-model="queryParams.keyword"
placeholder="请输入条码"
clearable
style="width: 240px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>查询</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['dish:material:add']"
>新增</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="typeList" border>
<el-table-column label="序号" align="center" width="80" type="index">
<template slot-scope="scope">
<span>{{(queryParams.pageNum - 1) * 10 + scope.$index + 1}}</span>
</template>
</el-table-column>
<el-table-column label="原料编码" align="center" key="materialNum" prop="materialNum" show-overflow-tooltip/>
<el-table-column label="所属区域" align="center" key="region" prop="region" show-overflow-tooltip/>
<el-table-column label="原料类别" align="center" key="materialType" prop="materialType" show-overflow-tooltip/>
<el-table-column label="原料名称" align="center" key="materialName" prop="materialName" show-overflow-tooltip/>
<el-table-column label="营养信息名称" align="center" key="nutritionName" prop="nutritionName" show-overflow-tooltip/>
<el-table-column label="单位" align="center" key="unit" prop="unit" show-overflow-tooltip/>
<el-table-column label="条码" align="center" key="barcode" prop="barcode" show-overflow-tooltip/>
<el-table-column label="原料进价(元)" align="center" key="purchasePrice" prop="purchasePrice" show-overflow-tooltip/>
<el-table-column label="最近进价(元)" align="center" key="recentPrice" prop="recentPrice" show-overflow-tooltip/>
<el-table-column label="最近入库时间" align="center" key="lastStockTime" prop="lastStockTime" show-overflow-tooltip/>
<el-table-column label="月度均价(元)" align="center" key="monthlyAvgPrice" prop="monthlyAvgPrice" show-overflow-tooltip/>
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>
编辑
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</el-col>
</el-row>
<!-- 添加或修改原料类别对话框 -->
<el-dialog
:title="title+'-原料类别'"
:visible.sync="open"
width="500px"
append-to-body
:close-on-click-modal="false"
>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="所属区域" prop="areaNameStr">
<el-cascader
v-model="form.areaNameStr" :show-all-levels="false" :filterable="true"
:options="treeAreaOptions" :props="treeProps" collapse-tags
@change="handleTreeChange"></el-cascader>
</el-form-item>
<el-row>
<el-col :span="24">
<el-form-item label="原料类别" prop="categoryName">
<el-input
v-model="form.categoryName"
placeholder="请输入原料类别"
maxlength="30"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="原类别父节点" prop="superAreaName">
<el-input
v-model="form.superAreaName"
disabled
placeholder="原类别父节点"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="新类别父节点" prop="areaNameStr">
<el-cascader
v-model="form.areaNameStr" :show-all-levels="false" :filterable="true"
:options="treeAreaOptions" :props="treeProps" collapse-tags
@change="handleTreeChange"></el-cascader>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<!-- 添加或修改用户配置对话框 -->
<material-dialog
:visible.sync="dialogVisible"
:title="title"
@submit="handleDialogSubmit"
ref="materialDialog"
/>
</div>
</template>
<script>
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { systemMaterialTreeApi,systemAreaTreeApi,getMaterialListApi,getMaterialNameApi,getMaterialNumApi,addMaterialApi,updateMaterialApi,removeMaterialApi } from "@/api/dish/material";
import MaterialDialog from './components/MaterialDialog.vue';
export default {
name: "Material",
components: {
Treeselect,
MaterialDialog
},
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
treeOptions: undefined,
treeTemp: [],
isMousemoveId: null,
defaultProps: {
children: "children",
label: "categoryName",
},
materialName:"",
materialId:"",
//
queryParams: {
pageNum: 1,
pageSize: 10,
},
//
total: 0,
//
typeList: undefined,
//
open: false,
dialogVisible: false,
//
title: "",
//
form: {
categoryName: "",
parentId: "",
superAreaName: "",
categoryCode: "",
description: ""
},
//
rules: {
categoryName: [
{
required: true,
message: "类别名称不能为空",
trigger: "blur",
},
],
categoryCode: [
{
required: true,
message: "类别编码不能为空",
trigger: "blur",
},
]
},
parentId: undefined,
treeAreaOptions:[],//
treeProps:{
multiple: true,
value:"id",
label:"treeName",
children:"children",
},
};
},
watch: {
//
materialName(val) {
this.$refs.tree.filter(val);
},
},
created() {
this.getTreeData();
this.getAreaTreeData();
},
methods: {
// -
filterNode(value, data) {
if (!value) return true;
return data.categoryName.indexOf(value) !== -1;
},
/** 查询新增页面-上级类型下拉树结构 */
getTreeData() {
systemMaterialTreeApi({}).then((response) => {
this.treeOptions = response.data;
console.log("this.treeOptions",this.treeOptions)
if(this.treeOptions && this.treeOptions.length > 0){
//
this.treeOptions = this.treeOptions.map(node => ({
...node,
categoryName: node.categoryName || node.treeName || node.label || '未命名'
}));
this.materialId = this.treeOptions[0].id;
this.getList();
} else {
this.materialId = "";
this.getList();
}
});
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.queryParams.pageNum = 1;
this.queryParams.pageSize = 10;
this.$refs.tree.setCurrentKey(null);
this.handleQuery();
},
/** 查询列表 */
getList() {
this.loading = true;
let params= {
"materialName":this.materialName,
"materialId":this.materialId,
"size": this.queryParams.pageSize,
"current": this.queryParams.pageNum
}
getMaterialListApi(params).then((response) => {
this.typeList = response.records;
this.total = Number(response.total);
this.loading = false;
});
},
// -
async handleNodeClick(data, node) {
console.log(data)
this.materialId = data.id;
this.handleQuery();
},
// -
async getMaterialName(data) {
let params= {
"materialId":data.id
}
const res = await getMaterialNameApi(params);
this.$set(this.form,"superMaterialName",res.msg)
},
// -
async getMaterialNum(data) {
let params= {
"superId":data.id||""
}
if(data.parentId=="-1"){
params.canteenTreeType=-1
}else{
params.canteenTreeType=0
}
const res = await getMaterialNumApi(params);
this.$set(this.form,"materialNum",res.data)
},
/* 树节点增加 */
appendTreeNode(data) {
this.reset();
if(data.parentId=="-1"){
this.$set(this.form,"superAreaName",data.categoryName)
}else{
this.$set(this.form,"superAreaName",data.categoryName)
}
this.$set(this.form,"parentId",data.id)
this.open = true;
this.title = "新增";
},
/* 树节点删除 */
removeTreeNode(data) {
console.log(data, "删除时的数据源--");
this.$modal
.confirm("是否确认删除数据项?")
.then(function () {
return removeMaterialApi({"materialId":data.id});
})
.then(() => {
this.$modal.msgSuccess("删除成功");
this.getList();
this.getTreeData();
})
.catch(() => {});
},
/* 树节点修改 */
editTreeNode(data) {
this.reset();
this.form = {
...data,
superAreaName: data.parentId === "-1" ? "" : this.getParentCategoryName(data.parentId)
};
this.open = true;
this.title = "修改";
},
onMousemove(data) {
this.isMousemoveId = data.id;
},
onMouseleave() {
this.isMousemoveId = null;
},
//
cancel() {
this.dialogVisible = false;
this.reset();
},
//
reset() {
this.form = {};
this.resetForm("form");
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.dialogVisible = true;
this.title = "新增";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.dialogVisible = true;
this.title = "修改";
// $refs 访
this.$nextTick(() => {
// setFormData
this.$refs.materialDialog.setFormData(row);
});
},
/** 处理对话框提交 */
handleDialogSubmit(formData) {
if (this.title === "新增") {
addMaterialApi(formData).then(response => {
this.$modal.msgSuccess("新增成功");
this.dialogVisible = false;
this.getList();
this.getTreeData();
});
} else {
updateMaterialApi(formData).then(response => {
this.$modal.msgSuccess("修改成功");
this.dialogVisible = false;
this.getList();
this.getTreeData();
});
}
},
/** 删除按钮操作 */
handleDelete(row) {
this.$modal
.confirm("是否确认删除数据项?")
.then(function () {
return removeMaterialApi({"materialId":row.materialId});
})
.then(() => {
this.$modal.msgSuccess("删除成功");
this.getList();
this.getTreeData();
})
.catch(() => {});
},
getParentName(list, id) {
try {
list.forEach((e) => {
if (e.id == id) {
this.form.label = e.label;
throw new Error();
} else {
if (e.children && e.children.length > 0) {
this.getParentName(e.children, id);
}
}
});
} catch (error) {}
},
/** 表单提交 */
handleSubmit() {
this.$refs.form.validate(valid => {
if (valid) {
if (this.form.id != undefined) {
updateMaterialApi(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addMaterialApi(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
//
getParentCategoryName(parentId) {
const findNode = (nodes) => {
for (let node of nodes) {
if (node.id === parentId) {
return node.categoryName;
}
if (node.children) {
const result = findNode(node.children);
if (result) return result;
}
}
return "";
};
return findNode(this.treeOptions);
},
handleTreeChange(e){
console.log(e)
},
//
getAreaTreeData() {
systemAreaTreeApi({}).then((response) => {
this.treeAreaOptions = response;
console.log(this.treeAreaOptions)
});
},
},
};
</script>
<style lang="scss" scoped>
::v-deep.el-table .fixed-width .el-button--mini {
width: 60px !important;
margin-bottom: 10px;
}
::v-deep .btn-items .el-button + .el-button {
margin-left: 6px;
}
.btn-items {
margin-left: 4px;
.el-button--text {
font-size: 16px;
}
}
::v-deep .el-tree .el-tree-node__expand-icon.expanded {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
::v-deep .el-tree .el-icon-caret-right:before {
content: "\e783";
font-size: 16px;
}
::v-deep
.el-tree
.el-tree-node__expand-icon.expanded.el-icon-caret-right:before {
content: "\e781";
font-size: 16px;
color: #1890ff;
}
::v-deep .el-tree-node__content > .el-tree-node__expand-icon {
color: #1890ff !important;
}
::v-deep .el-tree-node__expand-icon.is-leaf {
color: transparent !important;
}
::v-deep
.el-tree--highlight-current
.el-tree-node.is-current
> .el-tree-node__content {
background-color: #8decf1;
}
::v-deep .el-dialog .material-dialog {
//
.el-form-item__label {
font-size: 14px;
color: #606266;
font-weight: 500;
line-height: 1.5;
}
//
.el-input__inner {
font-size: 14px;
color: #303133;
&::placeholder {
font-size: 13px;
color: #c0c4cc;
}
}
//
span {
font-size: 14px;
// color: #606266;
margin-left: 8px;
}
//
.el-select {
.el-input__inner {
font-size: 14px;
color: #303133;
}
}
//
.el-input.is-disabled .el-input__inner {
background-color: #f5f7fa;
border-color: #e4e7ed;
color: #606266;
cursor: not-allowed;
}
}
//
::v-deep .el-table {
font-size: 14px;
th {
font-weight: 500;
color: #303133;
}
td {
color: #606266;
}
}
//
::v-deep .el-button {
font-size: 14px;
&--text {
font-size: 13px;
}
}
//
::v-deep .el-tree-node__label {
font-size: 14px;
color: #606266;
}
//
::v-deep .el-input--small {
.el-input__inner {
font-size: 13px;
&::placeholder {
font-size: 13px;
color: #c0c4cc;
}
}
}
</style>