<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> 
 |