<template>
|
<div class="standard">
|
<div class="title">
|
<el-row>
|
<el-col :span="12" style="line-height: 32px;">标准BOM</el-col>
|
<el-col :span="12" style="text-align: right;">
|
<el-button type="primary" icon="el-icon-plus" style="background: #004EA2;"
|
@click="showBomAddModel">新增</el-button>
|
<el-button icon="el-icon-plus" @click="addVersionBtn">新增版本</el-button>
|
<el-button @click="deleteDataBtn" icon="el-icon-delete">删除</el-button>
|
</el-col>
|
</el-row>
|
</div>
|
<div class="thing">
|
<div class="left">
|
<div class="left_search">
|
<el-row :gutter="5">
|
<el-col :span="21">
|
<el-input v-model="search" suffix-icon="el-icon-search" placeholder="请输入搜索内容" size="small" clearable></el-input>
|
</el-col>
|
<el-col :span="2">
|
<el-button size="mini" icon="el-icon-plus" @click="bomLeftAdd=true"></el-button>
|
</el-col>
|
</el-row>
|
</div>
|
<div class="left_tree">
|
<el-row>
|
<el-col :span="24">
|
<el-tree :data="list" ref="tree" default-expand-all :props="{ children: 'children', label: 'name' }"
|
node-key="id" :filter-node-method="filterNode" @node-click="handleNodeClick" highlight-current>
|
<div class="custom-tree-node" slot-scope="{ node, data }">
|
<span><i :class="`node_i ${data.code != '[5]' ? 'el-icon-folder-opened' : 'el-icon-tickets'}`"></i>
|
{{ data.code }}{{ data.name }}</span>
|
<el-button type="text" size="mini" @click.stop="remove(node, data)">
|
<i class="el-icon-delete"></i>
|
</el-button>
|
</div>
|
</el-tree>
|
</el-col>
|
</el-row>
|
</div>
|
</div>
|
<div class="right">
|
<div class="choose">
|
<span>类型:</span>
|
<el-select v-model="tableType" size="small" placeholder="请选择" @change="TYPE"
|
style="width: 13vw;margin-right: 15px;">
|
<el-option :value="0" label="工艺路线"></el-option>
|
<el-option :value="1" label="技术指标"></el-option>
|
<el-option :value="2" label="物料清单"></el-option>
|
<!-- <el-option :value="3" label="生产工艺"></el-option> -->
|
</el-select>
|
<span>版本:</span>
|
<el-select v-model="versionVal" @change="verevent" size="small" style="width: 13vw;margin-right: 15px;" placeholder="请选择">
|
<el-option v-for="(item,index) in versionData" :key="index" :label="item.label" :value="item.value">
|
</el-option>
|
</el-select>
|
<span>{{ tableType == 1 ? '项目:' : '工艺名称:' }}</span>
|
<el-input v-model="searchName" size="small" placeholder="请输入" style="width: 13vw;margin-right:15px"
|
clearable></el-input>
|
<el-button size="mini" @click="() => { searchName = ''; selectAll() }">
|
<span>重 置</span>
|
</el-button>
|
<el-button size="mini" type="primary" style="background: #004EA2;" @click="selectAll">
|
<span>查 询</span>
|
</el-button>
|
</div>
|
|
<div class="contentTable" v-if="this.typeselect == 0">
|
<technology @childData="getChildData" @updateDevice="updateDevice" :tableType="tableType" :tableData="tableData"></technology>
|
</div>
|
<div class="contentTable" v-if="this.typeselect == 1">
|
<target @childData="getChildData" :tableType="tableType" :tableData="tableData"></target>
|
</div>
|
<div class="contentTable" v-if="this.typeselect == 2">
|
<material @childData="getChildData" :tableType="tableType" :tableData="tableData"></material>
|
</div>
|
<div class="contentTable" v-if="this.typeselect == 3">
|
<product @childData="getChildData" :tableType="tableType" :tableData="tableData"></product>
|
</div>
|
</div>
|
</div>
|
|
<div class="bom-add-model">
|
<!-- 工艺路线 -->
|
<el-dialog title="BOM新增" :visible.sync="technologyVisible" width="45%">
|
<el-form :model="technologyForm" :inline="true" label-position="right"
|
ref="technologyForm" :rules="technologyRules" label-width="90px">
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="工序:" prop="tefather" style="display: flex;">
|
<el-select size="small"
|
filterable allow-create default-first-option style="width: 100%;"
|
v-model="technologyForm.tefather" placeholder="请输入或选择工序">
|
<el-option :value="item.father" :label="item.father" v-for="(item,index) in fatherList" :key="index"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="工艺名称:" prop="tename" style="display: flex;">
|
<el-input style="width: 100%;" size="small" placeholder="请输入工艺名称"
|
clearable v-model="technologyForm.tename"></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="设备组:" prop="deviceGroup" style="display: flex;">
|
<el-select placeholder="请选择设备组" size="small" style="width: 100%;"
|
v-model="technologyForm.deviceGroup">
|
<el-option :value="item.father"
|
v-for="(item,index) in deviceList" :key="index" :label="item.father"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="生产定额:" prop="productionQuota" style="display: flex;">
|
<el-input style="width: 100%;" size="small" clearable v-model.number="technologyForm.productionQuota" placeholder="请输入生产定额" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
</el-form>
|
<span slot="footer" class="dialog-footer" >
|
<el-button type="primary" @click="confirmAdd('technologyForm')">确 定</el-button>
|
<el-button @click="technologyVisible = false">取 消</el-button>
|
</span>
|
</el-dialog>
|
<!-- 技术指标 -->
|
<el-dialog title="BOM新增" :visible.sync="targetVisible" width="45%">
|
<el-form :model="targetForm" :inline="true" label-position="right"
|
:rules="targetRules" ref="targetForm" label-width="90px">
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="工序:" prop="pfather">
|
<el-select v-model="targetForm.pfather"
|
@change="changeFather" size="small" placeholder="请选择工序">
|
<el-option :value="item.name" :label="item.name" v-for="(item,index) in targetFormList" :key="index"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="工艺名称:" prop="technologyId">
|
<el-select v-model="targetForm.technologyId"
|
@change="changeTechnologyId" size="small" placeholder="请选择工艺名称">
|
<el-option :value="item.id" :label="item.name" v-for="(item,index) in technologyIdList" :key="index"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="项目:" prop="father">
|
<el-select v-model="targetForm.father"
|
filterable allow-create default-first-option
|
size="small" placeholder="请输入或选择项目">
|
<el-option :value="item.father" :label="item.father" v-for="(item,index) in projectList" :key="index"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="指标名称:" prop="name">
|
<el-input size="small" v-model="targetForm.name" placeholder="请输入指标名称"/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="单位:" prop="unit">
|
<el-input size="small" v-model="targetForm.unit" placeholder="请输入单位"/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="内控值:" prop="internal">
|
<el-input size="small" v-model="targetForm.internal" placeholder="请输入内控值"/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="标准值:" prop="required">
|
<el-input size="small" v-model="targetForm.required" placeholder="请输入标准值"/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12"></el-col>
|
</el-row>
|
</el-form>
|
<span slot="footer" class="dialog-footer" >
|
<el-button type="primary" @click="confirmAdd('targetForm')">确 定</el-button>
|
<el-button @click="targetVisible = false">取 消</el-button>
|
</span>
|
</el-dialog>
|
<!-- 物料清单 -->
|
<el-dialog title="BOM新增" :visible.sync="materialVisible" width="45%">
|
<el-form :model="materialForm" label-position="right"
|
:rules="materialRules" ref="materialForm" label-width="90px">
|
<el-row :gutter="100">
|
<el-col :span="12">
|
<el-form-item label="工序:" prop="mfather">
|
<el-select placeholder="请选择工序" @change="changeMName"
|
style="width:100%;" v-model="materialForm.mfather" size="small">
|
<el-option v-for="(item,index) in materialFormList" :key="index"
|
:label="item.name" :value="item.name" ></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="工艺名称:" prop="mtechnologyId">
|
<el-select placeholder="请选择工艺名称" style="width:100%;"
|
v-model="materialForm.mtechnologyId" size="small">
|
<el-option v-for="(item,index) in mIdList" :key="index"
|
:value="item.id" :label="item.name"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="材料信息" style="font-weight: bold;"></el-form-item>
|
</el-col>
|
<el-col :span="12" style="text-align: right;">
|
<el-button size="small" @click="addRowByMaterial">添加行</el-button>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="24">
|
<el-table :data="materialForm.tableList" border max-height="470"
|
:cell-style="{height:'20px',textAlign:'left'}"
|
:header-cell-style="{height:'20px'}">
|
<!-- <el-table-column label="供应商名称">
|
<template slot-scope="scope">
|
<el-input size="mini" v-model="scope.row.supplier"
|
placeholder="请输入"></el-input>
|
</template>
|
</el-table-column> -->
|
<el-table-column label="质量追溯号">
|
<template slot-scope="scope">
|
<el-input size="mini" v-model="scope.row.qualityTraceability"
|
placeholder="请输入"></el-input>
|
</template>
|
</el-table-column>
|
<el-table-column label="原材料名称">
|
<template slot-scope="scope">
|
<el-input size="mini" v-model="scope.row.name"
|
placeholder="请输入"></el-input>
|
</template>
|
</el-table-column>
|
<el-table-column label="规格型号">
|
<template slot-scope="scope">
|
<el-input size="mini" v-model="scope.row.specifications"
|
placeholder="请输入"></el-input>
|
</template>
|
</el-table-column>
|
<el-table-column label="单位">
|
<template slot-scope="scope">
|
<el-input size="mini" v-model="scope.row.unit"
|
placeholder="请输入"></el-input>
|
</template>
|
</el-table-column>
|
<el-table-column label="数量">
|
<template slot-scope="scope">
|
<el-input size="mini" v-model="scope.row.num"
|
placeholder="请输入"></el-input>
|
</template>
|
</el-table-column>
|
<el-table-column label="操作" width="60">
|
<template slot-scope="scope">
|
<el-button type="text" @click="removeMTableRow(scope.$index)">删除</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
</el-col>
|
</el-row>
|
</el-form>
|
<span slot="footer" class="dialog-footer" >
|
<el-button type="primary" @click="confirmAdd('materialForm')">确 定</el-button>
|
<el-button @click="materialVisible = false">取 消</el-button>
|
</span>
|
</el-dialog>
|
<!-- 生产工艺 -->
|
<el-dialog title="BOM新增" :visible.sync="productVisible" width="45%">
|
<el-form :model="productForm" :inline="true" label-position="right"
|
:rules="productRules" ref="productForm" label-width="90px">
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="工序:" prop="profather">
|
<el-select v-model="productForm.profather"
|
@change="changeProduct" placeholder="请选择工序" size="small">
|
<el-option v-for="(item,index) in productFormList" :key="index"
|
:value="item.name" :label="item.name"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="工艺名称:" prop="protechnologyId">
|
<el-select placeholder="请选择工艺名称" @change="getProductDeviceList"
|
v-model="productForm.protechnologyId" size="small">
|
<el-option v-for="(item,index) in proIdList" :key="index"
|
:value="item.id" :label="item.name"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="设备:" prop="device">
|
<el-select placeholder="请选择设备" size="small"
|
v-model="productForm.device">
|
<el-option v-for="(item,index) in productDeviceList" :key="index"
|
:value="item.device" :label="item.device"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="项目:" prop="productFather">
|
<el-select placeholder="请选择项目" size="small" @change="changeProductFather"
|
v-model="productForm.productFather">
|
<el-option v-for="(item,index) in productProjectList" :key="index"
|
:value="item.name" :label="item.name"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="指标:" prop="product">
|
<el-select placeholder="请选择指标" size="small" @change="changeProProduct"
|
v-model="productForm.product">
|
<el-option v-for="(item,index) in proProductList" :key="index"
|
:value="item.name" :label="item.name"></el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="单位:" prop="unit">
|
<el-input style="width:100%" size="small" disabled v-model="productForm.unit"/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
</el-form>
|
<span slot="footer" class="dialog-footer" >
|
<el-button type="primary" @click="confirmAdd('productForm')">确 定</el-button>
|
<el-button @click="productVisible = false">取 消</el-button>
|
</span>
|
</el-dialog>
|
|
<!-- 左侧点击+按钮 -->
|
<el-dialog title="BOM新增" :visible.sync="bomLeftAdd" width="29%">
|
<el-form ref="leftAdd" :model="leftAdd">
|
<el-form-item :rules="[{ required: true, message: '请选择产品类型', trigger: 'blur' }]" label="产品类型" prop="type">
|
<el-cascader @change="changeLeftAdd" v-model="leftAdd.type" style="width: 86%;" :options="formTypeOptions" :props="{ checkStrictly: true }" clearable></el-cascader>
|
</el-form-item>
|
<el-form-item v-if="leftAdd.type.length<2" label="产品大类" prop="father">
|
<el-autocomplete class="inline-input" style="width: 88%;" v-model="leftAdd.father" :fetch-suggestions="querySearch" placeholder="请选择产品大类" @select="handleSelect"></el-autocomplete>
|
</el-form-item>
|
<el-form-item v-if="leftAdd.type.length<3" label="产品名称" prop="name">
|
<el-autocomplete class="inline-input" style="width: 88%;" v-model="leftAdd.name" :fetch-suggestions="querySearchName" placeholder="请选择产品名称" @select="handleSelect"></el-autocomplete>
|
</el-form-item>
|
<el-form-item v-if="leftAdd.type.length<4" label="产品标准" prop="standard">
|
<el-autocomplete class="inline-input" style="width: 88%;" v-model="leftAdd.standard" :fetch-suggestions="querySearchStandar" placeholder="请选择产品标准" @select="handleSelect"></el-autocomplete>
|
</el-form-item>
|
<el-form-item label="产品型号" prop="specifications">
|
<el-input v-model="leftAdd.specifications" style="width: 88%;" placeholder="请输入产品型号"></el-input>
|
</el-form-item>
|
</el-form>
|
<span slot="footer" class="dialog-footer">
|
<el-button @click="resetForm('leftAdd')">取 消</el-button>
|
<el-button type="primary" @click="submitForm('leftAdd')">确 定</el-button>
|
</span>
|
</el-dialog>
|
<!-- 右上侧点击删除按钮 -->
|
<el-dialog title="BOM删除" :visible.sync="bomRightDl" width="30%">
|
<el-form>
|
删除
|
</el-form>
|
<span slot="footer" class="dialog-footer">
|
<el-button @click="bomRightDl=false">取 消</el-button>
|
<el-button type="primary" @click="bomRightDl = false">确 定</el-button>
|
</span>
|
</el-dialog>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import technology from "./standard-table/technology.vue"
|
import material from "./standard-table/material.vue"
|
import target from "./standard-table/target.vue"
|
import product from "./standard-table/product.vue"
|
import bomClickAdd from '@/components/view/standard-box/bomClickAdd'
|
export default {
|
components: { technology,material,target,product,bomClickAdd },
|
|
data() {
|
var checkPq = (rule,value,callback)=>{
|
if(value!='' && !Number.isInteger(value)){
|
return callback(new Error('请输入数字值'));
|
}
|
callback();
|
};
|
var checkVal = (rule,value,callback)=>{
|
let arr = [">","<","="];
|
if(value!='' && arr.indexOf(value.substring(0,1))==-1){
|
callback(new Error("开头需包含 > 或 < 或 = "))
|
}
|
callback();
|
};
|
return {
|
//子组件传的id列表
|
childIds:[],
|
isUpdateDevice:false,
|
//工序列表
|
fatherList:[],
|
deviceList:[],
|
technologyForm:{
|
tefather:'',
|
tename:'',
|
deviceGroup:'',
|
productionQuota:''
|
},
|
technologyRules:{
|
tefather:{required:true,message:'工序不能为空',trigger:'change'},
|
tename:{required:true,message:'工艺名称不能为空',trigger:'blur'},
|
deviceGroup:{required:true,message:'设备组不能为空',trigger:'change'},
|
productionQuota:{validator:checkPq,trigger:'change'}
|
},
|
//技术指标
|
targetFormList:[],
|
technologyIdList:[],
|
projectList:[],
|
targetForm:{
|
pfather:'',
|
father: '',
|
technologyId:'',
|
name:'',
|
unit:'',
|
internal:'',
|
required: ''
|
},
|
targetRules:{
|
pfather:{required:true,message:'工序不能为空',trigger:'change'},
|
technologyId:{required:true,message:'工艺名称不能为空',trigger:'change'},
|
father:{required:true,message:'项目不能为空',trigger:'change'},
|
name:{required:true,message:'指标名称不能为空',trigger:'blur'},
|
unit:{required:true,message:'单位不能为空',trigger:'change'},
|
internal:{required:true,message:'内控值不能为空',trigger:'change'},
|
required:{required:true,message:'标准值不能为空',trigger:'change'}
|
},
|
//物料清单
|
materialForm:{
|
mfather: '',
|
mtechnologyId:'',
|
tableList:[]
|
},
|
materialFormList:[],
|
mIdList:[],
|
materialRules:{
|
mfather:{required:true,message:'工序不能为空',trigger:'change'},
|
mtechnologyId:{required:true,message:'工艺名称不能为空',trigger:'change'},
|
},
|
//生产工艺
|
productForm:{
|
profather:'',
|
protechnologyId:'',
|
productFather:'',
|
product:'',
|
unit:'',
|
device:''
|
},
|
//设备列表
|
productDeviceList:[],
|
//工艺名称列表
|
proIdList:[],
|
//项目列表
|
productProjectList:[],
|
//指标列表
|
proProductList:[],
|
productRules:{
|
profather:{required:true,message:'工序不能为空',trigger:'change'},
|
protechnologyId:{required:true,message:'工艺名称不能为空',trigger:'change'},
|
productFather:{required:true,message:'项目不能为空',trigger:'change'},
|
product:{required:true,message:'指标不能为空',trigger:'change'},
|
device:{required:true,message:'设备不能为空',trigger:'change'}
|
},
|
productFormList:[],
|
// BOM树数据结构
|
list: [],
|
search: null,
|
tableType: 0, // 表格类型 1:技术指标,0:工艺路线
|
searchName: "",// 查询条件-名称
|
checkTreeNode: {},// 点击选中树节点
|
tableData: [],
|
technologyVisible: false,// 控制工艺路线新增模态框是否显示
|
targetVisible: false,// 控制技术指标新增模态框是否显示
|
materialVisible: false,// 控制物料清单新增模态框是否显示
|
productVisible: false,// 控制生产工艺新增模态框是否显示
|
bomLeftAdd: false,
|
bomRightUp: false,
|
bomRightDl: false,
|
formTypeOptions: null,
|
typeselect: 0,
|
returntree: {id:28},
|
leftAdd:{
|
type: [],
|
father: null,
|
standard: null,
|
name: null,
|
specifications: null
|
},
|
versionData: [],
|
versionVal: null,
|
restaurants: [],
|
bomName:[],
|
bomStandard:[],
|
isLeftAdd: true
|
}
|
},
|
mounted() {
|
this.tableType=0
|
this.selectMaterialTree()
|
this.selectVersion()
|
},
|
methods: {
|
updateDevice(val){
|
this.isUpdateDevice = val;
|
},
|
changeLeftAdd(){
|
if(this.leftAdd.type.length===2){
|
this.leftAdd.father=null
|
this.leftAdd.father=this.leftAdd.type[1]
|
}
|
if(this.leftAdd.type.length===3){
|
this.leftAdd.name=null
|
this.leftAdd.father=this.leftAdd.type[1]
|
this.leftAdd.name=this.leftAdd.type[2]
|
}
|
if(this.leftAdd.type.length===4){
|
this.leftAdd.standard=null
|
this.leftAdd.father=this.leftAdd.type[1]
|
this.leftAdd.name=this.leftAdd.type[2]
|
this.leftAdd.standard=this.leftAdd.type[3]
|
}
|
},
|
submitForm(formName) {
|
this.$refs[formName].validate((valid) => {
|
if (valid) {
|
let obj=JSON.parse(JSON.stringify(this.leftAdd))
|
if(obj.type.length===1){
|
obj.type=this.getType(obj.type[0])
|
this.$axios.post(this.$api.url.leftAddOneTwo,obj,{
|
headers: { "Content-Type": "application/json" }
|
}).then(res=>{
|
this.$message({
|
message: res.message,
|
type: 'success'
|
});
|
this.leftAdd.type=[]
|
this.leftAdd.father=null
|
this.leftAdd.standard=null
|
this.leftAdd.name=null
|
this.leftAdd.specifications=null
|
this.selectMaterialTree()
|
this.bomLeftAdd=false
|
this.selectVersion()
|
})
|
return
|
}
|
let one=this.list.filter(item=>{
|
return item.name===obj.type[0]
|
})[0]
|
let two=one.children.filter(item=>{
|
return item.name===obj.father
|
})[0]
|
console.log("two",two);
|
//执行一二级新增
|
if(two===undefined||two===null){
|
obj.type=this.getType(obj.type[0])
|
this.$axios.post(this.$api.url.leftAddOneTwo,obj,{
|
headers: { "Content-Type": "application/json" }
|
}).then(res=>{
|
this.$message({
|
message: res.message,
|
type: 'success'
|
});
|
this.leftAdd.type=[]
|
this.leftAdd.father=null
|
this.leftAdd.standard=null
|
this.leftAdd.name=null
|
this.leftAdd.specifications=null
|
this.selectMaterialTree()
|
this.bomLeftAdd=false
|
this.selectVersion()
|
})
|
}else{
|
let three=two.children.filter(item=>{
|
return item.name===obj.name
|
})[0]
|
console.log("three",three);
|
if(three===undefined||three===null){
|
obj.type=this.getType(obj.type[0])
|
this.$axios.post(this.$api.url.leftAddOneTwo,obj,{
|
headers: { "Content-Type": "application/json" }
|
}).then(res=>{
|
this.$message({
|
message: res.message,
|
type: 'success'
|
});
|
this.leftAdd.type=[]
|
this.leftAdd.father=null
|
this.leftAdd.standard=null
|
this.leftAdd.name=null
|
this.leftAdd.specifications=null
|
this.selectMaterialTree()
|
this.bomLeftAdd=false
|
this.selectVersion()
|
})
|
}else{
|
//新增标准型号
|
let four=three.children.filter(item=>{
|
return item.name===obj.standard
|
})[0]
|
if(four===undefined||four===null){
|
let StandardDto={
|
"id": three.id,
|
"specifications": obj.specifications,
|
"standard": obj.standard
|
}
|
this.$axios.post(this.$api.url.leftAddThree,StandardDto,{
|
headers: { "Content-Type": "application/json" }
|
}).then(res=>{
|
this.$message({
|
message: res.message,
|
type: 'success'
|
});
|
this.leftAdd.type=[]
|
this.leftAdd.father=null
|
this.leftAdd.standard=null
|
this.leftAdd.name=null
|
this.leftAdd.specifications=null
|
this.selectMaterialTree()
|
this.bomLeftAdd=false
|
this.selectVersion()
|
})
|
}else{
|
let specificationsDto={
|
"id": four.id,
|
"specifications": obj.specifications
|
}
|
this.$axios.post(this.$api.url.leftAddFour,specificationsDto,{
|
headers: { "Content-Type": "application/json" }
|
}).then(res=>{
|
this.$message({
|
message: res.message,
|
type: 'success'
|
});
|
this.leftAdd.type=[]
|
this.leftAdd.father=null
|
this.leftAdd.standard=null
|
this.leftAdd.name=null
|
this.leftAdd.specifications=null
|
this.selectMaterialTree()
|
this.bomLeftAdd=false
|
this.selectVersion()
|
})
|
}
|
}
|
}
|
this.resetForm('leftAdd')
|
} else {
|
console.log('error submit!!');
|
return false;
|
}
|
});
|
},
|
resetForm(formName) {
|
this.bomLeftAdd=false
|
this.$refs[formName].resetFields();
|
},
|
leftAddBom(){
|
|
},
|
//获取子组件数据
|
getChildData(data){
|
this.childIds = data;
|
},
|
//物料清单-新增bom-表格删除行
|
removeMTableRow(index){
|
this.materialForm.tableList.splice(index,1);
|
},
|
//删除按钮
|
deleteDataBtn(){
|
let ids;
|
let url;
|
ids = this.childIds.filter(item=>{
|
return item != undefined;
|
});
|
if(ids.length < 1){
|
this.$message.error("请先选择数据!");
|
return;
|
}
|
switch(this.typeselect){
|
case 0:
|
url = this.$api.url.delAllByTechnology;
|
break;
|
case 1:
|
url = this.$api.url.delAllByTarget;
|
break;
|
case 2:
|
url = this.$api.url.delAllByMBom;
|
break;
|
case 3:
|
url = this.$api.url.delAllByProduct;
|
break;
|
}
|
this.$confirm('确认删除已选中的数据吗', '删除', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning'
|
}).then(() => {
|
this.$axios.post(url,{
|
ids : ids.join(",")
|
}).then(res=>{
|
this.selectAll();
|
this.$message.success(res.message);
|
}).catch(error=>{
|
this.$message.error(error.message);
|
})
|
}).catch(() => {});
|
},
|
//新增版本
|
addVersionBtn(){
|
this.$confirm('确认新增版本吗', '新增版本', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'info'
|
}).then(() => {
|
this.$axios.post(this.$api.url.addVersion,{
|
specificationsId : this.returntree.id,
|
version : this.versionVal,
|
}).then(res=>{
|
this.selectVersion();
|
this.$message.success(res.message);
|
})
|
})
|
},
|
//右侧bom,确认新增
|
confirmAdd(formName){
|
this.$refs[formName].validate(valid=>{
|
if(valid){
|
let type = this.typeselect;
|
let obj = {}
|
if(type == 0){
|
obj = {
|
version : this.versionVal,
|
specificationsId: Number.parseInt(this.returntree.id),
|
deviceGroup: this.technologyForm.deviceGroup,
|
father: this.technologyForm.tefather,
|
name: this.technologyForm.tename,
|
productionQuota: this.technologyForm.productionQuota,
|
}
|
this.submitBomAdd(this.$api.url.addTechnology,obj);
|
}else if(type == 1){
|
obj = this.targetForm;
|
obj.version = this.versionVal;
|
this.submitBomAdd(this.$api.url.addProductByStandard,obj);
|
}else if(type == 2){
|
obj = {
|
mbomDto2List:this.materialForm.tableList,
|
technologyId:this.materialForm.mtechnologyId,
|
version : this.versionVal
|
}
|
this.submitBomAdd(this.$api.url.addMBomByStandard,obj);
|
}else if(type == 3){
|
let form = this.productForm;
|
obj = {
|
device: form.device,
|
product: form.product,
|
productFather: form.productFather,
|
technologyId: form.protechnologyId,
|
unit: form.unit,
|
version : this.versionVal
|
}
|
this.submitBomAdd(this.$api.url.addTechniqueByStandard,obj);
|
}else{
|
return
|
}
|
this.technologyVisible = false;
|
this.targetVisible = false;
|
this.materialVisible = false;
|
this.productVisible = false;
|
}
|
})
|
},
|
submitBomAdd(url,data){
|
this.$axios.post(
|
url,data,
|
{headers: { "Content-Type": "application/json" }}
|
).then(res=>{
|
this.selectAll();
|
this.$message.success(res.message);
|
}).catch(error=>{
|
})
|
},
|
//清空新增bom表单
|
clearBomAddModel(){
|
if(this.typeselect == 0){
|
this.deviceList=[];
|
this.$refs["technologyForm"].resetFields();
|
}else if(this.typeselect == 1){
|
this.technologyIdList = [];
|
this.projectList = [];
|
this.$refs["targetForm"].resetFields();
|
}else if(this.typeselect == 2){
|
this.mIdList = [];
|
this.materialForm.tableList = [];
|
this.$refs["materialForm"].resetFields();
|
}else{
|
this.productDeviceList=[];
|
this.proIdList=[];
|
this.productProjectList=[];
|
this.proProductList=[];
|
this.$refs["productForm"].resetFields();
|
}
|
},
|
changeTechnologyId(val){
|
this.$axios.get(this.$api.url.chooseFatherByStandard,{
|
params:{technologyId : val}
|
}).then(res=>{
|
this.projectList = res.data;
|
}).catch(error=>{
|
this.$message.error(error.message);
|
});
|
},
|
changeFather(val){
|
let arr = this.targetFormList.filter(item=>{
|
return item.name == val;
|
});
|
if(arr != undefined || arr.children != null){
|
this.technologyIdList = arr[0].children;
|
}
|
},
|
//物料清单--添加行
|
addRowByMaterial(){
|
let obj = {
|
"name": "",
|
"num": null,
|
"qualityTraceability": "",
|
"specifications": "",
|
// "supplier": "",
|
"unit": ""
|
}
|
this.materialForm.tableList.push(obj);
|
},
|
//物料清单--获取工序,工艺列表
|
getMaterialFormList(){
|
this.$axios.get(this.$api.url.chooseTechByMBom,{
|
params:{
|
specificationsId : this.returntree.id,
|
version : this.versionVal
|
}
|
}).then(res=>{
|
this.materialFormList = res.data;
|
}).catch(error=>{
|
this.$message.error(error.message);
|
})
|
},
|
changeMName(val){
|
let arr = this.materialFormList.filter(item=>{
|
return item.name == val;
|
})
|
this.mIdList = arr[0].children;
|
},
|
//技术指标--获取工序,工艺列表
|
getTargetFormList(){
|
this.$axios.get(this.$api.url.chooseTechByStandard,{
|
params:{
|
specificationsId : this.returntree.id,
|
version : this.versionVal
|
}
|
}).then(res=>{
|
this.targetFormList = res.data;
|
}).catch(error=>{
|
this.$message.error(error.message);
|
})
|
},
|
//1.生产工艺-->选择工序,工艺
|
getProductFormList(){
|
this.$axios.get(this.$api.url.chooseTechByProduct,{
|
params:{
|
specificationsId : this.returntree.id,
|
version : this.versionVal
|
}
|
}).then(res=>{
|
this.productFormList = res.data;
|
}).catch(error=>{
|
this.$message.error(error.message);
|
})
|
},
|
//2.选择工序,获取工艺名称
|
changeProduct(val){
|
let arr = this.productFormList.filter(item=>{
|
return item.name == val
|
});
|
this.proIdList = arr[0].children;
|
},
|
//3.生产工艺-->选择设备
|
getProductDeviceList(val){
|
this.$axios.get(this.$api.url.chooseDevByProduct,{
|
params:{technologyId : val}
|
}).then(res=>{
|
this.productDeviceList = res.data;
|
this.getProjectFormList(val);
|
}).catch(error=>{
|
this.$message.error(error.message);
|
})
|
},
|
//4.生产工艺--获取项目列表
|
getProjectFormList(val){
|
this.$axios.get(this.$api.url.chooseProByProduct,{
|
params:{technologyId : val}
|
}).then(res=>{
|
this.productProjectList = res.data;
|
}).catch(error=>{
|
this.$message.error(error.message);
|
})
|
},
|
//5.选择项目列表,获取指标
|
changeProductFather(val){
|
let arr = this.productProjectList.filter(item=>{
|
return item.name == val;
|
})
|
this.proProductList = arr[0].children;
|
},
|
//选择指标列表
|
changeProProduct(val){
|
let arr = this.proProductList.filter(item=>{
|
return item.name == val;
|
})
|
this.productForm.unit = arr[0].unit;
|
},
|
//工艺路线--获取工序列表
|
getFatherList(){
|
this.$axios.get(this.$api.url.chooseFather,{
|
params:{
|
specificationsId : this.returntree.id,
|
version: this.versionVal
|
}
|
}).then(res=>{
|
this.fatherList = res.data;
|
}).catch(error=>{
|
this.$message.error(error.message);
|
})
|
},
|
//工艺路线--获取设备组列表
|
getDeviceList(){
|
this.$axios.get(this.$api.url.chooseDevice).then(res=>{
|
this.deviceList = res.data;
|
}).catch(error=>{
|
this.$message.error(error.message);
|
})
|
},
|
showBomAddModel(){
|
if(this.typeselect == 0){
|
this.getFatherList();
|
this.getDeviceList();
|
this.technologyVisible = true
|
}else if(this.typeselect == 1){
|
this.getTargetFormList();
|
this.targetVisible = true
|
}else if(this.typeselect == 2){
|
this.getMaterialFormList();
|
this.materialVisible = true
|
}else{
|
this.getProductFormList();
|
this.productVisible = true
|
}
|
},
|
startLeftAdd(){
|
|
},
|
getType(typeName){
|
return typeName==="成品"?1:2
|
},
|
handleSelect(item) {
|
console.log(item);
|
},
|
querySearch(queryString, cb) {
|
var restaurants = this.restaurants;
|
var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants;
|
// 调用 callback 返回建议列表的数据
|
cb(results);
|
},
|
querySearchName(queryString, cb) {
|
var restaurants = this.bomName;
|
var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants;
|
// 调用 callback 返回建议列表的数据
|
cb(results);
|
},
|
querySearchStandar(queryString, cb) {
|
var restaurants = this.bomStandard;
|
var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants;
|
// 调用 callback 返回建议列表的数据
|
cb(results);
|
},
|
loadFatherType(){
|
return [{label:"橡胶连接器",value: "橡胶连接器"},{label:"金属连接器",value: "金属连接器"},
|
{label:"湿插拔电连接器",value: "湿插拔电连接器"},{label:"分支组件",value: "分支组件"}]
|
},
|
createFilter(queryString) {
|
return (restaurant) => {
|
return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
|
};
|
},
|
selectDataList() {
|
this.list.forEach(a => {
|
a.code = '[1]'
|
if (a.children != undefined) {
|
a.children.forEach(b => {
|
b.code = '[2]'
|
if (b.children != undefined) {
|
b.children.forEach(c => {
|
c.code = '[3]'
|
if (c.children != undefined) {
|
c.children.forEach(d => {
|
d.code = '[4]'
|
if (d.children != undefined) {
|
d.children.forEach(e => {
|
e.code = '[5]'
|
})
|
}
|
})
|
}
|
})
|
}
|
})
|
}
|
})
|
},
|
handleSelectionChange() {
|
|
},
|
TYPE(val) {//类型.数据
|
this.typeselect = val
|
this.searchName = '';
|
this.selectVersion()
|
},
|
handleNodeClick(val) {//树的值
|
if(val.code==='[5]'&&val.children===undefined){
|
this.returntree = val
|
this.selectVersion()
|
}
|
},
|
async selectVersion() {//版本
|
this.versionData = [];
|
await this.$axios.get(this.$api.url.selectVersion, {
|
params: {
|
specificationsId: this.returntree.id,
|
type: this.typeselect,
|
}
|
}).then(res => {
|
//初始化版本选择列表
|
if(res.data != null){
|
res.data.forEach(item=>{
|
this.versionData.push({
|
label:"v"+item,
|
value:item
|
})
|
this.versionVal = res.data[0];
|
})
|
}
|
this.selectAll()
|
})
|
},
|
//右侧数据
|
selectAll() {
|
this.$axios.get(this.$api.url.selectAll, {
|
params: {
|
specificationsId: this.returntree.id,//tree的点击反馈
|
type: this.typeselect,//类型
|
version: this.versionVal,//版本
|
message: this.searchName//搜索条件
|
}
|
}).then(res => {
|
let arr = res.data;
|
this.formatData(arr)
|
this.tableData = arr;
|
})
|
},
|
formatData(data){
|
let arr = data;
|
for(var i=0;i<arr.length;i++){
|
arr[i].rowId = Math.random();
|
if(arr[i].children != undefined){
|
this.formatData(arr[i].children);
|
}
|
}
|
},
|
verevent(val) {
|
this.versionVal = val
|
this.selectAll()
|
},
|
//五级树
|
selectMaterialTree() {
|
this.$axios.get(this.$api.url.selectTreeByMaterial).then( res => {
|
this.list=res.data
|
this.list.forEach((el, idx, arr) => {
|
if (idx == 0) {
|
arr[idx].name = '成品'
|
}
|
if (idx == 1) {
|
arr[idx].name = '半成品'
|
}
|
})
|
if(res.data.length<1){
|
let obj={
|
name: '成品',
|
}
|
let obj2={
|
name: '半成品',
|
}
|
this.list.push(obj)
|
this.list.push(obj2)
|
}
|
if(res.data.length===1){
|
if(res.data[0].name==='成品'){
|
this.list.push({
|
name: '半成品',
|
})
|
}
|
if(res.data[0].name==='半成品'){
|
this.list.push({
|
name: '成品',
|
})
|
}
|
}
|
this.selectDataList()
|
// 默认第一个五级节点搜索,新增配置项
|
const treeOptions = JSON.parse(JSON.stringify(this.list));
|
this.getDefault(treeOptions, 0);
|
this.formTypeOptions = treeOptions;
|
this.$nextTick().then(() => {
|
const firstNode = document.querySelector(
|
".el-tree-node .el-tree-node__children .el-tree-node .el-tree-node__children .el-tree-node .el-tree-node__children .el-tree-node .el-tree-node__children .el-tree-node"
|
);
|
try {
|
firstNode.click();
|
} catch (e) {
|
//TODO handle the exception
|
}
|
});
|
})
|
},
|
getDefault(arr, index) {
|
for (const item of arr) {
|
if (item.children && item.children.length > 0) {
|
// 有子节点
|
this.getDefault(item.children, index + 1);
|
if (index === 2) {
|
item.children = null;
|
}
|
}
|
}
|
},
|
filterNode(value, data) {
|
if (!value) return true;
|
return data.name.indexOf(value) !== -1;
|
},
|
remove(node, data) {
|
this.$confirm("是否删除", "提示", {
|
type: "warning"
|
}).then(res => {
|
const parent = node.parent;
|
const children = parent.data.children || parent.data;
|
const index = children.findIndex(d => d.id === data.id);
|
children.splice(index, 1);
|
}).catch(e => { })
|
},
|
nodeOpen(data, node, el) {
|
$($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder-opened')
|
},
|
nodeClose(data, node, el) {
|
$($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder')
|
},
|
// 递归更改添加级联所需属性
|
replaceProp(arr){
|
for (let index = 0; index < arr.length; index++) {
|
let element = arr[index];
|
element.label=element.name
|
element.value=element.name
|
if(element.children!=undefined){
|
if(element.code==='[4]'){
|
delete element['children']
|
continue
|
}
|
this.replaceProp(element.children)
|
}
|
}
|
}
|
},
|
watch:{
|
isUpdateDevice(val){
|
if(val){
|
this.selectAll();
|
}
|
},
|
search(val) {
|
this.$refs.tree.filter(val);
|
},
|
leftAdd: {
|
handler(newVal, oldVal) {
|
if(this.isLeftAdd){
|
let tree=JSON.parse(JSON.stringify(this.list))
|
console.log(tree);
|
let father=null;
|
if(newVal.father!=null&&newVal.father!=''&&newVal.type.length>0){
|
let one=tree.filter(item=>{
|
return item.name===newVal.type[0]
|
})[0]
|
console.log(one);
|
if(one.children===undefined){
|
return
|
}
|
let two=one.children.filter(item=>{
|
return item.name===newVal.father
|
})[0]
|
if(two!=undefined){
|
this.bomName=[]
|
father=JSON.parse(JSON.stringify(two))
|
two.children.forEach(item=>{
|
let obj={label: item.name,value: item.name}
|
this.bomName.push(obj)
|
})
|
}
|
}
|
if(newVal.name!=null&&newVal!=''&&newVal.father!=null&&newVal.father!=''&&newVal.type.length>0){
|
let three=null
|
if(father!=undefined&&father!=null){
|
three=father.children.filter(item=>{
|
return item.name===newVal.name
|
})[0]
|
}
|
if(three!=undefined&&three!=null){
|
this.bomStandard=[]
|
three.children.forEach(item=>{
|
let obj={label: item.name,value: item.name}
|
this.bomStandard.push(obj)
|
})
|
}
|
}
|
}
|
},
|
deep: true // 深度监听对象内部属性的变化,可选的
|
},
|
bomLeftAdd:{
|
handler(newval,oldVal){
|
if(newval){
|
let treeOptions = JSON.parse(JSON.stringify(this.list));
|
this.replaceProp(treeOptions)
|
this.formTypeOptions=treeOptions
|
this.restaurants=this.loadFatherType()
|
}
|
}
|
},
|
technologyVisible(newVal){
|
if(!newVal){
|
this.clearBomAddModel();
|
}
|
},
|
targetVisible(newVal){
|
if(!newVal){
|
this.clearBomAddModel();
|
}
|
},
|
materialVisible(newVal){
|
if(!newVal){
|
this.clearBomAddModel();
|
}
|
},
|
productVisible(newVal){
|
if(!newVal){
|
this.clearBomAddModel();
|
}
|
}
|
}
|
}
|
</script>
|
|
<style scoped>
|
|
.standard .title .el-button {
|
height: 32px;
|
border: 1px solid rgba(190, 190, 190, 0.44);
|
box-shadow: 0px 2px 4px rgba(220, 220, 220, 0.41);
|
padding: 0 12px;
|
}
|
|
.contentTable{
|
width:98%;
|
margin-left:1%;
|
}
|
|
.standard .title {
|
margin-bottom: 10px;
|
padding: 0 20px;
|
}
|
|
.standard .title * {
|
font-size: 16px;
|
}
|
|
.thing {
|
width: 100%;
|
height: calc(100% - 48px);
|
background-color: #fff;
|
display: flex;
|
|
}
|
|
.thing .left {
|
width: 295px;
|
height: calc(100% - 32px);
|
border-right: 3px solid rgb(245, 247, 251);
|
padding: 16px;
|
}
|
|
.thing .left .left_search{
|
width:95%;
|
height: 32px;
|
line-height: 32px;
|
margin-bottom: 5px;
|
}
|
|
.thing .left .left_tree{
|
width: 100%;
|
height: calc(100% - 32px);
|
overflow-y: scroll;
|
}
|
|
.thing .left .custom-tree-node span {
|
font-size: 14px;
|
}
|
|
.thing .left .custom-tree-node {
|
flex: 1;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
font-size: 14px;
|
padding-right: 8px;
|
}
|
|
.node_i {
|
color: orange;
|
}
|
|
.el-icon-delete {
|
display: none;
|
color: #004EA2;
|
}
|
|
.custom-tree-node:hover .el-icon-delete {
|
display: inline;
|
}
|
|
.thing .right {
|
width: calc(100% - 295px);
|
height: 100%;
|
overflow: hidden;
|
}
|
|
.thing .right .choose {
|
padding: 21px 24px;
|
display: flex;
|
align-items: center;
|
}
|
|
.thing .right .choose * {
|
font-size: 14px;
|
}
|
|
.thing .right .choose .el-button {
|
height: 32px;
|
border: 1px solid rgba(190, 190, 190, 0.44);
|
box-shadow: 0px 2px 4px rgba(220, 220, 220, 0.41);
|
padding: 0 12px;
|
}
|
|
.thing .right .table {
|
margin-right: 24px;
|
height: calc(100% - 74px);
|
}
|
</style>
|
<style>
|
.standard .title .el-button * {
|
font-size: 14px;
|
}
|
|
.standard .title .el-button--default {
|
color: #004EA2;
|
}
|
|
.standard .thing .left .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
|
background: rgba(58, 124, 253, 0.3);
|
color: #004EA2;
|
}
|
|
.el-tree-node__content {
|
height: 30px;
|
border-radius: 2px;
|
}
|
</style>
|