Browse Source

1.供应商管理2.采购、入库整合供应商

lizhenhao 2 years ago
parent
commit
207a67ba34

+ 39 - 0
src/api/materialManagement/SupplierService.js

@@ -0,0 +1,39 @@
+import request from '@/utils/httpRequest'
+
+export default class SupplierService {
+  save (param) {
+    return request({
+      url: '/material/supplier/save',
+      method: 'post',
+      data: param
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/material/supplier/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  list (param) {
+    return request({
+      url: '/material/supplier/list',
+      method: 'get',
+      params: param
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/material/supplier/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  findByName (name) {
+    return request({
+      url: '/material/supplier/findByName',
+      method: 'get',
+      params: {name: name}
+    })
+  }
+}

+ 117 - 13
src/views/modules/materialManagement/info/UpdateInfoForm.vue

@@ -1,4 +1,4 @@
-<template>
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
   <div>
     <el-dialog
       :title="title"
@@ -11,10 +11,10 @@
       append-to-body
     >
       <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
-               label-width="100px" @submit.native.prevent>
+               label-width="110px" @submit.native.prevent>
 
         <el-divider content-position="left"><i class="el-icon-document"></i> 基础信息</el-divider>
-        <el-row :gutter="26">
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="采购编号" prop="purchaseNo">
               <el-input placeholder="自动生成" v-model="inputForm.purchaseNo" :disabled="true"></el-input>
@@ -27,6 +27,8 @@
               <el-input v-model="inputForm.purchaseSketch" placeholder="请填写采购名称"></el-input>
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="经办人" prop="handledBy">
               <el-input v-model="inputForm.handledBy" :disabled="true"></el-input>
@@ -51,12 +53,15 @@
               <!--            <el-input v-model="inputForm.handledByOffice" :disabled="true"></el-input>-->
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="采购时间" prop="purchaseDate" :rules="[{required: true, message:'请选择采购时间', trigger:'blur'}]">
               <el-date-picker
                 v-model="inputForm.purchaseDate"
                 type="date"
                 value-format="yyyy-MM-dd"
+                placement="bottom-start"
                 style="width: 100%"
                 placeholder="选择日期">
               </el-date-picker>
@@ -75,6 +80,8 @@
               </el-select>
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="24">
             <el-form-item label="备注" prop="remarks">
               <el-input v-model="inputForm.remarks"
@@ -110,49 +117,80 @@
             :edit-config="{trigger: 'click', mode: 'row', showStatus: false, autoClear: true, icon: '-'}"
             :edit-rules="validRules"
           >
-            <vxe-table-column field="purchaserAgent" title="采购人" :edit-render="{}" :rules="[{required: true, message:'请选择采购人', trigger:'blur'}]">
+            <vxe-table-column align="center" field="purchaserAgent" title="采购人" :edit-render="{}" :rules="[{required: true, message:'请选择采购人', trigger:'blur'}]">
               <template v-slot:edit="scope">
                 <el-input v-model="scope.row.purchaserAgent" @focus="userPullListForm(scope.$rowIndex)"></el-input>
               </template>
             </vxe-table-column>
-            <vxe-table-column field="procurementOffice" title="采购部门" :edit-render="{}">
+            <vxe-table-column align="center" field="procurementOffice" title="采购部门" :edit-render="{}">
               <template v-slot:edit="scope">
                 <el-input :disabled='true' v-model="scope.row.procurementOffice" ></el-input>
               </template>
             </vxe-table-column>
-            <vxe-table-column field="procurementType" title="采购类型" :edit-render="{}" :rules="[{required: true, message:'请选择采购类型', trigger:'blur'}]">
+            <vxe-table-column align="center" field="procurementType" title="采购类型" :edit-render="{}" :rules="[{required: true, message:'请选择采购类型', trigger:'blur'}]">
               <template v-slot:edit="scope">
                 <el-input v-model="scope.row.procurementType" @focus="typePullForm(scope.$rowIndex)"></el-input>
               </template>
             </vxe-table-column>
-            <vxe-table-column field="tradeName" title="商品名称" :edit-render="{}" :rules="[{required: true, message:'请填写商品名称', trigger:'blur'}]">
+            <vxe-table-column align="center" field="supplierName" title="供应商" :edit-render="{}" :rules="[{required: true, message:'请选择供应商', trigger:'blur'}]">
+              <template v-slot:edit="scope">
+                <vxe-pulldown ref="xDown4" transfer>
+                  <template #default>
+                    <vxe-input v-model="scope.row.supplierName" :readonly="commonJS.isNotEmpty(scope.row.isSupplier) && scope.row.isSupplier === '2'"
+                               :disabled="method === 'view'" placeholder="请填写供应商" @focus="focusEvent4(scope.$rowIndex)" ></vxe-input>
+                  </template>
+                  <template #dropdown>
+                    <div style="width: 600px;
+                              height: 300px;
+                              background-color: #fff;
+                              box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);">
+                      <vxe-input v-model="suppName" type="search" @search-click="searchClick"  placeholder="请输入供应商名称搜索" style="width: 100%" clearable></vxe-input>
+                      <vxe-grid
+                        border
+                        show-overflow
+                        auto-resize
+                        height="auto"
+                        :row-config="{isHover: true}"
+                        :loading="loading4"
+                        :pager-config="tablePage4"
+                        :data="tableData4"
+                        :columns="tableColumn4"
+                        @cell-click="cellClickEvent4"
+                        @page-change="pageChangeEvent4">
+                      </vxe-grid>
+                    </div>
+                  </template>
+                </vxe-pulldown>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column align="center" field="tradeName" title="商品名称" :edit-render="{}" :rules="[{required: true, message:'请填写商品名称', trigger:'blur'}]">
               <template v-slot:edit="scope">
                 <el-input @change="ifSameValue" v-model="scope.row.tradeName"></el-input>
               </template>
             </vxe-table-column>
-            <vxe-table-column field="tradePrice" title="商品单价(元)" :edit-render="{}" :rules="[{required: true, message:'请输入商品单价', trigger:'blur'}]">
+            <vxe-table-column align="center" field="tradePrice" title="商品单价(元)" :edit-render="{}" :rules="[{required: true, message:'请输入商品单价', trigger:'blur'}]">
               <template v-slot:edit="scope">
                 <!--              <el-input @change="changeValue" maxlength="15" v-model="scope.row.tradePrice" @keyup.native="scope.row.tradePrice = twoDecimalPlaces(scope.row.tradePrice)"></el-input>-->
                 <el-input @change="changeValue" maxlength="15" v-model="scope.row.tradePrice" @blur="scope.row.tradePrice = twoDecimalPlaces(scope.row.tradePrice)"></el-input>
               </template>
             </vxe-table-column>
-            <vxe-table-column field="tradeNumber" title="商品数量" :edit-render="{}">
+            <vxe-table-column align="center" field="tradeNumber" title="商品数量" :edit-render="{}">
               <template v-slot:edit="scope">
                 <!--              <el-input @change="changeValue" v-model="scope.row.tradeNumber" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>-->
                 <el-input @change="changeValue" v-model="scope.row.tradeNumber" @blur="scope.row.tradeNumber = twoDecimalPlaces2(scope.row.tradeNumber)" maxlength="10"></el-input>
               </template>
             </vxe-table-column>
-            <vxe-table-column field="priceSum" title="商品总价" :edit-render="{}">
+            <vxe-table-column align="center" field="priceSum" title="商品总价" :edit-render="{}">
               <template v-slot:edit="scope">
                 <el-input v-model="scope.row.priceSum" @blur="scope.row.priceSum = twoDecimalPlaces(scope.row.priceSum)" maxlength="15"></el-input>
               </template>
             </vxe-table-column>
-            <vxe-table-column field="company" title="单位" :edit-render="{}" :rules="[{required: true, message:'请填写单位', trigger:'blur'}]">
+            <vxe-table-column align="center" field="company" title="单位" :edit-render="{}" :rules="[{required: true, message:'请填写单位', trigger:'blur'}]">
               <template v-slot:edit="scope">
                 <el-input v-model="scope.row.company"></el-input>
               </template>
             </vxe-table-column>
-            <vxe-table-column field="remarks" title="备注" :edit-render="{}">
+            <vxe-table-column align="center" field="remarks" title="备注" :edit-render="{}">
               <template v-slot:edit="scope">
                 <el-input v-model="scope.row.remarks" ></el-input>
               </template>
@@ -246,6 +284,7 @@
   import UpLoadComponent from '@/views/common/UpLoadComponent'
   import UserPullForm from '@/views/modules/finance/invoice/UserPullForm'
   import XEUtils from 'xe-utils'
+  import SupplierService from '@/api/materialManagement/SupplierService'
   export default {
     data () {
       return {
@@ -290,16 +329,32 @@
           detailInfos: [],
           // amountInfos: [],
           files: [] // 附件信息
-        }
+        },
+        loading4: false,
+        tablePage4: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10
+        },
+        tableColumn4: [
+          { field: 'name', title: '名称', align: 'center' },
+          { field: 'address', title: '地址', align: 'center' },
+          { field: 'telPhone', title: '联系电话', align: 'center' }
+        ],
+        tableData4: [],
+        suppName: '',
+        suppIndex: ''
       }
     },
     // reimbursementService: null,
     // reimbursementApprovalService: null,
     MaterialManagementService: null,
+    supplierService: null,
     created () {
       // this.reimbursementService = new ReimbursementService()
       // this.reimbursementApprovalService = new ReimbursementApprovalService()
       this.materialManagementService = new MaterialManagementService()
+      this.supplierService = new SupplierService()
     },
     components: {
       SelectTree,
@@ -633,7 +688,56 @@
             }
           }
         }
+      },
+      focusEvent4 (rowIndex) {
+        this.$refs.xDown4.showPanel()
+        this.loading4 = true
+        this.suppName = '' // 搜索框的值 清空
+        this.suppIndex = rowIndex // 获取当前行下标
+        this.tablePage4.currentPage = 1
+        this.tablePage4.pageSize = 10
+        this.refreshSupplierList()
+      },
+      suffixClick4 () {
+        this.$refs.xDown4.togglePanel()
+      },
+      searchClick () {
+        this.refreshSupplierList()
+      },
+      cellClickEvent4 ({ row }) {
+        this.inputForm.detailInfos[this.suppIndex].supplierName = row.name
+        this.inputForm.detailInfos[this.suppIndex].supplierId = row.id
+        this.inputForm.detailInfos[this.suppIndex].isSupplier = '2' // isSupplier:手动填写 ‘1’ 选择填写 ‘2’
+        this.suppIndex = ''
+        this.$refs.xDown4.hidePanel()
+      },
+      pageChangeEvent4 ({ currentPage, pageSize }) {
+        this.tablePage4.currentPage = currentPage
+        this.tablePage4.pageSize = pageSize
+        this.refreshSupplierList()
+      },
+      // 刷新供应商
+      refreshSupplierList () {
+        this.supplierService.list({
+          'current': this.tablePage4.currentPage,
+          'size': this.tablePage4.pageSize,
+          'name': this.suppName
+        }).then(({data}) => {
+          this.tableData4 = data.records
+          this.tablePage4.total = data.total
+          this.loading4 = false
+        })
       }
     }
   }
 </script>
+
+<style>
+  .el-divider__text {
+    font-size: 16px;
+    font-weight: bold;
+  }
+  .vxe-pulldown--panel {
+    z-index: 9997 !important
+  }
+</style>

+ 117 - 18
src/views/modules/materialManagement/purchase/PurchaseForm.vue

@@ -1,10 +1,10 @@
-<template>
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
   <div>
-    <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="formReadOnly"
-             label-width="100px" @submit.native.prevent>
+    <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status === 'audit' || status === 'taskFormDetail'"
+             label-width="110px" @submit.native.prevent>
 
       <el-divider content-position="left"><i class="el-icon-document"></i> 基础信息</el-divider>
-      <el-row :gutter="26">
+      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="采购编号" prop="purchaseNo">
             <el-input placeholder="自动生成" v-model="inputForm.purchaseNo" :disabled="true"></el-input>
@@ -17,6 +17,8 @@
             <el-input v-model="inputForm.purchaseSketch" placeholder="请填写采购名称"></el-input>
           </el-form-item>
         </el-col>
+      </el-row>
+      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="经办人" prop="handledBy">
             <el-input v-model="inputForm.handledBy" :disabled="true"></el-input>
@@ -41,12 +43,15 @@
 <!--            <el-input v-model="inputForm.handledByOffice" :disabled="true"></el-input>-->
           </el-form-item>
         </el-col>
+      </el-row>
+      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="采购申请时间" prop="purchaseDate" :rules="[{required: true, message:'请选择采购申请时间', trigger:'blur'}]">
             <el-date-picker
               v-model="inputForm.purchaseDate"
               type="date"
               value-format="yyyy-MM-dd"
+              placement="bottom-start"
               style="width: 100%"
               placeholder="选择日期">
             </el-date-picker>
@@ -67,6 +72,8 @@
             </el-select>
           </el-form-item>
         </el-col>
+      </el-row>
+      <el-row :gutter="20">
         <el-col :span="24">
           <el-form-item label="备注" prop="remarks">
             <el-input v-model="inputForm.remarks"
@@ -82,7 +89,7 @@
 
       <el-divider content-position="left"><i class="el-icon-document"></i>
         采购详情
-        <el-button style="margin-left: 20px" type="primary" :disabled="method==='view' || this.formReadOnly" size="mini" @click="insertEvent('detail')" plain>
+        <el-button style="margin-left: 20px" type="primary" :disabled="method==='view' || status === 'audit' || status === 'taskFormDetail'" size="mini" @click="insertEvent('detail')" plain>
           新增
         </el-button>
       </el-divider>
@@ -102,59 +109,89 @@
           :edit-config="{trigger: 'click', mode: 'row', showStatus: false, autoClear: true, icon: '-'}"
           :edit-rules="validRules"
         >
-          <vxe-table-column field="purchaserAgent" title="采购人" :edit-render="{}" :rules="[{required: true, message:'请选择采购人', trigger:'blur'}]">
+          <vxe-table-column align="center" field="purchaserAgent" title="采购人" :edit-render="{}" :rules="[{required: true, message:'请选择采购人', trigger:'blur'}]">
             <template v-slot:edit="scope">
               <el-input v-model="scope.row.purchaserAgent" @focus="userPullListForm(scope.$rowIndex)"></el-input>
             </template>
           </vxe-table-column>
-          <vxe-table-column field="procurementOffice" title="采购部门" :edit-render="{}">
+          <vxe-table-column align="center" field="procurementOffice" title="采购部门" :edit-render="{}">
             <template v-slot:edit="scope">
               <el-input :disabled='true' v-model="scope.row.procurementOffice" ></el-input>
             </template>
           </vxe-table-column>
-          <vxe-table-column field="procurementType" title="采购类型" :edit-render="{}" :rules="[{required: true, message:'请选择采购类型', trigger:'blur'}]">
+          <vxe-table-column align="center" field="procurementType" title="采购类型" :edit-render="{}" :rules="[{required: true, message:'请选择采购类型', trigger:'blur'}]">
             <template v-slot:edit="scope">
               <el-input v-model="scope.row.procurementType" @focus="typePullForm(scope.$rowIndex)"></el-input>
             </template>
           </vxe-table-column>
-          <vxe-table-column field="tradeName" title="商品名称" :edit-render="{}" :rules="[]">
+          <vxe-table-column align="center" field="supplierName" title="供应商" :edit-render="{}" :rules="[{required: true, message:'请选择供应商', trigger:'blur'}]">
+            <template v-slot:edit="scope">
+              <vxe-pulldown ref="xDown4" transfer>
+                <template #default>
+                  <vxe-input v-model="scope.row.supplierName" :readonly="scope.row.isSupplier === '2'" :disabled="status === 'audit' || status === 'taskFormDetail'" placeholder="请填写供应商" @focus="focusEvent4(scope.$rowIndex)" ></vxe-input>
+                </template>
+                <template #dropdown>
+                  <div style="width: 600px;
+                              height: 300px;
+                              background-color: #fff;
+                              box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);">
+                    <vxe-input v-model="suppName" type="search" @search-click="searchClick"  placeholder="请输入供应商名称搜索" style="width: 100%" clearable></vxe-input>
+                    <vxe-grid
+                      border
+                      show-overflow
+                      auto-resize
+                      height="auto"
+                      :row-config="{isHover: true}"
+                      :loading="loading4"
+                      :pager-config="tablePage4"
+                      :data="tableData4"
+                      :columns="tableColumn4"
+                      @cell-click="cellClickEvent4"
+                      @page-change="pageChangeEvent4">
+                    </vxe-grid>
+                  </div>
+                </template>
+              </vxe-pulldown>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column align="center" field="tradeName" title="商品名称" :edit-render="{}" :rules="[]">
             <template v-slot:edit="scope">
               <el-input @change="ifSameValue" v-model="scope.row.tradeName"></el-input>
             </template>
           </vxe-table-column>
-          <vxe-table-column field="tradePrice" title="商品单价(元)" :edit-render="{}" :rules="[]">
+          <vxe-table-column align="center" field="tradePrice" title="商品单价(元)" :edit-render="{}" :rules="[]">
             <template v-slot:edit="scope">
 <!--              <el-input @change="changeValue" maxlength="15" v-model="scope.row.tradePrice" @keyup.native="scope.row.tradePrice = twoDecimalPlaces(scope.row.tradePrice)"></el-input>-->
               <el-input @change="changeValue" maxlength="15" v-model="scope.row.tradePrice" @blur="scope.row.tradePrice = twoDecimalPlaces2(scope.row.tradePrice)"></el-input>
             </template>
           </vxe-table-column>
-          <vxe-table-column field="tradeNumber" title="商品数量" :edit-render="{}">
+          <vxe-table-column align="center" field="tradeNumber" title="商品数量" :edit-render="{}">
             <template v-slot:edit="scope">
 <!--              <el-input @change="changeValue" v-model="scope.row.tradeNumber" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>-->
               <el-input @change="changeValue" v-model="scope.row.tradeNumber" @blur="scope.row.tradeNumber = twoDecimalPlaces2(scope.row.tradeNumber)" maxlength="10"></el-input>
             </template>
           </vxe-table-column>
-          <vxe-table-column field="priceSum" title="商品总价" :edit-render="{}">
+          <vxe-table-column align="center" field="priceSum" title="商品总价" :edit-render="{}">
             <template v-slot:edit="scope">
               <el-input v-model="scope.row.priceSum" :readonly="true" maxlength="15"></el-input>
 <!--              <el-input v-model="scope.row.priceSum" @blur="scope.row.priceSum = twoDecimalPlaces(scope.row.priceSum, scope.$rowIndex)" maxlength="15"></el-input>-->
             </template>
           </vxe-table-column>
-          <vxe-table-column field="company" title="单位" :edit-render="{}" :rules="[{required: true, message:'请填写单位', trigger:'blur'}]">
+          <vxe-table-column align="center" field="company" title="单位" :edit-render="{}" :rules="[{required: true, message:'请填写单位', trigger:'blur'}]">
             <template v-slot:edit="scope">
               <el-input v-model="scope.row.company"></el-input>
             </template>
           </vxe-table-column>
-          <vxe-table-column field="remarks" title="备注" :edit-render="{}">
+          <vxe-table-column align="center" field="remarks" title="备注" :edit-render="{}">
             <template v-slot:edit="scope">
               <el-input v-model="scope.row.remarks" ></el-input>
             </template>
           </vxe-table-column>
-          <vxe-table-column title="操作" width="300">
+          <vxe-table-column align="center" title="操作" width="300">
             <template v-slot="scope">
               <el-button size="mini" type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'detail')">删除</el-button>
               <el-button size="mini" type="primary" @click="sss(scope.$rowIndex)">上传附件</el-button>
-              <el-button size="mini" type="primary" v-if="formReadOnly" :disabled="false" @click="seeFileInfo(scope.$rowIndex)">查看文件详情</el-button>
+              <el-button size="mini" type="primary" v-if="status === 'audit' || status === 'taskFormDetail'" :disabled="false" @click="seeFileInfo(scope.$rowIndex)">查看文件详情</el-button>
 <!--              <el-button size="mini" v-if="formReadOnly" :disabled="false" type="primary" @click="seeFileInfo(scope.$rowIndex)">查看文件详情</el-button>-->
             </template>
           </vxe-table-column>
@@ -238,6 +275,7 @@
   import CwProgramPageForm from '@/views/modules/cw/reimbursementApproval/info/CwProgramPageForm'
   import MaterialTypePullForm from '../info/MaterialTypePullForm'
   import UserPullForm from '@/views/modules/finance/invoice/UserPullForm'
+  import SupplierService from '@/api/materialManagement/SupplierService'
   export default {
     data () {
       return {
@@ -274,16 +312,32 @@
           // amountInfos: [],
           files: [] // 附件信息
         },
-        keyWatch: ''
+        keyWatch: '',
+        loading4: false,
+        tablePage4: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10
+        },
+        tableColumn4: [
+          { field: 'name', title: '名称', align: 'center' },
+          { field: 'address', title: '地址', align: 'center' },
+          { field: 'telPhone', title: '联系电话', align: 'center' }
+        ],
+        tableData4: [],
+        suppName: '',
+        suppIndex: ''
       }
     },
     MaterialManagementService: null,
     userService: null,
     commonApi: null,
+    supplierService: null,
     created () {
       this.materialManagementService = new MaterialManagementService()
       this.userService = new UserService()
       this.commonApi = new CommonApi()
+      this.supplierService = new SupplierService()
     },
     props: {
       businessId: {
@@ -382,7 +436,7 @@
         this.visible = true
         this.loading = false
         this.$nextTick(() => {
-          if (this.formReadOnly === true && this.businessId !== 'false') {
+          if ((this.status === 'audit' || this.status === 'taskFormDetail') && this.businessId !== 'false') {
             method = 'view'
           }
           if (this.commonJS.isEmpty(this.inputForm.handledByOffice)) {
@@ -865,7 +919,52 @@
             }
           }
         }
+      },
+      focusEvent4 (rowIndex) {
+        this.$refs.xDown4.showPanel()
+        this.loading4 = true
+        this.suppName = '' // 搜索框的值 清空
+        this.suppIndex = rowIndex // 获取当前行下标
+        this.tablePage4.currentPage = 1
+        this.tablePage4.pageSize = 10
+        this.refreshSupplierList()
+      },
+      suffixClick4 () {
+        this.$refs.xDown4.togglePanel()
+      },
+      searchClick () {
+        this.refreshSupplierList()
+      },
+      cellClickEvent4 ({ row }) {
+        this.inputForm.detailInfos[this.suppIndex].supplierName = row.name
+        this.inputForm.detailInfos[this.suppIndex].supplierId = row.id
+        this.inputForm.detailInfos[this.suppIndex].isSupplier = '2' // isSupplier:手动填写 ‘1’ 选择填写 ‘2’
+        this.suppIndex = ''
+        this.$refs.xDown4.hidePanel()
+      },
+      pageChangeEvent4 ({ currentPage, pageSize }) {
+        this.tablePage4.currentPage = currentPage
+        this.tablePage4.pageSize = pageSize
+        this.refreshSupplierList()
+      },
+      // 刷新供应商
+      refreshSupplierList () {
+        this.supplierService.list({
+          'current': this.tablePage4.currentPage,
+          'size': this.tablePage4.pageSize,
+          'name': this.suppName
+        }).then(({data}) => {
+          this.tableData4 = data.records
+          this.tablePage4.total = data.total
+          this.loading4 = false
+        })
       }
     }
   }
 </script>
+<style>
+  .el-divider__text {
+    font-size: 16px;
+    font-weight: bold;
+  }
+</style>

+ 496 - 0
src/views/modules/materialManagement/supplier/SupplierForm.vue

@@ -0,0 +1,496 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1200px"
+      height="500px"
+      @close="close"
+      append-to-body
+      @keyup.enter.native=""
+      :visible.sync="visible">
+      <el-row>
+        <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method === 'view'"
+                 label-width="140px" @submit.native.prevent>
+          <el-row  :gutter="0">
+            <el-col :span="10">
+              <el-form-item label="供应商名称" prop="name" :rules="[
+                  {required: true, message:'请填写供应商名称', trigger:'blur'}
+                   ]">
+<!--                <span slot="label"><span style="color: red;border-top: 20px">*</span> 供应商名称</span>-->
+                <el-input maxlength="64" v-model="inputForm.name" @input="checkName" @blur="checkName" placeholder="请输入供应商名称"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="2">
+              <el-popover
+                v-model="visiblePop"
+                placement="left"
+                width="400"
+                height="800"
+                trigger="click"
+                :popper-options="{ boundariesElement: 'viewport', removeOnDestroy: true }"
+                ref="pops">
+                <vxe-table
+                  border="inner"
+                  auto-resize
+                  resizable
+                  :row-config="{isHover: true}"
+                  :data="gridData"
+                  :checkbox-config="{}"
+                  :row-style="rowStyle"
+                  :key="popKey"
+                  @cell-click="rowClick"
+                  :show-header="false"
+                >
+                  <vxe-column title="" field="entname" ></vxe-column>
+                </vxe-table>
+
+                <el-button type="info" slot="reference" @click="getPopTable" style="width: 100%" plain>查询</el-button>
+
+              </el-popover>
+              <el-form-item>
+
+              </el-form-item>
+            </el-col>
+
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="供应商名称" prop="name" :rules="[-->
+<!--                      {required: true, message:'供应商名称不能为空', trigger:'blur'}-->
+<!--                   ]">-->
+<!--                <el-input maxlength="64" v-model="inputForm.name" placeholder="请输入供应商名称"></el-input>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+
+            <el-col :span="12">
+              <el-form-item label="是否拥有信用代码" prop="isUscCode"
+                            :rules="[
+                    {required: true, message:'请选择是否拥有信用代码', trigger:'blur'}
+                   ]">
+                <el-radio-group v-model="inputForm.isUscCode">
+                  <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" >{{item.label}}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="0">
+            <el-col v-if="inputForm.isUscCode === '1'" :span="12">
+              <el-form-item label="统一社会信用代码" prop="uscCode"
+                            :rules="[
+                                    {required: true, message:'统一社会信用代码不能为空', trigger:'blur'}
+                     ]">
+                <el-input v-model="inputForm.uscCode" placeholder="请填写统一社会信用代码" ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col v-if="inputForm.isUscCode === '0'||commonJS.isEmpty(inputForm.isUscCode)" :span="12">
+              <el-form-item label="统一社会信用代码" prop="uscCode"
+                            :rules="[
+                     ]">
+                <el-input v-model="inputForm.uscCode" placeholder="请填写统一社会信用代码" ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="归属地区" prop="reconciliationArea"
+                            :rules="[
+                 ]">
+                <SelectTree
+                  ref="areaTree"
+                  :props="{
+                      value: 'id',             // ID字段名
+                      label: 'name',         // 显示名称
+                      children: 'children'    // 子级字段名
+                    }"
+                  url="/sys/area/treeData"
+                  :value="inputForm.reconciliationArea"
+                  :clearable="true"
+                  size="medium"
+                  :accordion="true"
+                  @getValue="(value) => {inputForm.reconciliationArea=value}"/>
+              </el-form-item>
+            </el-col>
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="供应商性质" prop="characterIs"-->
+<!--                            :rules="[-->
+<!--                     ]">-->
+<!--                <el-select v-model="inputForm.characterIs" placeholder="请选择供应商性质" style="width: 100%;">-->
+<!--                  <el-option-->
+<!--                    v-for="item in $dictUtils.getDictList('cw_work_client_type')"-->
+<!--                    :key="item.value"-->
+<!--                    :label="item.label"-->
+<!--                    :value="item.value">-->
+<!--                  </el-option>-->
+<!--                </el-select>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+            <el-col :span="12">
+              <el-form-item label="邮政编码" prop="zipCode">
+                <el-input maxlength="64" v-model="inputForm.zipCode" placeholder="请填写邮政编码"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="传真" prop="fax">
+                <el-input maxlength="64" v-model="inputForm.fax" placeholder="请填写传真"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="联系电话" prop="telPhone"
+                            :rules="[
+                     ]">
+                <el-input v-model="inputForm.telPhone" placeholder="联系电话" ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="地址" prop="address"
+                            :rules="[
+                     ]">
+                <el-input v-model="inputForm.address" placeholder="地址" ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="备注" prop="remarks"
+                            :rules="[
+                     ]">
+                <el-input type="textarea" style="width:100%" :rows="5" maxlength="500" v-model="inputForm.remarks" placeholder="请填写备注"></el-input>
+              </el-form-item>
+            </el-col>
+
+          </el-row>
+        </el-form>
+      </el-row>
+      <!--    联系人信息-->
+      <el-divider content-position="left">
+        <span style="color: red;border-top: 20px;margin-right: 5px">*</span>
+        <i class="el-icon-document"></i>
+        联系人信息
+        <el-button style="margin-left: 20px" type="primary" :disabled="method==='view'" size="mini" @click="insertEvent('link')" plain>
+          新增
+        </el-button>
+      </el-divider>
+      <el-row  :gutter="15">
+        <vxe-table
+          border
+          :column-config="{resizable: true}"
+          show-overflow
+          show-footer
+          :key="tableKey"
+          ref="linkTable"
+          class="vxe-table-element"
+          :data="inputForm.materialSupplierLinkDTOList"
+          style="margin-left: 3em"
+          @cell-click=""
+          @edit-closed=""
+          highlight-current-row
+          :edit-rules="validRules"
+          :edit-config="{trigger: 'click', mode: 'row', showStatus: false, autoClear: true, icon: '-', activeMethod: activeRowMethod}"
+        >
+          <vxe-table-column align="center" field="name" title="姓名" :edit-render="{}">
+            <template v-slot:edit="scope">
+              <vxe-input v-model="scope.row.name" placeholder="姓名"></vxe-input>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column align="center" field="sex" title="性别" :edit-render="{name: '$select', options: $dictUtils.getDictList('sex')}">
+            <template v-slot:edit="scope">
+              <vxe-select v-model="scope.row.sex" placeholder="性别" style="width: 100%;" transfer>
+                <vxe-option
+                  v-for="item in $dictUtils.getDictList('sex')"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </vxe-option>
+              </vxe-select>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column align="center" field="office" title="部门" :edit-render="{}">
+            <template v-slot:edit="scope">
+              <vxe-input v-model="scope.row.office" placeholder="部门"></vxe-input>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column align="center" field="position" title="职务" :edit-render="{}">
+            <template v-slot:edit="scope">
+              <vxe-input v-model="scope.row.position" placeholder="职务" ></vxe-input>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column align="center" field="linkPhone" title="联系方式1" :edit-render="{}">
+            <template v-slot:edit="scope">
+              <vxe-input v-model="scope.row.linkPhone" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式1" ></vxe-input>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column align="center" field="linkMobile" title="联系方式2" :edit-render="{}">
+            <template v-slot:edit="scope">
+              <vxe-input v-model="scope.row.linkMobile" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式2" ></vxe-input>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column align="center" field="email" title="邮箱" :edit-render="{}">
+            <template v-slot:edit="scope">
+              <vxe-input v-model="scope.row.email" @change="$forceUpdate()" @blur="blurEmail(scope.$rowIndex)" placeholder="邮箱"></vxe-input>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column align="center" field="remarks" title="备注" :edit-render="{}">
+            <template v-slot:edit="scope">
+              <vxe-input maxlength="500" v-model="scope.row.remarks" placeholder="备注"></vxe-input>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column align="center" title="操作" width="100">
+            <template v-slot="scope">
+              <el-button :disabled="method === 'view'" size="mini" type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'link')">删除</el-button>
+            </template>
+          </vxe-table-column>
+        </vxe-table>
+      </el-row>
+      <!--    附件-->
+      <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" :loading="loading" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+        <el-button size="small" :loading="loading" v-if="method === 'edit' || method === 'add'" type="primary" icon="el-icon-circle-check" @click="save()">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import SupplierService from '@/api/materialManagement/SupplierService'
+  import EnterpriseSearchService from '@/api/cw/common/EnterpriseSearchService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        loading: false,
+        inputForm: {
+          name: '',
+          isUscCode: '',
+          uscCode: '',
+          reconciliationArea: '',
+          characterIs: '',
+          zipCode: '',
+          fax: '',
+          telPhone: '',
+          address: '',
+          remarks: '',
+          materialSupplierLinkDTOList: [],
+          workAttachmentDtoList: []
+        },
+        tableKey: '',
+        visible: false,
+        visiblePop: false,
+        validRules: {
+          name: [
+            {required: true, message: '姓名不可以为空'}
+          ],
+          linkPhone: [
+            {required: true, message: '联系方式1不可以为空'}
+          ]
+        },
+        gridData: [],
+        popKey: ''
+      }
+    },
+    supplierService: null,
+    enterpriseSearchService: null,
+    created () {
+      this.supplierService = new SupplierService()
+      this.enterpriseSearchService = new EnterpriseSearchService()
+    },
+    components: {
+      UpLoadComponent,
+      SelectTree
+    },
+    methods: {
+      init (method, id) {
+        if (method === 'add') {
+          this.title = '新建供应商信息'
+        } else if (method === 'edit') {
+          this.title = '修改供应商信息'
+        } else {
+          method = 'view'
+          this.title = '查看供应商信息'
+        }
+        this.visible = true
+        this.method = method
+        this.inputForm = {
+          name: '',
+          isUscCode: '',
+          uscCode: '',
+          reconciliationArea: '',
+          characterIs: '',
+          zipCode: '',
+          fax: '',
+          telPhone: '',
+          address: '',
+          remarks: '',
+          materialSupplierLinkDTOList: [],
+          workAttachmentDtoList: []
+        }
+        this.inputForm.id = id
+        if (this.commonJS.isEmpty(this.inputForm.id)) {
+          this.inputForm.id = 'false'
+        }
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.supplierService.queryById(this.inputForm.id).then(({data}) => {
+            this.$refs.uploadComponent.clearUpload()
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            if (this.commonJS.isEmpty(this.inputForm.isUscCode)) {
+              this.inputForm.isUscCode = '0'
+            }
+            if (this.commonJS.isEmpty(this.inputForm.materialSupplierLinkDTOList)) {
+              this.inputForm.materialSupplierLinkDTOList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
+              this.inputForm.workAttachmentDtoList = []
+            }
+            this.$refs.uploadComponent.newUpload(this.method, this.inputForm.workAttachmentDtoList, 'material_supplier')
+            this.loading = false
+          })
+        })
+      },
+      save () {
+        this.$refs['inputForm'].validate(async (valid) => {
+          if (valid) {
+            if (this.commonJS.isEmpty(this.inputForm.materialSupplierLinkDTOList)) {
+              this.$message.error('联系人信息至少填写一条')
+            } else {
+              const errMap = await this.$refs.linkTable.validate(true).catch(errMap => errMap)
+              if (errMap) {
+                this.$message.error('联系人信息填写不正确')
+              } else {
+                this.supplierService.findByName(this.inputForm.name).then(({data}) => {
+                  if (this.commonJS.isNotEmpty(data) && this.commonJS.isNotEmpty(data.name)) { // 说明有查询到这个名称的数据
+                    if ((this.commonJS.isNotEmpty(this.inputForm.id) && this.inputForm.id !== data.id) || this.commonJS.isEmpty(this.inputForm.id)) {
+                      this.$message.warning('供应商已存在')
+                    } else {
+                      this.saveTrue()
+                    }
+                  } else {
+                    this.saveTrue()
+                  }
+                })
+              }
+            }
+          }
+        })
+      },
+      saveTrue () {
+        this.loading = true
+        if (this.$refs.uploadComponent.checkProgress()) {
+          this.loading = false
+        } else {
+          this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+          this.supplierService.save(this.inputForm).then(() => {
+            this.loading = false
+            this.$emit('refreshList')
+            this.close()
+          }).catch(() => {
+            this.loading = false
+          })
+        }
+      },
+      close () {
+        this.inputForm = {
+          name: '',
+          isUscCode: '',
+          uscCode: '',
+          reconciliationArea: '',
+          characterIs: '',
+          zipCode: '',
+          fax: '',
+          telPhone: '',
+          address: '',
+          remarks: '',
+          materialSupplierLinkDTOList: [],
+          workAttachmentDtoList: []
+        }
+        this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      },
+      // 新增
+      insertEvent (type) {
+        if (type === 'link') {
+          let d = {
+            name: '',
+            office: '',
+            position: '',
+            sex: '',
+            linkPhone: '',
+            linkMobile: '',
+            email: ''
+          }
+          if (this.commonJS.isEmpty(this.inputForm.materialSupplierLinkDTOList)) {
+            this.inputForm.materialSupplierLinkDTOList = []
+          }
+          this.$refs.linkTable.insertAt(d)
+          this.inputForm.materialSupplierLinkDTOList.push(d)
+          this.tableKey = Math.random()
+        }
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'link') {
+          this.$refs.linkTable.remove(row)
+          this.inputForm.materialSupplierLinkDTOList.splice(rowIndex, 1)
+        }
+      },
+      blurEmail (index) {
+        if (this.commonJS.isNotEmpty(this.inputForm.materialSupplierLinkDTOList[index].email)) {
+          if (!this.validateXG.isEmail(this.inputForm.materialSupplierLinkDTOList[index].email)) {
+            this.$message.error('联系人信息中,第' + (index + 1) + '条数据的“邮箱”填写错误,请重新填写')
+            this.inputForm.materialSupplierLinkDTOList[index].email = ''
+            throw new Error('联系人信息中,第' + (index + 1) + '条数据的“邮箱”填写错误,请重新填写')
+          }
+        }
+      },
+      // 禁用编辑
+      activeRowMethod ({ row, rowIndex }) {
+        if (this.method === 'view') {
+          return false
+        }
+        return true
+      },
+      rowStyle (event) {
+        return 'cursor:pointer;'
+      },
+      async rowClick (event) {
+        let id = this.gridData[event.rowIndex].companyid
+        await this.enterpriseSearchService.enterpriseTicketInfo(id).then((data) => {
+          this.inputForm.name = data.data.ENTNAME
+          this.inputForm.uscCode = data.data.UNCID
+          this.inputForm.address = data.data.OPLOC
+          this.checkName()
+        })
+        this.visiblePop = false
+      },
+      async getPopTable () {
+        let name = this.inputForm.name
+        if (this.commonJS.isNotEmpty(name)) {
+          await this.enterpriseSearchService.enterpriseSearchByName(name).then(({data}) => {
+            this.gridData = data.data.items
+            this.$refs.pops.updatePopper()
+            this.popKey = Math.random()
+          })
+        }
+        this.$refs.pops.updatePopper()
+      },
+      closePop () {
+        this.visiblePop = false
+      },
+      checkName () {
+        if (this.commonJS.isNotEmpty(this.inputForm.name)) {
+          this.supplierService.findByName(this.inputForm.name).then(({data}) => {
+            if (this.commonJS.isNotEmpty(data) && this.commonJS.isNotEmpty(data.name)) { // 说明有查询到这个名称的数据
+              if ((this.commonJS.isNotEmpty(this.inputForm.id) && this.inputForm.id !== data.id) || this.commonJS.isEmpty(this.inputForm.id)) {
+                this.$message.warning('供应商已存在')
+              }
+            }
+          })
+        }
+      }
+    }
+  }
+</script>
+

+ 183 - 0
src/views/modules/materialManagement/supplier/SupplierList.vue

@@ -0,0 +1,183 @@
+<template>
+  <div class="page">
+    <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="供应商名称" prop="name">
+        <el-input size="small" v-model="searchForm.name" placeholder="请输入供应商名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="联系电话" prop="telPhone">
+        <el-input size="small" v-model="searchForm.telPhone" placeholder="请输入联系电话" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="联系人名称" prop="linkName">
+        <el-input size="small" v-model="searchForm.linkName" placeholder="请输入联系人名称" clearable></el-input>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="bg-white top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('material:supplier:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+          <el-button v-if="hasPermission('material:supplier:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.supplierTable && $refs.supplierTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+        </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="supplierTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></vxe-column>
+          <vxe-column min-width="230" align="center" title="供应商名称" field="name">
+            <template slot-scope="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('material:supplier:view')" @click="view(scope.row.id)">{{scope.row.name}}</el-link>
+              <span v-else>{{scope.row.name}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="230" align="center" title="联系电话" field="telPhone"></vxe-column>
+          <vxe-column min-width="230" align="center" title="地址" field="address"></vxe-column>
+          <vxe-column min-width="130" align="center" title="创建人" field="createName"></vxe-column>
+          <vxe-column min-width="200" align="center" title="创建时间" field="createDate"></vxe-column>
+          <vxe-column title="操作" width="150px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('material:supplier:edit')" type="text"  size="small" @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('material:supplier:del')" type="text"   size="small" @click="del(scope.row.id)">删除</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          size="small"
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+    </div>
+    <SupplierForm ref="supplierForm" @refreshList="refreshList"></SupplierForm>
+  </div>
+</template>
+
+<script>
+  import SupplierForm from './SupplierForm'
+  import SupplierService from '@/api/materialManagement/SupplierService'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          telPhone: '',
+          name: '',
+          linkName: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    supplierService: null,
+    created () {
+      this.supplierService = new SupplierService()
+    },
+    components: {
+      SupplierForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.supplierForm.init('add', 'false')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.supplierTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.supplierForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.supplierForm.init('view', id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.supplierService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then(({data}) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.supplierTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.supplierService.delete(ids).then(({data}) => {
+            if (data === '删除成功') {
+              this.$message.success(data)
+            } else {
+              this.$message.error(data)
+            }
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 91 - 1
src/views/modules/materialManagement/wareHouse/WareHouseAddForm.vue

@@ -159,6 +159,37 @@
                 <el-input v-model="scope.row.wareHouseType" @focus="typePullForm(scope.$rowIndex)"></el-input>
               </template>
             </vxe-table-column>
+            <vxe-table-column min-width="100px" align="center" field="supplierName" title="供应商" :edit-render="{}" :rules="[{required: true, message:'请选择供应商', trigger:'blur'}]">
+              <template v-slot:edit="scope">
+                <vxe-pulldown ref="xDown4" transfer>
+                  <template #default>
+                    <vxe-input v-model="scope.row.supplierName" :readonly="scope.row.isSupplier === '2'" :disabled="method === 'view'"
+                               placeholder="请填写供应商" @focus="focusEvent4(scope.$rowIndex)" ></vxe-input>
+                  </template>
+                  <template #dropdown>
+                    <div style="width: 600px;
+                              height: 300px;
+                              background-color: #fff;
+                              box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);">
+                      <vxe-input v-model="suppName" type="search" @search-click="searchClick"  placeholder="请输入供应商名称搜索" style="width: 100%" clearable></vxe-input>
+                      <vxe-grid
+                        border
+                        show-overflow
+                        auto-resize
+                        height="auto"
+                        :row-config="{isHover: true}"
+                        :loading="loading4"
+                        :pager-config="tablePage4"
+                        :data="tableData4"
+                        :columns="tableColumn4"
+                        @cell-click="cellClickEvent4"
+                        @page-change="pageChangeEvent4">
+                      </vxe-grid>
+                    </div>
+                  </template>
+                </vxe-pulldown>
+              </template>
+            </vxe-table-column>
             <vxe-table-column min-width="180px" align="center" field="tradeName" title="商品名称" :edit-render="{}" :rules="[{required: true, message:'请填写商品名称', trigger:'blur'}]">
               <template v-slot:edit="scope">
                 <el-input @change="ifSameValue" maxlength="64" v-model="scope.row.tradeName"></el-input>
@@ -238,6 +269,7 @@
   import ContractChooseForm from '../contract/ContractChooseForm'
   import XEUtils from 'xe-utils'
   import UpdateInfoForm from '../info/UpdateInfoForm'
+  import SupplierService from '@/api/materialManagement/SupplierService'
   export default {
     data () {
       return {
@@ -283,14 +315,30 @@
           // amountInfos: [],
           files: [] // 附件信息
         },
-        tableKey: ''
+        tableKey: '',
+        loading4: false,
+        tablePage4: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10
+        },
+        tableColumn4: [
+          { field: 'name', title: '名称', align: 'center' },
+          { field: 'address', title: '地址', align: 'center' },
+          { field: 'telPhone', title: '联系电话', align: 'center' }
+        ],
+        tableData4: [],
+        suppName: '',
+        suppIndex: ''
       }
     },
     MaterialManagementService: null,
     WareHouseService: null,
+    supplierService: null,
     created () {
       this.materialManagementService = new MaterialManagementService()
       this.wareHouseService = new WareHouseService()
+      this.supplierService = new SupplierService()
     },
     components: {
       SelectTree,
@@ -784,6 +832,45 @@
             }
           }
         }
+      },
+      focusEvent4 (rowIndex) {
+        this.$refs.xDown4.showPanel()
+        this.loading4 = true
+        this.suppName = '' // 搜索框的值 清空
+        this.suppIndex = rowIndex // 获取当前行下标
+        this.tablePage4.currentPage = 1
+        this.tablePage4.pageSize = 10
+        this.refreshSupplierList()
+      },
+      suffixClick4 () {
+        this.$refs.xDown4.togglePanel()
+      },
+      searchClick () {
+        this.refreshSupplierList()
+      },
+      cellClickEvent4 ({ row }) {
+        this.inputForm.wareHouse[this.suppIndex].supplierName = row.name
+        this.inputForm.wareHouse[this.suppIndex].supplierId = row.id
+        this.inputForm.wareHouse[this.suppIndex].isSupplier = '2' // isSupplier:手动填写 ‘1’ 选择填写 ‘2’
+        this.suppIndex = ''
+        this.$refs.xDown4.hidePanel()
+      },
+      pageChangeEvent4 ({ currentPage, pageSize }) {
+        this.tablePage4.currentPage = currentPage
+        this.tablePage4.pageSize = pageSize
+        this.refreshSupplierList()
+      },
+      // 刷新供应商
+      refreshSupplierList () {
+        this.supplierService.list({
+          'current': this.tablePage4.currentPage,
+          'size': this.tablePage4.pageSize,
+          'name': this.suppName
+        }).then(({data}) => {
+          this.tableData4 = data.records
+          this.tablePage4.total = data.total
+          this.loading4 = false
+        })
       }
     }
   }
@@ -793,4 +880,7 @@
     font-size: 16px;
     font-weight: bold;
   }
+  .vxe-pulldown--panel {
+    z-index: 9997 !important
+  }
 </style>

+ 4 - 3
src/views/modules/materialManagement/wareHouse/WareHouseHi.vue

@@ -5,7 +5,7 @@
       :close-on-click-modal="false"
       v-dialogDrag
       append-to-body
-      width="1200px"
+      width="1300px"
       @close="close"
       @keyup.enter.native="doSubmit"
       :visible.sync="visible">
@@ -130,7 +130,7 @@
           :row-class-name="rowClassName"
           :key="tableKey"
         >
-          <vxe-column min-width="100px" align="center" field="wareHouseMan" title="入库人">
+          <vxe-column min-width="110px" align="center" field="wareHouseMan" title="入库人">
             <template v-slot="scope">
               <span v-if="scope.row.upFlag === '1'"> {{scope.row.wareHouseMan}}(修改前) </span>
               <span v-else-if="scope.row.upFlag === '2'"> {{scope.row.wareHouseMan}}(已删除) </span>
@@ -140,13 +140,14 @@
           </vxe-column>
           <vxe-column min-width="100px" align="center" field="wareHouseManOffice" title="入库部门"></vxe-column>
           <vxe-column min-width="100px" align="center" field="wareHouseType" title="入库类型"></vxe-column>
+          <vxe-column min-width="130px" align="center" field="supplierName" title="供应商" ></vxe-column>
           <vxe-column min-width="180px" align="center" field="tradeName" title="商品名称" ></vxe-column>
           <vxe-column min-width="80px" align="center" field="tradeNumber" title="商品数量" ></vxe-column>
           <vxe-column min-width="80px" align="center" field="company" title="单位"></vxe-column>
           <vxe-column min-width="80px" align="center" field="tradePrice" title="商品单价(元)" ></vxe-column>
           <vxe-column min-width="80px" align="center" field="priceSum" title="商品总价"></vxe-column>
           <vxe-column min-width="80px" align="center" field="actualPrice" title="实际价格"></vxe-column>
-          <vxe-column min-width="110px" align="center" field="remarks" title="备注"></vxe-column>
+          <vxe-column min-width="100px" align="center" field="remarks" title="备注"></vxe-column>
           <vxe-column align="center" fixed="right" title="操作" width="80px">
             <template v-slot="scope">
               <el-button size="mini" type="primary" v-if="scope.row.upFlag !== '1'" :disabled="false" @click="seeFileInfo2(scope.$rowIndex)" plain>附件</el-button>

+ 102 - 22
src/views/modules/materialManagement/wareHouse/WareHouseUpdateForm.vue

@@ -131,6 +131,7 @@
           </vxe-column>
           <vxe-column min-width="100px" align="center" field="wareHouseManOffice" title="入库部门"></vxe-column>
           <vxe-column min-width="100px" align="center" field="wareHouseType" title="入库类型"></vxe-column>
+          <vxe-column min-width="150px" align="center" field="supplierName" title="商品名称" ></vxe-column>
           <vxe-column min-width="180px" align="center" field="tradeName" title="商品名称" ></vxe-column>
           <vxe-column min-width="80px" align="center" field="tradeNumber" title="商品数量" ></vxe-column>
           <vxe-column min-width="80px" align="center" field="company" title="单位"></vxe-column>
@@ -176,6 +177,36 @@
               <el-input v-model="scope.row.wareHouseType" @focus="typePullForm(scope.$rowIndex)"></el-input>
             </template>
           </vxe-table-column>
+          <vxe-table-column min-width="100px" align="center" field="supplierName" title="供应商" :edit-render="{}" :rules="[{required: true, message:'请选择供应商', trigger:'blur'}]">
+            <template v-slot:edit="scope">
+              <vxe-pulldown ref="xDown4" transfer>
+                <template #default>
+                  <vxe-input v-model="scope.row.supplierName" :readonly="scope.row.isSupplier === '2'" :disabled="status === 'audit' || status === 'taskFormDetail'" placeholder="请填写供应商" @focus="focusEvent4(scope.$rowIndex)" ></vxe-input>
+                </template>
+                <template #dropdown>
+                  <div style="width: 600px;
+                              height: 300px;
+                              background-color: #fff;
+                              box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);">
+                    <vxe-input v-model="suppName" type="search" @search-click="searchClick"  placeholder="请输入供应商名称搜索" style="width: 100%" clearable></vxe-input>
+                    <vxe-grid
+                      border
+                      show-overflow
+                      auto-resize
+                      height="auto"
+                      :row-config="{isHover: true}"
+                      :loading="loading4"
+                      :pager-config="tablePage4"
+                      :data="tableData4"
+                      :columns="tableColumn4"
+                      @cell-click="cellClickEvent4"
+                      @page-change="pageChangeEvent4">
+                    </vxe-grid>
+                  </div>
+                </template>
+              </vxe-pulldown>
+            </template>
+          </vxe-table-column>
           <vxe-table-column min-width="180px" align="center" field="tradeName" title="商品名称" :edit-render="{}" :rules="[{required: true, message:'请填写商品名称', trigger:'blur'}]">
             <template v-slot:edit="scope">
               <el-input @change="ifSameValue" maxlength="64" v-model="scope.row.tradeName"></el-input>
@@ -264,6 +295,7 @@
   import MaterialTypePullForm from '../info/MaterialTypePullForm'
   import UserPullForm from '@/views/modules/finance/invoice/UserPullForm'
   import ContractChooseForm from '../contract/ContractChooseForm'
+  import SupplierService from '@/api/materialManagement/SupplierService'
   export default {
     data () {
       return {
@@ -312,18 +344,34 @@
           updateCause: ''
         },
         keyWatch: '',
-        tableKey: ''
+        tableKey: '',
+        loading4: false,
+        tablePage4: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10
+        },
+        tableColumn4: [
+          { field: 'name', title: '名称', align: 'center' },
+          { field: 'address', title: '地址', align: 'center' },
+          { field: 'telPhone', title: '联系电话', align: 'center' }
+        ],
+        tableData4: [],
+        suppName: '',
+        suppIndex: ''
       }
     },
     wareHouseService: null,
     MaterialManagementService: null,
     userService: null,
     commonApi: null,
+    supplierService: null,
     created () {
       this.materialManagementService = new MaterialManagementService()
       this.userService = new UserService()
       this.commonApi = new CommonApi()
       this.wareHouseService = new WareHouseService()
+      this.supplierService = new SupplierService()
     },
     props: {
       businessId: {
@@ -629,27 +677,20 @@
             if (this.commonJS.isEmpty(this.inputForm.files)) {
               this.inputForm.files = []
             }
-            if (this.commonJS.isEmpty(this.inputForm.wareHouse)) {
-              this.$message.error('至少填写一条入库详情信息')
-              this.loading = false
-              this.inputForm.functionFlag = ''
-              return
-            } else {
-              let i = this.inputForm.wareHouse.length
-              for (let j = 0; j < i; j++) {
-                let k = j + 1
-                if (this.commonJS.isEmpty(this.inputForm.wareHouse[j].wareHouseMan)) {
-                  this.$message.error('入库详情第' + k + '行请选择入库人')
-                  this.loading = false
-                  this.inputForm.functionFlag = ''
-                  return
-                }
-                if (this.commonJS.isEmpty(this.inputForm.wareHouse[j].wareHouseType)) {
-                  this.$message.error('入库详情第' + k + '行请选择入库类型')
-                  this.loading = false
-                  this.inputForm.functionFlag = ''
-                  return
-                }
+            let i = this.inputForm.wareHouse.length
+            for (let j = 0; j < i; j++) {
+              let k = j + 1
+              if (this.commonJS.isEmpty(this.inputForm.wareHouse[j].wareHouseMan)) {
+                this.$message.error('入库详情第' + k + '行请选择入库人')
+                this.loading = false
+                this.inputForm.functionFlag = ''
+                return
+              }
+              if (this.commonJS.isEmpty(this.inputForm.wareHouse[j].wareHouseType)) {
+                this.$message.error('入库详情第' + k + '行请选择入库类型')
+                this.loading = false
+                this.inputForm.functionFlag = ''
+                return
               }
             }
             this.inputForm.files = this.$refs.uploadComponent.getDataList()
@@ -965,6 +1006,45 @@
         } else if (row.upFlag === '0' && this.commonJS.isEmpty(row.sourceId)) { // 未被修改过的数据
           return ''
         }
+      },
+      focusEvent4 (rowIndex) {
+        this.$refs.xDown4.showPanel()
+        this.loading4 = true
+        this.suppName = '' // 搜索框的值 清空
+        this.suppIndex = rowIndex // 获取当前行下标
+        this.tablePage4.currentPage = 1
+        this.tablePage4.pageSize = 10
+        this.refreshSupplierList()
+      },
+      suffixClick4 () {
+        this.$refs.xDown4.togglePanel()
+      },
+      searchClick () {
+        this.refreshSupplierList()
+      },
+      cellClickEvent4 ({ row }) {
+        this.inputForm.wareHouse[this.suppIndex].supplierName = row.name
+        this.inputForm.wareHouse[this.suppIndex].supplierId = row.id
+        this.inputForm.wareHouse[this.suppIndex].isSupplier = '2' // isSupplier:手动填写 ‘1’ 选择填写 ‘2’
+        this.suppIndex = ''
+        this.$refs.xDown4.hidePanel()
+      },
+      pageChangeEvent4 ({ currentPage, pageSize }) {
+        this.tablePage4.currentPage = currentPage
+        this.tablePage4.pageSize = pageSize
+        this.refreshSupplierList()
+      },
+      // 刷新供应商
+      refreshSupplierList () {
+        this.supplierService.list({
+          'current': this.tablePage4.currentPage,
+          'size': this.tablePage4.pageSize,
+          'name': this.suppName
+        }).then(({data}) => {
+          this.tableData4 = data.records
+          this.tablePage4.total = data.total
+          this.loading4 = false
+        })
       }
     }
   }