<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="leftAddIsCopy"></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="45%">
|
<el-form ref="leftAdd" :model="leftAdd" style="width: 100%;">
|
<el-col :span="24" style="display: flex;justify-content: space-between;">
|
<el-form-item style="display: flex"
|
:rules="[{ required: true, message: '请选择产品类型', trigger: 'blur' }]" label="类型" prop="type">
|
<el-cascader @change="changeLeftAdd" v-model="leftAdd.type" style="width: 90%;" :options="formTypeOptions"
|
:props="{ checkStrictly: true }" clearable></el-cascader>
|
</el-form-item>
|
<el-form-item style="display: flex" v-if="leftAdd.type.length < 2" label="大类"
|
prop="father">
|
<el-autocomplete class="inline-input" style="width: 100%;" v-model="leftAdd.father"
|
:fetch-suggestions="querySearch" placeholder="请选择产品大类" @select="handleSelect"></el-autocomplete>
|
</el-form-item>
|
</el-col>
|
<el-col :span="24" style="display: flex;justify-content: space-between;">
|
<el-form-item style="display: flex;margin-left: 10px;" v-if="leftAdd.type.length < 3"
|
label="名称" prop="name">
|
<el-autocomplete class="inline-input" style="width: 100%;" v-model="leftAdd.name"
|
:fetch-suggestions="querySearchName" placeholder="请选择产品名称" @select="handleSelect"></el-autocomplete>
|
</el-form-item>
|
<el-form-item style="display: flex;margin-left: 13px;" v-if="leftAdd.type.length < 4"
|
label="标准" prop="standard">
|
<el-autocomplete class="inline-input" style="width: 100%;" v-model="leftAdd.standard"
|
:fetch-suggestions="querySearchStandar" placeholder="请选择产品标准" @select="handleSelect"></el-autocomplete>
|
</el-form-item>
|
</el-col>
|
<el-col :span="24" style="display: flex;justify-content: space-between;">
|
<el-form-item style="display: flex;margin-left: 5px" label="型号"
|
prop="specifications">
|
<el-input v-model="leftAdd.specifications" style="width: 100%;" placeholder="请输入产品型号"></el-input>
|
</el-form-item>
|
<el-col :span="10">
|
<el-form-item v-if="isCopy" style="display: flex;" label="是否复制">
|
<el-radio-group v-model="copyRadio">
|
<el-radio label="1">不复制</el-radio>
|
<el-radio label="2">复制</el-radio>
|
</el-radio-group>
|
</el-form-item>
|
</el-col>
|
</el-col>
|
</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: [],
|
copyRadio: "1",
|
spId: 0,
|
ver: 0,
|
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,
|
isCopy: 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: {
|
leftAddIsCopy() {
|
this.bomLeftAdd = true
|
this.copyRadio="1"
|
},
|
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+"?"+"spId="+this.spId+"&&"+"ver="+this.ver, 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]
|
//执行一二级新增
|
if (two === undefined || two === null) {
|
obj.type = this.getType(obj.type[0])
|
this.$axios.post(this.$api.url.leftAddOneTwo+"?"+"spId="+this.spId+"&&"+"ver="+this.ver, 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]
|
if (three === undefined || three === null) {
|
obj.type = this.getType(obj.type[0])
|
this.$axios.post(this.$api.url.leftAddOneTwo+"?"+"spId="+this.spId+"&&"+"ver="+this.ver, 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+"?"+"spId="+this.spId+"&&"+"ver="+this.ver, 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+"?"+"spId="+this.spId+"&&"+"ver="+this.ver, 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 {
|
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) {
|
},
|
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()
|
let versionArr = this.versionData;
|
if(versionArr == null || versionArr.length < 1){
|
this.versionVal = '';
|
}
|
},
|
handleNodeClick(val) {//树的值
|
if (val.code === '[5]' && val.children === undefined) {
|
this.isCopy=true
|
this.returntree = val
|
this.selectVersion()
|
}else{
|
this.isCopy=false
|
}
|
},
|
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))
|
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]
|
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();
|
}
|
},
|
copyRadio: {
|
handler(newval, oldVal) {
|
if (newval==='2') {
|
this.spId=JSON.stringify(this.returntree.id)
|
this.ver=JSON.stringify(this.versionVal)
|
}else{
|
this.spId=0
|
this.ver=0
|
}
|
}
|
}
|
}
|
}
|
</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>
|