From 6bbceeae0a692ef60f429dbca889752fcb09ec9a Mon Sep 17 00:00:00 2001
From: houshuai <17802598606@163.com>
Date: 星期四, 03 七月 2025 19:42:01 +0800
Subject: [PATCH] 线边库和订单 基本页面搭建

---
 src/views/lsw/modules/LswMaterialInventoryForm.vue           |    2 
 src/views/lsw/LswMaterialOutboundList.vue                    |   38 
 src/views/pms/modules/PmsProcessBillMaterialsForm.vue        |  144 ++++
 src/views/base/FactoryManager.vue                            |    6 
 src/views/lsw/modules/LswMaterialForm.vue                    |   77 +
 src/views/pms/modules/PmsProcessBillMaterialsModal.vue       |   60 +
 src/views/pms/modules/PmsMaterialProcessForm.vue             |  172 +++++
 src/views/pms/modules/PmsProcessBillMaterialsDetailForm.vue  |  141 ++++
 src/views/pms/modules/PmsProcessBillMaterialsDetailModal.vue |   60 +
 src/views/pms/PmsProcessBillMaterialsList.vue                |  241 +++++++
 src/views/lsw/modules/LswMaterialOutboundForm.vue            |   71 +
 src/views/pms/PmsProcessBillMaterialsDetailList.vue          |  207 ++++++
 src/views/lsw/LswMaterialInboundList.vue                     |   58 +
 src/views/lsw/modules/LswMaterialInboundForm.vue             |  237 ++++---
 src/views/pms/PmsMaterialProcessList.vue                     |  213 ++++++
 src/views/pms/modules/PmsMaterialProcessModal.vue            |   60 +
 src/views/lsw/LswMateriaView.vue                             |   43 +
 17 files changed, 1,661 insertions(+), 169 deletions(-)

diff --git a/src/views/base/FactoryManager.vue b/src/views/base/FactoryManager.vue
index 8d11dc0..93ea983 100644
--- a/src/views/base/FactoryManager.vue
+++ b/src/views/base/FactoryManager.vue
@@ -119,11 +119,11 @@
   </a-row>
 </template>
 <script>
-  import UserFactory from './modules/factoryManager/UserFactory'
+  import UserFactory from './modules/FactoryManager/UserFactory'
   import { queryFactoryTreeList, searchByKeywords, deleteByFactory } from '@/api/api'
   import { httpAction, deleteAction } from '@/api/manage'
   import { JeecgListMixin } from '@/mixins/JeecgListMixin'
-  import FactoryModal from './modules/factoryManager/FactoryModal'
+  import FactoryModal from './modules/FactoryManager/FactoryModal'
 
   export default {
     name: 'FactoryManager',
@@ -220,7 +220,7 @@
         this.iExpandedKeys = expandedKeys
         this.autoExpandParent = false
       },
-     
+
       batchDel: function() {
         this.isIncludesNotLeaf = false
         this.includesNotLeaf(this.factoryTree)
diff --git a/src/views/lsw/LswMateriaView.vue b/src/views/lsw/LswMateriaView.vue
index 0b726ef..9dee24c 100644
--- a/src/views/lsw/LswMateriaView.vue
+++ b/src/views/lsw/LswMateriaView.vue
@@ -3,7 +3,39 @@
     :bordered="false"
     title="绾胯竟搴撶墿鏂欎俊鎭�"
   >
-    <a-button @click="handleAdd" type="primary" icon="plus">鏂板鐗╂枡淇℃伅-娴嬭瘯</a-button>
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡缂栫爜">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�" v-model="queryParam.materialNumber"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡鍚嶇О">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欏悕绉�" v-model="queryParam.materialName"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡鍨嬪彿">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欏瀷鍙�" v-model="queryParam.materialModel"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡绫诲瀷">
+              <j-dict-select-tag placeholder="璇疯緭鍏ョ墿鏂欑被鍨�"  dictCode="material_category" v-model="queryParam.materialCategory"></j-dict-select-tag>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+<!--    <a-button @click="handleAdd" type="primary" icon="plus">鏂板鐗╂枡淇℃伅-娴嬭瘯</a-button>-->
     <a-spin :spinning="confirmLoading">
       <div>
         <!-- 涓昏〃鍗曞尯鍩� -->
@@ -154,8 +186,8 @@
             defaultValue: ''
           },
           {
-            title: '搴撳瓨鍦癐D',
-            key: 'warehouseId',
+            title: '搴撳瓨鍦�',
+            key: 'warehouseName',
             type: JVXETypes.input,
             width: '200px',
             placeholder: '璇疯緭鍏�${title}',
@@ -172,6 +204,7 @@
         ]
       },
       url: {
+        //searchlikeQuery
         list: '/lswmaterial/lswMaterial/list',
         queryById: '/lswmaterial/lswMaterial/queryById',
         lswMaterialInventory: {
@@ -212,15 +245,17 @@
       console.log('test---->', this.selectedRowKeys[0])
     },
     async onSelectChange(selectedRowKeys) {
+      this.lswMaterialInventoryTable.loading = true
       // 鍗曢�夋ā寮忎笅锛宻electedRowKeys 鏄暟缁勶紝浣嗛暱搴︽渶澶氫负1
       console.log('鐐瑰嚮浜�---->')
       this.selectedRowKeys = selectedRowKeys
-
+      this.lswMaterialInventoryTable.dataSource=[]
       // 鑾峰彇閫変腑琛岀殑瀹屾暣鏁版嵁
       if (selectedRowKeys.length > 0) {
         const selectedId = selectedRowKeys[0] // 閫変腑琛岀殑id
         const lswMaterialInventoryResult = await getAction(this.url.lswMaterialInventory.list, { 'id': selectedId })
         this.lswMaterialInventoryTable.dataSource = lswMaterialInventoryResult.result
+        this.lswMaterialInventoryTable.loading = false
       }
     }
 
diff --git a/src/views/lsw/LswMaterialInboundList.vue b/src/views/lsw/LswMaterialInboundList.vue
index 97c81f4..a0e75c8 100644
--- a/src/views/lsw/LswMaterialInboundList.vue
+++ b/src/views/lsw/LswMaterialInboundList.vue
@@ -4,6 +4,27 @@
     <div class="table-page-search-wrapper">
       <a-form layout="inline" @keyup.enter.native="searchQuery">
         <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡缂栫爜">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�" v-model="queryParam.materialNumber"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡鍚嶇О">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欏悕绉�" v-model="queryParam.materialName"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鎵规鍙�">
+              <j-input placeholder="璇疯緭鍏ユ壒娆″彿" v-model="queryParam.batchNumber"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
         </a-row>
       </a-form>
     </div>
@@ -12,12 +33,6 @@
     <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
     <div class="table-operator">
       <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('鐗╂枡鍏ュ簱鍗�')">瀵煎嚭</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
-        <a-button type="primary" icon="import">瀵煎叆</a-button>
-      </a-upload>
-      <!-- 楂樼骇鏌ヨ鍖哄煙 -->
-      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
       <a-dropdown v-if="selectedRowKeys.length > 0">
         <a-menu slot="overlay">
           <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>鍒犻櫎</a-menu-item>
@@ -122,19 +137,14 @@
             }
           },
           {
-            title:'鍒犻櫎鏍囪',
+            title:'浜х嚎',
             align:"center",
-            dataIndex: 'delFlag'
+            dataIndex: 'factoryId_dictText'
           },
           {
-            title:'浜х嚎ID',
+            title:'搴撳瓨鍦�',
             align:"center",
-            dataIndex: 'factoryId'
-          },
-          {
-            title:'搴撳瓨鍦癐D',
-            align:"center",
-            dataIndex: 'warehouseId'
+            dataIndex: 'warehouseId_dictText'
           },
           {
             title:'鐗╂枡缂栫爜',
@@ -166,14 +176,14 @@
             align:"center",
             dataIndex: 'receiveTime'
           },
-          {
-            title: '鎿嶄綔',
-            dataIndex: 'action',
-            align:"center",
-            fixed:"right",
-            width:147,
-            scopedSlots: { customRender: 'action' }
-          }
+          // {
+          //   title: '鎿嶄綔',
+          //   dataIndex: 'action',
+          //   align:"center",
+          //   fixed:"right",
+          //   width:147,
+          //   scopedSlots: { customRender: 'action' }
+          // }
         ],
         url: {
           list: "/lswmaterialinbound/lswMaterialInbound/list",
@@ -181,7 +191,6 @@
           deleteBatch: "/lswmaterialinbound/lswMaterialInbound/deleteBatch",
           exportXlsUrl: "/lswmaterialinbound/lswMaterialInbound/exportXls",
           importExcelUrl: "lswmaterialinbound/lswMaterialInbound/importExcel",
-
         },
         dictOptions:{},
         superFieldList:[],
@@ -197,6 +206,7 @@
     },
     methods: {
       initDictConfig(){
+
       },
       getSuperFieldList(){
         let fieldList=[];
diff --git a/src/views/lsw/LswMaterialOutboundList.vue b/src/views/lsw/LswMaterialOutboundList.vue
index 7045f44..b38cd0d 100644
--- a/src/views/lsw/LswMaterialOutboundList.vue
+++ b/src/views/lsw/LswMaterialOutboundList.vue
@@ -4,6 +4,27 @@
     <div class="table-page-search-wrapper">
       <a-form layout="inline" @keyup.enter.native="searchQuery">
         <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡缂栫爜">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�" v-model="queryParam.materialNumber"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡鍚嶇О">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欏悕绉�" v-model="queryParam.materialName"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鎵规鍙�">
+              <j-input placeholder="璇疯緭鍏ユ壒娆″彿" v-model="queryParam.batchNumber"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
         </a-row>
       </a-form>
     </div>
@@ -12,12 +33,6 @@
     <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
     <div class="table-operator">
       <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('鐗╂枡鍑哄簱鍗�')">瀵煎嚭</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
-        <a-button type="primary" icon="import">瀵煎叆</a-button>
-      </a-upload>
-      <!-- 楂樼骇鏌ヨ鍖哄煙 -->
-      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
       <a-dropdown v-if="selectedRowKeys.length > 0">
         <a-menu slot="overlay">
           <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>鍒犻櫎</a-menu-item>
@@ -122,11 +137,6 @@
             }
           },
           {
-            title:'鍒犻櫎鏍囪',
-            align:"center",
-            dataIndex: 'delFlag'
-          },
-          {
             title:'鐗╂枡缂栫爜',
             align:"center",
             dataIndex: 'materialNumber'
@@ -137,9 +147,9 @@
             dataIndex: 'materialName'
           },
           {
-            title:'浜х嚎ID',
+            title:'浜х嚎',
             align:"center",
-            dataIndex: 'factoryId'
+            dataIndex: 'factoryId_dictText'
           },
           {
             title:'鎵规鍙�',
@@ -162,7 +172,7 @@
             dataIndex: 'quantity'
           },
           {
-            title:'宸ュ崟ID',
+            title:'宸ュ崟',
             align:"center",
             dataIndex: 'workOrderId'
           },
diff --git a/src/views/lsw/modules/LswMaterialForm.vue b/src/views/lsw/modules/LswMaterialForm.vue
index 8c4958e..98276bb 100644
--- a/src/views/lsw/modules/LswMaterialForm.vue
+++ b/src/views/lsw/modules/LswMaterialForm.vue
@@ -69,6 +69,7 @@
     },
     data() {
       return {
+        warehouseColOptions: [],
         labelCol: {
           xs: { span: 24 },
           sm: { span: 5 },
@@ -81,8 +82,6 @@
          },
         // 鏂板鏃跺瓙琛ㄩ粯璁ゆ坊鍔犲嚑琛岀┖鏁版嵁
         addDefaultRowNum: 1,
-        validatorRules: {
-        },
         refKeys: ['lswMaterialInventory', ],
         tableKeys:['lswMaterialInventory', ],
         activeKey: 'lswMaterialInventory',
@@ -91,14 +90,6 @@
           loading: false,
           dataSource: [],
           columns: [
-            {
-              title: '鐗╂枡ID',
-              key: 'materialId',
-               type: JVXETypes.input,
-              width:"200px",
-              placeholder: '璇疯緭鍏�${title}',
-              defaultValue:'',
-            },
             {
               title: '鎵规鍙�',
               key: 'batchNumber',
@@ -110,10 +101,12 @@
             {
               title: '搴撳瓨绫诲瀷',
               key: 'inventoryCategory',
-               type: JVXETypes.input,
+               type: JVXETypes.select,
               width:"200px",
-              placeholder: '璇疯緭鍏�${title}',
+              placeholder: '璇烽�夋嫨${title}',
               defaultValue:'',
+              options:[],
+              dictCode: 'inventoryCategory'
             },
             {
               title: '鏁伴噺',
@@ -124,27 +117,46 @@
               defaultValue:'',
             },
             {
-              title: '搴撳瓨鍦癐D',
+              title: '搴撳瓨鍦�',
               key: 'warehouseId',
-               type: JVXETypes.input,
-              width:"200px",
-              placeholder: '璇疯緭鍏�${title}',
-              defaultValue:'',
+              type: JVXETypes.select,
+              width: "200px",
+              options: this.warehouseColOptions,
             },
             {
               title: '搴撳瓨鐘舵��',
               key: 'inventoryStatus',
-               type: JVXETypes.input,
+               type: JVXETypes.select,
               width:"200px",
               placeholder: '璇疯緭鍏�${title}',
               defaultValue:'',
+              options:[],
+              dictCode: 'inventory_status'
             },
           ]
+        },
+        validatorRules: {
+          materialNumber: [
+            { required: true, message: '鐗╂枡缂栫爜鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialName: [
+            { required: true, message: '鐗╂枡鍚嶇О鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialModel: [
+            { required: true, message: '鐗╂枡鍨嬪彿鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialCategory: [
+            { required: true, message: '鐗╂枡绫诲瀷鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialUnit: [
+            { required: true, message: '鍗曚綅鏄繀閫夐」', trigger: 'change' }
+          ],
         },
         url: {
           add: "/lswmaterial/lswMaterial/add",
           edit: "/lswmaterial/lswMaterial/edit",
           queryById: "/lswmaterial/lswMaterial/queryById",
+          warehouseList:"/base/lineSideWarehouse/list",
           lswMaterialInventory: {
             list: '/lswmaterial/lswMaterial/queryLswMaterialInventoryByMainId'
           },
@@ -165,8 +177,37 @@
       },
     },
     created () {
+      this.loadWarehouseOptions();
     },
     methods: {
+      async loadWarehouseOptions() {
+        try {
+          const res = await getAction(this.url.warehouseList);
+          console.log("浠撳簱API鍝嶅簲:", res);
+          let data = [];
+          data = res.result.records;
+          console.log("澶勭悊鍚庣殑浠撳簱鏁版嵁:", data);
+          const options = data.map(item => ({
+            text: item.warehouseName || `浠撳簱(${item.id})`, // 鏄剧ず鏂囨湰
+            value: item.id // 瀹為檯鍊�
+          }));
+          console.log("鏍煎紡鍖栧悗鐨勯�夐」:", options);
+          const warehouseCol = this.lswMaterialInventoryTable.columns.find(
+            col => col.key === 'warehouseId'
+          );
+          if (warehouseCol) {
+            this.$set(warehouseCol, 'options', options);
+            this.warehouseColOptions = warehouseCol.options
+            console.log("鏇存柊鍚庣殑鍒楅�夐」:", warehouseCol.options);
+          }
+          this.$nextTick(() => {
+            this.$forceUpdate();
+            console.log("宸插己鍒舵洿鏂拌鍥�");
+          });
+        } catch (error) {
+          console.error('鍔犺浇浠撳簱鍒楄〃澶辫触:', error);
+        }
+      },
       addBefore(){
         this.lswMaterialInventoryTable.dataSource=[]
       },
diff --git a/src/views/lsw/modules/LswMaterialInboundForm.vue b/src/views/lsw/modules/LswMaterialInboundForm.vue
index 80c577d..eb3dc18 100644
--- a/src/views/lsw/modules/LswMaterialInboundForm.vue
+++ b/src/views/lsw/modules/LswMaterialInboundForm.vue
@@ -3,34 +3,45 @@
     <j-form-container :disabled="formDisabled">
       <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
         <a-row>
+          <a-form-model-item label="浜х嚎" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryId">
+            <a-row :gutter="24">
+              <a-col :span="24">
+                <a-form-item
+                  :labelCol="labelCol"
+                  :wrapperCol="wrapperCol"
+                  label=""
+                >
+                  <j-select-factory
+                    :disabled="disabled"
+                    v-model="model.factoryId"
+                    :multi="true"
+                    @back="backFactoryInfo"
+                    :backProduction="true"
+                    :treeProductOpera="true"
+                  ></j-select-factory>
+                </a-form-item>
+              </a-col>
+            </a-row>
+          </a-form-model-item>
           <a-col :span="12">
-            <a-form-model-item label="鍒犻櫎鏍囪" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="delFlag">
-              <a-input-number v-model="model.delFlag" placeholder="璇疯緭鍏ュ垹闄ゆ爣璁�" style="width: 100%" />
-            </a-form-model-item>
-          </a-col>
-          <a-col :span="12">
-            <a-form-model-item label="浜х嚎ID" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryId">
-              <a-input v-model="model.factoryId" placeholder="璇疯緭鍏ヤ骇绾縄D"  ></a-input>
-            </a-form-model-item>
-          </a-col>
-          <a-col :span="12">
-            <a-form-model-item label="搴撳瓨鍦癐D" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="warehouseId">
-              <a-input v-model="model.warehouseId" placeholder="璇疯緭鍏ュ簱瀛樺湴ID"  ></a-input>
+            <a-form-model-item label="搴撳瓨鍦�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="warehouseId">
+              <j-search-select-tag v-model="model.warehouseId" placeholder="璇烽�夋嫨搴撳瓨鍦�"
+                                   dict="base_line_side_warehouse,warehouse_name,id"></j-search-select-tag>
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
             <a-form-model-item label="鐗╂枡缂栫爜" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialNumber">
-              <a-input v-model="model.materialNumber" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�"  ></a-input>
+              <a-input v-model="model.materialNumber" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�"></a-input>
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
             <a-form-model-item label="鐗╂枡鍚嶇О" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName">
-              <a-input v-model="model.materialName" placeholder="璇疯緭鍏ョ墿鏂欏悕绉�"  ></a-input>
+              <a-input v-model="model.materialName" placeholder="璇疯緭鍏ョ墿鏂欏悕绉�"></a-input>
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
             <a-form-model-item label="鎵规鍙�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="batchNumber">
-              <a-input v-model="model.batchNumber" placeholder="璇疯緭鍏ユ壒娆″彿"  ></a-input>
+              <a-input v-model="model.batchNumber" placeholder="璇疯緭鍏ユ壒娆″彿"></a-input>
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
@@ -40,12 +51,13 @@
           </a-col>
           <a-col :span="12">
             <a-form-model-item label="鎺ユ敹浜�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="receiver">
-              <a-input v-model="model.receiver" placeholder="璇疯緭鍏ユ帴鏀朵汉"  ></a-input>
+              <j-select-user-by-dep v-model="model.receiver" placeholder="璇疯緭鍏ユ帴鏀朵汉"></j-select-user-by-dep>
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
             <a-form-model-item label="鎺ユ敹鏃堕棿" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="receiveTime">
-              <j-date placeholder="璇烽�夋嫨鎺ユ敹鏃堕棿"  v-model="model.receiveTime" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
+              <j-date placeholder="璇烽�夋嫨鎺ユ敹鏃堕棿" v-model="model.receiveTime" :show-time="true"
+                      date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
             </a-form-model-item>
           </a-col>
         </a-row>
@@ -56,89 +68,128 @@
 
 <script>
 
-  import { httpAction, getAction } from '@/api/manage'
-  import { validateDuplicateValue } from '@/utils/util'
+import { httpAction, getAction } from '@/api/manage'
+import { validateDuplicateValue } from '@/utils/util'
+import JDate from '@/components/jeecg/JDate'
+import pick from 'lodash.pick'
+import moment from 'moment'
+import { duplicateCheck } from '@/api/api'//閲嶅鏍¢獙
+import JTreeDict from '@/components/jeecg/JTreeDict'//鍒嗙被瀛楀吀鏍戝舰涓嬫媺缁勪欢
+import JSelectFactory from '../../../../src/components/jeecgbiz/JSelectFactory.vue'
 
-  export default {
-    name: 'LswMaterialInboundForm',
-    components: {
-    },
-    props: {
-      //琛ㄥ崟绂佺敤
-      disabled: {
-        type: Boolean,
-        default: false,
-        required: false
+export default {
+  name: 'LswMaterialInboundForm',
+  components: {
+    JDate,
+    JTreeDict,
+    JSelectFactory
+  },
+  props: {
+    //琛ㄥ崟绂佺敤
+    disabled: {
+      type: Boolean,
+      default: false,
+      required: false
+    }
+  },
+  data() {
+    return {
+      model: {},
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      },
+      confirmLoading: false,
+      validatorRules: {
+        factoryId: [
+          { required: true, message: '浜х嚎鏄繀閫夐」', trigger: 'change' }
+        ],
+        warehouseId: [
+          { required: true, message: '搴撳瓨鍦版槸蹇呴�夐」', trigger: 'change' }
+        ],
+        materialNumber: [
+          { required: true, message: '鐗╂枡缂栫爜鏄繀閫夐」', trigger: 'change' }
+        ],
+        materialName: [
+          { required: true, message: '鐗╂枡鍚嶇О鏄繀閫夐」', trigger: 'change' }
+        ],
+        batchNumber: [
+          { required: true, message: '鎵规鍙锋槸蹇呴�夐」', trigger: 'change' }
+        ],
+        quantity: [
+          { required: true, message: '鍏ュ簱鏁伴噺鏄繀閫夐」', trigger: 'change' }
+        ],
+        receiver: [
+          { required: true, message: '鎺ユ敹浜烘槸蹇呴�夐」', trigger: 'change' }
+        ],
+        receiveTime: [
+          { required: true, message: '鎺ユ敹鏃堕棿鏄繀閫夐」', trigger: 'change' }
+        ]
+      },
+      url: {
+        add: '/lswmaterialinbound/lswMaterialInbound/add',
+        edit: '/lswmaterialinbound/lswMaterialInbound/edit',
+        queryById: '/lswmaterialinbound/lswMaterialInbound/queryById'
       }
+    }
+  },
+  computed: {
+    formDisabled() {
+      return this.disabled
+    }
+  },
+  created() {
+    //澶囦唤model鍘熷鍊�
+    this.modelDefault = JSON.parse(JSON.stringify(this.model))
+  },
+  methods: {
+    backFactoryInfo(info) {
+      this.model.factoryIds = this.model.factoryId
+      this.nextFactoryOptions = info.map((item, index, arr) => {
+        let c = { label: item.text, value: item.value + '' }
+        return c
+      })
     },
-    data () {
-      return {
-        model:{
-         },
-        labelCol: {
-          xs: { span: 24 },
-          sm: { span: 5 },
-        },
-        wrapperCol: {
-          xs: { span: 24 },
-          sm: { span: 16 },
-        },
-        confirmLoading: false,
-        validatorRules: {
-        },
-        url: {
-          add: "/lswmaterialinbound/lswMaterialInbound/add",
-          edit: "/lswmaterialinbound/lswMaterialInbound/edit",
-          queryById: "/lswmaterialinbound/lswMaterialInbound/queryById"
-        }
-      }
+    add() {
+      this.edit(this.modelDefault)
     },
-    computed: {
-      formDisabled(){
-        return this.disabled
-      },
+    edit(record) {
+      this.model = Object.assign({}, record)
+      this.visible = true
     },
-    created () {
-       //澶囦唤model鍘熷鍊�
-      this.modelDefault = JSON.parse(JSON.stringify(this.model));
-    },
-    methods: {
-      add () {
-        this.edit(this.modelDefault);
-      },
-      edit (record) {
-        this.model = Object.assign({}, record);
-        this.visible = true;
-      },
-      submitForm () {
-        const that = this;
-        // 瑙﹀彂琛ㄥ崟楠岃瘉
-        this.$refs.form.validate(valid => {
-          if (valid) {
-            that.confirmLoading = true;
-            let httpurl = '';
-            let method = '';
-            if(!this.model.id){
-              httpurl+=this.url.add;
-              method = 'post';
-            }else{
-              httpurl+=this.url.edit;
-               method = 'put';
-            }
-            httpAction(httpurl,this.model,method).then((res)=>{
-              if(res.success){
-                that.$message.success(res.message);
-                that.$emit('ok');
-              }else{
-                that.$message.warning(res.message);
-              }
-            }).finally(() => {
-              that.confirmLoading = false;
-            })
+    submitForm() {
+      const that = this
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          that.confirmLoading = true
+          let httpurl = ''
+          let method = ''
+          if (!this.model.id) {
+            httpurl += this.url.add
+            method = 'post'
+          } else {
+            httpurl += this.url.edit
+            method = 'put'
           }
+          httpAction(httpurl, this.model, method).then((res) => {
+            if (res.success) {
+              that.$message.success(res.message)
+              that.$emit('ok')
+            } else {
+              that.$message.warning(res.message)
+            }
+          }).finally(() => {
+            that.confirmLoading = false
+          })
+        }
 
-        })
-      },
+      })
     }
   }
+}
 </script>
\ No newline at end of file
diff --git a/src/views/lsw/modules/LswMaterialInventoryForm.vue b/src/views/lsw/modules/LswMaterialInventoryForm.vue
index 79637ba..ddc905e 100644
--- a/src/views/lsw/modules/LswMaterialInventoryForm.vue
+++ b/src/views/lsw/modules/LswMaterialInventoryForm.vue
@@ -20,7 +20,7 @@
           </a-col>
           <a-col :span="12">
             <a-form-model-item label="鏁伴噺" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="quantity">
-              <a-input v-model="model.quantity" placeholder="璇疯緭鍏ユ暟閲�"  ></a-input>
+              <a-input-number v-model="model.quantity" placeholder="璇疯緭鍏ユ暟閲�"  ></a-input-number>
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
diff --git a/src/views/lsw/modules/LswMaterialOutboundForm.vue b/src/views/lsw/modules/LswMaterialOutboundForm.vue
index eebe46f..d4f84b3 100644
--- a/src/views/lsw/modules/LswMaterialOutboundForm.vue
+++ b/src/views/lsw/modules/LswMaterialOutboundForm.vue
@@ -3,11 +3,26 @@
     <j-form-container :disabled="formDisabled">
       <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
         <a-row>
-          <a-col :span="12">
-            <a-form-model-item label="鍒犻櫎鏍囪" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="delFlag">
-              <a-input-number v-model="model.delFlag" placeholder="璇疯緭鍏ュ垹闄ゆ爣璁�" style="width: 100%" />
-            </a-form-model-item>
-          </a-col>
+          <a-form-model-item label="浜х嚎" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryId">
+            <a-row :gutter="24">
+              <a-col :span="24">
+                <a-form-item
+                  :labelCol="labelCol"
+                  :wrapperCol="wrapperCol"
+                  label=""
+                >
+                  <j-select-factory
+                    :disabled="disabled"
+                    v-model="model.factoryId"
+                    :multi="true"
+                    @back="backFactoryInfo"
+                    :backProduction="true"
+                    :treeProductOpera="true"
+                  ></j-select-factory>
+                </a-form-item>
+              </a-col>
+            </a-row>
+          </a-form-model-item>
           <a-col :span="12">
             <a-form-model-item label="鐗╂枡缂栫爜" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialNumber">
               <a-input v-model="model.materialNumber" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�"  ></a-input>
@@ -19,18 +34,13 @@
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
-            <a-form-model-item label="浜х嚎ID" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryId">
-              <a-input v-model="model.factoryId" placeholder="璇疯緭鍏ヤ骇绾縄D"  ></a-input>
-            </a-form-model-item>
-          </a-col>
-          <a-col :span="12">
             <a-form-model-item label="鎵规鍙�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="batchNumber">
               <a-input v-model="model.batchNumber" placeholder="璇疯緭鍏ユ壒娆″彿"  ></a-input>
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
             <a-form-model-item label="鍑哄簱浜�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="outboundStaff">
-              <a-input v-model="model.outboundStaff" placeholder="璇疯緭鍏ュ嚭搴撲汉"  ></a-input>
+              <j-select-user-by-dep v-model="model.outboundStaff" placeholder="璇疯緭鍏ュ嚭搴撲汉"  ></j-select-user-by-dep>
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
@@ -40,7 +50,7 @@
           </a-col>
           <a-col :span="12">
             <a-form-model-item label="鍑哄簱鏁伴噺" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="quantity">
-              <a-input v-model="model.quantity" placeholder="璇疯緭鍏ュ嚭搴撴暟閲�"  ></a-input>
+              <a-input-number v-model="model.quantity" placeholder="璇疯緭鍏ュ嚭搴撴暟閲�"  ></a-input-number>
             </a-form-model-item>
           </a-col>
           <a-col :span="12">
@@ -58,10 +68,16 @@
 
   import { httpAction, getAction } from '@/api/manage'
   import { validateDuplicateValue } from '@/utils/util'
+  import JTreeDict from '@/components/jeecg/JTreeDict'//鍒嗙被瀛楀吀鏍戝舰涓嬫媺缁勪欢
+  import JSelectFactory from '../../../../src/components/jeecgbiz/JSelectFactory.vue'
+  import JDate from '@/components/jeecg/JDate'
 
   export default {
     name: 'LswMaterialOutboundForm',
     components: {
+      JDate,
+      JTreeDict,
+      JSelectFactory
     },
     props: {
       //琛ㄥ崟绂佺敤
@@ -85,6 +101,30 @@
         },
         confirmLoading: false,
         validatorRules: {
+          factoryId: [
+            { required: true, message: '浜х嚎鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialNumber: [
+            { required: true, message: '鐗╂枡缂栫爜鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialName: [
+            { required: true, message: '鐗╂枡鍚嶇О鏄繀閫夐」', trigger: 'change' }
+          ],
+          batchNumber: [
+            { required: true, message: '鎵规鍙锋槸蹇呴�夐」', trigger: 'change' }
+          ],
+          quantity: [
+            { required: true, message: '鍑哄簱鏁伴噺鏄繀閫夐」', trigger: 'change' }
+          ],
+          outboundStaff: [
+            { required: true, message: '鍑哄簱浜烘槸蹇呴�夐」', trigger: 'change' }
+          ],
+          outboundTime: [
+            { required: true, message: '鍑哄簱鏃堕棿鏄繀閫夐」', trigger: 'change' }
+          ],
+          workOrderId:[
+            { required: true, message: '宸ュ崟鏄繀閫夐」', trigger: 'change' }
+          ],
         },
         url: {
           add: "/lswmaterialoutbound/lswMaterialOutbound/add",
@@ -103,6 +143,13 @@
       this.modelDefault = JSON.parse(JSON.stringify(this.model));
     },
     methods: {
+      backFactoryInfo(info) {
+        this.model.factoryIds = this.model.factoryId
+        this.nextFactoryOptions = info.map((item, index, arr) => {
+          let c = { label: item.text, value: item.value + '' }
+          return c
+        })
+      },
       add () {
         this.edit(this.modelDefault);
       },
diff --git a/src/views/pms/PmsMaterialProcessList.vue b/src/views/pms/PmsMaterialProcessList.vue
new file mode 100644
index 0000000..68bfa0c
--- /dev/null
+++ b/src/views/pms/PmsMaterialProcessList.vue
@@ -0,0 +1,213 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡缂栫爜">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�" v-model="queryParam.materialNumber"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡鍚嶇О">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欏悕绉�" v-model="queryParam.materialName"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
+      <!-- 楂樼骇鏌ヨ鍖哄煙 -->
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>鍒犻櫎</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 鎵归噺鎿嶄綔 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 宸查�夋嫨 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>椤�
+        <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text,record">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犲浘鐗�</span>
+          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犳枃浠�</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            涓嬭浇
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">缂栬緫</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">鏇村 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handleDetail(record)">璇︽儏</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(record.id)">
+                  <a>鍒犻櫎</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+
+    <pms-material-process-modal ref="modalForm" @ok="modalFormOk"></pms-material-process-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import PmsMaterialProcessModal from './modules/PmsMaterialProcessModal'
+
+  export default {
+    name: 'PmsMaterialProcessList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      PmsMaterialProcessModal
+    },
+    data () {
+      return {
+        description: '鐗╂枡宸ュ簭绠$悊椤甸潰',
+        // 琛ㄥご
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'鐗╂枡缂栫爜',
+            align:"center",
+            dataIndex: 'materialNumber'
+          },
+          {
+            title:'鐗╂枡鍚嶇О',
+            align:"center",
+            dataIndex: 'materialName'
+          },
+          {
+            title:'浜х嚎ID(SAP宸ヤ綔涓績)',
+            align:"center",
+            dataIndex: 'factoryId_dictText'
+          },
+          {
+            title:'宸ュ簭鍙�',
+            align:"center",
+            dataIndex: 'processCode'
+          },
+          {
+            title:'宸ュ簭鍚嶇О',
+            align:"center",
+            dataIndex: 'processName'
+          },
+          {
+            title:'鎺у埗鐮�',
+            align:"center",
+            dataIndex: 'controlCode'
+          },
+          {
+            title: '鎿嶄綔',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/pms/pmsMaterialProcess/list",
+          delete: "/pms/pmsMaterialProcess/delete",
+          deleteBatch: "/pms/pmsMaterialProcess/deleteBatch",
+          exportXlsUrl: "/pms/pmsMaterialProcess/exportXls",
+          importExcelUrl: "pms/pmsMaterialProcess/importExcel",
+
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'int',value:'delFlag',text:'鍒犻櫎鏍囪',dictCode:''})
+        fieldList.push({type:'string',value:'materialNumber',text:'鐗╂枡缂栫爜',dictCode:''})
+        fieldList.push({type:'string',value:'materialName',text:'鐗╂枡鍚嶇О',dictCode:''})
+        fieldList.push({type:'string',value:'factoryId',text:'浜х嚎ID(SAP宸ヤ綔涓績)',dictCode:''})
+        fieldList.push({type:'string',value:'processCode',text:'宸ュ簭鍙�',dictCode:''})
+        fieldList.push({type:'string',value:'processName',text:'宸ュ簭鍚嶇О',dictCode:''})
+        fieldList.push({type:'string',value:'controlCode',text:'鎺у埗鐮�',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/pms/PmsProcessBillMaterialsDetailList.vue b/src/views/pms/PmsProcessBillMaterialsDetailList.vue
new file mode 100644
index 0000000..e2ed69c
--- /dev/null
+++ b/src/views/pms/PmsProcessBillMaterialsDetailList.vue
@@ -0,0 +1,207 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-row :gutter="24">
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="鐗╂枡缂栫爜">
+                <j-input placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�" v-model="queryParam.materialNumber"></j-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="鐗╂枡鍚嶇О">
+                <j-input placeholder="璇疯緭鍏ョ墿鏂欏悕绉�" v-model="queryParam.materialName"></j-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+            </a-col>
+          </a-row>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('鐗╂枡娓呭崟')">瀵煎嚭</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">瀵煎叆</a-button>
+      </a-upload>
+      <!-- 楂樼骇鏌ヨ鍖哄煙 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>鍒犻櫎</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 鎵归噺鎿嶄綔 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 宸查�夋嫨 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>椤�
+        <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text,record">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犲浘鐗�</span>
+          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犳枃浠�</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            涓嬭浇
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">缂栬緫</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">鏇村 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handleDetail(record)">璇︽儏</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(record.id)">
+                  <a>鍒犻櫎</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+
+    <pms-process-bill-materials-detail-modal ref="modalForm" @ok="modalFormOk"></pms-process-bill-materials-detail-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import PmsProcessBillMaterialsDetailModal from './modules/PmsProcessBillMaterialsDetailModal'
+
+  export default {
+    name: 'PmsProcessBillMaterialsDetailList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      PmsProcessBillMaterialsDetailModal
+    },
+    data () {
+      return {
+        description: '鐗╂枡娓呭崟绠$悊椤甸潰',
+        // 琛ㄥご
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'鐢熶骇鐗╂枡ID',
+            align:"center",
+            dataIndex: 'materialId_dictText'
+          },
+          {
+            title:'鐗╂枡缂栫爜',
+            align:"center",
+            dataIndex: 'materialNumber'
+          },
+          {
+            title:'鐗╂枡鍚嶇О',
+            align:"center",
+            dataIndex: 'materialName'
+          },
+          {
+            title:'闇�姹傜敤閲�',
+            align:"center",
+            dataIndex: 'usageUnit'
+          },
+          {
+            title: '鎿嶄綔',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/pms/pmsProcessBillMaterialsDetail/list",
+          delete: "/pms/pmsProcessBillMaterialsDetail/delete",
+          deleteBatch: "/pms/pmsProcessBillMaterialsDetail/deleteBatch",
+          exportXlsUrl: "/pms/pmsProcessBillMaterialsDetail/exportXls",
+          importExcelUrl: "pms/pmsProcessBillMaterialsDetail/importExcel",
+
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'materialId',text:'鐢熶骇鐗╂枡ID',dictCode:''})
+        fieldList.push({type:'string',value:'materialNumber',text:'鐗╂枡缂栫爜',dictCode:''})
+        fieldList.push({type:'string',value:'materialName',text:'鐗╂枡鍚嶇О',dictCode:''})
+        fieldList.push({type:'double',value:'usageUnit',text:'闇�姹傜敤閲�',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/pms/PmsProcessBillMaterialsList.vue b/src/views/pms/PmsProcessBillMaterialsList.vue
new file mode 100644
index 0000000..8e8f6bd
--- /dev/null
+++ b/src/views/pms/PmsProcessBillMaterialsList.vue
@@ -0,0 +1,241 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡缂栫爜">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�" v-model="queryParam.materialNumber"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡鍚嶇О">
+              <j-input placeholder="璇疯緭鍏ョ墿鏂欏悕绉�" v-model="queryParam.materialName"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
+      <!-- 楂樼骇鏌ヨ鍖哄煙 -->
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>鍒犻櫎</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 鎵归噺鎿嶄綔 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+    <!-- table鍖哄煙-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 宸查�夋嫨 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>椤�
+        <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text,record">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犲浘鐗�</span>
+          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犳枃浠�</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            涓嬭浇
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">缂栬緫</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">鏇村 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handleDetail(record)">璇︽儏</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(record.id)">
+                  <a>鍒犻櫎</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+        <span slot="figureNum" slot-scope="text, record">
+          <span v-if="record.materialNumber == null || '' == record.materialNumber">鏃犳暟鎹�</span>
+          <span v-else>
+            <a-popover placement="top" :title="'鐗╂枡鍩烘湰淇℃伅:'" arrow-point-at-center>
+              <template slot="content">
+              </template>
+              <a-button class="fontweight" style="font-weight: bold;color: inherit;" @click="handleMaterialClick(record)">
+                {{ record.materialNumber }}
+              </a-button>
+            </a-popover>
+          </span>
+        </span>
+      </a-table>
+    </div>
+
+    <pms-process-bill-materials-modal ref="modalForm" @ok="modalFormOk"></pms-process-bill-materials-modal>
+    <PmsProcessBillMaterialsDetailModal ref="PmsProcessBillMaterialsDetailModal"></PmsProcessBillMaterialsDetailModal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import PmsProcessBillMaterialsModal from './modules/PmsProcessBillMaterialsModal'
+  import PmsProcessBillMaterialsDetailModal from './modules/PmsProcessBillMaterialsDetailModal.vue'
+  import { getAction } from '@api/manage'
+
+  export default {
+    name: 'PmsProcessBillMaterialsList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      PmsProcessBillMaterialsModal,
+      PmsProcessBillMaterialsDetailModal
+    },
+    data () {
+      return {
+        description: '璁㈠崟BOM绠$悊椤甸潰',
+        // 琛ㄥご
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'鐢熸垚璁㈠崟ID',
+            align:"center",
+            dataIndex: 'orderId'
+          },
+          {
+            title:'鐗╂枡缂栫爜',
+            align:"center",
+            dataIndex: 'materialNumber',
+            defaultSortOrder: 'descend',
+            scopedSlots: { customRender: 'figureNum', },
+          },
+          {
+            title:'鐗╂枡鍚嶇О',
+            align:"center",
+            dataIndex: 'materialName'
+          },
+          {
+            title:'BOM浠g爜',
+            align:"center",
+            dataIndex: 'billMaterialsCode'
+          },
+          {
+            title:'鍩烘湰鍗曚綅',
+            align:"center",
+            dataIndex: 'productionUnit'
+          },
+          {
+            title:'璁㈠崟鏁伴噺',
+            align:"center",
+            dataIndex: 'productionQuantity'
+          },
+          {
+            title: '鎿嶄綔',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/pmsprocessbillmaterials/pmsProcessBillMaterials/list",
+          delete: "/pmsprocessbillmaterials/pmsProcessBillMaterials/delete",
+          deleteBatch: "/pmsprocessbillmaterials/pmsProcessBillMaterials/deleteBatch",
+          exportXlsUrl: "/pmsprocessbillmaterials/pmsProcessBillMaterials/exportXls",
+          importExcelUrl: "pmsprocessbillmaterials/pmsProcessBillMaterials/importExcel",
+          queryByMaterialId:'/pms/pmsProcessBillMaterialsDetail/queryByMaterialId'
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      handleMaterialClick(record){
+        console.log('record----->',record)
+        getAction(this.url.queryByMaterialId,{'materialId':record.id}).then(res=>{
+          if(res.success){
+            this.$refs.PmsProcessBillMaterialsDetailModal.edit(res.result);
+            this.$refs.PmsProcessBillMaterialsDetailModal.title="鐗╂枡娓呭崟";
+            this.$refs.PmsProcessBillMaterialsDetailModal.disableSubmit = true;
+          }else{
+            this.$message.error('娌℃煡鍒版暟鎹紝璇疯仈绯荤鐞嗗憳')
+          }
+        })
+      },
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'int',value:'delFlag',text:'鍒犻櫎鏍囪',dictCode:''})
+        fieldList.push({type:'string',value:'orderId',text:'鐢熸垚璁㈠崟ID',dictCode:''})
+        fieldList.push({type:'string',value:'materialNumber',text:'鐗╂枡缂栫爜',dictCode:''})
+        fieldList.push({type:'string',value:'materialName',text:'鐗╂枡鍚嶇О',dictCode:''})
+        fieldList.push({type:'string',value:'billMaterialsCode',text:'BOM浠g爜',dictCode:''})
+        fieldList.push({type:'string',value:'productionUnit',text:'鍩烘湰鍗曚綅',dictCode:''})
+        fieldList.push({type:'double',value:'productionQuantity',text:'璁㈠崟鏁伴噺',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/pms/modules/PmsMaterialProcessForm.vue b/src/views/pms/modules/PmsMaterialProcessForm.vue
new file mode 100644
index 0000000..d76e154
--- /dev/null
+++ b/src/views/pms/modules/PmsMaterialProcessForm.vue
@@ -0,0 +1,172 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="鐗╂枡缂栫爜" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialNumber">
+              <a-input v-model="model.materialNumber" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鐗╂枡鍚嶇О" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName">
+              <a-input v-model="model.materialName" placeholder="璇疯緭鍏ョ墿鏂欏悕绉�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="浜х嚎ID(SAP宸ヤ綔涓績)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryId">
+                <a-row :gutter="24">
+                  <a-col :span="24">
+                    <a-form-item
+                      :labelCol="labelCol"
+                      :wrapperCol="wrapperCol"
+                      label=""
+                    >
+                      <j-select-factory
+                        :disabled="disabled"
+                        v-model="model.factoryId"
+                        :multi="true"
+                        @back="backFactoryInfo"
+                        :backProduction="true"
+                        :treeProductOpera="true"
+                      ></j-select-factory>
+                    </a-form-item>
+                  </a-col>
+                </a-row>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="宸ュ簭鍙�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="processCode">
+              <a-input v-model="model.processCode" placeholder="璇疯緭鍏ュ伐搴忓彿"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="宸ュ簭鍚嶇О" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="processName">
+              <a-input v-model="model.processName" placeholder="璇疯緭鍏ュ伐搴忓悕绉�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鎺у埗鐮�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="controlCode">
+              <a-input v-model="model.controlCode" placeholder="璇疯緭鍏ユ帶鍒剁爜"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+  import JSelectFactory from '@comp/jeecgbiz/JSelectFactory.vue'
+  import JTreeDict from '@/components/jeecg/JTreeDict'//鍒嗙被瀛楀吀鏍戝舰涓嬫媺缁勪欢
+
+  export default {
+    name: 'PmsMaterialProcessForm',
+    components: {
+      JSelectFactory,
+      JTreeDict
+    },
+    props: {
+      //琛ㄥ崟绂佺敤
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+          factoryId: [
+            { required: true, message: '浜х嚎鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialNumber: [
+            { required: true, message: '鐗╂枡缂栫爜鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialName: [
+            { required: true, message: '鐗╂枡鍚嶇О鏄繀閫夐」', trigger: 'change' }
+          ],
+          processCode: [
+            { required: true, message: '宸ュ簭鍙锋槸蹇呴�夐」', trigger: 'change' }
+          ],
+          processName: [
+            { required: true, message: '宸ュ簭鍚嶇О鏄繀閫夐」', trigger: 'change' }
+          ],
+        },
+        url: {
+          add: "/pms/pmsMaterialProcess/add",
+          edit: "/pms/pmsMaterialProcess/edit",
+          queryById: "/pms/pmsMaterialProcess/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //澶囦唤model鍘熷鍊�
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      backFactoryInfo(info) {
+        this.model.factoryIds = this.model.factoryId
+        this.nextFactoryOptions = info.map((item, index, arr) => {
+          let c = { label: item.text, value: item.value + '' }
+          return c
+        })
+      },
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 瑙﹀彂琛ㄥ崟楠岃瘉
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+
+        })
+      },
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/pms/modules/PmsMaterialProcessModal.vue b/src/views/pms/modules/PmsMaterialProcessModal.vue
new file mode 100644
index 0000000..c207816
--- /dev/null
+++ b/src/views/pms/modules/PmsMaterialProcessModal.vue
@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <pms-material-process-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></pms-material-process-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import PmsMaterialProcessForm from './PmsMaterialProcessForm'
+  export default {
+    name: 'PmsMaterialProcessModal',
+    components: {
+      PmsMaterialProcessForm
+    },
+    data () {
+      return {
+        title:'',
+        width:896,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/pms/modules/PmsProcessBillMaterialsDetailForm.vue b/src/views/pms/modules/PmsProcessBillMaterialsDetailForm.vue
new file mode 100644
index 0000000..eaa6351
--- /dev/null
+++ b/src/views/pms/modules/PmsProcessBillMaterialsDetailForm.vue
@@ -0,0 +1,141 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="鐢熶骇鐗╂枡ID" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialId">
+              <j-search-select-tag v-model="model.materialId" placeholder="璇疯緭鍏ョ敓浜х墿鏂橧D" dict="pms_process_bill_materials,material_number,id" @change="handleMaterialChange"></j-search-select-tag>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鐗╂枡缂栫爜" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialNumber">
+              <a-input v-model="model.materialNumber" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鐗╂枡鍚嶇О" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName">
+              <a-input v-model="model.materialName" placeholder="璇疯緭鍏ョ墿鏂欏悕绉�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="闇�姹傜敤閲�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="usageUnit">
+              <a-input-number v-model="model.usageUnit" placeholder="璇疯緭鍏ラ渶姹傜敤閲�" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'PmsProcessBillMaterialsDetailForm',
+    components: {
+    },
+    props: {
+      //琛ㄥ崟绂佺敤
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+          materialId: [
+            { required: true, message: '鐢熶骇鐗╂枡ID鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialNumber: [
+            { required: true, message: '鐗╂枡缂栫爜鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialName: [
+            { required: true, message: '鐗╂枡鍚嶇О鏄繀閫夐」', trigger: 'change' }
+          ],
+          usageUnit: [
+            { required: true, message: '闇�姹傜敤閲忔槸蹇呴�夐」', trigger: 'change' }
+          ],
+        },
+        url: {
+          add: "/pms/pmsProcessBillMaterialsDetail/add",
+          edit: "/pms/pmsProcessBillMaterialsDetail/edit",
+          queryById: "/pms/pmsProcessBillMaterialsDetail/queryById",
+          queryPmsProcessBillMaterials:"/pmsprocessbillmaterials/pmsProcessBillMaterials/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //澶囦唤model鍘熷鍊�
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      async handleMaterialChange(value){
+        console.log('value---->',value)
+        this.confirmLoading = true
+        const res = await getAction(this.url.queryPmsProcessBillMaterials,{'id':value})
+        console.log('res.result---->',res.result)
+        this.model.materialNumber = res.result.materialNumber
+        this.model.materialName = res.result.materialName
+        this.confirmLoading = false
+      },
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 瑙﹀彂琛ㄥ崟楠岃瘉
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+
+        })
+      },
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/pms/modules/PmsProcessBillMaterialsDetailModal.vue b/src/views/pms/modules/PmsProcessBillMaterialsDetailModal.vue
new file mode 100644
index 0000000..e0e6743
--- /dev/null
+++ b/src/views/pms/modules/PmsProcessBillMaterialsDetailModal.vue
@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <pms-process-bill-materials-detail-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></pms-process-bill-materials-detail-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import PmsProcessBillMaterialsDetailForm from './PmsProcessBillMaterialsDetailForm'
+  export default {
+    name: 'PmsProcessBillMaterialsDetailModal',
+    components: {
+      PmsProcessBillMaterialsDetailForm
+    },
+    data () {
+      return {
+        title:'',
+        width:896,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/pms/modules/PmsProcessBillMaterialsForm.vue b/src/views/pms/modules/PmsProcessBillMaterialsForm.vue
new file mode 100644
index 0000000..68e2d88
--- /dev/null
+++ b/src/views/pms/modules/PmsProcessBillMaterialsForm.vue
@@ -0,0 +1,144 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="鐢熸垚璁㈠崟" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderId">
+              <a-input v-model="model.orderId" placeholder="璇疯緭鍏ョ敓鎴愯鍗旾D"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鐗╂枡缂栫爜" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialNumber">
+              <a-input v-model="model.materialNumber" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鐗╂枡鍚嶇О" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName">
+              <a-input v-model="model.materialName" placeholder="璇疯緭鍏ョ墿鏂欏悕绉�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="BOM浠g爜" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="billMaterialsCode">
+              <a-input v-model="model.billMaterialsCode" placeholder="璇疯緭鍏OM浠g爜"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鍩烘湰鍗曚綅" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="productionUnit">
+              <a-input v-model="model.productionUnit" placeholder="璇疯緭鍏ュ熀鏈崟浣�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="璁㈠崟鏁伴噺" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="productionQuantity">
+              <a-input-number v-model="model.productionQuantity" placeholder="璇疯緭鍏ヨ鍗曟暟閲�" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'PmsProcessBillMaterialsForm',
+    components: {
+    },
+    props: {
+      //琛ㄥ崟绂佺敤
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+          orderId: [
+            { required: true, message: '鐢熸垚璁㈠崟鏄繀閫夐」', trigger: 'change' }
+          ],
+          materialNumber: [
+            { required: true, message: '鐗╂枡缂栫爜鏄繀濉」', trigger: 'change' }
+          ],
+          materialName: [
+            { required: true, message: '鐗╂枡鍚嶇О鏄繀濉」', trigger: 'change' }
+          ],
+          productionUnit: [
+            { required: true, message: '鍩烘湰鍗曚綅鏄繀濉」', trigger: 'change' }
+          ],
+          productionQuantity: [
+            { required: true, message: '璁㈠崟鏁伴噺鏄繀濉」', trigger: 'change' }
+          ],
+        },
+        url: {
+          add: "/pmsprocessbillmaterials/pmsProcessBillMaterials/add",
+          edit: "/pmsprocessbillmaterials/pmsProcessBillMaterials/edit",
+          queryById: "/pmsprocessbillmaterials/pmsProcessBillMaterials/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //澶囦唤model鍘熷鍊�
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 瑙﹀彂琛ㄥ崟楠岃瘉
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+
+        })
+      },
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/pms/modules/PmsProcessBillMaterialsModal.vue b/src/views/pms/modules/PmsProcessBillMaterialsModal.vue
new file mode 100644
index 0000000..806a2e2
--- /dev/null
+++ b/src/views/pms/modules/PmsProcessBillMaterialsModal.vue
@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <pms-process-bill-materials-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></pms-process-bill-materials-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import PmsProcessBillMaterialsForm from './PmsProcessBillMaterialsForm'
+  export default {
+    name: 'PmsProcessBillMaterialsModal',
+    components: {
+      PmsProcessBillMaterialsForm
+    },
+    data () {
+      return {
+        title:'',
+        width:896,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
\ No newline at end of file

--
Gitblit v1.9.3