| <template> | 
|   <GlobalWindow | 
|     :title="title" | 
|     :visible.sync="visible" | 
|     width="80%" | 
|     :confirm-working="isWorking" | 
|     @confirm="confirm" | 
|   > | 
|     <div style="min-width:1150px;width:100%"> | 
|       <div class="form-data"> | 
|         <el-form :model="form" ref="form" class="form-wrap" inline :rules="rules" label-width="100px"> | 
|           <el-form-item label="物料编码" prop="materialCode"> | 
|             <div style="display: flex; justify-content: space-between; width: 192px"> | 
|               <el-input v-model="form.materialCode" placeholder="请选择关联产品" disabled v-trim/> | 
|               <el-button style="margin-left: 5px;" type="primary" @click="selectMainMaterial">查找</el-button> | 
|             </div> | 
|             <!-- <el-select v-model="form.materialId" filterable clearable placeholder="请选择关联产品" @change="selectMaterial"> | 
|               <el-option | 
|                 v-for="(item, index) in materials" | 
|                 :key="index" | 
|                 :label="item.code" | 
|                 :value="item.id"> | 
|               </el-option> | 
|             </el-select> --> | 
|           </el-form-item> | 
|           <el-form-item label="物料名称" prop="materialName"> | 
|             <el-input v-model="form.materialName" disabled placeholder="根据物料自动带出" v-trim/> | 
|           </el-form-item> | 
|           <el-form-item label="单位" prop="unitName"> | 
|             <el-input v-model="form.unitName" disabled placeholder="根据物料自动带出" v-trim/> | 
|           </el-form-item> | 
|           <!-- <el-form-item label="单位数量" prop="unitNum"> | 
|             <el-input v-model="form.unitNum" disabled placeholder="根据物料自动带出" v-trim/> | 
|           </el-form-item> --> | 
|           <el-form-item label="版本号" prop="version"> | 
|             <el-input v-model="form.version" disabled v-trim/> | 
|           </el-form-item> | 
|           <el-form-item label="工厂" prop="factoryId"> | 
|             <el-select v-model="form.factoryId" @visible-change="visibleChange" :loading="loading" filterable clearable placeholder="请选择工厂" @change="selectFactory"> | 
|               <el-option | 
|                 v-for="(item, index) in factories" | 
|                 :key="index" | 
|                 :label="item.name" | 
|                 :value="item.id"> | 
|               </el-option> | 
|             </el-select> | 
|           </el-form-item> | 
|           <el-form-item label="工艺路线" prop="routeId"> | 
|             <el-select v-model="form.routeId" :disabled="!form.factoryId" filterable clearable placeholder="请选择工艺" @change="selectRoute"> | 
|               <el-option | 
|                 v-for="(item, index) in routes" | 
|                 :key="index" | 
|                 :label="'【' + item.code + '】' + item.name" | 
|                 :value="item.id"> | 
|                 <span class="long-title-style" :title="'【' + item.code + '】' + item.name">{{ '【' + item.code + '】' + item.name }}</span> | 
|               </el-option> | 
|             </el-select> | 
|           </el-form-item> | 
|           <el-form-item label="投料工序" prop="procedureId"> | 
|             <el-select v-model="form.procedureId" disabled filterable clearable placeholder="请选择工序"> | 
|               <el-option | 
|                 v-for="(item, index) in procedures" | 
|                 :key="index" | 
|                 :label="item.name" | 
|                 :value="item.id"> | 
|               </el-option> | 
|             </el-select> | 
|           </el-form-item> | 
|           <el-form-item label="投料方式" prop="type"> | 
|             <el-select v-model="form.type" clearable placeholder="请选择投料方式"> | 
|               <el-option | 
|                 v-for="(item, index) in type" | 
|                 :key="index" | 
|                 :label="item.name" | 
|                 :value="item.id"> | 
|               </el-option> | 
|             </el-select> | 
|           </el-form-item> | 
|           <el-form-item label="图纸编号" prop="papercode"> | 
|             <el-input v-model="form.papercode" placeholder="请输入图纸编号" v-trim/> | 
|           </el-form-item> | 
|           <el-form-item label="模具编号" prop="mjcode"> | 
|             <el-input v-model="form.mjcode" placeholder="请输入模具编号" v-trim/> | 
|           </el-form-item> | 
|           <!-- <el-form-item label="喂料体系" prop="system"> | 
|             <el-input v-model="form.system" placeholder="请输入喂料体系" v-trim/> | 
|           </el-form-item> | 
|           <el-form-item label="收缩比" prop="ratio"> | 
|             <el-input v-model="form.ratio" placeholder="请输入收缩比" v-trim/> | 
|           </el-form-item> --> | 
|         </el-form> | 
|       </div> | 
|       <!-- 列表 --> | 
|       <el-tabs v-model="activeName"> | 
|         <el-tab-pane label="BOM组成" name="first"></el-tab-pane> | 
|       </el-tabs> | 
|       <ul class="toolbar"> | 
|           <li><el-button type="primary" @click="addMaterial">新增</el-button></li> | 
|         </ul> | 
|       <el-table | 
|         :data="form.bomDetailBeanList" | 
|         border | 
|         stripe | 
|       > | 
|         <el-table-column align="center" label="序号" type="index" /> | 
|         <el-table-column prop="code" align="center" label="物料编码" min-width="100px"></el-table-column> | 
|         <el-table-column prop="name" align="center" label="物料名称" show-overflow-tooltip min-width="140px"></el-table-column> | 
|         <el-table-column prop="umodelName" align="center" label="单位" min-width="60px"></el-table-column> | 
|         <el-table-column label="使用数量" align="center" min-width="100px"> | 
|           <template slot-scope="{row}"> | 
|             <el-input | 
|               v-model="row.num" | 
|               placeholder="请输入数量" | 
|               oninput="if(value<0) { value = ''} else {value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d\d\d\d\d\d\d).*$/, '$1$2.$3').replace(/^\./g, '')}" | 
|               v-trim/> | 
|           </template> | 
|         </el-table-column> | 
|         <el-table-column | 
|           label="操作" | 
|           min-width="100" | 
|           align="center" | 
|           fixed="right" | 
|         > | 
|           <template slot-scope="{row}"> | 
|             <span style="margin-left:8px"> | 
|               <el-button type="text" @click="deleteMaterail(row)">删除</el-button> | 
|             </span> | 
|           </template> | 
|         </el-table-column> | 
|       </el-table> | 
|     </div> | 
|     <SelectMaterail | 
|       ref="selectMaterail" | 
|       @selectData="selectData" | 
|     ></SelectMaterail> | 
|   </GlobalWindow> | 
| </template> | 
|   | 
| <script> | 
| import BaseOpera from '@/components/base/BaseOpera' | 
| import GlobalWindow from '@/components/common/GlobalWindow' | 
| import SelectMaterail from '@/components/ext/SelectMaterail' | 
| // import Drawa from '@/components/ext/draw' | 
| import { getDepartmentListByConditon } from '@/api/ext/departmentExt' | 
| import { getAllListRoute as routList, routeExt as proceList } from '@/api/ext/routeProcedureExt' | 
| import { findByBomId } from '@/api/ext/bomExt' | 
| export default { | 
|   name: 'OperaBomExtWindow', | 
|   extends: BaseOpera, | 
|   // SelectMaterail | 
|   components: { GlobalWindow, SelectMaterail }, | 
|   data () { | 
|     return { | 
|       // 表单数据 | 
|       form: { | 
|         id: null, | 
|         materialCode: '', | 
|         materialId: '', | 
|         materialName: '', | 
|         unitName: '', | 
|         unitId: '', | 
|         unitNum: 1, | 
|         version: '1.0', | 
|         factoryId: '', | 
|         routeId: '', | 
|         procedureId: '', | 
|         papercode: '', | 
|         mjcode: '', | 
|         system: '', | 
|         ratio: '', | 
|         type: '', | 
|         bomDetailBeanList: [ | 
|         ] | 
|       }, | 
|       // 验证规则 | 
|       rules: { | 
|         materialCode: [ | 
|           { required: true, message: '请选择物料', trigger: 'change' } | 
|         ], | 
|         version: [ | 
|           { required: true, message: '请选择填写版本号', trigger: 'blur' } | 
|         ], | 
|         factoryId: [ | 
|           { required: true, message: '请选择工厂', trigger: 'change' } | 
|         ], | 
|         routeId: [ | 
|           { required: true, message: '请选择工艺路线', trigger: 'change' } | 
|         ], | 
|         type: [ | 
|           { required: true, message: '请选择投料方式', trigger: 'change' } | 
|         ], | 
|         procedureId: [ | 
|           { required: true, message: '请选择工序', trigger: 'change' } | 
|         ] | 
|       }, | 
|       materials: [ | 
|       ], | 
|       loading: false, | 
|       factories: [ | 
|       ], | 
|       routes: [ | 
|       ], | 
|       procedures: [ | 
|       ], | 
|       activeName: 'first', | 
|       selectedMaterails: [] | 
|     } | 
|   }, | 
|   inject: ['type'], | 
|   created () { | 
|     this.config({ | 
|       api: '/ext/bomExt', | 
|       'field.id': 'id' | 
|     }) | 
|   }, | 
|   methods: { | 
|     visibleChange(e) { | 
|       if (e) { | 
|         this.loading = true | 
|         // 当前组织下的工厂 | 
|         getDepartmentListByConditon({ | 
|           type: 1 | 
|         }) | 
|           .then(res => { | 
|             // console.log(res) | 
|             this.factories = res | 
|             this.loading = false | 
|           }) | 
|           .catch(err => { | 
|             console.log(err) | 
|             this.loading = false | 
|           }) | 
|       } | 
|     }, | 
|     open (title, target) { | 
|       this.title = title | 
|       this.visibleChange(true) | 
|       this.visible = true | 
|       // 新建 | 
|       if (target == null) { | 
|         this.$nextTick(() => { | 
|           this.$refs.form.resetFields() | 
|           this.form.bomDetailBeanList = [] | 
|           this.form[this.configData['field.id']] = null | 
|         }) | 
|         return | 
|       } | 
|       // 编辑 | 
|       this.$nextTick(() => { | 
|         for (const key in this.form) { | 
|           this.form[key] = target[key] | 
|         } | 
|         // console.log(this.form) | 
|         this.form.bomDetailBeanList = [] | 
|         // this.selectMaterial(this.form.materialId) | 
|         this.getRourte(this.form.factoryId) | 
|         this.getProcedure(this.form.routeId) | 
|         this.getMaterialList(this.form.materialId) | 
|       }) | 
|     }, | 
|     getMaterialList (id) { | 
|       const query = '?materialId=' + id | 
|       findByBomId(query) | 
|         .then(res => { | 
|           // console.log(res) | 
|           // this.form.bomDetailBeanList = res | 
|           for (const item of res) { | 
|             this.form.bomDetailBeanList.push({ | 
|               code: item.materialCode, | 
|               name: item.materialName, | 
|               materialId: item.materialId, | 
|               num: item.num, | 
|               unitId: item.unitId, | 
|               umodelName: item.unitName | 
|             }) | 
|           } | 
|         }) | 
|         .catch(err => { | 
|           console.log(err) | 
|         }) | 
|     }, | 
|     selectMaterial (v) { | 
|       const tempM = this.materials[v - 1] | 
|       this.form.materialName = tempM.name | 
|       this.form.unitName = tempM.umodelName | 
|       this.form.unitId = tempM.unitId | 
|     }, | 
|     selectFactory (value) { | 
|       // console.log('选择工厂', value) | 
|       this.form.routeId = null | 
|       this.form.procedureId = null | 
|       this.getRourte(value) | 
|     }, | 
|     getRourte (value) { | 
|       routList({ | 
|         departId: value | 
|       }).then(res => { | 
|         this.routes = res | 
|         // console.log(res) | 
|       }) | 
|     }, | 
|     selectRoute (v) { | 
|       // console.log('选择工艺') | 
|       this.form.procedureId = null | 
|       this.getProcedure(v) | 
|     }, | 
|     getProcedure (v) { | 
|       proceList(v).then(res => { | 
|         // console.log(res) | 
|         this.procedures = res.proceList | 
|         this.form.procedureId = this.procedures[0].id | 
|       }).catch(err => { | 
|         console.log(err) | 
|       }) | 
|     }, | 
|     deleteMaterail (row) { | 
|       // console.log('删除物料') | 
|       if (this.form.bomDetailBeanList.length === 1) { | 
|         this.$message.warning('至少保留一条物料') | 
|         return | 
|       } | 
|       this.form.bomDetailBeanList.splice(this.form.bomDetailBeanList.indexOf(row), 1) | 
|     }, | 
|     selectMainMaterial () { | 
|       const ids = [] | 
|       if (this.form.bomDetailBeanList) { | 
|         for (const item of this.form.bomDetailBeanList) { | 
|           ids.push(item.materialId) | 
|         } | 
|       } | 
|       // console.log('ids', ids) | 
|       this.$refs.selectMaterail.open('选择物料', { ids: ids.join(','), multiple: false }) | 
|     }, | 
|     addMaterial () { | 
|       // console.log('增加物料') | 
|       const ids = [] | 
|       if (this.form.materialId) { | 
|         ids.push(this.form.materialId) | 
|       } | 
|       if (this.form.bomDetailBeanList) { | 
|         for (const item of this.form.bomDetailBeanList) { | 
|           ids.push(item.materialId) | 
|         } | 
|       } | 
|       // console.log(ids) | 
|       this.$refs.selectMaterail.open('选择物料', { ids: ids.join(','), multiple: true }) | 
|     }, | 
|     selectData (data) { | 
|       // 选择物料回调 | 
|       // console.log(data) | 
|       if (!data.multiple) { | 
|         const tempM = data.selectedMaterails[0] | 
|         this.form.materialId = tempM.id | 
|         this.form.materialCode = tempM.mmodelCode | 
|         this.form.materialName = tempM.mmodelUnionName | 
|         this.form.unitName = tempM.umodelName | 
|         this.form.unitId = tempM.unitId | 
|       } else { | 
|         for (const item of data.selectedMaterails) { | 
|           this.form.bomDetailBeanList.push({ | 
|             code: item.mmodelCode, | 
|             name: item.mmodelUnionName, | 
|             materialId: item.id, | 
|             num: item.num, | 
|             unitId: item.unitId, | 
|             umodelName: item.umodelName | 
|           }) | 
|         } | 
|       } | 
|     } | 
|   } | 
| } | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
| .form-data { | 
|   ::v-deep .el-form-item{ | 
|     width: 30%; | 
|     margin-right: 3%; | 
|   } | 
| } | 
| </style> | 
|   | 
| <style lang="scss" scoped> | 
| .toolbar { | 
|   border-bottom: 1px solid #eee; | 
|   padding-bottom: 10px; | 
|   li { | 
|     display: inline-block; | 
|     margin-right: 6px; | 
|   } | 
| } | 
| ::v-deep .el-dialog { | 
|   // height: calc(100% - 190px); | 
|   height: 70%; | 
|   min-height: 400px; | 
| } | 
| ::v-deep .el-dialog__footer { | 
|   padding: 0px; | 
| } | 
| ::v-deep .el-dialog__body { | 
|   height: calc(100% - 114px); | 
| } | 
|   | 
| .main-materail { | 
|   display: flex; | 
|   justify-content: space-between; | 
|   height: 100%; | 
|   .left { | 
|     width: calc(30% - 20px); | 
|     height: calc(100% - 20px); | 
|     border: #111 solid 1px; | 
|     padding: 10px; | 
|     font-size: 18px; | 
|   } | 
|   .right { | 
|     width: calc(70% - 20px); | 
|     height: calc(100% - 20px); | 
|     padding: 0, 20px; | 
|     section { | 
|       display: inline-block; | 
|       margin-left: 16px; | 
|       margin-bottom: 18px; | 
|     } | 
|   } | 
| } | 
| </style> |