From 6232ac30ca4f54e28ddeccdf5aca03734d02aada Mon Sep 17 00:00:00 2001
From: Houjie <714924425@qq.com>
Date: 星期五, 23 五月 2025 18:02:14 +0800
Subject: [PATCH] 库存预警界面/ 工具盘点功能/工具盘点/刀具刃磨

---
 src/views/tms/requirement/ToolSharpeningList .vue                       |  302 +++
 src/views/tms/lossBound/modules/LossboundModal.vue                      |  427 +++++
 src/views/tms/requirement/modules/ToolsSharpeningModal.vue              |  385 ++++
 src/views/tms/requirement/modules/ToolsModal.vue                        |    0 
 src/views/tms/lossBound/modules/LossboundDetailModal.vue                |  141 +
 src/views/tms/storeEarlyWarning/ToolsStoreEarlyWarningList.vue          |  303 +++
 src/views/tms/stocktakingBound/ToolsStocktakingBoundList.vue            |  321 +++
 src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningModal.vue |   60 
 src/views/tms/lossBound/LossboundList.vue                               |  307 +++
 src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningForm.vue  |  221 ++
 src/views/tms/lossBound/LossboundDetailList.vue                         |  180 ++
 src/views/flowable/workflow/lossBound/lossBoundHandle.vue               |  499 +++++
 src/views/tms/lossBound/modules/JSelectLossboundToolModal.vue           |  221 ++
 src/views/tms/stocktakingBound/ToolsStocktaKingBoundDetail.vue          |  225 ++
 src/views/flowable/workflow/FlowTodo.vue                                |  686 ++++---
 src/views/tms/stocktakingBound/modules/ToolsStocktakingBoundModal.vue   |  504 ++++++
 src/views/tms/stocktakingBound/modules/ToolSelectorModal.vue            |  216 ++
 17 files changed, 4,675 insertions(+), 323 deletions(-)

diff --git a/src/views/flowable/workflow/FlowTodo.vue b/src/views/flowable/workflow/FlowTodo.vue
index c8f36b2..34c75f5 100644
--- a/src/views/flowable/workflow/FlowTodo.vue
+++ b/src/views/flowable/workflow/FlowTodo.vue
@@ -50,7 +50,7 @@
               <a-button @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
                <a @click="handleToggleSearch" style="margin-left: 8px">
                 {{ toggleSearchStatus ? '鏀惰捣' : '灞曞紑' }}
-                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'" />
               </a>
             </span>
           </a-col>
@@ -64,12 +64,12 @@
       <a-dropdown v-if="selectedRowKeys.length > 0 ">
         <a-menu slot="overlay">
           <a-menu-item key="1" @click="batchHandle">
-            <a-icon type="delete"/>
+            <a-icon type="delete" />
             鎵归噺澶勭悊
           </a-menu-item>
         </a-menu>
         <a-button style="margin-left: 8px"> 鎵归噺鎿嶄綔
-          <a-icon type="down"/>
+          <a-icon type="down" />
         </a-button>
       </a-dropdown>
     </div>
@@ -78,7 +78,7 @@
     <div>
       <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
         <i class="anticon anticon-info-circle ant-alert-icon"></i>宸查�夋嫨&nbsp;<a style="font-weight: 600">{{
-        selectedRowKeys.length }}</a>椤�&nbsp;&nbsp;
+          selectedRowKeys.length }}</a>椤�&nbsp;&nbsp;
         <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
       </div>
 
@@ -101,9 +101,12 @@
 
       </a-table>
     </div>
-    <AssignFileStreamHandle ref="modalFormApproval" :selectShenpiData="selectShenpiData" @searchReset="searchReset"></AssignFileStreamHandle>
-    <DispatchFileHandle ref="modalFormDispatchFileXq"  :selectShenpiData="selectDispatchFileXqData" @searchReset="searchReset"></DispatchFileHandle>
-    <DispatchFileBachHandleStyle ref="modalFormDispatchFileBatch" @searchReset="searchReset" @ok="modalFormOk"></DispatchFileBachHandleStyle>
+    <AssignFileStreamHandle ref="modalFormApproval" :selectShenpiData="selectShenpiData"
+                            @searchReset="searchReset"></AssignFileStreamHandle>
+    <DispatchFileHandle ref="modalFormDispatchFileXq" :selectShenpiData="selectDispatchFileXqData"
+                        @searchReset="searchReset"></DispatchFileHandle>
+    <DispatchFileBachHandleStyle ref="modalFormDispatchFileBatch" @searchReset="searchReset"
+                                 @ok="modalFormOk"></DispatchFileBachHandleStyle>
     <!--鍗曚釜娴佺▼澶勭悊-->
     <InspectionOrderHandle ref="modalFormInspectionOrder" :selectShenpiData="selectInspectionOrderData"
                            @searchReset="searchReset"></InspectionOrderHandle>
@@ -112,354 +115,391 @@
     <repair-order-approval-modal ref="repairOrderApprovalModal" @searchReset="searchReset"
                                  :selectShenpiData="selectRepairOrderData"></repair-order-approval-modal>
     <out-bound-order-handle ref="outBoundOrderHandle" :selectShenpiData="selectOutBoundOrderData"
-                              @searchReset="searchReset"></out-bound-order-handle>
+                            @searchReset="searchReset"></out-bound-order-handle>
+    <stocktaking-bound-handle   ref="stocktakingBoundHandle" :selectShenpiData="selectStocktakingBoundOrderData" @searchReset="searchReset"></stocktaking-bound-handle>
 
+
+    <loss-bound-handle ref="lossBoundHandle" :selectShenpiData="selectLossBoundOrderData"
+                       @searchReset="searchReset"></loss-bound-handle>
+<!--    <loss-bound-handle ref="lossBoundHandle" :selectShenpiData="selectLossBoundOrderData"-->
+<!--                       @searchReset="searchReset"></loss-bound-handle>-->
     <!--鎵归噺澶勭悊-->
     <inspection-order-batch-handle ref="inspectionOrderBatchHandleRef" @searchReset="searchReset"
-                                   :taskList="selectionRows"/>
+                                   :taskList="selectionRows" />
 
     <week-maintenance-batch-approval-modal ref="weenMaintenanceBatchApprovalModalRef" @searchReset="searchReset"
-                                           :taskList="selectionRows"/>
-    <equipment-lean-out-approval-modal ref="equipmentLeanOutApprovalModelRef" @searchReset="searchReset"/>
+                                           :taskList="selectionRows" />
+    <equipment-lean-out-approval-modal ref="equipmentLeanOutApprovalModelRef" @searchReset="searchReset" />
 
-    <second-maintenance-approval-modal ref="secondMaintenanceApprovalModal" :selectShenpiData="selectSecondMaintenanceData"
-                                     @searchReset="searchReset"></second-maintenance-approval-modal>
+    <second-maintenance-approval-modal ref="secondMaintenanceApprovalModal"
+                                       :selectShenpiData="selectSecondMaintenanceData"
+                                       @searchReset="searchReset"></second-maintenance-approval-modal>
     <third-maintenance-approval-modal ref="thirdMaintenanceApprovalModal" :selectShenpiData="selectThirdMaintenanceData"
-                                       @searchReset="searchReset"></third-maintenance-approval-modal>
-    <equipment-seal-up-approval-modal ref="equipmentSealUpApprovalModelRef" @searchReset="searchReset"/>
+                                      @searchReset="searchReset"></third-maintenance-approval-modal>
+    <equipment-seal-up-approval-modal ref="equipmentSealUpApprovalModelRef" @searchReset="searchReset" />
   </a-card>
 </template>
 
 <script>
 
-  import '@/assets/less/TableExpand.less'
-  import { mixinDevice } from '@/utils/mixin'
-  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
-  import JDictSelectTag from '@/components/dict/JDictSelectTag.vue'
-  import WeekMaintenanceApprovalModal from '@views/flowable/workflow/weekMaintenance/WeekMaintenanceApprovalModal'
-  import RepairOrderApprovalModal from '@views/flowable/workflow/repairOrder/RepairOrderApprovalModal'
-  import InspectionOrderHandle from '@views/flowable/workflow/InspectionOrder/InspectionOrderHandle.vue'
+import '@/assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import JDictSelectTag from '@/components/dict/JDictSelectTag.vue'
+import WeekMaintenanceApprovalModal from '@views/flowable/workflow/weekMaintenance/WeekMaintenanceApprovalModal'
+import RepairOrderApprovalModal from '@views/flowable/workflow/repairOrder/RepairOrderApprovalModal'
+import InspectionOrderHandle from '@views/flowable/workflow/InspectionOrder/InspectionOrderHandle.vue'
 
-  import { getAction } from '@api/manage'
-  import InspectionOrderBatchHandle from './InspectionOrder/InspectionOrderBatchHandle'
-  import WeekMaintenanceBatchApprovalModal from './weekMaintenance/WeekMaintenanceBatchApprovalModal'
-  import AssignFileStreamHandle from '@views/flowable/workflow/assignFileStream/AssignFileStreamHandle.vue'
-  import DispatchFileHandle from '@views/flowable/workflow/dispatchFile/DispatchFileHandle.vue'
-  import DispatchFileBachHandleStyle from '@views/flowable/workflow/dispatchFile/DispatchFileBachHandleStyle#Drawer.vue'
-  import OutBoundOrderHandle from '@views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue'
-  import EquipmentLeanOutApprovalModal from '@views/flowable/workflow/leanOut/EquipmentLeanOutApprovalModal.vue'
-  import SecondMaintenanceApprovalModal from '@views/flowable/workflow/secondMaintenance/SecondMaintenanceApprovalModal.vue'
-  import ThirdMaintenanceApprovalModal from '@views/flowable/workflow/thirdMaintenance/ThirdMaintenanceApprovalModal.vue'
-  import EquipmentSealUpApprovalModal from '@views/flowable/workflow/sealUp/EquipmentSealUpApprovalModal.vue'
-  export default {
-    name: 'NcDeviceCharactersList',
-    mixins: [JeecgListMixin, mixinDevice],
-    components: {
-      AssignFileStreamHandle,
-      DispatchFileHandle,
-      DispatchFileBachHandleStyle,
-      WeekMaintenanceBatchApprovalModal,
-      InspectionOrderBatchHandle,
-      JDictSelectTag,
-      WeekMaintenanceApprovalModal,
-      RepairOrderApprovalModal,
-      InspectionOrderHandle,
-      EquipmentLeanOutApprovalModal,
-      SecondMaintenanceApprovalModal,
-      ThirdMaintenanceApprovalModal,
-      OutBoundOrderHandle,
-      EquipmentSealUpApprovalModal,
-    },
-    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: 'category_dictText'
-          },
-          {
-            title: '娴佺▼鍚嶇О',
-            align: 'center',
-            dataIndex: 'flowName',
-            width: 200
-          },
-          {
-            title: '娴佺▼涓氬姟绠�瑕佹弿杩�',
-            align: 'center',
-            dataIndex: 'description',
-            width: 350,
-            ellipsis: true
+import { getAction } from '@api/manage'
+import InspectionOrderBatchHandle from './InspectionOrder/InspectionOrderBatchHandle'
+import WeekMaintenanceBatchApprovalModal from './weekMaintenance/WeekMaintenanceBatchApprovalModal'
+import AssignFileStreamHandle from '@views/flowable/workflow/assignFileStream/AssignFileStreamHandle.vue'
+import DispatchFileHandle from '@views/flowable/workflow/dispatchFile/DispatchFileHandle.vue'
+import DispatchFileBachHandleStyle from '@views/flowable/workflow/dispatchFile/DispatchFileBachHandleStyle#Drawer.vue'
+import OutBoundOrderHandle from '@views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue'
+import EquipmentLeanOutApprovalModal from '@views/flowable/workflow/leanOut/EquipmentLeanOutApprovalModal.vue'
+import SecondMaintenanceApprovalModal
+  from '@views/flowable/workflow/secondMaintenance/SecondMaintenanceApprovalModal.vue'
+import ThirdMaintenanceApprovalModal from '@views/flowable/workflow/thirdMaintenance/ThirdMaintenanceApprovalModal.vue'
+import EquipmentSealUpApprovalModal from '@views/flowable/workflow/sealUp/EquipmentSealUpApprovalModal.vue'
+import stocktakingBoundHandle from '@views/flowable/workflow/stocktakingBound/stocktakingBoundHandle.vue'
+import lossBoundHandle from '@views/flowable/workflow/lossBound/lossBoundHandle.vue'
 
-          },
-          {
-            title: '涓婁竴姝ュ鐞嗕汉',
-            align: 'center',
-            dataIndex: 'preNodeAssignee_dictText',
-            width: 150
-          },
-          {
-            title: '鍓嶉┍鑺傜偣',
-            align: 'center',
-            dataIndex: 'preNode',
-            width: 200
-          },
-          {
-            title: '褰撳墠鑺傜偣',
-            align: 'center',
-            dataIndex: 'name',
-            width: 200
-          },
-          {
-            title: '褰撳墠鑺傜偣寮�濮嬫椂闂�',
-            align: 'center',
-            dataIndex: 'createTime',
-            width: 200
-          },
-          {
-            title: '鎿嶄綔',
-            dataIndex: 'action',
-            scopedSlots: { customRender: 'action' },
-            align: 'center',
-            width: 150,
-            fixed: 'right'
+export default {
+  name: 'NcDeviceCharactersList',
+  mixins: [JeecgListMixin, mixinDevice],
+  components: {
+    lossBoundHandle,
+    stocktakingBoundHandle,
+    AssignFileStreamHandle,
+    DispatchFileHandle,
+    DispatchFileBachHandleStyle,
+    WeekMaintenanceBatchApprovalModal,
+    InspectionOrderBatchHandle,
+    JDictSelectTag,
+    WeekMaintenanceApprovalModal,
+    RepairOrderApprovalModal,
+    InspectionOrderHandle,
+    EquipmentLeanOutApprovalModal,
+    SecondMaintenanceApprovalModal,
+    ThirdMaintenanceApprovalModal,
+    OutBoundOrderHandle,
+    EquipmentSealUpApprovalModal
+  },
+  data() {
+    return {
+      description: '宸ヤ綔娴�-鎴戠殑寰呭姙',
+      // 琛ㄥご
+      columns: [
+        {
+          title: '搴忓彿',
+          dataIndex: '',
+          key: 'rowIndex',
+          width: 60,
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
           }
-        ],
-        url: {
-          list: '/assign/flow/toTaskBySelf',
-          isSameNode: '/assign/flow/isSameNode'
         },
-        dictOptions: {},
-        selectShenpiData: {},
-        selectDispatchFileXqData:{},
-        selectInspectionOrderData: {},
-        selectWeekMaintenanceData: {},
-        selectSecondMaintenanceData: {},
-        selectThirdMaintenanceData: {},
-        selectBachData: {},
-        selectRepairOrderData: {},
-        selectOutBoundOrderData: {},
-        //涓氬姟淇℃伅ID
-        dataId: undefined
-      }
-    },
-    created() {
-    },
-    computed: {
-      importExcelUrl: function() {
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
+        {
+          title: '娴佺▼鍒嗙被',
+          align: 'center',
+          dataIndex: 'category_dictText'
+        },
+        {
+          title: '娴佺▼鍚嶇О',
+          align: 'center',
+          dataIndex: 'flowName',
+          width: 200
+        },
+        {
+          title: '娴佺▼涓氬姟绠�瑕佹弿杩�',
+          align: 'center',
+          dataIndex: 'description',
+          width: 350,
+          ellipsis: true
+
+        },
+        {
+          title: '涓婁竴姝ュ鐞嗕汉',
+          align: 'center',
+          dataIndex: 'preNodeAssignee_dictText',
+          width: 150
+        },
+        {
+          title: '鍓嶉┍鑺傜偣',
+          align: 'center',
+          dataIndex: 'preNode',
+          width: 200
+        },
+        {
+          title: '褰撳墠鑺傜偣',
+          align: 'center',
+          dataIndex: 'name',
+          width: 200
+        },
+        {
+          title: '褰撳墠鑺傜偣寮�濮嬫椂闂�',
+          align: 'center',
+          dataIndex: 'createTime',
+          width: 200
+        },
+        {
+          title: '鎿嶄綔',
+          dataIndex: 'action',
+          scopedSlots: { customRender: 'action' },
+          align: 'center',
+          width: 150,
+          fixed: 'right'
+        }
+      ],
+      url: {
+        list: '/assign/flow/toTaskBySelf',
+        isSameNode: '/assign/flow/isSameNode'
       },
-      getTableColumnsTotalWidth() {
-        return this.columns.reduce((total, item) => total + item.width, 0)
-      }
+      dictOptions: {},
+      selectShenpiData: {},
+      selectDispatchFileXqData: {},
+      selectInspectionOrderData: {},
+      selectWeekMaintenanceData: {},
+      selectSecondMaintenanceData: {},
+      selectThirdMaintenanceData: {},
+      selectBachData: {},
+      selectRepairOrderData: {},
+      selectOutBoundOrderData: {},
+      selectLossBoundOrderData: {},
+      selectStocktakingBoundOrderData: {},
+      //涓氬姟淇℃伅ID
+      dataId: undefined
+    }
+  },
+  created() {
+  },
+  computed: {
+    importExcelUrl: function() {
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
     },
-    methods: {
-      loadData(arg) {
-        if (!this.url.list) {
-          this.$message.error('璇疯缃畊rl.list灞炴��!')
-          return
-        }
-        //鍔犺浇鏁版嵁 鑻ヤ紶鍏ュ弬鏁�1鍒欏姞杞界涓�椤电殑鍐呭
-        if (arg === 1) {
-          this.ipagination.current = 1
-        }
-        var params = this.getQueryParams()//鏌ヨ鏉′欢
-        if (!params) {
-          return false
-        }
-        this.loading = true
-        getAction(this.url.list, params).then((res) => {
-          if (res.success) {
-            // console.log(res)
-            //update-begin---author:zhangyafei    Date:20201118  for锛氶�傞厤涓嶅垎椤电殑鏁版嵁鍒楄〃------------
-            this.dataSource = res.result.records || res.result
-            if (res.result.total) {
-              this.ipagination.total = res.result.total
-            } else {
-              this.ipagination.total = 0
-            }
-            if (this.selectedRowKeys.length > 0) this.selectedRowKeys = this.selectionRows = []
-            //update-end---author:zhangyafei    Date:20201118  for锛氶�傞厤涓嶅垎椤电殑鏁版嵁鍒楄〃------------
+    getTableColumnsTotalWidth() {
+      return this.columns.reduce((total, item) => total + item.width, 0)
+    }
+  },
+  methods: {
+    loadData(arg) {
+      if (!this.url.list) {
+        this.$message.error('璇疯缃畊rl.list灞炴��!')
+        return
+      }
+      //鍔犺浇鏁版嵁 鑻ヤ紶鍏ュ弬鏁�1鍒欏姞杞界涓�椤电殑鍐呭
+      if (arg === 1) {
+        this.ipagination.current = 1
+      }
+      var params = this.getQueryParams()//鏌ヨ鏉′欢
+      if (!params) {
+        return false
+      }
+      this.loading = true
+      getAction(this.url.list, params).then((res) => {
+        if (res.success) {
+          // console.log(res)
+          //update-begin---author:zhangyafei    Date:20201118  for锛氶�傞厤涓嶅垎椤电殑鏁版嵁鍒楄〃------------
+          this.dataSource = res.result.records || res.result
+          if (res.result.total) {
+            this.ipagination.total = res.result.total
           } else {
-            this.$message.warning(res.message)
+            this.ipagination.total = 0
           }
-        }).finally(() => {
-          this.loading = false
+          if (this.selectedRowKeys.length > 0) this.selectedRowKeys = this.selectionRows = []
+          //update-end---author:zhangyafei    Date:20201118  for锛氶�傞厤涓嶅垎椤电殑鏁版嵁鍒楄〃------------
+        } else {
+          this.$message.warning(res.message)
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+
+    handelDetail(item, index) {
+      console.log('鐐瑰嚮浜嗚鎯�')
+      console.log('item----->', item)
+      console.log('index----->', index)
+      let processType = this.splitAprocessType(item.category)
+      console.log('processType--->', processType)
+      switch (processType) {
+        case 'drApproval':
+          this.handDrDetial(item)
+          break
+        case 'ggApproval':
+          this.handDispatchFileDetial(item)
+          break
+        case 'sbdjApproval':
+          this.handInspectionOrder(item)
+          break
+        case 'WEEK_MAINTENANCE':
+          this.handleWeekMaintenance(item)
+          break
+        case 'eam_repair':
+          this.handleRepairOrder(item)
+          break
+        case 'equipment_lean_out':
+          this.handleEquipmentLeanOut(item)
+          break
+        case 'second_maintenance':
+          this.handleSecondMaintenance(item)
+          break
+        case 'third_maintenance':
+          this.handleThirdMaintenance(item)
+          break
+        case 'toolOutStorageApproval':
+          this.handleToolOutStorageApproval(item)
+          break
+        case 'toolsStocktakingBound':
+          this.handleToolStocktakingApproval(item)
+          break
+        case 'toolsLossApproval':
+          this.handleToolLossApproval(item)
+          break
+        case 'equipment_seal_up':
+          this.handleEquipmentSealUp(item)
+          break
+        default:
+          alert('娌℃壘鍒拌娴佺▼')
+      }
+    },
+
+    batchHandle() {
+      const categorySet = new Set(this.selectionRows.map(item => item.category))
+      const nameSet = new Set(this.selectionRows.map(item => item.name))
+      if (categorySet.size !== 1 || nameSet.size !== 1) {
+        this.$notification.info({
+          message: '娑堟伅',
+          description: '璇烽�夋嫨鍚屼竴娴佺▼鍒嗙被涓嬬殑鍚屼竴褰撳墠鑺傜偣'
         })
-      },
+        return
+      }
 
-      handelDetail(item, index) {
-        console.log('鐐瑰嚮浜嗚鎯�')
-        console.log('item----->', item)
-        console.log('index----->', index)
-        let processType = this.splitAprocessType(item.category)
-        console.log('processType--->', processType)
-        switch (processType) {
-          case 'drApproval':
-            this.handDrDetial(item)
-            break
-          case 'ggApproval':
-            this.handDispatchFileDetial(item)
-            break
-          case 'sbdjApproval':
-            this.handInspectionOrder(item)
-            break
-          case 'WEEK_MAINTENANCE':
-            this.handleWeekMaintenance(item)
-            break
-          case 'eam_repair':
-            this.handleRepairOrder(item)
-            break
-          case 'equipment_lean_out':
-            this.handleEquipmentLeanOut(item)
-            break
-          case 'second_maintenance':
-            this.handleSecondMaintenance(item)
-            break
-          case 'third_maintenance':
-            this.handleThirdMaintenance(item)
-            break
-          case 'toolOutStorageApproval':
-            this.handleToolOutStorageApproval(item)
-            break
-          case 'equipment_seal_up':
-            this.handleEquipmentSealUp(item)
-            break
-          default:
-            alert('娌℃壘鍒拌娴佺▼')
-        }
-      },
+      if (categorySet.has('eam_repair')) {
+        this.$notification.info({
+          message: '娑堟伅',
+          description: '璁惧缁翠慨娴佺▼鏃犳硶鎵归噺澶勭悊'
+        })
+        return
+      }
 
-      batchHandle() {
-        const categorySet = new Set(this.selectionRows.map(item => item.category))
-        const nameSet = new Set(this.selectionRows.map(item => item.name))
-        if (categorySet.size !== 1 || nameSet.size !== 1) {
-          this.$notification.info({
-            message: '娑堟伅',
-            description: '璇烽�夋嫨鍚屼竴娴佺▼鍒嗙被涓嬬殑鍚屼竴褰撳墠鑺傜偣'
-          })
-          return
-        }
+      if (categorySet.has('sbdjApproval')) {
+        this.$refs.inspectionOrderBatchHandleRef.visible = true
+        this.$refs.inspectionOrderBatchHandleRef.title = this.selectionRows[0].name
+        this.$refs.inspectionOrderBatchHandleRef.getAllApproveData(this.selectionRows[0])
+        this.$refs.inspectionOrderBatchHandleRef.getBasicInformation(this.selectionRows[0])
+      } else if (categorySet.has('WEEK_MAINTENANCE')) {
+        this.$refs.weenMaintenanceBatchApprovalModalRef.handleDetail(this.selectionRows[0])
+        this.$refs.weenMaintenanceBatchApprovalModalRef.title = this.selectionRows[0].name
+      }
+    },
 
-        if (categorySet.has('eam_repair')) {
-          this.$notification.info({
-            message: '娑堟伅',
-            description: '璁惧缁翠慨娴佺▼鏃犳硶鎵归噺澶勭悊'
-          })
-          return
-        }
+    splitAprocessType(title) {
+      let parts = title.split('锛�') // 娉ㄦ剰鍐掑彿鏄叏瑙掑瓧绗︼紝浣跨敤瀵瑰簲鐨勫瓧杩涜鍒嗗壊
+      let result = parts[0]
+      return result
+    },
 
-        if (categorySet.has('sbdjApproval')) {
-          this.$refs.inspectionOrderBatchHandleRef.visible = true
-          this.$refs.inspectionOrderBatchHandleRef.title = this.selectionRows[0].name
-          this.$refs.inspectionOrderBatchHandleRef.getAllApproveData(this.selectionRows[0])
-          this.$refs.inspectionOrderBatchHandleRef.getBasicInformation(this.selectionRows[0])
-        } else if (categorySet.has('WEEK_MAINTENANCE')) {
-          this.$refs.weenMaintenanceBatchApprovalModalRef.handleDetail(this.selectionRows[0])
-          this.$refs.weenMaintenanceBatchApprovalModalRef.title = this.selectionRows[0].name
-        }
-      },
+    handDrDetial(item) {
+      this.selectShenpiData = item
+      this.$refs.modalFormApproval.clearTableSource()
+      this.$refs.modalFormApproval.getAllApproveData(item)
+    },
 
-      splitAprocessType(title) {
-        let parts = title.split('锛�') // 娉ㄦ剰鍐掑彿鏄叏瑙掑瓧绗︼紝浣跨敤瀵瑰簲鐨勫瓧杩涜鍒嗗壊
-        let result = parts[0]
-        return result
-      },
+    handDispatchFileDetial(item) {
+      console.log('item----->', item)
+      this.selectDispatchFileXqData = item
+      this.$refs.modalFormDispatchFileXq.clearTableSource()
+      this.$refs.modalFormDispatchFileXq.getAllApproveData(item)
+    },
 
-      handDrDetial(item) {
-        this.selectShenpiData = item
-        this.$refs.modalFormApproval.clearTableSource()
-        this.$refs.modalFormApproval.getAllApproveData(item)
-      },
+    handInspectionOrder(record) {
+      console.log('record----->', record)
+      this.selectInspectionOrderData = Object.assign({}, record)
+      this.$refs.modalFormInspectionOrder.visible = true
+      this.$refs.modalFormInspectionOrder.title = record.name
+      this.$refs.modalFormInspectionOrder.getAllApproveData(record)
+      this.$refs.modalFormInspectionOrder.getBasicInformation(record)
+    },
 
-      handDispatchFileDetial(item){
-        console.log('item----->', item)
-        this.selectDispatchFileXqData = item
-        this.$refs.modalFormDispatchFileXq.clearTableSource()
-        this.$refs.modalFormDispatchFileXq.getAllApproveData(item)
-      },
+    handleWeekMaintenance(item) {
+      if (item && item.dataId) {
+        this.selectWeekMaintenanceData = Object.assign({}, item)
+        this.$refs.weekMaintenanceApprovalModal.handleDetail(item)
+        this.$refs.weekMaintenanceApprovalModal.title = item.name
+        this.$refs.weekMaintenanceApprovalModal.disableSubmit = false
+      }
+    },
 
-      handInspectionOrder(record) {
-        console.log('record----->', record)
-        this.selectInspectionOrderData = Object.assign({}, record)
-        this.$refs.modalFormInspectionOrder.visible = true
-        this.$refs.modalFormInspectionOrder.title = record.name
-        this.$refs.modalFormInspectionOrder.getAllApproveData(record)
-        this.$refs.modalFormInspectionOrder.getBasicInformation(record)
-      },
+    /**
+     * 鐐瑰嚮璁惧缁翠慨鍒嗙被娴佺▼璇︽儏鏃惰Е鍙�
+     * @param record
+     */
+    handleRepairOrder(record) {
+      this.selectRepairOrderData = Object.assign({}, record)
+      this.$refs.repairOrderApprovalModal.visible = true
+      this.$refs.repairOrderApprovalModal.title = record.name
+      this.$refs.repairOrderApprovalModal.getAllApproveData(record)
+      this.$refs.repairOrderApprovalModal.getBasicInformation(record)
+    },
+    handleEquipmentLeanOut(item) {
+      this.$refs.equipmentLeanOutApprovalModelRef.visible = true
+      this.$refs.equipmentLeanOutApprovalModelRef.title = item.name
+      this.$refs.equipmentLeanOutApprovalModelRef.handleDetail(item)
+      this.$refs.equipmentLeanOutApprovalModelRef.disableSubmit = false
+    },
+    handleSecondMaintenance(item) {
+      if (item && item.dataId) {
+        this.selectSecondMaintenanceData = Object.assign({}, item)
+        this.$refs.secondMaintenanceApprovalModal.handleDetail(item)
+        this.$refs.secondMaintenanceApprovalModal.title = item.name
+        this.$refs.secondMaintenanceApprovalModal.disableSubmit = false
+      }
+    },
+    handleThirdMaintenance(item) {
+      if (item && item.dataId) {
+        this.selectThirdMaintenanceData = Object.assign({}, item)
+        this.$refs.thirdMaintenanceApprovalModal.handleDetail(item)
+        this.$refs.thirdMaintenanceApprovalModal.title = item.name
+        this.$refs.thirdMaintenanceApprovalModal.disableSubmit = false
+      }
+    },
+    handleToolOutStorageApproval(item) {
+      if (item && item.dataId) {
+        this.selectOutBoundOrderData = Object.assign({}, item)
+        this.$refs.outBoundOrderHandle.auditVisible = true
+        this.$refs.outBoundOrderHandle.clearTableSource()
+        this.$refs.outBoundOrderHandle.getAllApproveData(item)
+      }
+    },
+    handleToolStocktakingApproval(item) {
+      if (item && item.dataId) {
+        this.selectStocktakingBoundOrderData = Object.assign({}, item)
+        this.$refs.stocktakingBoundHandle.auditVisible = true
+        this.$refs.stocktakingBoundHandle.clearTableSource()
+        this.$refs.stocktakingBoundHandle.getAllApproveData(item)
+      }
+    },
+    handleToolLossApproval(item) {
+      if (item && item.dataId) {
+        this.selectLossBoundOrderData = Object.assign({}, item)
+        this.$refs.lossBoundHandle.auditVisible = true
+        this.$refs.lossBoundHandle.clearTableSource()
+        this.$refs.lossBoundHandle.getAllApproveData(item)
+      }
+    },
 
-
-      handleWeekMaintenance(item) {
-        if (item && item.dataId) {
-          this.selectWeekMaintenanceData = Object.assign({}, item)
-          this.$refs.weekMaintenanceApprovalModal.handleDetail(item)
-          this.$refs.weekMaintenanceApprovalModal.title = item.name
-          this.$refs.weekMaintenanceApprovalModal.disableSubmit = false
-        }
-      },
-
-      /**
-       * 鐐瑰嚮璁惧缁翠慨鍒嗙被娴佺▼璇︽儏鏃惰Е鍙�
-       * @param record
-       */
-      handleRepairOrder(record) {
-        this.selectRepairOrderData = Object.assign({}, record)
-        this.$refs.repairOrderApprovalModal.visible = true
-        this.$refs.repairOrderApprovalModal.title = record.name
-        this.$refs.repairOrderApprovalModal.getAllApproveData(record)
-        this.$refs.repairOrderApprovalModal.getBasicInformation(record)
-      },
-      handleEquipmentLeanOut(item) {
-        this.$refs.equipmentLeanOutApprovalModelRef.visible = true
-        this.$refs.equipmentLeanOutApprovalModelRef.title = item.name
-        this.$refs.equipmentLeanOutApprovalModelRef.handleDetail(item)
-        this.$refs.equipmentLeanOutApprovalModelRef.disableSubmit = false
-      },
-      handleSecondMaintenance(item) {
-        if (item && item.dataId) {
-          this.selectSecondMaintenanceData = Object.assign({}, item)
-          this.$refs.secondMaintenanceApprovalModal.handleDetail(item)
-          this.$refs.secondMaintenanceApprovalModal.title = item.name
-          this.$refs.secondMaintenanceApprovalModal.disableSubmit = false
-        }
-      },
-      handleThirdMaintenance(item) {
-        if (item && item.dataId) {
-          this.selectThirdMaintenanceData = Object.assign({}, item)
-          this.$refs.thirdMaintenanceApprovalModal.handleDetail(item)
-          this.$refs.thirdMaintenanceApprovalModal.title = item.name
-          this.$refs.thirdMaintenanceApprovalModal.disableSubmit = false
-        }
-      },
-      handleToolOutStorageApproval(item) {
-        if (item && item.dataId) {
-          this.selectOutBoundOrderData = Object.assign({}, item)
-          this.$refs.outBoundOrderHandle.auditVisible = true
-          this.$refs.outBoundOrderHandle.clearTableSource()
-          this.$refs.outBoundOrderHandle.getAllApproveData(item)
-        }
-      },
-      handleEquipmentSealUp(item) {
-        this.$refs.equipmentSealUpApprovalModelRef.visible = true
-        this.$refs.equipmentSealUpApprovalModelRef.title = item.name
-        this.$refs.equipmentSealUpApprovalModelRef.handleDetail(item)
-        this.$refs.equipmentSealUpApprovalModelRef.disableSubmit = false
-      },
+    handleEquipmentSealUp(item) {
+      this.$refs.equipmentSealUpApprovalModelRef.visible = true
+      this.$refs.equipmentSealUpApprovalModelRef.title = item.name
+      this.$refs.equipmentSealUpApprovalModelRef.handleDetail(item)
+      this.$refs.equipmentSealUpApprovalModelRef.disableSubmit = false
     }
   }
+}
 </script>
 <style scoped>
-  @import '~@assets/less/common.less';
+@import '~@assets/less/common.less';
 </style>
\ No newline at end of file
diff --git a/src/views/flowable/workflow/lossBound/lossBoundHandle.vue b/src/views/flowable/workflow/lossBound/lossBoundHandle.vue
new file mode 100644
index 0000000..d0b2286
--- /dev/null
+++ b/src/views/flowable/workflow/lossBound/lossBoundHandle.vue
@@ -0,0 +1,499 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :footer="null"
+    @cancel="handCancel"
+  >
+    <a-card :bordered="false">
+      <div>
+        <b>{{ selectShenpiData.description }}</b>
+        <br>
+        <br>
+        <a-tag color="blue">
+          澶勭悊浜� {{ selectShenpiData.assignee_dictText }}
+        </a-tag>
+        <a-tag color="blue">
+          鍒涘缓鏃堕棿 {{ selectShenpiData.createTime }}
+        </a-tag>
+        <br>
+        <br>
+        <button @click="fetchAndShowBmp" class="btn-custom">鎵撳紑娴佺▼鍥�</button>
+        <div v-if="imageSrc">
+          <img :src="imageSrc" alt="Fetched Image" />
+        </div>
+        <hr class="shallow-hr">
+      </div>
+      <div>
+        <b>鎶ユ崯璇︽儏</b>
+        <br>
+        <a-form :form="form">
+          <a-spin :spinning="spinning">
+            <a-tabs default-active-key="1" @change="callback">
+              <a-tab-pane key="1" tab="鎶ユ崯鍩烘湰淇℃伅">
+                <a-form-model ref="form" :model="tableRowRecord">
+                  <a-row>
+                    <a-col :span="span">
+                      <a-form-model-item label="鎶ユ崯鍗曞崟鍙�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="outNum">
+                        <a-input :disabled="coldisabled" v-model="tableRowRecord.orderCode"></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="span">
+                      <a-form-model-item label="鎶ユ崯浜�" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                                         prop="outStorehouseType">
+                        <j-dict-select-tag :disabled="coldisabled"
+                                           v-model="tableRowRecord.losser" dictCode="sys_user,realname,id"
+                                           placeholder="璇烽�夋嫨" />
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span="span">
+                      <a-form-model-item label="鎶ユ崯鏃堕棿" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                                         prop="outboundTime">
+                        <j-date :disabled="coldisabled" v-model="tableRowRecord.lossTime" :show-time="true"
+                                dateFormat="YYYY-MM-DD HH:mm" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="span">
+                      <a-form-model-item label="鎶ユ崯鍘熷洜" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                                         prop="subjectMatter">
+                        <a-input :disabled="coldisabled" v-model="tableRowRecord.lossReason"></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                  <a-row>
+                    <a-col :span="span">
+                      <a-form-model-item label="缁忔墜浜�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="handler">
+                        <j-dict-select-tag :disabled="coldisabled"
+                                           v-model="tableRowRecord.handler" dictCode="sys_user,realname,id"
+                                           placeholder="璇烽�夋嫨" />
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="span">
+                      <a-form-model-item label="澶囨敞" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
+                        <a-textarea :disabled="coldisabled" v-model="tableRowRecord.remark" rows="4" />
+                      </a-form-model-item>
+                    </a-col>
+                  </a-row>
+                </a-form-model>
+              </a-tab-pane>
+              <a-tab-pane key="2" tab="鎶ユ崯鏄庣粏淇℃伅">
+                <a-table
+                  ref="table"
+                  size="middle"
+                  bordered
+                  rowKey="id"
+                  :scroll="{x:'max-content'}"
+                  :columns="columns"
+                  :dataSource="dataSource"
+                  :pagination="ipagination"
+                  :loading="loading"
+                  :rowSelection="null">
+                </a-table>
+              </a-tab-pane>
+              <a-tab-pane key="3" tab="娴佺▼鑺傜偣">
+                <a-timeline>
+                  <a-timeline-item v-for="(item,index) in hitaskDataSource" :key="index">
+                    <div>
+                      <h3 style="font-weight: bold;">{{ item.taskName }}</h3>
+                      <div>澶勭悊浜猴細{{ item.assignee_dictText }}</div>
+                      <div v-if="index !==0">澶勭悊鏃堕暱锛歿{ item.duration }}</div>
+                      <div v-if="item.name !== '鎻愪氦鐢宠'">澶勭悊绫诲瀷锛歿{ item.sequenceFlowName }}</div>
+                      <div v-if="item.description">澶勭悊鎰忚锛歿{ item.description }}</div>
+                    </div>
+                  </a-timeline-item>
+                </a-timeline>
+              </a-tab-pane>
+            </a-tabs>
+          </a-spin>
+        </a-form>
+      </div>
+      <div v-if="auditVisible">
+        <hr class="shallow-hr">
+        <br>
+        <b>瀹℃壒璇︽儏</b>
+        <br>
+        <a-form-model ref="form" :model="approveData" :rules="validatorRules" slot="detail">
+          <a-row>
+            <a-col ::span="span">
+              <a-form-model-item label="鐢宠浜�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="handler_dictText">
+                <a-input :disabled="coldisabled" v-model="tableRowRecord.handler_dictText"></a-input>
+              </a-form-model-item>
+            </a-col>
+            <a-col ::span="span">
+              <a-form-model-item label="鐢宠鏃堕棿" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="createTime">
+                <a-input :disabled="coldisabled" v-model="tableRowRecord.createTime"></a-input>
+              </a-form-model-item>
+            </a-col>
+            <a-col :span="24" class="btxx">
+              <a-form-item label="瀹℃壒鐘舵��" :labelCol="labelCol" :wrapperCol="wrapperCol">
+                <a-select v-model="assignFileStream.status" placeholder="璇烽�夋嫨瀹℃壒缁撴灉">
+                  <a-select-option value="3">閫氳繃</a-select-option>
+                  <a-select-option value="4">椹冲洖</a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :span="24" class="btxx">
+              <a-form-model-item label="瀹℃壒鎰忚" :labelCol="labelCol" :wrapperCol="wrapperCol">
+                <a-textarea v-model="assignFileStream.approvalOpinion" rows="4" placeholder="璇疯緭鍏ュ鎵规剰瑙�" />
+              </a-form-model-item>
+            </a-col>
+          </a-row>
+          <div class="table-operator" style="text-align: right;">
+            <a-button @click="handleQueXiaoTask" type="primary" icon="close">鍙栨秷</a-button>
+            <a-button @click="submitForm">鎻� 浜�</a-button>
+          </div>
+        </a-form-model>
+      </div>
+    </a-card>
+
+
+  </a-modal>
+</template>
+
+<script>
+
+import '@assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { downFile, getAction, httpAction } from '@api/manage'
+
+export default {
+  name: 'lossBoundHandle',
+  mixins: [mixinDevice],
+  props: {
+    selectShenpiData: {
+      type: Object,
+      required: true
+    }
+  },
+
+  data() {
+    return {
+      form: this.$form.createForm(this),
+      span: 12,
+      span1: 8,
+      coldisabled: true,
+      spinning: false,
+      tableRowRecord: {},
+      assignFileStream: {},
+      tableDataSource: [],
+      usageDataSource: [],
+      hitaskDataSource: [],
+      dataSource: [],
+      bomForm: {},
+      imageSrc: null,
+      drawerVisible: true,
+      auditVisible: true,
+      loading: false,
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 30 },
+        sm: { span: 16 }
+      },
+      /* 鍒嗛〉鍙傛暟 */
+      ipagination: {
+        current: 1,
+        pageSize: 5,
+        pageSizeOptions: ['5', '10', '50'],
+        showTotal: (total, range) => {
+          return range[0] + '-' + range[1] + ' 鍏�' + total + '鏉�'
+        },
+        showQuickJumper: true,
+        showSizeChanger: true,
+        total: 0
+      },
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key: 'rowIndex',
+          width: 60,
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
+          }
+        },
+        {
+          title: '鍒�鍏风紪鍙�',
+          align: 'center',
+          dataIndex: 'toolCode'
+        },
+        {
+          title: '宸ュ叿绫诲瀷',
+          align: 'center',
+          dataIndex: 'applicationType_dictText'
+        },
+        {
+          title: '鎶ユ崯鍘熷洜',
+          align: 'center',
+          dataIndex: 'lossReason'
+        },
+        {
+          title: '鎶ユ崯鏁伴噺',
+          align: 'center',
+          dataIndex: 'lossNumber'
+        },
+        {
+          title: '涓枃鍚嶇О',
+          align: 'center',
+          dataIndex: 'chineseName'
+        },
+        {
+          title: '鍨嬪彿/鍥惧彿',
+          align: 'center',
+          dataIndex: 'toolModel'
+        },
+        {
+          title: '鍒�鍏锋潗鏂�',
+          align: 'center',
+          dataIndex: 'toolMaterial'
+        },
+        {
+          title: '闆朵欢鏉愭枡',
+          align: 'center',
+          dataIndex: 'partMaterial'
+        },
+        {
+          title: '鍘傚',
+          align: 'center',
+          dataIndex: 'supplierId'
+        },
+        {
+          title: '瀛樺偍浣嶇疆(搴撲綅鍙�)',
+          align: 'center',
+          dataIndex: 'positionCode'
+        },
+
+        {
+          title: '鍒涘缓鏃堕棿',
+          align: 'center',
+          dataIndex: 'createTime'
+        },
+        {
+          title: '澶囨敞',
+          align: 'center',
+          dataIndex: 'remark'
+        }
+      ],
+      validatorRules: {
+        status: {
+          rules: [
+            { required: true, message: '璇烽�夋嫨瀹℃壒鐘舵��!' }
+          ]
+        }
+      },
+      approveData: {},
+      flowData: {},
+      title: '瀹℃壒椤甸潰',
+      width: 1200,
+      visible: false,
+      // 琛ㄥご
+      url: {
+        queryOutBoundOrder: '/tms/toolsLossBound/queryById',
+        queryOutBoundDetailList: '/tms/toolsLossBound/listlossboundDetailByMainId',
+        diagramView: '/assign/flow/diagramView',
+        queryHisTaskList: '/assign/flow/queryHisTaskList',
+        approve: '/tms/outboundOrder/approval'
+      },
+      dictOptions: {},
+      superFieldList: [],
+      workflowSource: []
+    }
+  },
+  created() {
+  },
+  computed: {},
+  methods: {
+    callback() {
+    },
+    handCancel() {
+      this.visible = false
+    },
+    clearTableSource() {
+      this.tableDataSource = []
+      this.usageDataSource = []
+    },
+    fetchAndShowBmp() {
+      console.log('flowData----->', this.flowData)
+      try {
+        let parm = {
+          processDefinitionId: this.flowData.processDefinitionId,
+          processInstanceId: this.flowData.processInstanceId,
+          TaskDefinitionKey: this.flowData.processDefinitionKey
+        }
+        downFile(this.url.diagramView, parm, 'get').then((res => {
+          console.log('Pica------>', res)
+          const urlObject = window.URL.createObjectURL(new Blob([res]))
+          this.imageSrc = urlObject
+        }))
+      } catch (error) {
+        console.error('Error fetching image blob:', error)
+        alert('鏃犳硶鍔犺浇鍥剧墖锛岃绋嶅悗鍐嶈瘯銆�')
+      }
+    },
+    handleQueXiaoTask() {
+      this.visible = false
+      this.routeReload()
+    },
+    submitForm() {
+      const that = this
+      if (!that.assignFileStream.status == null || that.assignFileStream.status === undefined) {
+        this.$message.warning('璇烽�夋嫨瀹℃壒鐘舵�侊紒')
+        return false
+      }
+      if (!that.assignFileStream.approvalOpinion == null || that.assignFileStream.approvalOpinion === undefined) {
+        this.$message.warning('璇疯緭鍏ュ鎵规剰瑙侊紒')
+        return false
+      }
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          that.confirmLoading = true
+          let url = this.url.approve
+          let method = 'post'
+          let flowTaskVo = {}
+          flowTaskVo.status = that.assignFileStream.status
+          flowTaskVo.approvalOpinion = that.assignFileStream.approvalOpinion
+          flowTaskVo.comment = that.assignFileStream.approvalOpinion
+          flowTaskVo.dataId = this.selectShenpiData.dataId
+          flowTaskVo.taskId = this.selectShenpiData.id
+          flowTaskVo.userId = this.selectShenpiData.assignee
+          flowTaskVo.instanceId = this.selectShenpiData.procInstId
+          flowTaskVo.targetKey = this.selectShenpiData.taskDefKey
+          flowTaskVo.values = this.selectShenpiData.variables
+          flowTaskVo.assignee = this.selectShenpiData.assignee
+          console.log('琛ㄥ崟鎻愪氦鏁版嵁', flowTaskVo)
+          httpAction(url, flowTaskVo, method).then((res) => {
+            if (res.success) {
+              that.$message.success(res.message)
+              that.visible = false
+              //鍒锋柊琛ㄦ牸
+              that.$emit('searchReset')
+            } else {
+              that.$message.warning(res.message)
+            }
+          }).finally(() => {
+            that.confirmLoading = false
+          })
+        }
+
+      })
+    },
+    getAllApproveData(item) {
+      this.visible = true
+      this.loading = true
+      console.log('selectShenpiData----->', this.selectShenpiData)
+      this.flowData = item
+      getAction(this.url.queryHisTaskList, { procInstId: item.procInstId }).then(res => {
+        if (res.success) {
+          this.hitaskDataSource = res.result
+        }
+      })
+      getAction(this.url.queryOutBoundOrder, { id: item.dataId }).then((res => {
+        if (res.success) {
+          this.tableRowRecord = res.result
+        }
+      }))
+      getAction(this.url.queryOutBoundDetailList, { lossBoundId: item.dataId }).then(res => {
+        if (res.success) {
+          this.dataSource = res.result.records
+          if (res.result.total) {
+            this.ipagination.total = res.result.total
+          } else {
+            this.ipagination.total = 0
+          }
+        } else {
+          this.$message.warning(res.message)
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    }
+  }
+}
+</script>
+<style scoped>
+.shallow-hr {
+  border: 0;
+  height: 1px; /* 鍒嗙晫绾跨殑楂樺害 */
+  background-color: rgba(0, 0, 0, 0.1); /* 浣跨敤 RGBA 棰滆壊锛屽苟璁剧疆杈冧綆鐨勯�忔槑搴� */
+  margin: 20px 0; /* 鍒嗙晫绾夸笂涓嬬殑澶栬竟璺� */
+}
+
+.btn-custom {
+  background-color: #4CAF50; /* 缁胯壊鑳屾櫙 */
+  color: white; /* 鐧借壊鏂囧瓧 */
+  border: none; /* 鏃犺竟妗� */
+  padding: 5px 15px; /* 鍐呰竟璺� */
+  text-align: center; /* 鏂囧瓧灞呬腑 */
+  text-decoration: none; /* 鏃犱笅鍒掔嚎 */
+  display: inline-block; /* 琛屽唴鍧楀厓绱� */
+  font-size: 12px; /* 瀛椾綋澶у皬 */
+  margin: 4px 2px; /* 澶栬竟璺� */
+  cursor: pointer; /* 榧犳爣鎮仠鏃舵樉绀烘墜鍨� */
+  border-radius: 4px; /* 鍦嗚杈规 */
+}
+
+.bold-large-label {
+  font-weight: bold;
+  font-size: 20px; /* 鎴栦綘闇�瑕佺殑浠讳綍澶у皬 */
+}
+
+.left_qiu {
+  position: absolute;
+  left: -74px;
+  top: 0;
+  width: 54px;
+  border-radius: 50%;
+  height: 54px;
+  font-size: 13px;
+  margin: auto;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: center;
+  background: #0099ff;
+  transform: translate(0, 0);
+}
+
+/deep/ .ant-timeline-item-tail {
+  left: -29px !important;
+}
+
+.left_qiu span {
+  width: 3em;
+  display: block;
+  color: #fff;
+  text-align: center;
+}
+
+.img {
+  width: 75%;
+}
+
+.wrap {
+  clear: both;
+  width: 100%;
+  display: flex;
+  height: 50px;
+  border: 1px solid #ccc;
+  /* background-color: aqua; */
+}
+
+.box {
+  width: 21%;
+  height: 50px;
+  border-right: 1px solid #ccc;
+  line-height: 50px;
+  /* background: red; */
+  text-align: center;
+  margin: auto;
+}
+
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/tms/lossBound/LossboundDetailList.vue b/src/views/tms/lossBound/LossboundDetailList.vue
new file mode 100644
index 0000000..bc54001
--- /dev/null
+++ b/src/views/tms/lossBound/LossboundDetailList.vue
@@ -0,0 +1,180 @@
+<template>
+  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
+    <!-- 鏌ヨ鍖哄煙 -->
+
+    <!--    </div>-->
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator" v-if="mainId">
+
+    </div>
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="null"
+        @change="handleTableChange">
+
+      </a-table>
+    </div>
+
+<!--    <lossboundDetail-modal ref="modalForm" @ok="modalFormOk" :mainId="mainId"></lossboundDetail-modal>-->
+  </a-card>
+</template>
+
+<script>
+
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import LossboundDetailModal from './modules/LossboundDetailModal'
+
+export default {
+  name: 'LossboundDetailList',
+  mixins: [JeecgListMixin],
+  components: { LossboundDetailModal },
+  props: {
+    mainId: {
+      type: String,
+      default: '',
+      required: false
+    }
+  },
+  watch: {
+    mainId: {
+      immediate: true,
+      handler(val) {
+        if (!this.mainId) {
+          this.clearList()
+        } else {
+          this.queryParam['lossBoundId'] = val
+          this.loadData(1)
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      description: '鎶ユ崯绠$悊椤甸潰',
+      disableMixinCreated: true,
+      // 琛ㄥご
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key: 'rowIndex',
+          width: 60,
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
+          }
+        },
+        {
+          title: '鍒�鍏风紪鍙�',
+          align: 'center',
+          dataIndex: 'toolCode'
+        },
+        {
+          title: '宸ュ叿绫诲瀷',
+          align: 'center',
+          dataIndex: 'applicationType_dictText'
+        },
+        {
+          title: '鎶ユ崯鍘熷洜',
+          align: 'center',
+          dataIndex: 'lossReason'
+        },
+        {
+          title: '鎶ユ崯鏁伴噺',
+          align: 'center',
+          dataIndex: 'lossNumber'
+        },
+        {
+          title: '涓枃鍚嶇О',
+          align: 'center',
+          dataIndex: 'chineseName'
+        },
+        {
+          title: '鍨嬪彿/鍥惧彿',
+          align: 'center',
+          dataIndex: 'toolModel'
+        },
+        {
+          title: '鍒�鍏锋潗鏂�',
+          align: 'center',
+          dataIndex: 'toolMaterial'
+        },
+        {
+          title: '闆朵欢鏉愭枡',
+          align: 'center',
+          dataIndex: 'partMaterial'
+        },
+        {
+          title: '鍘傚',
+          align: 'center',
+          dataIndex: 'supplierId'
+        },
+        {
+          title: '瀛樺偍浣嶇疆(搴撲綅鍙�)',
+          align: 'center',
+          dataIndex: 'positionCode'
+        },
+
+        {
+          title: '鍒涘缓鏃堕棿',
+          align: 'center',
+          dataIndex: 'createTime'
+        },
+        {
+          title: '澶囨敞',
+          align: 'center',
+          dataIndex: 'remark'
+        }
+        // {
+        //   title: '鎿嶄綔',
+        //   dataIndex: 'action',
+        //   align:"center",
+        //   fixed:"right",
+        //   width:147,
+        //   scopedSlots: { customRender: 'action' },
+        // }
+      ],
+      url: {
+        list: '/tms/toolsLossBound/listlossboundDetailByMainId',
+        delete: '/tms/toolsLossBound/deleteLootboundDetail',
+        deleteBatch: '/tms/toolsLossBound/deleteBatchLossboundDetail',
+        exportXlsUrl: '/tms/toolsLossBound/exportLossboundDetail',
+        importUrl: '/tms/toolsLossBound/importLossboundDetail'
+      },
+    }
+  },
+  created() {
+  },
+  computed: {
+    importExcelUrl() {
+      return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`
+    }
+  },
+  methods: {
+    clearList() {
+      this.dataSource = []
+      this.selectedRowKeys = []
+      this.ipagination.current = 1
+    }
+
+  }
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+</style>
diff --git a/src/views/tms/lossBound/LossboundList.vue b/src/views/tms/lossBound/LossboundList.vue
new file mode 100644
index 0000000..23d100c
--- /dev/null
+++ b/src/views/tms/lossBound/LossboundList.vue
@@ -0,0 +1,307 @@
+<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="鎶ユ崯鍗曞崟鍙�">
+              <a-input placeholder="璇疯緭鍏ユ姤鎹熷崟鍗曞彿" v-model="queryParam.orderCode"></a-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="璇烽�夋嫨瀹℃牳鐘舵��" v-model="queryParam.orderStatus"
+                                 dictCode="approval_status"/>
+            </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>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '鏀惰捣' : '灞曞紑' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'" />
+              </a>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
+
+    </div>
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        class="j-table-force-nowrap"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}"
+        :customRow="clickThenSelect"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleDetail(record)">璇︽儏</a>
+          <span v-if="record.orderStatus === '1'">
+            <a-divider type="vertical" />
+            <a-popconfirm title="纭畾鎻愪氦鍚�?" @confirm="() => handleSubmit(record)">
+              <a>鎻愪氦</a>
+            </a-popconfirm>
+            <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="handleEdit(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>
+
+      </a-table>
+    </div>
+
+    <a-tabs defaultActiveKey="1">
+      <a-tab-pane tab="鎶ユ崯鐢宠鍗曟槑缁�" key="1">
+        <LossboundDetailList ref="lossboundDetailList" :mainId="lossboundDetailMainId" />
+      </a-tab-pane>
+    </a-tabs>
+
+    <lossbound-modal ref="modalForm" @ok="modalFormOk"></lossbound-modal>
+  </a-card>
+</template>
+
+<script>
+
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import LossboundModal from './modules/LossboundModal'
+import { deleteAction, getAction } from '@/api/manage'
+import LossboundDetailList from './LossboundDetailList.vue'
+import '@/assets/less/TableExpand.less'
+
+export default {
+  name: 'LooboundList',
+  mixins: [JeecgListMixin],
+  components: {
+    LossboundDetailList,
+    LossboundModal
+  },
+  data() {
+    return {
+      description: 'tms_outbound_order绠$悊椤甸潰',
+      // 琛ㄥご
+      columns: [
+        {
+          title: '鎶ユ崯鍗曞崟鍙�',
+          align: 'center',
+          dataIndex: 'orderCode'
+        },
+        {
+          title: '瀹℃牳鐘舵��',
+          align: 'center',
+          dataIndex: 'orderStatus_dictText'
+        },
+        {
+          title: '缁忔墜浜�',
+          align: 'center',
+          dataIndex: 'handler_dictText'
+        },
+        {
+          title: '瀹℃牳浜�',
+          align: 'center',
+          dataIndex: 'reviewer_dictText'
+        },
+        {
+          title: '瀹℃牳鏃堕棿',
+          align: 'center',
+          dataIndex: 'auditDate'
+        },
+        {
+          title: '瀹℃牳鎰忚',
+          align: 'center',
+          dataIndex: 'approvalOpinion'
+        },
+        {
+          title: '澶囨敞',
+          align: 'center',
+          dataIndex: 'remark'
+        },
+        {
+          title: '鎿嶄綔',
+          dataIndex: 'action',
+          align: 'center',
+          fixed: 'right',
+          width: 147,
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      url: {
+        list: '/tms/toolsLossBound/list',
+        delete: '/tms/toolsLossBound/delete',
+        submit: '/tms/toolsLossBound/submit',
+        deleteBatch: '/tms/toolsLossBound/deleteBatch',
+        exportXlsUrl: '/tms/toolsLossBound/exportXls',
+        importExcelUrl: 'tms/toolsLossBound/importExcel'
+      },
+      /* 鍒嗛〉鍙傛暟 */
+      ipagination: {
+        current: 1,
+        pageSize: 5,
+        pageSizeOptions: ['5', '10', '50'],
+        showTotal: (total, range) => {
+          return range[0] + '-' + range[1] + ' 鍏�' + total + '鏉�'
+        },
+        showQuickJumper: true,
+        showSizeChanger: true,
+        total: 0
+      },
+      selectedMainId: '',
+      superFieldList: [],
+      lossboundDetailMainId: ''
+    }
+  },
+  created() {
+    this.getSuperFieldList()
+  },
+  computed: {
+    importExcelUrl: function() {
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
+    }
+  },
+  methods: {
+    modalFormOk() {
+      this.$refs.lossboundDetailList.clearList()
+      this.loadData()
+    },
+    searchReset() {
+      this.queryParam = {}
+      this.onClearSelected()
+      this.$refs.lossboundDetailList.clearList()
+      this.loadData(1)
+    },
+    initDictConfig() {
+    },
+    clickThenSelect(record) {
+      return {
+        on: {
+          click: () => {
+            this.onSelectChange(record.id.split(','), [record])
+          }
+        }
+      }
+    },
+    onClearSelected() {
+      this.selectedRowKeys = []
+      this.selectionRows = []
+      this.selectedMainId = ''
+      this.lossboundDetailMainId = ''
+    },
+    onSelectChange(selectedRowKeys, selectionRows) {
+      this.selectedMainId = selectedRowKeys[0]
+      this.selectedRowKeys = selectedRowKeys
+      this.selectionRows = selectionRows
+      this.lossboundDetailMainId = selectionRows[0]['id']
+    },
+    handleSubmit(record) {
+      getAction(this.url.submit, { id: record.id }).then((res) => {
+        if (res.success) {
+          this.$message.success(res.message)
+          this.loadData()
+          this.$refs.lossboundDetailList.clearList()
+        } else {
+          this.$message.warning(res.message)
+        }
+      })
+    },
+    handleDelete: function(id) {
+      if (!this.url.delete) {
+        this.$message.error('璇疯缃畊rl.delete灞炴��!')
+        return
+      }
+      var that = this
+      deleteAction(that.url.delete, { id: id }).then((res) => {
+        if (res.success) {
+          //閲嶆柊璁$畻鍒嗛〉闂
+          that.reCalculatePage(1)
+          // that.$message.success(res.message);
+          that.$notification.success({
+            message: '娑堟伅',
+            description: res.message
+          })
+          that.loadData()
+          this.$refs.lossboundDetailList.clearList()
+        } else {
+          // that.$message.warning(res.message);
+          that.$notification.warning({
+            message: '娑堟伅',
+            description: res.message
+          })
+        }
+      })
+    },
+    loadData(arg) {
+      if (!this.url.list) {
+        this.$message.error('璇疯缃畊rl.list灞炴��!')
+        return
+      }
+      //鍔犺浇鏁版嵁 鑻ヤ紶鍏ュ弬鏁�1鍒欏姞杞界涓�椤电殑鍐呭
+      if (arg === 1) {
+        this.ipagination.current = 1
+      }
+      this.onClearSelected()
+      var params = this.getQueryParams()//鏌ヨ鏉′欢
+      this.loading = true
+      getAction(this.url.list, params).then((res) => {
+        if (res.success) {
+          this.dataSource = res.result.records
+          this.ipagination.total = res.result.total
+        }
+        if (res.code === 510) {
+          this.$message.warning(res.message)
+        }
+        this.loading = false
+      })
+    },
+    getSuperFieldList() {
+      let fieldList = []
+      fieldList.push({ type: 'string', value: 'orderCode', text: '鍑哄簱鍗曠紪鍙�', dictCode: '' })
+
+      fieldList.push({ type: 'string', value: 'handler', text: '缁忔墜浜�', dictCode: '' })
+      fieldList.push({ type: 'sel_user', value: 'reviewer', text: '瀹℃牳浜�' })
+      fieldList.push({ type: 'string', value: 'orderStatus', text: '瀹℃牳鐘舵��', dictCode: '' })
+      fieldList.push({ type: 'date', value: 'auditDate', text: '瀹℃牳鏃堕棿' })
+      fieldList.push({ type: 'string', value: 'approvalOpinion', text: '瀹℃牳鎰忚', dictCode: '' })
+      fieldList.push({ type: 'string', value: 'subjectMatter', text: '棰嗙敤浜嬬敱', dictCode: '' })
+      fieldList.push({ type: 'date', value: 'outboundTime', text: '鍑哄簱鏃堕棿' })
+      fieldList.push({ type: 'string', value: 'remark', text: '澶囨敞', dictCode: '' })
+      fieldList.push({ type: 'string', value: 'createBy', text: '鎿嶄綔鍛�', dictCode: '' })
+      fieldList.push({ type: 'date', value: 'createTime', text: '鍒涘缓鏃堕棿' })
+      this.superFieldList = fieldList
+    }
+  }
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/tms/lossBound/modules/JSelectLossboundToolModal.vue b/src/views/tms/lossBound/modules/JSelectLossboundToolModal.vue
new file mode 100644
index 0000000..ad06f5d
--- /dev/null
+++ b/src/views/tms/lossBound/modules/JSelectLossboundToolModal.vue
@@ -0,0 +1,221 @@
+<template>
+  <!--鏀寔鍏ㄥ睆缂╂斁-->
+  <j-modal
+    :visible="visible"
+    :width="1200"
+    :title="title"
+    switchFullscreen
+    @ok="handleSubmit"
+    @cancel="close"
+    style="top: 50px"
+    cancelText="鍏抽棴"
+  >
+    <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="宸ュ叿缂栫爜">
+                <a-input placeholder="璇疯緭鍏ュ伐鍏风紪鐮�,鏀寔妯$硦鏌ヨ" v-model="queryParam.toolCode"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+            <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+          </a-row>
+        </a-form>
+      </div>
+      <!--鍑哄簱鍗曞垪琛�-->
+      <a-table
+        ref="table"
+        size="middle"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :rowSelection="rowSelection"
+        :loading="loading"
+        @change="handleTableChange"
+      >
+      </a-table>
+    </a-card>
+  </j-modal>
+</template>
+
+<script>
+import { filterObj } from '@/utils/util'
+import { getAction } from '@api/manage'
+
+export default {
+  name: 'JSelectLossboundToolModal',
+  components: {},
+  props: {},
+  data() {
+    return {
+      title: '閫夋嫨鍑哄簱宸ュ叿',
+      queryParam: {},
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key: 'rowIndex',
+          width: 60,
+          align: 'center',
+          customRender: (_, __, index) => parseInt(index) + 1
+        },
+        {
+          title: '宸ュ叿缂栫爜',
+          align: 'center',
+          dataIndex: 'toolCode'
+        },
+        {
+          title: '涓枃鍚嶇О',
+          align: 'center',
+          dataIndex: 'chineseName'
+        },
+        {
+          title: '鍨嬪彿/鍥惧彿',
+          align: 'center',
+          dataIndex: 'toolModel'
+        }
+      ],
+      selectedRowKeys: [],
+      oldSelectRow: [],
+      scrollTrigger: { x: 1500, y: 500 },
+      dataSource: [],
+      selectionRows: [],
+      ipagination: {
+        current: 1,
+        pageSize: 10,
+        pageSizeOptions: ['5', '10', '20'],
+        showTotal: (total, range) => {
+          return range[0] + '-' + range[1] + ' 鍏�' + total + '鏉�'
+        },
+        showQuickJumper: true,
+        showSizeChanger: true,
+        total: 0,
+      },
+      isorter: {
+        column: 'toolCode',
+        order: 'asc',
+      },
+      departTree: [],
+      visible: false,
+      loading: false,
+      prepareKnifeDetailList:[],
+      url: {
+        list: '/tms/baseTools/listWithLedgerAndConfig'
+      },
+    }
+  },
+  computed: {
+    rowSelection() {
+      return {
+        type: 'checkbox',
+        onChange: (selectedRowKeys, selectedRows) => {
+          this.selectedRowKeys = selectedRowKeys
+          this.onSelectChange(selectedRows)
+        },
+        getCheckboxProps: (record) => ({
+          props: {
+            disabled: record.disabled,
+          },
+        }),
+      }
+    },
+  },
+  watch: {
+  },
+  created() {
+  },
+  methods: {
+    async loadData(arg) {
+      if (arg === 1) {
+        this.ipagination.current = 1
+      }
+      this.loading = true
+      let params = this.getQueryParams() //鏌ヨ鏉′欢
+      console.log(params)
+      await getAction(this.url.list, params).then((res) => {
+        if (res.success) {
+          this.dataSource = res.result.records
+          this.ipagination.total = res.result.total
+        }
+        if (res.code === 510) {
+          this.$message.warning(res.message)
+        }
+        this.loading = false
+      })
+    },
+    showModal(oldSelectRow) {
+      this.oldSelectRow = oldSelectRow
+      this.visible = true
+      this.queryParam.status = '1'
+      this.queryParam.excludeIds = oldSelectRow
+      this.loadData(1)
+    },
+    getQueryParams() {
+      let param = Object.assign({}, this.queryParam, this.isorter)
+      param.field = this.getQueryField()
+      param.pageNo = this.ipagination.current
+      param.pageSize = this.ipagination.pageSize
+      return filterObj(param)
+    },
+    //鏌ヨ鏉′欢澶勭悊
+    getQueryField() {
+      let fields = ['id'];
+      for (let a = 0; a < this.columns.length; a++) {
+        fields.push(this.columns[a].dataIndex);
+      }
+      return fields.join(',');
+    },
+    searchReset() {
+      this.queryParam = {}
+      this.loadData(1)
+    },
+    close() {
+      this.queryParam = {}
+      // this.searchReset(0)
+      this.selectedRowKeys = []
+      this.selectionRows = []
+      this.visible = false
+    },
+    handleTableChange(pagination, filters, sorter) {
+      if (Object.keys(sorter).length > 0) {
+        this.isorter.column = sorter.field
+        this.isorter.order = 'ascend' === sorter.order ? 'asc' : 'desc'
+      }
+      this.ipagination = pagination
+      this.loadData()
+    },
+    handleSubmit() {
+      if (this.selectionRows.length > 0) {
+        this.$bus.$emit('selectionRows', this.selectionRows)
+        // this.searchReset(0)
+        this.close()
+      } else {
+        this.$message.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�')
+      }
+    },
+    onSelectChange(selectionRows) {
+      this.selectionRows = selectionRows
+    },
+    searchQuery() {
+      this.loadData(1)
+    },
+  },
+}
+</script>
+
+<style scoped>
+.ant-table-tbody .ant-table-row td {
+  padding-top: 10px;
+  padding-bottom: 10px;
+}
+
+#components-layout-demo-custom-trigger .trigger {
+  font-size: 18px;
+  line-height: 64px;
+  padding: 0 24px;
+  cursor: pointer;
+  transition: color 0.3s;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/tms/lossBound/modules/LossboundDetailModal.vue b/src/views/tms/lossBound/modules/LossboundDetailModal.vue
new file mode 100644
index 0000000..adaba74
--- /dev/null
+++ b/src/views/tms/lossBound/modules/LossboundDetailModal.vue
@@ -0,0 +1,141 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    switchFullscreen
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <a-spin :spinning="confirmLoading">
+      <a-form-model ref="form" :model="model" :rules="validatorRules">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="鍒�鍏风紪鐮�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toolCode">
+              <a-input v-model="model.toolCode" placeholder="璇疯緭鍏ュ垁鍏风紪鐮�"></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="鐢宠鍑哄簱鏁伴噺" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                               prop="outboundQuantity">
+              <a-input-number v-model="model.outboundQuantity" placeholder="璇疯緭鍏ョ敵璇峰嚭搴撴暟閲�" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="浠撳簱" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="storageLocation">
+              <a-input v-model="model.storageLocation" placeholder="璇疯緭鍏ヤ粨搴�"></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="鍑哄簱搴撲綅" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="outboundLocation">
+              <a-input v-model="model.outboundLocation" placeholder="璇疯緭鍏ュ嚭搴撳簱浣�"></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="鍑哄簱鐘舵��;1.鏈嚭搴擄紱2.閮ㄥ垎鍑哄簱锛�3.鍑哄簱瀹屾垚" :labelCol="labelCol"
+                               :wrapperCol="wrapperCol" prop="status">
+              <a-input-number v-model="model.status" placeholder="璇疯緭鍏ュ嚭搴撶姸鎬�;1.鏈嚭搴擄紱2.閮ㄥ垎鍑哄簱锛�3.鍑哄簱瀹屾垚"
+                              style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </a-spin>
+  </j-modal>
+</template>
+
+<script>
+
+import { httpAction } from '@/api/manage'
+
+export default {
+  name: 'LossboundDetailModal',
+  components: {},
+  props: {
+    mainId: {
+      type: String,
+      required: false,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      title: '鎿嶄綔',
+      width: 800,
+      visible: false,
+      model: {},
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      },
+
+      confirmLoading: false,
+      validatorRules: {},
+      url: {
+        add: '/tms/toolsLossBound/add',
+        edit: '/tms/toolsLossBound/edit'
+      }
+
+    }
+  },
+  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
+    },
+    close() {
+      this.$emit('close')
+      this.visible = false
+      this.$refs.form.clearValidate()
+    },
+    handleOk() {
+      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'
+          }
+          this.model['outStorehouseId'] = this.mainId
+          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
+            that.close()
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    handleCancel() {
+      this.close()
+    }
+
+  }
+}
+</script>
diff --git a/src/views/tms/lossBound/modules/LossboundModal.vue b/src/views/tms/lossBound/modules/LossboundModal.vue
new file mode 100644
index 0000000..62782be
--- /dev/null
+++ b/src/views/tms/lossBound/modules/LossboundModal.vue
@@ -0,0 +1,427 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    switchFullscreen
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <a-spin :spinning="confirmLoading">
+      <a-form-model ref="form" :model="model" :rules="validatorRules">
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="鎶ユ崯鍗曞崟鍙�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCode">
+              <a-input v-model="model.orderCode" placeholder="绯荤粺鑷姩鐢熸垚" :disabled="true"></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鎶ユ崯浜�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="losser">
+              <j-dict-select-tag :disabled="disableSubmit"
+                                 v-model="model.losser" dictCode="sys_user,realname,id"
+                                 placeholder="璇烽�夋嫨" />
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="鎶ユ崯鏃堕棿" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lossTime">
+
+              <j-date placeholder="璇烽�夋嫨鎶ユ崯鏃堕棿" date-format="YYYY-MM-DD HH:mm:ss" v-model="model.lossTime"
+                      style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="瀹℃牳浜�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="reviewer">
+              <!--              <j-dict-select-tag :disabled="disableSubmit"-->
+              <!--                                 v-model="model.reviewer" dictCode="sys_user,realname,id"-->
+              <!--                                 placeholder="璇烽�夋嫨" />-->
+              <j-select-user-by-dep :disabled="disableSubmit" v-model="model.reviewer" :store="'username'"
+                                    :text="'realname'" :multi="false" />
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-row>
+
+          <a-col :span="12">
+            <a-form-model-item v-if="addShow" label="缁忔墜浜�" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                               prop="handler">
+
+              <j-dict-select-tag :disabled="disableSubmit"
+                                 v-model="model.handler" dictCode="sys_user,realname,id"
+                                 placeholder="璇烽�夋嫨" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item v-if="addShow" label="瀹℃牳鐘舵��" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                               prop="orderStatus">
+              <j-dict-select-tag type="list" v-model="model.orderStatus" dictCode="out_bill_status"
+                                 placeholder="璇烽�夋嫨瀹℃牳鐘舵��" disabled />
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item v-if="addShow" label="瀹℃牳鏃堕棿" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                               prop="approvalDate">
+
+              <j-date placeholder="璇烽�夋嫨瀹℃牳鏃堕棿" date-format="YYYY-MM-DD HH:mm:ss" v-model="model.approvalDate"
+                      style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item v-if="addShow" label="瀹℃牳鎰忚" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                               prop="approvalOpinion">
+              <a-input v-model="model.approvalOpinion" placeholder="璇疯緭鍏ュ鏍告剰瑙�" disabled></a-input>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="澶囨敞" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
+              <a-textarea :disabled="disableSubmit" v-model="model.remark" rows="4" placeholder="璇疯緭鍏ュ娉�" />
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="鎶ユ崯鍘熷洜" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lossReason">
+              <a-textarea :disabled="disableSubmit" v-model="model.lossReason" rows="4" placeholder="璇疯緭鍏ュ娉�" />
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </a-spin>
+
+    <a-button type="primary" :style="{ marginBottom: '8px' }" @click="selectTools">
+      閫夋嫨宸ュ叿
+    </a-button>
+    <a-table
+      ref="table"
+      size="middle"
+      bordered
+      rowKey="id"
+      :scroll="{x:true}"
+      :columns="columns"
+      :dataSource="dataSource"
+      :pagination="ipagination"
+      :loading="loading"
+      :rowSelection="null"
+      @change="handleTableChange">
+
+      <template v-for="col in columns" :slot="col.dataIndex" slot-scope="text, record, index">
+        <a-input-number :disabled="disableSubmit" :value="text" v-if="col.dataIndex == 'lossNumber'" :min="0"
+                        :max="99999"
+                        @change="(e) => handleChange(e, record.key, col, index)" style="width: 100%;" />
+        <a-textarea
+          v-if="col.dataIndex == 'lossReason'"
+          :disabled="disableSubmit"
+          style="margin: -5px 0"
+          :value="text"
+          @change="(e) => handleChange(e.target.value, record.key, col, index)"
+        />
+
+      </template>
+      <span slot="action" v-if="disableSubmit === false" slot-scope="text, record, index">
+        <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(record, index)">
+          <a>鍒犻櫎</a>
+        </a-popconfirm>
+      </span>
+    </a-table>
+    <template slot="footer" v-if="disableSubmit === false">
+      <a-button :style="{ marginRight: '8px' }" @click="handleCancel">鍏抽棴</a-button>
+      <a-button @click="handleOk" :disabled="isDisabled" type="primary">纭畾</a-button>
+    </template>
+
+    <j-select-lossbound-tool-modal ref="selectLossBoundToolModal"></j-select-lossbound-tool-modal>
+  </j-modal>
+
+</template>
+
+<script>
+
+import { httpAction } from '@/api/manage'
+import LossboundDetailList from '../LossboundDetailList.vue'
+import JSelectLossboundToolModal from './JSelectLossboundToolModal.vue'
+import { getAction } from '../../../../api/manage'
+
+export default {
+  name: 'LossboundModal',
+  components: {
+    LossboundDetailList,
+    JSelectLossboundToolModal
+  },
+  data() {
+    return {
+      title: '',
+      width: 1200,
+      visible: false,
+      disableSubmit: false,
+      isDisabled: false,
+      addShow: true,
+      selectBorrowTool: false,
+      model: {},
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      },
+      //琛ㄦ牸鍙傛暟
+      ipagination: {
+        current: 1,
+        pageSize: 10,
+        total: 0
+      },
+      dataSource: [],
+      loading: false,
+      // 琛ㄥご
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key: 'rowIndex',
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
+          },
+          width: 50
+        },
+        {
+          title: '鍒�鍏风紪鍙�',
+          dataIndex: 'toolCode',
+          align: 'center',
+          width: 150
+        },
+
+        {
+          title: '宸ュ叿绫诲瀷',
+          dataIndex: 'applicationType',
+          align: 'center',
+          width: 150
+        },
+
+        {
+          title: '涓枃鍚嶇О',
+          dataIndex: 'chineseName',
+          width: 150,
+          align: 'center'
+        },
+
+        {
+          title: '鍨嬪彿/鍥惧彿',
+          dataIndex: 'toolModel',
+          width: 150,
+          align: 'center'
+        },
+
+        {
+          title: '鍒�鍏锋潗鏂�',
+          width: 150,
+          dataIndex: 'toolMaterial',
+          align: 'center'
+        },
+        {
+          title: '闆朵欢鏉愭枡',
+          width: 150,
+          dataIndex: 'partMaterial',
+          align: 'center'
+        },
+        {
+          title: '鍘傚',
+          width: 150,
+          dataIndex: 'supplierId',
+          align: 'center'
+
+        },
+        {
+          title: '瀛樺偍浣嶇疆',
+          width: 150,
+          dataIndex: 'goodsShelvesId',
+          align: 'center'
+        },
+        {
+          title: '鎶ユ崯鍘熷洜',
+          width: 150,
+          dataIndex: 'lossReason',
+          align: 'center',
+          scopedSlots: { customRender: 'lossReason' }
+        },
+
+        {
+          title: '鎶ユ崯鏁伴噺',
+          dataIndex: 'lossNumber',
+          align: 'center',
+          width: 150,
+          scopedSlots: { customRender: 'lossNumber' }
+        },
+
+        {
+          title: '澶囨敞',
+          width: 150,
+          dataIndex: 'remark',
+          align: 'center'
+        },
+        {
+          title: '鎿嶄綔',
+          width: 150,
+          dataIndex: 'action',
+          scopedSlots: { customRender: 'action' },
+          align: 'center'
+        }
+      ],
+      confirmLoading: false,
+      validatorRules: {
+        lossReason: [
+          { required: true, message: '璇疯緭鍏ユ姤鎹熷師鍥�' }
+        ],
+        lossTime: [
+          { required: true, message: '璇疯緭鍏ユ姤鎹熸椂闂�!' }
+        ],
+        losser: [
+          { required: true, message: '璇疯緭鍏ユ姤鎹熶汉!' }
+        ],
+
+      },
+      url: {
+        list: '/tms/toolsLossBound/listlossboundDetailByMainId',
+        add: '/tms/toolsLossBound/addTotal',
+        edit: '/tms/toolsLossBound/editTotal'
+      }
+
+    }
+  },
+  created() {
+    //澶囦唤model鍘熷鍊�
+    this.modelDefault = JSON.parse(JSON.stringify(this.model))
+  },
+  mounted() {
+    this.$bus.$on('selectionRows', (data) => {
+      for (let i = 0; i < data.length; i++) {
+        this.dataSource.push({
+          toolId: data[i].id,
+          toolCode: data[i].toolCode,
+          classifyId: data[i].classifyId,
+          applicationType: data[i].applicationType_dictText,
+          chineseName: data[i].chineseName,
+          toolModel: data[i].toolModel,
+          material: data[i].material,
+          supplierId: data[i].supplierId,
+          goodsShelvesId: data[i].positionCode,
+          toolMaterial: data[i].toolMaterial,
+          partMaterial: data[i].partMaterial
+
+        })
+      }
+      this.ipagination.total = this.dataSource.length
+    })
+  },
+  methods: {
+
+    handleDelete(record, index) {
+      this.dataSource.splice(index, 1)
+    },
+    handleChange(value, key, column, index) {
+      console.log(value, key, column, index)
+      const temp = [...this.dataSource]
+      const target = temp.filter(item => key === item.key)[index]
+      if (target) {
+        target[column.dataIndex] = value
+        this.dataSource = temp
+        if (column.dataIndex === 'lossNumber') {
+
+          target[column.dataIndex] = value
+        }
+        if (column.dataIndex === 'lossReason') {
+          target[column.dataIndex] = value
+        }
+        this.dataSource = temp
+      }
+    },
+
+    selectTools: function() {
+      let ids = []
+      for (let i = 0; i < this.dataSource.length; i++) {
+        ids.push(this.dataSource[i].id)
+      }
+      this.$refs.selectLossBoundToolModal.showModal(ids)
+      this.$refs.selectLossBoundToolModal.title = '閫夋嫨宸ュ叿淇℃伅'
+      this.$refs.selectLossBoundToolModal.disableSubmit = false
+    },
+    add() {
+      this.addShow = false
+      this.edit()
+      this.dataSource = []
+    },
+    edit(record) {
+      console.log(record)
+      this.model = Object.assign({}, record)
+      this.visible = true
+      getAction(this.url.list, {
+        lossBoundId: record.id,
+        pageNo: 1,
+        pageSize: 99999
+      }).then((res) => {
+        if (res.success) {
+          console.log(res.result.records)
+          this.dataSource = res.result.records
+        } else {
+          this.dataSource = null
+        }
+      })
+    },
+
+    close() {
+      this.$emit('close')
+      this.addShow = true
+      this.selectBorrowTool = false
+      this.visible = false
+      this.$refs.form.clearValidate()
+    },
+    handleTableChange(pagination, filters, sorter) {
+      this.ipagination = pagination
+    },
+    handleOk() {
+      const that = this
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.model.toolsLossBoundDetailList = this.dataSource
+          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
+            that.close()
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    handleCancel() {
+      this.close()
+    }
+
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/views/tms/requirement/ToolSharpeningList .vue b/src/views/tms/requirement/ToolSharpeningList .vue
new file mode 100644
index 0000000..d864f8c
--- /dev/null
+++ b/src/views/tms/requirement/ToolSharpeningList .vue
@@ -0,0 +1,302 @@
+<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="4" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鍒�鍏峰悕绉�">
+              <a-input placeholder="璇疯緭鍏ュ垁鍏峰悕绉�" v-model="queryParam.toolName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="4" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鍒冪(缁撴灉">
+              <a-input placeholder="璇疯緭鍏ュ垉纾ㄧ粨鏋�" v-model="queryParam.grindingResult"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鍒冪(鏃堕棿">
+              <a-range-picker v-model="queryParam.inspectionDateRange" @change="onInspectionDateChange" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
+            </a-form-item>
+          </a-col>
+          <a-col :xl="4" :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="info" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <div class="table-operator">
+        <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
+      </div>
+    </div>
+
+    <!-- table鍖哄煙-begin -->
+    <div>
+
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="null"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleDetail(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="handleEdit(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>
+
+    <tools-sharpening-modal ref="modalForm" :treeSelected="treeSelected" @ok="modalFormOk"></tools-sharpening-modal>
+  </a-card>
+</template>
+
+<script>
+
+import '@/assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import ToolsSharpeningModal from './modules/ToolsSharpeningModal'
+import { getAction, putAction, deleteAction } from '../../../api/manage'
+
+export default {
+  name: 'ToolSharpeningList ',
+  mixins:[JeecgListMixin, mixinDevice],
+  components: {
+    ToolsSharpeningModal
+  },
+  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: 'warehouseId'
+        },
+        {
+          title:'鍒�鍏风紪鍙�',
+          align:"center",
+          dataIndex: 'warehouseName'
+        },
+        {
+          title:'鍒�鍏峰悕绉�',
+          align:"center",
+          dataIndex: 'warehouseName'
+        },
+        {
+          title:'鍒�鍏锋潗鏂�',
+          align:"center",
+          dataIndex: 'parentWarehouseName',
+        },
+        {
+          title:'鍘傚',
+          align:"center",
+          dataIndex: 'status',
+        },
+        {
+          title:'闆朵欢鏉愭枡',
+          align:"center",
+          dataIndex: 'remark'
+        },
+
+        {
+          title:'鍒冪(鏃堕棿',
+          align:"center",
+          dataIndex: 'createBy'
+        },
+        {
+          title:'鍒冪(缁撴灉鍙婂缓璁�',
+          align:"center",
+          dataIndex: 'createBy'
+        },
+        {
+          title:'璐d换浜�',
+          align:"center",
+          dataIndex: 'createBy'
+        },
+
+        {
+          title:'鍒涘缓浜�',
+          align:"center",
+          dataIndex: 'createBy'
+        },
+
+        {
+          title:'鍒涘缓鏃堕棿',
+          align:"center",
+          dataIndex: 'createTime'
+        },
+        {
+          title: '鎿嶄綔',
+          dataIndex: 'action',
+          align:"center",
+          fixed:"right",
+          width:147,
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      url: {
+        list: "/tms/toolSharpening/list",
+        delete: "/tms/toolSharpening/delete",
+        edit: "/tms/toolSharpening/edit",
+        deleteBatch: "/tms/toolSharpening/deleteBatch",
+        exportXlsUrl: "/tms/toolSharpening/exportXls",
+        importExcelUrl: "tms/toolSharpening/importExcel",
+
+      },
+      dictOptions:{},
+      superFieldList:[],
+      treeSelected: {},
+    }
+  },
+  created() {
+    this.getSuperFieldList();
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    },
+    addFlag: function(){
+      return !(this.treeSelected.key && this.treeSelected.entity.leafFlag === '2');
+    }
+  },
+  mounted() {
+    this.handleGetCurrSelected = (data) => {
+      this.treeSelected = data;
+      this.queryParam.parentId = data.key;
+      this.loadData();
+    }
+    this.$bus.$on('getCurrSelected', this.handleGetCurrSelected);
+  },
+  beforeDestroy() {
+    this.$bus.$off('getCurrSelected', this.handleGetCurrSelected);
+  },
+  methods: {
+    handleStatus(record) {
+      getAction(this.url.list, { parentId: record.id }).then((res) => {
+        if (res.success) {
+          if (res.result.total > 0) {
+            this.$message.warning('璇ヨ妭鐐逛笅瀛樺湪瀛愯妭鐐癸紝涓嶈兘鍙樻洿鐘舵�侊紒')
+          } else {
+            const params = {
+              id: record.id,
+              status: record.status === '1' ? '2' : '1'
+            }
+            putAction(this.url.edit, params).then((res) => {
+              if (res.success) {
+                this.$message.success(res.message)
+                this.loadData()
+              } else {
+                this.$message.warning(res.message)
+              }
+            })
+          }
+        } else {
+          this.$message.warning(res.message);
+        }
+      });
+
+    },
+    handleDelete(id) {
+      getAction(this.url.list, { parentId: id }).then((res) => {
+        if (res.success) {
+          if (res.result.total > 0) {
+            this.$message.warning('璇峰厛鍒犻櫎瀛愯妭鐐�');
+          } else {
+            deleteAction(this.url.delete, {id: id}).then((res) => {
+              if (res.success) {
+                //閲嶆柊璁$畻鍒嗛〉闂
+                this.loadData()
+                this.$message.success(res.message);
+                this.$bus.$emit('queryTreeData')
+              } else {
+                this.$message.warning(res.message);
+              }
+            });
+          }
+        } else {
+          this.$message.warning(res.message);
+        }
+      })
+    },
+    searchReset() {
+      this.queryParam = {
+        parentId: this.treeSelected.key
+      }
+      this.loadData(1)
+    },
+    modalFormOk() {
+      this.loadData()
+      this.$bus.$emit('queryTreeData')
+    },
+    initDictConfig(){
+    },
+    getSuperFieldList(){
+      let fieldList=[];
+      fieldList.push({type:'string',value:'toolId',text:'宸ュ叿缂栧彿',dictCode:''})
+      fieldList.push({type:'string',value:'warehouseName',text:'浠撳簱鍚嶇О',dictCode:''})
+      fieldList.push({type:'string',value:'parentId',text:'鐖惰妭鐐圭紪鍙�',dictCode:''})
+      fieldList.push({type:'string',value:'seq',text:'灞曠ず搴忓彿',dictCode:''})
+      fieldList.push({type:'string',value:'leafFlag',text:'鏄惁鍙跺瓙鑺傜偣(1鏄�;2鍚�)',dictCode:''})
+      fieldList.push({type:'string',value:'status',text:'鐘舵�侊紙1鍚敤;2鍋滅敤锛�',dictCode:''})
+      fieldList.push({type:'string',value:'remark',text:'澶囨敞',dictCode:''})
+      fieldList.push({type:'string',value:'createBy',text:'鍒涘缓浜�',dictCode:''})
+      fieldList.push({type:'date',value:'createTime',text:'鍒涘缓鏃堕棿'})
+      this.superFieldList = fieldList
+    }
+  }
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+.enable {
+  color: green;
+}
+.disable {
+  color: red;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/tms/requirement/modules/ToolsModal.vue b/src/views/tms/requirement/modules/ToolsModal.vue
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/views/tms/requirement/modules/ToolsModal.vue
diff --git a/src/views/tms/requirement/modules/ToolsSharpeningModal.vue b/src/views/tms/requirement/modules/ToolsSharpeningModal.vue
new file mode 100644
index 0000000..37c0fb8
--- /dev/null
+++ b/src/views/tms/requirement/modules/ToolsSharpeningModal.vue
@@ -0,0 +1,385 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="1200"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    switchFullscreen
+    centered
+    :mask-closable="false"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+
+    <a-spin :spinning="spinning">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" :labelCol="labelCol" :wrapperCol="wrapperCol">
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-model-item prop="standardCode" label="宸ュ叿缂栧彿">
+              <a-input-search v-model="model.toolsId"  placeholder="璇烽�夋嫨宸ュ叿缂栧彿"  :disabled="disableSubmit" @search="onSearchPart" enter-button
+              />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="10">
+            <a-form-model-item prop="equipmentId" label="宸ュ叿鍒嗙被鍚嶇О">
+              <a-input placeholder="璇疯緭鍏ュ伐鍏峰垎绫诲悕绉�" v-model="model.typeName" readOnly/>
+            </a-form-model-item>
+          </a-col>
+
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-model-item prop="standardCode" label="宸ュ叿鍙傛暟鏍囪瘑">
+              <a-input placeholder="閫夋嫨璁惧鍚庤嚜鍔ㄥ甫鍑�" readOnly v-model="model.paraTypeFlagName" readOnly/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="宸ュ叿绫诲瀷">
+              <a-input placeholder="閫夋嫨璁惧鍚庤嚜鍔ㄥ甫鍑�" v-model="model.applicationType" readOnly/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-model-item prop="operator" label="璐d换浜�">
+              <j-dict-select-tag type="list" v-model="model.reportPerson" dictCode="sys_user,realname,id" placeholder="璇烽�夋嫨鎶ュ伐浜哄憳" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item prop="standardName" label="宸ュ叿鍒嗙被缂栫爜">
+              <a-input placeholder="閫夋嫨璁惧鍚庤嚜鍔ㄥ甫鍑�" readOnly v-model="model.classifyId" readOnly/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-model-item label="缁撴灉鍙婂缓璁�" prop="inspectionDate">
+              <a-input placeholder="閫夋嫨濉啓鍒冪(缁撴灉鍙婂缓璁�"  v-model="model.sharpeningResult" readOnly/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-model-item label="鍨嬪彿/鍥惧彿">
+              <j-date placeholder="閫夋嫨濉啓鍨嬪彿/鍥惧彿" v-model="model.toolModel" disabled style="width: 100%"/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-model-item label="浠撳簱鍩庡競" prop="inspectionDate">
+              <a-input placeholder="閫夋嫨濉啓浠撳簱鐪佷唤鍩庡競"  v-model="model.provinceCity" readOnly/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="搴撳尯/搴撳彿">
+              <j-date placeholder="閫夋嫨濉啓搴撳尯/搴撳彿" v-model="model.warehouseId" disabled style="width: 100%"/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-model-item label="瀛樺偍浣嶇疆" prop="inspectionDate">
+              <a-input placeholder="閫夋嫨濉啓瀛樺偍浣嶇疆"  v-model="model.storageLocation" readOnly/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="璁¢噺涓诲崟浣�">
+              <j-date placeholder="璇峰~鍐欒閲忎富鍗曚綅" v-model="model.mainUnit" disabled style="width: 100%"/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-model-item label="鍒冪(鏃堕棿" prop="inspectionDate">
+              <j-date placeholder="璇烽�夋嫨鎵撳嵃鏃堕棿" v-model="model.sharpeningTime"  style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="24">
+            <a-form-model-item label="澶囨敞" :labelCol="{span:2}" :wrapperCol="{span:21}" prop="remark">
+              <a-textarea v-model="model.remark" rows="3" placeholder="璇疯緭鍏ュ娉�"/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </a-spin>
+  </j-modal>
+</template>
+
+<script>
+import { getAction, httpAction } from '@/api/manage'
+import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'
+import { JVXETypes } from '@/components/jeecg/JVxeTable'
+import MaintenanceEquipmentSelect from '@views/eam/equipment/modules/MaintenanceEquipmentSelect'
+import moment from 'dayjs'
+
+export default {
+  name: 'ToolsSharpeningModal',
+  mixins: [JVxeTableModelMixin],
+  components: {
+    MaintenanceEquipmentSelect
+  },
+  data() {
+    return {
+      title: '鎿嶄綔',
+      visible: false,
+      model: {},
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 6 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 15 }
+      },
+      confirmLoading: false,
+      spinning: false,
+      disabled: false,
+      validatorRules: {
+        // standardName: [
+        //   { required: true, message: '璇疯緭鍏ユ爣鍑嗗悕绉�!' }
+        // ],
+        inspectionDate: [
+          { required: true, message: '璇烽�夋嫨鐐规鏃ユ湡!' }
+        ],
+        // maintenancePeriod: [
+        //   { required: true, message: '璇疯緭鍏ヤ繚鍏诲懆鏈燂紝鍗曚綅锛氬ぉ!' }
+        // ],
+        equipmentId: [
+          { required: true, message: '璇烽�夋嫨璁惧!' }
+        ]
+      },
+      url: {
+        add: '/eam/eamInspectionOrder/add',
+        edit: '/eam/eamInspectionOrder/edit',
+        detail: '/eam/eamMaintenanceStandardDetail/queryList',
+        detailOrder: '/eam/eamInspectionOrderDetail/queryList',
+        userSelect: '/eam/user_select/list'
+      },
+      maintenanceCategory: 'POINT_INSPECTION',
+      maintenanceOperatorOptions: [],
+      standardId: '',
+      standardType: false,
+      detail: {
+        loading: false,
+        dataSource: [],
+        columns: [
+          {
+            title: '搴忓彿',
+            key: 'itemCode',
+            type: JVXETypes.inputNumber,
+            width: '10%',
+            align: 'center',
+            validateRules: [
+              { required: true, unique: true, message: '搴忓彿涓嶈兘閲嶅' }
+            ]
+          },
+          {
+            title: '淇濆吇椤�',
+            key: 'itemName',
+            type: JVXETypes.textarea,
+            width: '20%',
+            align: 'center',
+            validateRules: [
+              { required: true, message: '淇濆吇椤逛笉鑳戒负绌猴紒' }
+            ]
+          },
+          {
+            title: '淇濆吇瑕佹眰',
+            key: 'itemDemand',
+            type: JVXETypes.textarea,
+            width: '30%',
+            align: 'center',
+            validateRules: [
+              { required: true, message: '淇濆吇瑕佹眰涓嶈兘涓虹┖锛�' }
+            ]
+          }
+        ]
+      }
+    }
+  },
+  created() {
+  },
+  methods: {
+    add() {
+      this.model = {}
+      this.detail.dataSource = []
+      this.visible = true
+      this.disabled = false
+      this.standardType = false
+    },
+
+    edit(record) {
+      this.model = Object.assign({}, record)
+      this.standardId = record.standardId
+      this.disabled = true
+      this.standardType = true
+      this.visible = true
+      this.detail.dataSource = []
+      if (record && record.referenceFile) {
+        let obj = JSON.parse(record.referenceFile)
+        this.model.fileList = [obj]
+      } else {
+        this.model.fieldList = []
+      }
+      this.loadDetailOrder(record.id)
+    },
+
+    async handleOk() {
+      const that = this
+      let errMap = await that.$refs.editableDetailTable.validateTable()
+      if (errMap) {
+        this.$message.warning('鏁版嵁鏍¢獙澶辫触锛�')
+        return
+      }
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          let tableData = that.$refs.editableDetailTable.getTableData()
+          let removeData = that.$refs.editableDetailTable.getDeleteData()
+          that.model.tableDetailList = [...tableData]
+          that.model.removeDetailList = [...removeData]
+
+          that.confirmLoading = that.spinning = true
+          let httpurl = ''
+          let method = ''
+          if (!this.model.id) {
+            httpurl += this.url.add
+            method = 'post'
+          } else {
+            httpurl += this.url.edit
+            method = 'put'
+          }
+          this.model.standardId = this.standardId
+          httpAction(httpurl, this.model, method).then((res) => {
+            if (res.success) {
+              that.$message.success(res.message)
+              that.$emit('ok')
+              that.close()
+            } else {
+              that.$message.warning(res.message)
+            }
+          }).finally(() => {
+            that.confirmLoading = that.spinning = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    onSearchPart() {
+      this.$refs.PartPopUp.showModals([this.model.enterpriseId])
+    },
+
+    autocompleteForm(selectObj) {
+      this.model.standardName = selectObj.standardName
+      this.model.maintenancePeriod = selectObj.maintenancePeriod
+      this.model.standardCode = selectObj.standardCode
+      // 鑻ュ彇娑堣澶囬�夋嫨鍚庝繚鍏诲懆鏈熶负绌哄垯闇�娓呯┖鐐规鏃ユ湡鍜岀偣妫�杩囨湡鏃堕棿
+      if (!this.model.equipmentId) {
+        delete this.model.inspectionDate
+        delete this.model.expirationTime
+      } else {
+        // 濡傛灉鐐规鏃ユ湡瀛樺湪锛屽垯鍦ㄩ噸鏂伴�夋嫨璁惧鍚庡嵆淇濆吇鍛ㄦ湡鍙兘鍙戠敓鏀瑰彉鍚庨噸鏂拌绠楄繃鏈熸椂闂�
+        if (this.model.inspectionDate) this.expirationTimeFrom(this.model.inspectionDate)
+      }
+      if (!this.standardType) {
+        console.log('this.standardType', this.standardType)
+        this.standardId = selectObj.id
+        this.loadDetail(selectObj.id)
+      }
+      this.$nextTick(() => this.loadMaintenanceOperatorList(this.model.equipmentId))
+    },
+
+    expirationTimeFrom(date) {
+      //杩囨湡鏃堕棿鏄垵濮嬫椂闂�+淇濆吇鍛ㄦ湡
+      if (date && this.model.maintenancePeriod) {
+        // 杞崲涓烘椂闂存埑瀛楃涓诧紙鎴栨寚瀹氭牸寮忥級
+        this.model.expirationTime = moment(date)
+          .add(this.model.maintenancePeriod, 'days')
+          .format('YYYY-MM-DD')
+      } else {
+        this.model.expirationTime = null // 娓呯┖鏃犳晥鍊�
+      }
+    },
+
+    //鍔犺浇璇︽儏鏁版嵁
+    loadDetail(standardId) {
+      this.detail.dataSource = []
+      if (standardId) {
+        console.log('standardId', standardId)
+        this.spinning = true
+        getAction(this.url.detail, { standardId: standardId })
+          .then(res => {
+            if (res.success) {
+              this.detail.dataSource = [...res.result]
+            }
+          })
+          .finally(() => {
+            this.spinning = false
+          })
+      }
+    },
+
+    loadDetailOrder(orderId) {
+      if (orderId) {
+        this.spinning = true
+        getAction(this.url.detailOrder, { orderId: orderId })
+          .then(res => {
+            if (res.success) {
+              this.detail.dataSource = [...res.result]
+            }
+          })
+          .finally(() => {
+            this.spinning = false
+          })
+      }
+    },
+
+    loadMaintenanceOperatorList(equipmentId) {
+      this.maintenanceOperatorOptions = []
+      let params = { positionCode: 'PCR0001' }
+      if (equipmentId) {
+        params.equipmentId = equipmentId
+      } else {
+        delete this.model.operator
+        return
+      }
+      const that = this
+      getAction(this.url.userSelect, params)
+        .then(res => {
+          if (res.success) {
+            that.maintenanceOperatorOptions = res.result.map(item => ({
+              key: item.id,
+              value: item.username,
+              text: item.realname
+            }))
+            if (!that.maintenanceOperatorOptions.find(item => item.value === that.model.operator)) delete that.model.operator
+          } else {
+            if (that.model.operator) delete that.model.operator
+          }
+        })
+        .catch(err => {
+          if (that.model.operator) delete that.model.operator
+        })
+    },
+
+    handleCancel() {
+      this.close()
+    },
+
+    close() {
+      this.$emit('close')
+      this.visible = false
+      this.$refs.form.clearValidate()
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/tms/stocktakingBound/ToolsStocktaKingBoundDetail.vue b/src/views/tms/stocktakingBound/ToolsStocktaKingBoundDetail.vue
new file mode 100644
index 0000000..692fd9e
--- /dev/null
+++ b/src/views/tms/stocktakingBound/ToolsStocktaKingBoundDetail.vue
@@ -0,0 +1,225 @@
+<template>
+  <a-card :bordered="false">
+    <div>
+      <a-table ref="table" size="middle" bordered rowKey="id" :scroll="{ x: true }" :columns="columns"
+        :dataSource="dataSource" :pagination="ipagination" :loading="loading" @change="handleTableChange">
+        <span slot="num" slot-scope="text, record" class="fontweight">
+          {{ record.num }}
+        </span>
+
+         </a-table>
+      <template v-for="col in columns" :slot="col.dataIndex" slot-scope="text, record, index">
+      </template>
+    </div>
+  </a-card>
+</template>
+
+<script>
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import { getAction } from '@/api/manage'
+import Tooltip from 'ant-design-vue/es/tooltip'
+export default {
+  name: "ToolsStocktaKingBoundDetail",
+  components: {
+    Tooltip,
+  },
+  mixins: [JeecgListMixin],
+  props: {
+    mainId: {
+      type: String,
+      default: '',
+      required: false
+    }
+  },
+  watch: {
+    mainId: {
+      immediate: true,
+      handler(val) {
+        if (!this.mainId) {
+          this.clearList()
+        } else {
+          alert(val)
+          this.queryParam['stocktakingBoundId'] = val;
+          this.queryParam['delFlag'] = 0;
+          this.loadData(1);
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key: 'rowIndex',
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
+          },
+          width: 50
+        },
+
+
+        {
+          title: '鍒�鍏风紪鍙�',
+          dataIndex: 'toolCode',
+          align: 'center'
+        },
+        {
+          title: '宸ュ叿绫诲瀷',
+          dataIndex: 'applicationType_dictText',
+          align: 'center',
+
+        },
+
+        {
+          title: '涓枃鍚嶇О',
+          dataIndex: 'chineseName',
+          align: 'center'
+        },
+
+        {
+          title: '鍨嬪彿/鍥惧彿',
+          dataIndex: 'toolModel',
+          align: 'center'
+        },
+        {
+          title: '鍒�鍏锋潗鏂�',
+          dataIndex: 'toolMaterial',
+          align: 'center'
+
+        },
+        {
+          title: '闆朵欢鏉愭枡',
+          dataIndex: 'partMaterial',
+          align: 'center'
+        },
+        {
+          title: '鍘傚',
+          dataIndex: 'supplierId',
+          align: 'center'
+
+        },
+        {
+          title: '瀛樺偍浣嶇疆(搴撲綅鍙�)',
+          dataIndex: 'goodsShelvesId',
+          align: 'center'
+        },
+
+        {
+          title: '璐﹂潰鏁伴噺',
+          dataIndex: 'bookQuantity',
+          align: 'center'
+
+        },
+        {
+          title: '鍙敤鏁伴噺',
+          dataIndex: 'availableQuantity',
+          align: 'center'
+
+        },
+        {
+          title: '瀹炵洏鏁伴噺',
+          dataIndex: 'practicalQuantity',
+          align: 'center'
+        },
+        {
+          title: '宸紓鍊�',
+          dataIndex: 'differenceValue',
+          align: 'center'
+        },
+        {
+          title: '鐩樹簭鐩樼泩',
+          dataIndex: 'surplusDeficit_dictText',
+          align: 'center'
+        },
+        {
+          title: '鐩樺簱鏃堕棿',
+          dataIndex: 'stocktakingDate',
+          align: 'center'
+        },
+        {
+          title: '澶囨敞',
+          dataIndex: 'remark',
+          align: 'center'
+        }
+      ],
+      url: {
+        list: "/tms/toolsStocktakingBound/listToolsStocktakingBoundControllerDetailsByMainId",
+      },
+      /* 鍒嗛〉鍙傛暟 */
+      ipagination: {
+        current: 1,
+        pageSize: 20,
+        pageSizeOptions: ['5', '10', '20', '50'],
+        showTotal: (total, range) => {
+          return range[0] + '-' + range[1] + ' 鍏�' + total + '鏉�'
+        },
+        showQuickJumper: true,
+        showSizeChanger: true,
+        total: 0
+      },
+    }
+  },
+  created() {
+  },
+  computed: {
+  },
+  methods: {
+    clearList() {
+      this.dataSource = []
+      this.selectedRowKeys = []
+      this.ipagination.current = 1
+    },
+    loadData(arg) {
+      if (!this.url.list) {
+        this.$message.error("璇疯缃畊rl.list灞炴��!")
+        return
+      }
+      //鍔犺浇鏁版嵁 鑻ヤ紶鍏ュ弬鏁�1鍒欏姞杞界涓�椤电殑鍐呭
+      if (arg === 1) {
+        this.ipagination.current = 1;
+      }
+      var params = this.getQueryParams();//鏌ヨ鏉′欢
+      this.loading = true;
+      getAction(this.url.list, params).then((res) => {
+        if (res.success) {
+          this.dataSource = res.result.records || res.result;
+          if (res.result.total) {
+            this.ipagination.total = res.result.total;
+          } else {
+            this.ipagination.total = 0;
+          }
+          //update-end---author:zhangyafei    Date:20201118  for锛氶�傞厤涓嶅垎椤电殑鏁版嵁鍒楄〃------------
+        } else {
+          this.$message.warning(res.message)
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+
+
+  }
+}
+</script>
+<style lang="less" scoped>
+@import '~@assets/less/common.less';
+
+.fontweight {
+  font-weight: bold;
+}
+
+/deep/ .frozenRowClass {
+  color: #c9c9c9;
+}
+
+.success {
+  color: green;
+}
+
+.error {
+  color: red;
+}
+</style>
diff --git a/src/views/tms/stocktakingBound/ToolsStocktakingBoundList.vue b/src/views/tms/stocktakingBound/ToolsStocktakingBoundList.vue
new file mode 100644
index 0000000..28d161a
--- /dev/null
+++ b/src/views/tms/stocktakingBound/ToolsStocktakingBoundList.vue
@@ -0,0 +1,321 @@
+<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="鐩樼偣鍗曞彿">
+              <a-input placeholder="璇疯緭鍏ョ洏鐐瑰崟鍙�" v-model="queryParam.orderCode"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="缁忔墜浜�">
+              <j-dict-select-tag dictCode="sys_user,realname,id" placeholder="璇烽�夋嫨缁忔墜浜�" v-model="queryParam.handler"
+                                  />
+            </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>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '鏀惰捣' : '灞曞紑' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </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"
+        bordered
+        rowKey="id"
+        class="j-table-force-nowrap"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection='{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }' :customRow='clickThenSelect'
+        @change="handleTabChange">
+
+
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleDetail(record)">璇︽儏</a>
+          <span v-if="record.approvalStatus === '1'">
+            <a-divider type="vertical" />
+            <a-popconfirm title="纭畾鎻愪氦鍚�?" @confirm="() => handleSubmit(record)">
+              <a>鎻愪氦</a>
+            </a-popconfirm>
+            <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="handleEdit(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>
+      </a-table>
+      <a-tabs defaultActiveKey="1">
+        <!-- type="card" -->
+        <a-tab-pane tab='鐩樼偣鍗曟槑缁�' key="1">
+          <div class="table-operator" style="margin:-16px">
+            <tools-stockta-king-bound-detail ref="toolStockingBoundDetail"  :mainId='mainId' />
+          </div>
+        </a-tab-pane>
+
+      </a-tabs>
+    </div>
+
+
+    <tools-stocktaking-bound-modal
+      ref="modalForm"
+      @ok="modalFormOk"
+    ></tools-stocktaking-bound-modal>
+  </a-card>
+</template>
+
+<script>
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import ToolsStocktaKingBoundDetail from './ToolsStocktaKingBoundDetail.vue'
+import ToolsStocktakingBoundModal from './modules/ToolsStocktakingBoundModal'
+import '@/assets/less/TableExpand.less'
+import { deleteAction, getAction } from '@api/manage'
+
+export default {
+    name: "ToolsStocktakingBoundList",
+    mixins:[JeecgListMixin],
+    components: {
+      ToolsStocktakingBoundModal,
+      ToolsStocktaKingBoundDetail
+    },
+    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: 'orderCode'
+          },
+          {
+            title:'缁忔墜浜�',
+            align:"center",
+            dataIndex: 'handler_dictText'
+          },
+          {
+            title:'瀹℃牳浜�',
+            align:"center",
+            dataIndex: 'reviewer_dictText'
+          },
+          {
+            title:'鐩樼偣鍚嶇О',
+            align:"center",
+            dataIndex: 'stocktakingName'
+          },
+          {
+            title:'澶囨敞',
+            align:"center",
+            dataIndex: 'remark'
+          },
+          {
+            title:'瀹℃牳鐘舵��',
+            align:"center",
+            dataIndex: 'approvalStatus_dictText'
+
+          },
+          {
+            title:'瀹℃牳鎰忚',
+            align:"center",
+            dataIndex: 'approvalOpinion'
+          },
+          {
+            title:'鐩樼偣鏃堕棿',
+            align:"center",
+            dataIndex: 'inventoryTime'
+          },
+          {
+            title: '鎿嶄綔',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/tms/toolsStocktakingBound/list",
+          submit:"/tms/toolsStocktakingBound/submit",
+          delete: "/tms/toolsStocktakingBound/delete",
+          deleteBatch: "/tms/toolsStocktakingBound/deleteBatch",
+          exportXlsUrl: "/tms/toolsStocktakingBound/exportXls",
+          importExcelUrl: "tms/toolsStocktakingBound/importExcel",
+
+        },
+        dictOptions:{},
+        mainId: '',
+        superFieldList:[],
+        selectedMainId: '',
+      }
+    },
+    created() {
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      clickThenSelect(record) {
+        return {
+          on: {
+            click: () => {
+              this.onSelectChange(record.id.split(','), [record])
+            }
+          }
+        }
+      },
+      onClearSelected() {
+        this.selectedRowKeys = []
+        this.selectionRows = []
+
+        this.selectedMainId = ''
+      },
+      onSelectChange(selectedRowKeys, selectionRows) {
+        if (selectedRowKeys.length == 1) {
+          this.mainId = selectionRows[0]['id']
+        } else {
+          this.mainId = ''
+        }
+        this.selectedRowKeys = selectedRowKeys
+        this.selectionRows = selectionRows
+      },
+      handleTabChange(pagination, filters, sorter) {
+        this.selectedRowKeys = []
+        this.$refs.toolStockingBoundDetail.dataSource = []
+        this.handleTableChange(pagination, filters, sorter)
+      },
+      handleDelete: function (id) {
+        if (!this.url.delete) {
+          this.$message.error('璇疯缃畊rl.delete灞炴��!')
+          return
+        }
+        deleteAction(this.url.delete, { id: id }).then((res) => {
+          if (res.success) {
+            //閲嶆柊璁$畻鍒嗛〉闂
+            this.reCalculatePage(1)
+            this.$message.success(res.message)
+            this.$refs.toolStockingBoundDetail.dataSource = []
+            this.loadData()
+          } else {
+            this.$message.warning(res.message)
+          }
+        })
+      },
+      handleSubmit(record) {
+        getAction(this.url.submit,{ id: record.id }).then((res)=>{
+          if (res.success) {
+            this.$message.success(res.message);
+            this.loadData();
+            this.$refs.toolStockingBoundDetail.clearList()
+          } else {
+            this.$message.warning(res.message);
+          }
+        })
+      },
+      searchQuery() {
+        this.selectedRowKeys = [];
+        this.$refs.toolStockingBoundDetail.loadData();
+        this.$refs.toolStockingBoundDetail.selectedRowKeys = [];
+        this.loadData();
+      },
+      searchReset() {
+        this.queryParam = {}
+        this.selectedRowKeys = []
+        this.$refs.toolStockingBoundDetail.dataSource = []
+        this.loadData();
+      },
+      modalFormOk() {
+        this.queryParam = {}
+        this.selectedRowKeys = []
+        this.$refs.toolStockingBoundDetail.dataSource = []
+        this.loadData();
+      },
+
+      handleEdit: function (record) {
+
+        console.log('record:', record)
+        this.$refs.modalForm.title = '缂栬緫'
+        this.$refs.modalForm.disableSubmit = false
+        this.$refs.modalForm.edit(record)
+
+      },
+      handleDetail:function(record){
+
+        this.$refs.modalForm.title="璇︽儏";
+        this.$refs.modalForm.disableSubmit = true;
+        this.$refs.modalForm.edit(record);
+      },
+      handleAdd: function () {
+        this.$refs.modalForm.disableSubmit = false
+        this.$refs.modalForm.title = "鏂板宸ュ叿鐢宠鍗�";
+        this.$refs.modalForm.add();
+
+        console.log(this.$refs.modalForm.title);
+
+      },
+
+
+      initDictConfig(){
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/tms/stocktakingBound/modules/ToolSelectorModal.vue b/src/views/tms/stocktakingBound/modules/ToolSelectorModal.vue
new file mode 100644
index 0000000..eed4078
--- /dev/null
+++ b/src/views/tms/stocktakingBound/modules/ToolSelectorModal.vue
@@ -0,0 +1,216 @@
+<template>
+  <!--鏀寔鍏ㄥ睆缂╂斁-->
+  <a-modal :visible='visible' :title='title' switchFullscreen @ok='handleSubmit' @cancel='close' style='top:50px'
+           cancelText='鍏抽棴' :width='1500'>
+    <a-card :bordered='false'>
+      <div class='table-page-search-wrapper'>
+        <a-form layout='inline' @keyup.enter.native='searchQuery'>
+          <a-row :gutter='24'>
+            <a-col :md='8' :sm='6'>
+              <a-form-item label='宸ュ叿缂栫爜'>
+                <j-input placeholder='璇疯緭鍏ュ伐鍏风紪鐮�' v-model='queryParam.toolCode' />
+              </a-form-item>
+            </a-col>
+            <a-col :md='3'>
+              <span style='float: left;overflow: hidden;' class='table-page-search-submitButtons'>
+                <a-button type='primary' @click='searchQuery' icon='search'>鏌ヨ</a-button>
+                <a-button @click='searchReset' icon='reload' style='margin-left: 10px'>閲嶇疆</a-button>
+              </span>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+      <a-table ref='table' :scroll='scrollTrigger' size='middle' rowKey='id' bordered :columns='columns'
+               :dataSource='dataSource' :pagination='ipagination' :rowSelection='rowSelection' :loading='loading'
+               @change='handleTableChange'>
+
+      </a-table>
+    </a-card>
+  </a-modal>
+</template>
+
+<script>
+import { filterObj } from '@/utils/util'
+import { getAction } from '@/api/manage'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+export default {
+  name: 'ToolSelectorModal',
+  mixins: [JeecgListMixin],
+  components: {},
+  props: {},
+  data() {
+    return {
+      queryParam: {},
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key: 'rowIndex',
+          width: 60,
+          align: 'center',
+          customRender: (_, __, index) => parseInt(index) + 1
+        },
+        {
+          title: '宸ュ叿缂栫爜',
+          align: 'center',
+          dataIndex: 'toolCode'
+        },
+        {
+          title: '涓枃鍚嶇О',
+          align: 'center',
+          dataIndex: 'chineseName'
+        },
+        {
+          title: '鍨嬪彿/鍥惧彿',
+          align: 'center',
+          dataIndex: 'toolModel'
+        }
+      ],
+      selectedRowKeys: [],
+      oldSelectRows: [],
+      scrollTrigger: {},
+      dataSource: [],
+      selectionRows: [],
+      title: '鏍规嵁鏌ヨ缁撴灉閫夋嫨宸ュ叿',
+      ipagination: {
+        current: 1,
+        pageSize: 10,
+        pageSizeOptions: ['5', '10', '30', '50', '100'],
+        showTotal: (total, range) => {
+          return range[0] + '-' + range[1] + ' 鍏�' + total + '鏉�'
+        },
+        showQuickJumper: true,
+        showSizeChanger: true,
+        total: 0
+      },
+      isorter: {
+        column: 'createTime',
+        order: 'desc'
+      },
+      visible: false,
+      loading: false,
+      url: {
+        list: '/tms/baseTools/listWithLedgerAndConfig'
+      }
+    }
+  },
+  computed: {
+    rowSelection() {
+      return {
+        type: 'checkbox',
+        onChange: (selectedRowKeys, selectedRows) => {
+          this.selectedRowKeys = selectedRowKeys
+          this.onSelectChange(selectedRows)
+        },
+        getCheckboxProps: record => ({
+          props: {
+            disabled: record.distable
+          }
+        }),
+        selectedRowKeys: this.selectedRowKeys
+      }
+    }
+  },
+
+  methods: {
+
+    async loadData(arg) {
+      if (arg === 1) {
+        this.ipagination.current = 1
+      }
+      let that = this
+      this.loading = true
+      let params = this.getQueryParams()//鏌ヨ鏉′欢
+      await getAction(this.url.list, params).then((res) => {
+        if (res.success) {
+          for (let i = 0; i < res.result.records.length; i++) {
+            if (that.oldSelectRows.indexOf(res.result.records[i].id) > -1) {
+              res.result.records[i].distable = true
+            } else {
+              res.result.records[i].distable = false
+            }
+          }
+          this.dataSource = res.result.records
+          this.ipagination.total = res.result.total
+        }
+        if (res.code === 510) {
+          this.$message.warning(res.message)
+        }
+        this.loading = false
+      })
+    },
+
+    showModals(oldSelectRows) {
+      this.selectionRows = []
+      this.oldSelectRows = oldSelectRows
+      this.visible = true
+      this.loadData(1)
+    },
+    getQueryParams() {
+      let param = Object.assign({}, this.queryParam, this.isorter)
+      param.field = this.getQueryField()
+      param.pageNo = this.ipagination.current
+      param.pageSize = this.ipagination.pageSize
+      return filterObj(param)
+    },
+    //鏌ヨ鏉′欢澶勭悊
+    getQueryField() {
+      let str = 'id,'
+      for (let a = 0; a < this.columns.length; a++) {
+        str += ',' + this.columns[a].dataIndex
+      }
+      return str
+    },
+    searchReset(num) {
+      let that = this
+      this.queryParam = []
+      if (num !== 0) {
+        that.loadData(1)
+      }
+      that.selectborrowIds = []
+    },
+    close() {
+      this.searchReset(0)
+      this.selectedRowKeys = []
+      this.visible = false
+    },
+    handleTableChange(pagination, filters, sorter) {
+      //TODO 绛涢��
+
+      if (Object.keys(sorter).length > 0) {
+        this.isorter.column = sorter.field
+        this.isorter.order = 'ascend' === sorter.order ? 'asc' : 'desc'
+      }
+      this.ipagination = pagination
+      this.loadData()
+    },
+    handleSubmit() {
+      this.$bus.$emit('selectionRows', this.selectionRows)
+      // this.searchReset(0)
+      this.close()
+    },
+    onSelectChange(selectionRows) {
+      this.selectionRows = selectionRows
+    },
+    searchQuery() {
+      this.loadData(1)
+    }
+  }
+}
+</script>
+
+<style scoped>
+.ant-table-tbody .ant-table-row td {
+  padding-top: 10px;
+  padding-bottom: 10px;
+}
+
+#components-layout-demo-custom-trigger .trigger {
+  font-size: 18px;
+  line-height: 64px;
+  padding: 0 24px;
+  cursor: pointer;
+  transition: color 0.3s;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/tms/stocktakingBound/modules/ToolsStocktakingBoundModal.vue b/src/views/tms/stocktakingBound/modules/ToolsStocktakingBoundModal.vue
new file mode 100644
index 0000000..b158f99
--- /dev/null
+++ b/src/views/tms/stocktakingBound/modules/ToolsStocktakingBoundModal.vue
@@ -0,0 +1,504 @@
+<template>
+  <a-modal :title="title" :width="1500" :height="1500" :visible="visible" :maskClosable="false" @ok="handleOk"
+           cancelText="鍏抽棴"
+           @cancel="handleCancel" :confirmLoading="confirmLoading">
+
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="鐩樼偣鍗曞彿" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCode">
+              <a-input :disabled="true" v-model="model.orderCode" placeholder="绯荤粺鑷姩鐢熸垚"></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鐩樼偣绫诲瀷" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="approvalStatus">
+              <j-dict-select-tag dictCode="stocktakingType" placeholder="璇烽�夋嫨鐩樼偣绫诲瀷" v-model="model.stocktakingType"
+                                 :disabled="disableSubmit"></j-dict-select-tag>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item v-show="addShow" label="缁忔墜浜�" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                               prop="handler">
+              <j-dict-select-tag dictCode="sys_user,realname,id" placeholder="璇烽�夋嫨缁忔墜浜�" v-model="model.handler"
+                                 :disabled="disableSubmit" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="瀹℃牳浜�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="reviewer">
+              <j-select-user-by-dep :disabled="disableSubmit" v-model="model.reviewer" :store="'username'"
+                                    :text="'realname'" :multi="false" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鐩樼偣鍚嶇О" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="stocktakingName">
+              <a-input v-model="model.stocktakingName" placeholder="璇疯緭鍏ョ洏鐐瑰悕绉�"></a-input>
+            </a-form-model-item>
+          </a-col>
+
+          <a-col :span="12">
+            <a-form-model-item v-show="addShow" label="瀹℃牳鐘舵��" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                               prop="approvalStatus">
+              <j-dict-select-tag dictCode="approval_status" placeholder="璇烽�夋嫨瀹℃牳鐘舵��" v-model="model.approvalStatus"
+                                 :disabled="true"></j-dict-select-tag>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item v-show="addShow" label="瀹℃牳鎰忚" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                               prop="approvalOpinion">
+              <a-input v-model="model.approvalOpinion" placeholder="璇疯緭鍏ュ鏍告剰瑙�" type="textarea"
+                       :disabled="model.approvalStatus==1"></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="鐩樼偣鏃堕棿" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="inventoryTime">
+              <j-date placeholder="璇烽�夋嫨鐩樼偣鏃堕棿" date-format="YYYY-MM-DD HH:mm:ss" v-model="model.inventoryTime"
+                      style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="澶囨敞" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
+              <a-input v-model="model.remark" placeholder="璇疯緭鍏ュ娉�" type="textarea"></a-input>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form>
+    </a-spin>
+    <a-button type="primary" :style="{ marginRight: '8px', marginBottom: '8px' }" :loading="confirmLoading"
+              :disabled="disableSubmit" @click="selectTools()">宸ュ叿鏄庣粏
+    </a-button>
+    <a-table ref="table" bordered size="middle" rowKey="id" :columns="columns" :dataSource="dataSource"
+             :scroll="{x:true}">
+      <template v-for="col in columns" :slot="col.dataIndex" slot-scope="text, record, index">
+        <a-input-number :disabled="disableSubmit" :value="text" v-if="col.dataIndex == 'practicalQuantity'" :min="0"
+                        :max="99999"
+                        @change="(e) => handleChange(e, record.key, col, index)" style="width: 100%;" />
+        <a-input-number :value="text" v-if="col.dataIndex == 'differenceValue'" :min="0" :max="99999"
+                        :disabled="true" @change="(e) => handleChange(e, record.key, col, index)"
+                        style="width: 100%;" />
+        <j-dict-select-tag :value="text" v-if="col.dataIndex == 'surplusDeficit'"
+                           dictCode="surplusDeficit"
+                           :disabled="true"
+                           style="width: 100%;"
+                           @change="(e) => handleChange(e, record.key, col, index)" />
+        <!--        <j-dict-select-tag :value="text" v-if="col.dataIndex == 'classifyId'"-->
+        <!--                           dictCode="tms_tools_classify,type_name,id"-->
+        <!--                           style="width: 100%;"-->
+        <!--                           :disabled="true"-->
+        <!--                           @change="(e) => handleChange(e, record.key, col, index)" />-->
+        <j-date
+          :value="text"
+          v-if="col.dataIndex == 'stocktakingDate'"
+          placeholder="閫夋嫨鐩樺簱鏃堕棿"
+          @change="(e) => handleChange(e, record.key, col, index)"
+          style="width: 100%;"
+        />
+
+        <a-textarea
+          v-if="col.dataIndex == 'remark'"
+          :disabled="disableSubmit"
+          style="margin: -5px 0"
+          :value="text"
+          @change="(e) => handleChange(e.target.value, record.key, col, index)"
+        />
+
+      </template>
+
+      <span slot="action" slot-scope="text, record, index">
+        <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(text, record, index)">
+          <a :disabled="disableSubmit">鍒犻櫎</a>
+        </a-popconfirm>
+      </span>
+    </a-table>
+    <template slot="footer">
+      <a-button :style="{ marginRight: '8px' }" @click="handleCancel()">
+        鍏抽棴
+      </a-button>
+
+      <a-button @click="handleOk()" :disabled="disableSubmit" type="primary" :loading="confirmLoading">纭畾</a-button>
+    </template>
+    <tool-selector-modal ref="toolsModalForm"></tool-selector-modal>
+  </a-modal>
+
+</template>
+
+<script>
+import { getAction, postAction, requestPut } from '@/api/manage'
+import JMultiSelectTag from '@/components/dict/JMultiSelectTag'
+import Tooltip from 'ant-design-vue/es/tooltip'
+import ToolSelectorModal from '@views/tms/stocktakingBound/modules/ToolSelectorModal.vue'
+
+export default {
+  name: 'ToolsStocktakingBoundModal',
+  components: {
+    ToolSelectorModal,
+    JMultiSelectTag,
+    Tooltip
+  },
+  data() {
+
+    return {
+      addShow: true,
+      model: {},
+      formDisabled: false,
+      pagination: {
+        current: 1,
+        pageSize: 10,
+        total: 0
+      },
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key: 'rowIndex',
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
+          },
+          width: 50
+        },
+        {
+          title: '鍒�鍏风紪鍙�',
+          dataIndex: 'toolCode',
+          align: 'center',
+          width: 150
+        },
+
+        {
+          title: '宸ュ叿绫诲瀷',
+          dataIndex: 'applicationType',
+          align: 'center',
+          width: 150
+        },
+
+        {
+          title: '涓枃鍚嶇О',
+          dataIndex: 'chineseName',
+          width: 150,
+          align: 'center'
+        },
+
+        {
+          title: '鍨嬪彿/鍥惧彿',
+          dataIndex: 'toolModel',
+          width: 150,
+          align: 'center'
+        },
+
+        {
+          title: '鍒�鍏锋潗鏂�',
+          width: 150,
+          dataIndex: 'toolMaterial',
+          align: 'center'
+        },
+        {
+          title: '闆朵欢鏉愭枡',
+          width: 150,
+          dataIndex: 'partMaterial',
+          align: 'center'
+        },
+        {
+          title: '鍘傚',
+          width: 150,
+          dataIndex: 'supplierId',
+          align: 'center'
+
+        },
+        {
+          title: '瀛樺偍浣嶇疆',
+          width: 150,
+          dataIndex: 'goodsShelvesId',
+          align: 'center'
+
+        },
+        {
+          title: '璐﹂潰搴撳瓨',
+          width: 150,
+          dataIndex: 'bookQuantity',
+          align: 'center'
+
+        },
+        {
+          title: '鍙敤鏁伴噺',
+          width: 150,
+          dataIndex: 'availableQuantity',
+          align: 'center'
+
+        },
+        {
+          title: '瀹炵洏鏁伴噺',
+          dataIndex: 'practicalQuantity',
+          align: 'center',
+          width: 150,
+          scopedSlots: { customRender: 'practicalQuantity' }
+        },
+        {
+          title: '宸紓鍊�',
+          dataIndex: 'differenceValue',
+          align: 'center',
+          width: 150,
+          scopedSlots: { customRender: 'differenceValue' }
+        },
+
+        {
+          title: '鐩樹簭鐩樼泩',
+          width: 150,
+          dataIndex: 'surplusDeficit',
+          align: 'center',
+          scopedSlots: { customRender: 'surplusDeficit' }
+        },
+
+        {
+          title: '鐩樺簱鏃堕棿',
+          width: 150,
+          dataIndex: 'stocktakingDate',
+          align: 'center',
+          scopedSlots: { customRender: 'stocktakingDate' }
+        },
+        {
+          title: '澶囨敞',
+          width: 150,
+          dataIndex: 'remark',
+          align: 'center',
+          scopedSlots: { customRender: 'remark' }
+        },
+        {
+          title: '鎿嶄綔',
+          width: 150,
+          dataIndex: 'action',
+          scopedSlots: { customRender: 'action' },
+          align: 'center'
+        }
+      ],
+      title: '鎿嶄綔',
+      visible: false,
+      disableSubmit: false,
+      codeDisable: true,
+
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 6 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 18 }
+      },
+      confirmLoading: false,
+      form: this.$form.createForm(this),
+      validatorRules: {
+        orderCode: [
+          { required: true, message: '璇疯緭鍏ョ洏鐐瑰崟鍙�!' }
+        ],
+        handler: [
+          { required: true, message: '璇疯緭鍏ョ粡鎵嬩汉!' }
+        ],
+        stocktakingName: [
+          { required: true, message: '璇疯緭鍏ョ洏鐐瑰悕绉�!' }
+        ],
+        approvalStatus: [
+          { required: true, message: '璇疯緭鍏ュ鏍哥姸鎬�!' }
+        ],
+        inventoryTime: [
+          { required: true, message: '璇疯緭鍏ョ洏鐐规椂闂�!' }
+        ]
+      },
+      url: {
+        add: '/tms/toolsStocktakingBound/add',
+        edit: '/tms/toolsStocktakingBound/edit',
+        queryDetailList: '/tms/toolsStocktakingBound/listToolsStocktakingBoundControllerDetailsByMainId'
+
+      },
+      dataSource: []
+    }
+  },
+
+  mounted() {
+    this.$bus.$on('selectionRows', (data) => {
+      for (let i = 0; i < data.length; i++) {
+        this.dataSource.push({
+          toolId: data[i].id,
+          toolCode: data[i].toolCode,
+          classifyId: data[i].classifyId,
+          applicationType: data[i].applicationType_dictText,
+          chineseName: data[i].chineseName,
+          toolModel: data[i].toolModel,
+          material: data[i].material,
+          toolMaterial: data[i].toolMaterial,
+          partMaterial: data[i].partMaterial,
+          bookQuantity: data[i].totalCount,
+          supplierId: data[i].supplierId,
+          goodsShelvesId: data[i].positionCode
+        })
+      }
+    })
+  },
+
+  methods: {
+    selectTools: function() {
+      let ids = []
+      for (let i = 0; i < this.dataSource.length; i++) {
+        ids.push(this.dataSource[i].partId)
+      }
+      this.$refs.toolsModalForm.showModals(ids)
+      this.$refs.toolsModalForm.title = '閫夋嫨宸ュ叿淇℃伅'
+      this.$refs.toolsModalForm.disableSubmit = false
+    },
+    add() {
+      this.addShow = false
+      this.edit()
+    },
+
+    edit(record) {
+      console.log(record)
+      console.log(this.auditFlag)
+      this.form.resetFields()
+      this.model = Object.assign({}, record)
+      this.visible = true
+      getAction(this.url.queryDetailList, {
+        stocktakingBoundId: record.id,
+        pageNo: 1,
+        pageSize: 99999
+      }).then((res) => {
+        if (res.success) {
+          console.log(res.result.records)
+          this.dataSource = res.result.records
+        } else {
+          this.dataSource = null
+        }
+      })
+    },
+
+
+
+    close() {
+      this.$emit('close')
+      this.visible = false
+    },
+
+    handleCancel() {
+      this.model = {}
+      this.dataSource = []
+      this.close()
+    },
+
+    handleOk() {
+      const that = this
+      let data = that.dataSource
+      for (let i = 0; i < data.length; i++) {
+        if (data[i].practicalQuantity == undefined || data[i].practicalQuantity == null || data[i].practicalQuantity == '') {
+          that.$message.warning('璇疯緭鍏ョ' + (i + 1) + '琛岀殑瀹炵洏鏁伴噺鏁版嵁锛�')
+          return false
+        }
+      }
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          that.confirmLoading = true
+          let formData = Object.assign(this.model, values)
+          if (that.dataSource.length === 0) {
+            that.$message.warning('璇烽�夋嫨宸ュ叿锛�')
+            that.confirmLoading = false
+            return
+          }
+          formData.toolsStocktakingBoundDetailList = that.dataSource
+          // formData.status = '0';
+          let obj
+          if (!this.model.id) {
+            obj = postAction(this.url.add, formData)
+          } else {
+            obj = requestPut(this.url.edit, formData, { id: this.model.id })
+          }
+          obj.then((res) => {
+            if (res.success) {
+              that.$message.success(res.message)
+              that.$emit('ok')
+              that.close()
+            } else {
+              that.$message.warning(res.message)
+            }
+          }).finally(() => {
+            that.confirmLoading = false
+          })
+        }
+      })
+    },
+
+    handleDelete(text, record, index) {
+      this.dataSource.splice(index, 1)
+    },
+
+    handleChange(value, key, column, index) {
+      let that = this
+      const temp = [...that.dataSource]
+      const target = temp.filter(item => key === item.key)[index]
+      if (target) {
+        // if (column.dataIndex == 'practicalQuantity') {
+        //   target[column.dataIndex] = value
+        // }
+        if (column.dataIndex === 'practicalQuantity') {
+          target[column.dataIndex] = value
+
+          // 璁$畻宸紓鍊�
+          target.differenceValue = value - target.availableQuantity
+
+          // 鏍规嵁宸紓鍊煎垽鏂洏浜忕洏鐩�
+          if (target.differenceValue > 0) {
+            target.surplusDeficit = 1
+          } else if (target.differenceValue < 0) {
+            target.surplusDeficit = 2
+          } else {
+            target.surplusDeficit = 0
+          }
+        }
+        if (column.dataIndex == 'differenceValue') {
+          target[column.dataIndex] = value
+        }
+        if (column.dataIndex == 'classifyId') {
+          target[column.dataIndex] = value
+        }
+        if (column.dataIndex == 'surplusDeficit') {
+          target[column.dataIndex] = value  // 鍋囪 value 鏄瓧绗︿覆鏍煎紡鐨勬棩鏈�
+        }
+        if (column.dataIndex == 'stocktakingDate') {
+          target[column.dataIndex] = value  // 鍋囪 value 鏄瓧绗︿覆鏍煎紡鐨勬棩鏈�
+        }
+        if (column.dataIndex === 'remark') {
+          // 娉ㄦ剰杩欓噷浣跨敤鐨勬槸 e.target.value
+          target[column.dataIndex] = value
+        }
+
+        that.dataSource = temp
+      }
+    }
+  }
+
+}
+</script>
+
+<style lang="less" scoped>
+.frozenRowClass {
+  color: #c9c9c9;
+}
+
+.fontweight {
+  font-weight: bold;
+}
+
+.ant-btn {
+  padding: 0 10px;
+  margin-left: 3px;
+}
+
+.ant-form-item-control {
+  line-height: 0px;
+}
+
+/** 涓昏〃鍗曡闂磋窛 */
+.ant-form .ant-form-item {
+  margin-bottom: 10px;
+}
+
+/** Tab椤甸潰琛岄棿璺� */
+.ant-tabs-content .ant-form-item {
+  margin-bottom: 0px;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/tms/storeEarlyWarning/ToolsStoreEarlyWarningList.vue b/src/views/tms/storeEarlyWarning/ToolsStoreEarlyWarningList.vue
new file mode 100644
index 0000000..7ebb7fc
--- /dev/null
+++ b/src/views/tms/storeEarlyWarning/ToolsStoreEarlyWarningList.vue
@@ -0,0 +1,303 @@
+<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
+            :md="6"
+            :sm="8"
+          >
+            <a-form-item
+              label="宸ュ叿缂栧彿"
+              :labelCol="{span: 5}"
+              :wrapperCol="{span: 18, offset: 1}"
+            >
+              <a-input
+                placeholder="璇疯緭鍏ュ伐鍏风紪鐮佹绱�"
+                v-model="queryParam.toolCode"
+              ></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col
+            :md="6"
+            :sm="8"
+          >
+            <a-form-item
+              label="鍘傚"
+              :labelCol="{span: 5}"
+              :wrapperCol="{span: 18, offset: 1}"
+            >
+              <a-input
+                placeholder="璇疯緭鍏ュ巶瀹舵绱�"
+                v-model="queryParam.supplierId"
+              ></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col
+            :md="6"
+            :sm="8"
+          >
+            <a-form-item
+              label="鏉愯川"
+              :labelCol="{span: 5}"
+              :wrapperCol="{span: 18, offset: 1}"
+            >
+              <a-input
+                placeholder="璇疯緭鍏ユ潗璐ㄦ绱�"
+                v-model="queryParam.toolMaterial"
+              ></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col
+            :md="6"
+            :sm="8"
+          >
+            <a-form-item
+              label="鍒�鍏疯鏍�"
+              :labelCol="{span: 5}"
+              :wrapperCol="{span: 18, offset: 1}"
+            >
+              <a-input
+                placeholder="璇疯緭鍏ュ垁鍏疯鏍兼绱�"
+                v-model="queryParam.toolModel"
+              ></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :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-button type="primary" icon="download" @click="handleExportXls('tms_store_early warning')">瀵煎嚭</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>-->
+      <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>
+
+    <tools-store-early-warning-modal ref="modalForm" @ok="modalFormOk"></tools-store-early-warning-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import ToolsStoreEarlyWarningModal from './modules/ToolsStoreEarlyWarningModal.vue'
+
+  export default {
+    name: 'TmsStoreEarlyWarningList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      ToolsStoreEarlyWarningModal
+    },
+    data () {
+      return {
+        description: 'tms_store_early warning绠$悊椤甸潰',
+        // 琛ㄥご
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'缂栫爜',
+            align:"center",
+            dataIndex: 'classifyId'
+          },
+          {
+            title:'鍚嶇О',
+            align:"center",
+            dataIndex: 'toolName'
+          },
+          {
+            title:'宸ュ叿绫诲瀷',
+            align:"center",
+            dataIndex: 'toolType'
+          },
+          {
+            title:'瑙勬牸',
+            align:"center",
+            dataIndex: 'toolModel'
+          },
+          {
+            title:'鏉愯川',
+            align:"center",
+            dataIndex: 'supplierId'
+          },
+          {
+            title:'瀛樺偍浣嶇疆',
+            align:"center",
+            dataIndex: 'goodsShelvesId'
+          },
+          {
+            title:'鍘傚',
+            align:"center",
+            dataIndex: 'supplierId'
+          },
+          {
+            title:'搴撳瓨涓婇檺',
+            align:"center",
+            dataIndex: 'highestInventory'
+          },
+          {
+            title:'搴撳瓨涓嬮檺',
+            align:"center",
+            dataIndex: 'lowerInventory'
+          },
+          {
+            title:'鎬诲簱瀛樻暟閲�',
+            align:"center",
+            dataIndex: 'totalCount'
+          },
+          {
+            title:'鍙敤搴撳瓨鏁伴噺',
+            align:"center",
+            dataIndex: 'availableQuantity'
+          },
+          {
+            title:'鐘舵��;',
+            align:"center",
+            dataIndex: 'status'
+          },
+          {
+            title:'澶囨敞',
+            align:"center",
+            dataIndex: 'remark'
+          },
+        ],
+        url: {
+          list: "tms/toolsStoreEarlyWarning/list",
+          delete: "tms/toolsStoreEarlyWarning/delete",
+          deleteBatch: "tools/tmsStoreEarlyWarning/deleteBatch",
+          exportXlsUrl: "tools/tmsStoreEarlyWarning/exportXls",
+          importExcelUrl: "toolsStoreEarlyWarning/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:'toolCode',text:'缂栫爜',dictCode:''})
+        fieldList.push({type:'string',value:'toolName',text:'鍚嶇О',dictCode:''})
+        fieldList.push({type:'string',value:'toolType',text:'宸ュ叿绫诲瀷',dictCode:''})
+        fieldList.push({type:'string',value:'toolModel',text:'瑙勬牸',dictCode:''})
+        fieldList.push({type:'string',value:'supplierId',text:'鏉愯川',dictCode:''})
+        fieldList.push({type:'string',value:'goodsShelvesId',text:'瀛樺偍浣嶇疆',dictCode:''})
+        fieldList.push({type:'string',value:'toolModel',text:'鍨嬪彿/鍥惧彿',dictCode:''})
+        fieldList.push({type:'string',value:'supplierId',text:'鍘傚',dictCode:''})
+        fieldList.push({type:'string',value:'toolMaterial',text:'鏉愯川',dictCode:''})
+        fieldList.push({type:'string',value:'totalCount',text:'鎬诲簱瀛樻暟閲�',dictCode:''})
+        fieldList.push({type:'string',value:'availableQuantity',text:'鍙敤搴撳瓨鏁伴噺',dictCode:''})
+        fieldList.push({type:'BigDecimal',value:'lowerInventory',text:'搴撳瓨涓嬮檺',dictCode:''})
+        fieldList.push({type:'string',value:'highestInventory',text:'搴撳瓨涓婇檺',dictCode:''})
+        fieldList.push({type:'string',value:'status',text:'鐘舵��;',dictCode:''})
+        fieldList.push({type:'string',value:'remark',text:'澶囨敞',dictCode:''})
+        fieldList.push({type:'string',value:'tenantId',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/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningForm.vue b/src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningForm.vue
new file mode 100644
index 0000000..88ead07
--- /dev/null
+++ b/src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningForm.vue
@@ -0,0 +1,221 @@
+<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="8">
+            <a-form-model-item label="鍒嗙被缂栧彿" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="classifyId">
+              <a-input v-model="model.classifyId" placeholder="璇疯緭鍏ュ垎绫荤紪鍙�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="涓枃鍚嶇О" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="chineseName">
+              <a-input v-model="model.chineseName" placeholder="璇疯緭鍏ヤ腑鏂囧悕绉�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鑻辨枃鍚嶇О" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="foreignLanguageName">
+              <a-input v-model="model.foreignLanguageName" placeholder="璇疯緭鍏ヨ嫳鏂囧悕绉�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="宸ュ叿绫诲瀷;1.閫氱敤
+2.涓撶敤" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="applicationType">
+              <a-input v-model="model.applicationType" placeholder="璇疯緭鍏ュ伐鍏风被鍨�;1.閫氱敤
+2.涓撶敤"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鏍囧噯绾у埆" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardLevel">
+              <a-input v-model="model.standardLevel" placeholder="璇疯緭鍏ユ爣鍑嗙骇鍒�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鏍囧噯鍙�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardCode">
+              <a-input v-model="model.standardCode" placeholder="璇疯緭鍏ユ爣鍑嗗彿"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鍨嬪彿/鍥惧彿" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toolModel">
+              <a-input v-model="model.toolModel" placeholder="璇疯緭鍏ュ瀷鍙�/鍥惧彿"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鍘傚" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="supplierId">
+              <a-input v-model="model.supplierId" placeholder="璇疯緭鍏ュ巶瀹�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="浠撳簱鐪佷唤鍩庡競" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="provinceCity">
+              <a-input v-model="model.provinceCity" placeholder="璇疯緭鍏ヤ粨搴撶渷浠藉煄甯�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="搴撳尯/搴撳彿" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="warehouseId">
+              <a-input v-model="model.warehouseId" placeholder="璇疯緭鍏ュ簱鍖�/搴撳彿"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="搴撲綅鍙�;鐢卞簱鍖�+灞�+鎺�+鍒楃粍鎴愶紝鍙互鏄涓簱浣嶅彿浠ヨ嫳鏂囩偣鍙峰垎鍓茬殑瀛楃涓层��" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="positionCode">
+              <a-input v-model="model.positionCode" placeholder="璇疯緭鍏ュ簱浣嶅彿;鐢卞簱鍖�+灞�+鎺�+鍒楃粍鎴愶紝鍙互鏄涓簱浣嶅彿浠ヨ嫳鏂囩偣鍙峰垎鍓茬殑瀛楃涓层��"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="瀛樺偍浣嶇疆锛堝亸閭d釜鍘傚尯鐨勫簱锛�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="storageLocation">
+              <a-input v-model="model.storageLocation" placeholder="璇疯緭鍏ュ瓨鍌ㄤ綅缃紙鍋忛偅涓巶鍖虹殑搴擄級"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="璁¢噺涓诲崟浣�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="mainUnit">
+              <a-input v-model="model.mainUnit" placeholder="璇疯緭鍏ヨ閲忎富鍗曚綅"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="璁¢噺杈呭崟浣�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="auxiliaryUnit">
+              <a-input v-model="model.auxiliaryUnit" placeholder="璇疯緭鍏ヨ閲忚緟鍗曚綅"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="璁¢噺涓诲崟浣嶆暟閲�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="mainCount">
+              <a-input v-model="model.mainCount" placeholder="璇疯緭鍏ヨ閲忎富鍗曚綅鏁伴噺"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="璁¢噺杈呭崟浣嶆暟閲�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="auxiliaryCount">
+              <a-input v-model="model.auxiliaryCount" placeholder="璇疯緭鍏ヨ閲忚緟鍗曚綅鏁伴噺"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鏄惁鏈夎閲忚緟鍗曚綅;1,鏈夎緟鍔╁崟浣�2.鏃犺緟鍔╁崟浣�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="auxiliaryUnitFlag">
+              <a-input v-model="model.auxiliaryUnitFlag" placeholder="璇疯緭鍏ユ槸鍚︽湁璁¢噺杈呭崟浣�;1,鏈夎緟鍔╁崟浣�2.鏃犺緟鍔╁崟浣�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鍗曚环" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="price">
+              <a-input-number v-model="model.price" placeholder="璇疯緭鍏ュ崟浠�" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鏈�浣庡簱瀛�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lowerInventory">
+              <a-input-number v-model="model.lowerInventory" placeholder="璇疯緭鍏ユ渶浣庡簱瀛�" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鏈�楂樺簱瀛�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="highestInventory">
+              <a-input v-model="model.highestInventory" placeholder="璇疯緭鍏ユ渶楂樺簱瀛�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="鐘舵��;1.鍚敤
+2.鏈惎鐢�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="status">
+              <a-input v-model="model.status" placeholder="璇疯緭鍏ョ姸鎬�;1.鍚敤
+2.鏈惎鐢�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="澶囨敞" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
+              <a-input v-model="model.remark" placeholder="璇疯緭鍏ュ娉�"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-model-item label="绉熸埛鍙�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="tenantId">
+              <a-input v-model="model.tenantId" 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'
+
+  export default {
+    name: 'TmsStoreEarlyWarningForm',
+    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: {
+           classifyId: [
+              { required: true, message: '璇疯緭鍏ュ垎绫荤紪鍙�!'},
+           ],
+        },
+        url: {
+          add: "/org.jeecg.modules.tms/tmsStoreEarlyWarning/add",
+          edit: "/org.jeecg.modules.tms/tmsStoreEarlyWarning/edit",
+          queryById: "/org.jeecg.modules.tms/tmsStoreEarlyWarning/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/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningModal.vue b/src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningModal.vue
new file mode 100644
index 0000000..b92d194
--- /dev/null
+++ b/src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningModal.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="鍏抽棴">
+    <tms-store-early-warning-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></tms-store-early-warning-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import TmsStoreEarlyWarningForm from './ToolsStoreEarlyWarningForm.vue'
+  export default {
+    name: 'TmsStoreEarlyWarningModal',
+    components: {
+      TmsStoreEarlyWarningForm
+    },
+    data () {
+      return {
+        title:'',
+        width:1024,
+        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