Explorar el Código

前端页面处理

oyq28 hace 1 año
padre
commit
01237e5ad6
Se han modificado 22 ficheros con 6250 adiciones y 59 borrados
  1. 152 0
      imcs-ui/src/api/runManageCenter/mesNotice.js
  2. 146 0
      imcs-ui/src/api/runManageCenter/orderTaskMgr.js
  3. 77 0
      imcs-ui/src/api/systemMgr/toolQuery.js
  4. 54 4
      imcs-ui/src/api/systemMgr/toolbar.js
  5. 1 1
      imcs-ui/src/views/zuihou/developer/warnLong/Index.vue
  6. 45 14
      imcs-ui/src/views/zuihou/developer/warnLong/components/View.vue
  7. 412 0
      imcs-ui/src/views/zuihou/dispatchMgr/toolQuery/Index.vue
  8. 333 37
      imcs-ui/src/views/zuihou/dispatchMgr/tools/Index.vue
  9. 2 2
      imcs-ui/src/views/zuihou/machiningClient/touchScreen/components/View1.vue
  10. 1 1
      imcs-ui/src/views/zuihou/machiningClient/touchScreen/components/View5.vue
  11. 448 0
      imcs-ui/src/views/zuihou/runManageCenter/mesNotice/Index.vue
  12. 201 0
      imcs-ui/src/views/zuihou/runManageCenter/mesNotice/components/Edit.vue
  13. 464 0
      imcs-ui/src/views/zuihou/runManageCenter/mesNotice/components/View.vue
  14. 302 0
      imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/DetailConf.vue
  15. 826 0
      imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/Edit.vue
  16. 403 0
      imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/MeterialSelect.vue
  17. 423 0
      imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/Select.vue
  18. 214 0
      imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/View.vue
  19. 658 0
      imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/index.vue
  20. 314 0
      imcs-ui/src/views/zuihou/statisticalAnalysis/otherWorkHour/Index.vue
  21. 453 0
      imcs-ui/src/views/zuihou/statisticalAnalysis/taskAnalysis/Index.vue
  22. 321 0
      imcs-ui/src/views/zuihou/statisticalAnalysis/workHour/Index.vue

+ 152 - 0
imcs-ui/src/api/runManageCenter/mesNotice.js

@@ -0,0 +1,152 @@
+/*********************** 【订单明细】API ********************/
+import axiosApi from '../AxiosApi.js'
+
+const apiList = {
+	getList: {
+    method: 'POST',
+    url: `/authority/mesNotice/all`
+  },
+  page: {
+    method: 'POST',
+    url: `/authority/mesNotice/page`
+  },
+  pageList: {
+    method: 'POST',
+    url: `/authority/mesNotice/pageList`
+  },
+  update: {
+    method: 'POST',
+    url: `/authority/mesNotice/update`
+  },
+  save: {
+    method: 'POST',
+    url: `/authority/mesNotice/save`
+  },
+  updateStatus: {   // 审核状态
+    method: 'POST',
+    url: `/authority/mesNotice/updateStatus`
+  },
+  remove: {
+    method: 'DELETE',
+    url: `/authority/mesNotice`
+  },
+  delete: {
+    method: 'POST',
+    url: `/authority/mesNotice/delete`
+  },
+  get: {
+    method: 'POST',
+    url: `/authority/mesNotice/get`
+  },
+  list: {
+    method: 'POST',
+    url: `/authority/mesNotice/query`
+  },
+  preview: {
+    method: 'POST',
+    url: `/authority/mesNotice/preview`
+  },
+  export: {
+    method: 'POST',
+    url: `/authority/mesNotice/export`
+  },
+  import: {
+    method: 'POST',
+    url: `/authority/mesNotice/import`
+  }
+}
+
+export default {
+	getList (data) {
+    return axiosApi({
+      ...apiList.getList,
+      data
+    })
+  },
+  page (data) {
+    return axiosApi({
+      ...apiList.page,
+      data
+    })
+  },
+  pageList (data) {
+    return axiosApi({
+      ...apiList.pageList,
+      data
+    })
+  },
+  save (data) {
+    return axiosApi({
+      ...apiList.save,
+      data
+    })
+  },
+  update (data) {
+    return axiosApi({
+      ...apiList.update,
+      data
+    })
+  },
+  updateStatus (data) {
+    return axiosApi({
+      ...apiList.updateStatus,
+      data
+    })
+  },
+  remove (data) {
+    return axiosApi({
+      ...apiList.remove,
+      data
+    })
+  },
+  delete (data) {
+    return axiosApi({
+      ...apiList.remove,
+      data
+    })
+  },
+  get (data) {
+    return axiosApi({
+      ...apiList.get,
+      data
+    })
+  },
+  list (data) {
+    return axiosApi({
+      ...apiList.list,
+      data
+    })
+  },
+  check (code) {
+    return axiosApi({
+      method: 'GET',
+      url: `/authority/mesNotice/check/${code}`
+    })
+  },
+  checkField (data) {
+    return axiosApi({
+      method: 'POST',
+      url: `/authority/mesNotice/check`,
+      data
+    })
+  },
+  preview (data) {
+    return axiosApi({
+      ...apiList.preview,
+      data
+    })
+  },
+  export (data) {
+    return axiosApi({
+      ...apiList.export,
+      responseType: "blob",
+      data
+    })
+  },
+  import (data) {
+    return axiosApi({
+      ...apiList.import,
+      data
+    })
+  }
+}

+ 146 - 0
imcs-ui/src/api/runManageCenter/orderTaskMgr.js

@@ -0,0 +1,146 @@
+/*********************** 【订单管理】API ********************/
+import axiosApi from '../AxiosApi.js'
+
+const apiList = {
+	getList: {
+	    method: 'POST',
+	    url: `/authority/orderTask/all`
+	},
+  page: {
+    method: 'POST',
+    url: `/authority/orderTask/page`
+  },
+  pageList: {
+    method: 'POST',
+    url: `/authority/orderTask/pageList`
+  },
+  update: {
+    method: 'POST',
+    url: `/authority/orderTask/update`
+  },
+  save: {
+    method: 'POST',
+    url: `/authority/orderTask/save`
+  },
+  // 一键排产
+  oneTouchSchedule: {
+    method: 'POST',
+    url: `/authority/orderTask/oneTouchSchedule`
+  }, 
+  // 订单启用
+  orderEnable: {
+    method: 'POST',
+    url: `/authority/orderTask/orderEnable`
+  },
+  // 订单暂停
+  orderSuspend: {
+    method: 'POST',
+    url: `/authority/orderTask/orderSuspend`
+  },
+  remove: {
+    method: 'DELETE',
+    url: `/authority/orderTask`
+  },
+  get: {
+    method: 'POST',
+    url: `/authority/orderTask/get`
+  },
+  delete: {
+    method: 'POST',
+    url: `/authority/orderTask/delete`
+  }, 
+  list: {
+    method: 'POST',
+    url: `/authority/orderTask/query`
+  }
+}
+
+export default {
+	getList (data) {
+    return axiosApi({
+      ...apiList.getList,
+      data
+    })
+  },
+  page (data) {
+    return axiosApi({
+      ...apiList.page,
+      data
+    })
+  },
+  pageList (data) {
+    return axiosApi({
+      ...apiList.pageList,
+      data
+    })
+  },
+  save (data) {
+    return axiosApi({
+      ...apiList.save,
+      data
+    })
+  },
+  update (data) {
+    return axiosApi({
+      ...apiList.update,
+      data
+    })
+  },
+  updateStatus (data) {
+    return axiosApi({
+      ...apiList.updateStatus,
+      data
+    })
+  },
+  // 更新优先级
+  updateData (data) {
+    return axiosApi({
+      ...apiList.updateData,
+      data
+    })
+  }, 
+  // 订单启用
+  orderEnable (data) {
+    return axiosApi({
+      ...apiList.orderEnable,
+      data
+    })
+  },
+  // 订单暂停
+  orderSuspend (data) {
+    return axiosApi({
+      ...apiList.orderSuspend,
+      data
+    })
+  },
+  remove (data) {
+    return axiosApi({
+      ...apiList.remove,
+      data
+    })
+  },
+  get (data) {
+    return axiosApi({
+      ...apiList.get,
+      data
+    })
+  },
+  delete (data) {
+    return axiosApi({
+      ...apiList.delete,
+      data
+    })
+  },
+  list (data) {
+    return axiosApi({
+      ...apiList.list,
+      data
+    })
+  },
+  check (code) {
+    return axiosApi({
+      method: 'GET',
+      url: `/authority/orderTask/check/${code}`
+    })
+  }  
+}

+ 77 - 0
imcs-ui/src/api/systemMgr/toolQuery.js

@@ -0,0 +1,77 @@
+import axiosApi from '../AxiosApi.js'
+
+const apiList = {
+	getBizStatusList: {
+    method: 'POST',
+    url: `/authority/toolQuery/getBizStatusList`
+  },
+  getAgvLockList: {
+    method: 'POST',
+    url: `/authority/toolQuery/getAgvLockList`
+  },
+  getCacheCallbackList: {
+    method: 'POST',
+    url: `/authority/toolQuery/getCacheCallbackList`
+  },
+  getStorgeLockList: {
+    method: 'POST',
+    url: `/authority/toolQuery/getStorgeLockList`
+  },
+  getCacheKeyList: {
+    method: 'POST',
+    url: `/authority/toolQuery/getCacheKeyList`
+  },
+  getOfflineList: {
+    method: 'POST',
+    url: `/authority/toolQuery/getOfflineList`
+  },
+  getOrderTaskList:{
+    method: 'POST',
+    url: `/authority/toolQuery/getOrderTaskList`
+  }
+}
+
+export default {
+	getBizStatusList (data) {
+    return axiosApi({
+      ...apiList.getBizStatusList,
+      data
+    })
+  },
+  getAgvLockList (data) {
+    return axiosApi({
+      ...apiList.getAgvLockList,
+      data
+    })
+  },
+  getCacheCallbackList (data) {
+    return axiosApi({
+      ...apiList.getCacheCallbackList,
+      data
+    })
+  },
+  getStorgeLockList (data) {
+    return axiosApi({
+      ...apiList.getStorgeLockList,
+      data
+    })
+  },
+  getCacheKeyList (data) {
+    return axiosApi({
+      ...apiList.getCacheKeyList,      
+      data
+    })
+  },
+  getOfflineList (data) {
+    return axiosApi({
+      ...apiList.getOfflineList,      
+      data
+    })
+  },
+  getOrderTaskList (data) {
+    return axiosApi({
+      ...apiList.getOrderTaskList,      
+      data
+    })
+  }
+}

+ 54 - 4
imcs-ui/src/api/systemMgr/toolbar.js

@@ -41,9 +41,9 @@ const apiList = {
     method: 'POST',
     url: `/authority/toolbar/refreshXbk`
   },
-  manualTask: {
+  updateDeviceStatus: {
     method: 'POST',
-    url: `/authority/toolbar/manualTask`
+    url: `/authority/toolbar/updateDeviceStatus`
   },
   manualXbk: {
     method: 'POST',
@@ -57,9 +57,29 @@ const apiList = {
     method: 'POST',
     url: `/authority/toolbar/addCacheMsg`
   },
+  addMachineCallback: {
+    method: 'POST',
+    url: `/authority/toolbar/addMachineCallback`
+  },
+  eraseWorkPiece: {
+    method: 'POST',
+    url: `/authority/toolbar/eraseWorkPiece`
+  },
+  updateBizStatus: {
+    method: 'POST',
+    url: `/authority/toolbar/updateBizStatus`
+  },
+  cleanCache: {
+    method: 'POST',
+    url: `/authority/toolbar/cleanCache`
+  },
   refreshPriority: {
     method: 'POST',
     url: `/authority/toolbar/refreshPriority`
+  },
+  updateUnExeTask: {
+    method: 'POST',
+    url: `/authority/toolbar/updateUnExeTask`
   } 
 }
 
@@ -124,9 +144,9 @@ export default {
       data
     })
   },
-  manualTask (data) {
+  updateDeviceStatus (data) {
     return axiosApi({
-      ...apiList.manualTask,
+      ...apiList.updateDeviceStatus,
       data
     })
   },
@@ -148,10 +168,40 @@ export default {
       data
     })
   },
+  addMachineCallback (data) {
+    return axiosApi({
+      ...apiList.addMachineCallback,
+      data
+    })
+  },
+  eraseWorkPiece (data) {
+    return axiosApi({
+      ...apiList.eraseWorkPiece,
+      data
+    })
+  },
+  updateBizStatus (data) {
+    return axiosApi({
+      ...apiList.updateBizStatus,
+      data
+    })
+  },
+  cleanCache (data) {
+    return axiosApi({
+      ...apiList.cleanCache,
+      data
+    })
+  },
   refreshPriority (data) {
     return axiosApi({
       ...apiList.refreshPriority,
       data
     })
+  },
+  updateUnExeTask (data) {
+    return axiosApi({
+      ...apiList.updateUnExeTask,
+      data 
+    })
   }
 }

+ 1 - 1
imcs-ui/src/views/zuihou/developer/warnLong/Index.vue

@@ -130,7 +130,7 @@
 		    column-key="operation"
 		    width="85px">
 			<template slot-scope="{ row }">
-		        	<el-tooltip class="item" content='分析处理' effect="dark" placement="top-start" v-if="row.taskNodeId">
+		        	<el-tooltip class="item" content='分析处理' effect="dark" placement="top-start" v-if="row.taskNodeId || row.method!='GlobalException'">
 			          <i
 			            class="el-icon-bell table-operation"
 			            style="color: #87d068;"

+ 45 - 14
imcs-ui/src/views/zuihou/developer/warnLong/components/View.vue

@@ -118,6 +118,9 @@
 
           <el-alert v-if="dataList[1] && dataList[1].onlineStatus=='2'" title="执行设备正在工作中,请耐心等待资源释放" type="warning" :closable="false" effect="dark"> </el-alert>
 
+          <el-alert v-if="tenant.method=='DataException'" title="系统数据异常处理" type="error" :closable="false" effect="dark" />
+
+          <el-alert v-if="tenant.method=='DataException' && tenant.feedback.indexOf('设备离线')>-1" title="执行设备工作状态异常,请检查设备是否在线" type="error" :closable="false" effect="dark" />
         </div>
       </el-col>      
     </el-row>
@@ -225,7 +228,7 @@
         </div>
         <div class="text item">
           <el-row :gutter="12" >
-            <el-col :xs="24" :sm="8">
+          <el-col :xs="24" :sm="8">
         <div class="view-item">
           <i class="el-icon-time" />
           <span>日志ID</span>
@@ -235,7 +238,7 @@
       <el-col :xs="24" :sm="8">
         <div class="view-item">
           <i class="el-icon-brush" />
-          <span>回调ID</span>
+          <span>节点ID</span>
           <el-input v-model="callbackId"  :placeholder="dataList[1]?dataList[1].taskNodeId:''"></el-input>
         </div>
       </el-col>
@@ -245,34 +248,56 @@
           <span>设备ID</span>
           <el-input v-model="deviceId" :placeholder="dataList[1]?dataList[1].deviceId:''"></el-input>
         </div>
-      </el-col>      
-       <el-col :xs="24" :sm="8">
+      </el-col>     
+      <el-col :xs="24" :sm="8">
         <div class="view-item">
           <i class="el-icon-time" />
-          <span>指令重发</span>
+          <span>任务ID</span>
           <div class="btn">
-            <el-button type="primary" icon="el-icon-edit" :disabled="confirmDisabled" @click="resend(this.logId)">重发指令</el-button>
+            <el-input v-model="taskId" :placeholder="dataList[1]?dataList[1].taskId:''"></el-input>
+          </div>          
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-brush" />
+          <span>批次号</span>
+          <div class="btn">
+            <el-input v-model="completeBatchNo" :placeholder="dataList[1]?dataList[1].completeBatchNo:''"></el-input>
           </div>
         </div>
       </el-col>
+      <!--
       <el-col :xs="24" :sm="8">
         <div class="view-item">
+                    
+        </div>
+      </el-col>   
+       <el-col :xs="24" :sm="8">
+        <div class="view-item">          
+          <i class="el-icon-time" />
+          <span>指令重发</span>
+          <div class="btn">
+            <el-button type="primary" icon="el-icon-edit" :disabled="confirmDisabled" @click="resend(this.logId)">重发指令</el-button>
+          </div>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="8">        
+        <div class="view-item">          
           <i class="el-icon-brush" />
           <span>校验回调</span>
           <div class="btn">
             <el-button type="primary" icon="el-icon-edit" :disabled="confirmDisabled" @click="nodeCallback(this.callbackId)">检验回调</el-button>
-          </div>  
-        </div>
+          </div>
+        </div> 
       </el-col>
       <el-col :xs="24" :sm="8">
         <div class="view-item">
-          <i class="el-icon-brush" />
-          <span>释放锁定设备</span>
           <div class="btn">
-            <el-button type="primary" icon="el-icon-edit" :disabled="confirmDisabled" @click="freeLock(this.deviceId)">释放设备</el-button>
+            <el-button type="primary" icon="el-icon-edit" :disabled="confirmDisabled" @click="freeLock(this.deviceId)">访问工具接口</el-button>
           </div>
         </div>
-      </el-col>
+      </el-col> -->
       </el-row>
     </div>
   </el-card>
@@ -325,6 +350,8 @@ export default {
       deviceId: '',
       logId:'',
       callbackId: '',
+      taskId: '',
+      completeBatchNo:'',
       keys: [{name:'nodeName', value:'节点名称'},{name:'resourceDesc', value:'执行设备'},{name:'overtimeStatus', value:'是否超时'},{name:'procedureDesc', value:'工序名称'},{name:'targetResourceDesc', value:'目标设备'},{name:'planTime', value:'计划时间'},{name:'actualTime', value:'执行时间'}],
       //robotNodes:[{label:'舱体线机器人',value:"1"},{label:'伺服舵机',value:"2"},{label:'框体线机器人',value:"3"}], 
       tabPosition: 'left',
@@ -368,8 +395,11 @@ export default {
       console.log(this.tenant)
       this.taskNodeId = this.tenant.taskNodeId
       this.callbackId = this.tenant.taskNodeId 
-      this.logId = this.tenant.id      
-      this.fetch()
+      this.logId = this.tenant.id
+      if(this.taskNodeId){
+        this.taskId = this.tenant.taskId
+        this.fetch()
+      }
     },
     fetch(){      
         warnLogApi.connected({id: this.tenant.taskNodeId}).then(response => {
@@ -377,6 +407,7 @@ export default {
 	        if (res.isSuccess) {
 	          this.dataList = res.data
             this.deviceId = this.dataList[1]? this.dataList[1].deviceId : ''
+            this.completeBatchNo = this.dataList[1].completeBatchNo
             console.log(this.dataList[1])
             if(this.deviceId!=''){
               warnLogApi.getStorageNode({resourceId: this.dataList[1].deviceId}).then(response => {

+ 412 - 0
imcs-ui/src/views/zuihou/dispatchMgr/toolQuery/Index.vue

@@ -0,0 +1,412 @@
+<template>
+  <div class="app-container space">
+
+	<el-card class="box-card">		
+        <div slot="header" class="clearfix">查询业务节点状态</div>
+		<el-form ref="form" :model="form" label-width="80px">
+			<el-row :gutter="12" >
+				<el-form-item label="超时天数:" prop="timeSpan">
+                	<el-input-number v-model="form.timeSpan" :min="0" :max="30"></el-input-number>
+				</el-form-item>
+			</el-row>
+			<el-form-item>
+    			<el-button type="primary" @click="getBizStatusList" >发送</el-button>    		
+  			</el-form-item>
+			<!--
+			<el-row :gutter="20">
+				<el-col :span="4">
+				    <div>
+						<el-form-item label="进行中:">
+							456/2
+						</el-form-item>		
+					</div>	
+				</el-col>
+				<el-col :span="4">
+					<div>
+                        <el-form-item label="暂停中:">
+							456/2
+						</el-form-item>	
+					</div>
+				</el-col>
+				<el-col :span="6">
+					<div>
+                        <el-form-item label="线边库中:">
+							456/2
+						</el-form-item>	
+					</div>
+				</el-col>
+			</el-row>		
+		-->
+			<el-row :gutter="10" v-for="(item, index) in bizStatuList" :key="item.id">
+				<el-col :span="4">
+					<el-form-item label="ID:">
+					 {{bizStatuList[index].id}}
+					</el-form-item>	
+				</el-col>
+				<el-col :span="6">
+					<el-form-item label="名称:">
+						{{bizStatuList[index].nodeName}}
+					</el-form-item>
+			    </el-col>
+				<el-col :span="6">
+					<el-form-item label="批次号:">
+						{{bizStatuList[index].completeBatchNo}}
+					</el-form-item>
+				</el-col>
+				<el-col :span="6">
+					<el-form-item label="状态:">
+						{{bizStatuList[index].exeStatus=="2"?"进行中":(bizStatuList[index].exeStatus=="4"? "暂存中":"线边库暂存中")}}
+					</el-form-item>
+				</el-col>				
+			</el-row>	
+		</el-form>
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">查询AGV锁定状态</div>
+		<el-form label-width="80px">
+		<el-row :gutter="10" v-for="agvLock in agvLockList" :key="agvLock.id">
+			    <el-col :span="6">
+					<el-form-item label="ID:">
+					 {{agvLock.id}}
+					</el-form-item>	
+				</el-col>
+				<el-col :span="6">
+					<el-form-item label="设备ID:">
+						{{agvLock.target_resource_id}}
+					</el-form-item>
+			    </el-col>
+				<el-col :span="6">
+					<el-form-item label="目标设备:">
+						{{agvLock.name}}
+					</el-form-item>
+				</el-col>				
+		   </el-row>
+		</el-form>
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">查询节点回调数据</div>
+		<el-form label-width="80px">
+		<el-row :gutter="10" v-for="cacheCallback in cacheCallbackList" :key="cacheCallback.Id">
+			    <el-col :span="5">
+					<el-form-item label="节点ID:">
+					 {{cacheCallback.taskNodeId}}
+					</el-form-item>	
+				</el-col>
+				<el-col :span="5">
+					<el-form-item label="任务名称:">
+						{{cacheCallback.operateName}}
+					</el-form-item>
+			    </el-col>
+				<el-col :span="5">
+					<el-form-item label="任务ID:">
+						{{cacheCallback.taskId}}
+					</el-form-item>
+				</el-col>
+				<el-col :span="3">
+					<el-form-item label="任务状态:">
+						{{cacheCallback.state=="1"?"未完成":"已完成"}}
+					</el-form-item>
+				</el-col>
+				<el-col :span="5">
+					<el-form-item label="地址:">
+						{{cacheCallback.address}}
+					</el-form-item>
+				</el-col>				
+		   </el-row>
+		</el-form>
+		
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">查询点库位锁定状态</div>
+		<el-form label-width="80px">
+		<el-row :gutter="10" v-for="storgeLock in storgeLockList" :key="storgeLock.id">
+			    <el-col :span="6">
+					<el-form-item label="名称:">
+					 {{storgeLock.name}}
+					</el-form-item>	
+				</el-col>
+				<el-col :span="3">
+					<el-form-item label="启用状态:">
+						{{storgeLock.status=="0"?"不可用":"可用"}}
+					</el-form-item>
+			    </el-col>
+				<el-col :span="3">
+					<el-form-item label="锁定状态:">
+						{{storgeLock.lockStatus=="0"?"已锁定":"未锁定"}}
+					</el-form-item>
+				</el-col>
+				<el-col :span="6">
+					<el-form-item label="锁定节点:">
+						{{storgeLock.campId}}
+					</el-form-item>
+				</el-col>
+				<el-col :span="6">
+					<el-form-item label="锁定批次:">
+						{{storgeLock.completeBatchNo}}
+					</el-form-item>
+				</el-col>				
+		   </el-row>
+		</el-form>
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">查询不在线设备</div>
+		<el-form label-width="80px">
+		<el-row :gutter="10" v-for="offline in offlineList" :key="offline.id">
+			    <el-col :span="6">
+					<el-form-item label="名称:">
+					 {{offline.name}}
+					</el-form-item>	
+				</el-col>
+				<el-col :span="6">
+					<el-form-item label="在线状态:">
+						{{offline.onlineStatus=='0'?"下线":"上线"}}
+					</el-form-item>
+			    </el-col>
+				<el-col :span="6">
+					<el-form-item label="掉线状态:">
+						{{offline.status=='0'?"掉线":"上线"}}
+					</el-form-item>
+				</el-col>
+				<el-col :span="6">
+					<el-form-item label="IP:">
+						{{offline.ip}}
+					</el-form-item>
+				</el-col>								
+		   </el-row>
+		</el-form>
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">查询自定义订单</div>		
+		<el-form label-width="80px">
+		<el-row :gutter="10"  v-for="task in orderTaskList" :key="task.id">
+			    <el-col :span="4">
+					<el-form-item label="订单名称">
+					 {{ task.orderName}}
+					</el-form-item>	
+				</el-col>
+				<el-col :span="4">
+					<el-form-item label="产品" label-width="100px">
+						{{task.bomDesc}}
+					</el-form-item>
+			    </el-col>
+				<el-col :span="5">
+					<el-form-item label="开始时间" label-width="100px">
+						{{task.startTime}}
+					</el-form-item>
+			    </el-col>
+				<el-col :span="5">
+					<el-form-item label="结束时间" label-width="100px">
+						{{task.endTime}}
+					</el-form-item>
+			    </el-col>								
+		   </el-row>
+		</el-form>	  
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">查询缓存关键字</div>		
+		<el-form label-width="80px">
+		<el-row :gutter="10">
+			    <el-col :span="6">
+					<el-form-item label="是否排产">
+					 {{cacheKeyList.YUNJIAN_SHEDULE_FLAG==1? "排产进行中":"无排产"}}
+					</el-form-item>	
+				</el-col>
+				<el-col :span="9">
+					<el-form-item label="是否优先级" label-width="100px">
+						{{cacheKeyList.PRIORITY_LOCK==1? "禁用":"启用"}}
+					</el-form-item>
+			    </el-col>								
+		   </el-row>
+		</el-form>	  
+	</el-card>
+	
+  </div>
+</template>
+
+<script>	
+	// 【锁定记录、出入库记录】-API
+	import toolQueryApi from "@/api/systemMgr/toolQuery"
+	import warnLogApi from "@/api/lineSideLibrary/warnLog"
+	import areaMgrApi from "@/api/resourceProductMgr/areaMgr"	
+	import { convertEnum, initDicts, initQueryParams } from '@/utils/commons'
+	export default {
+	  name: "ToolQuery",
+	  directives: { },
+	  components: { },
+	  props: {
+	  },
+	  data () {
+	    return {
+		  form:{
+			timeSpan: "2"
+		  },	
+		  orderTaskList: [],	     		  
+		  bizStatuList: [],
+		  agvLockList: [],
+		  cacheCallbackList: [],
+		  storgeLockList: [],
+		  cacheKeyList: [],
+		  offlineList:[],
+		  lineList: [{"name":"框体","value":"KT"},{"name":"舱体","value":"CT"},{"name":"保障中心","value":"BZ"}],
+		  typeList: [{"name":"全部","value":"0"},{"name":"FANUC","value":"1"},{"name":"HEIDENHAIN","value":"2"},{"name":"DMG","value":"3"},{"name":"HELLER","value":"4"}],
+	      tenantViewVisible: false,
+	      tableKey: 0,
+	      queryParams: initQueryParams({}),
+	      selection: [],
+	      loading: false
+		}  	      
+	  },
+	  // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
+	  created() {
+	  	// 调用常量-审核状态
+	  	this.audioStatus = this.$constWKS.OPTTYPE
+	  	// 加载【字典】
+	  	initDicts(['NATION'], this.dicts);
+	  	// 加载列表数据
+	  	this.fetch()
+		},
+	  computed: {
+	    currentUser () {
+	      return this.$store.state.account.user
+	    },
+	    nationList() {
+          return convertEnum(this.dicts.NATION)
+        }
+	  },
+	  mounted () {
+	   
+	  },
+	  methods: {        
+	    getBizStatusList () {
+			let query = this.form.timeSpan ? {"timeSpan" : this.form.timeSpan.toString()} : {}		
+			toolQueryApi.getBizStatusList(query).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.bizStatuList = res.data.data
+							//console.log(this.bizStatuList)
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+				}).finally(()=>{
+					return true		
+			})
+	    },
+	    getAgvLockList () {
+			toolQueryApi.getAgvLockList({}).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.agvLockList = res.data.data
+							//console.log(this.agvLockList)
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+				}).finally(()=>{
+					return true		
+			})	      
+	    },
+	    getCacheCallbackList () {
+			toolQueryApi.getCacheCallbackList({}).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.cacheCallbackList = res.data.data
+							//console.log(this.cacheCallbackList)
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+				}).finally(()=>{
+					return true		
+			})
+	    },
+	    getStorgeLockList () {
+	        toolQueryApi.getStorgeLockList({}).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.storgeLockList = res.data.data
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+				}).finally(()=>{
+					return true		
+			})
+	    },
+	    getCacheKeyList () {
+			toolQueryApi.getCacheKeyList({}).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.cacheKeyList = res.data
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+				}).finally(()=>{
+					return true		
+			})	     
+	    },
+		getOfflineList () {
+			toolQueryApi.getOfflineList({}).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.offlineList = res.data.data
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+				}).finally(()=>{
+					return true		
+			})	     
+	    },		
+		getOrderTaskList(){
+			toolQueryApi.getOrderTaskList({}).then(response=>{
+						const res = response.data
+						console.log(res)
+						if(res.isSuccess){
+							this.orderTaskList = res.data.data.records
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+				}).finally(()=>{
+					return true		
+			})
+		},
+	    fetch () {
+	      	this.getBizStatusList()
+			this.getAgvLockList()
+			this.getCacheCallbackList()
+			this.getStorgeLockList()
+			this.getCacheKeyList()
+			this.getOfflineList()
+			this.getOrderTaskList()
+	    }
+	  }
+	}
+</script>
+<style lang="scss" scoped>
+   .space  .box-card  {
+     margin: 10px 0;
+   }
+</style>

+ 333 - 37
imcs-ui/src/views/zuihou/dispatchMgr/tools/Index.vue

@@ -74,7 +74,7 @@
 	</el-card>
 
 	<el-card class="box-card">
-        <div slot="header" class="clearfix">设置加工设备上线\掉线</div>
+        <div slot="header" class="clearfix">切换加工设备上线\下线</div>
 		<el-form ref="form3" :model="form3" :rules="rules3" label-width="80px">
 			<el-row :gutter="12" >
 				<el-col :xs="6" :sm="5">
@@ -158,28 +158,20 @@
 	  </el-form>
 	</el-card>
 
-	<el-card class="box-card" v-show="false">
-        <div slot="header" class="clearfix">动态移动零件(产线内)</div>
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">更改设备掉线状态</div>
 		<el-form ref="form7" :model="form7" :rules="rules5" label-width="80px">
 			<el-row :gutter="12" >
 				<el-col :xs="6" :sm="5">
-					<el-select v-model="form7.zoneId" placeholder="选择产线">
-						<el-option v-for="deviceUnit in lineList " :label="deviceUnit.name" :value="deviceUnit.id" :key="deviceUnit.id" ></el-option>		
-			  		</el-select>
-				</el-col>
-				<el-col :xs="6" :sm="5">					
-					<el-form-item label="起始位:" prop="start">                    	
-						<el-input-number v-model="form7.startpointId" :min="1" ></el-input-number>
-					</el-form-item>
-				</el-col>
-				<el-col :xs="6" :sm="5">					
-					<el-form-item label="目的位:" prop="goal">                    	
-						<el-input-number v-model="form7.endpointId" :min="1" ></el-input-number>
+					<el-form-item label="类型:" prop="line">
+						<el-select v-model="form7.line" placeholder="选择产线">
+							<el-option v-for="line in lineList " :label="line.name" :value="line.value" :key="line.value" ></el-option>		
+			  			</el-select>
 					</el-form-item>
-				</el-col>							
+				</el-col>											
 			</el-row>
 			<el-form-item>
-    			<el-button type="primary" @click="manualTask">执行</el-button>    		
+    			<el-button type="primary" @click="updateDeviceStatus">更新</el-button>    		
   			</el-form-item>
 	  </el-form>
 	</el-card>
@@ -232,10 +224,10 @@
 
 	<el-card class="box-card">
         <div slot="header" class="clearfix">刷新线边库排产</div>
-		<el-form ref="form10" :model="form10" :rules="rules7" label-width="80px">
+		<el-form ref="form10" :model="form10" :rules="rules7" label-width="100px">
 			<el-row :gutter="12" >
 				<el-col :xs="6" :sm="5">
-					<el-form-item label="节点ID:" prop="deviceType">
+					<el-form-item label="设备类型:" prop="deviceType">
                     	<el-select v-model="form10.deviceType" placeholder="选择设备类型">
 							 <el-option v-for="deviceType in typeList" :label="deviceType.name" :value="deviceType.value" :key="deviceType.value" ></el-option>		
 			  			</el-select>
@@ -333,6 +325,104 @@
   			</el-form-item>
 	  </el-form>
 	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">添加加工设备回调</div>
+		<el-form ref="form15" :model="form15" :rules="rules11" label-width="80px">
+			<el-row :gutter="12" >
+				<el-col :xs="6" :sm="6">
+					<el-form-item label="任务ID:" prop="taskId">
+                    	<el-input  v-model="form15.taskId" placeholder="任务ID"></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="6" :sm="6">
+					<el-form-item label="节点ID:" prop="taskNodeId">
+                    	<el-input  v-model="form15.taskNodeId" placeholder="节点ID"></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="6" :sm="5">
+					<el-form-item label="设备IP:" prop="ip">
+                    	<el-input  v-model="form15.ip" placeholder="设备IP"></el-input>
+					</el-form-item>
+				</el-col>											
+			</el-row>
+			<el-form-item>
+    			<el-button type="primary" @click="addMachineCallback" >发送</el-button>    		
+  			</el-form-item>
+	  </el-form>
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">更新任务/节点状态</div>
+		<el-form ref="form16" :model="form16" :rules="rules12" label-width="80px">
+			<el-row :gutter="12" >
+				<el-col :xs="6" :sm="6">
+					<el-form-item label="任务ID:" prop="taskId">
+                    	<el-input  v-model="form16.taskId" placeholder="任务ID"></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="6" :sm="6">
+					<el-form-item label="节点ID:" prop="taskNodeId">
+                    	<el-input  v-model="form16.taskNodeId" placeholder="节点ID"></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="6" :sm="5">
+					<el-form-item label="状态:" prop="status">
+                    	<el-select v-model="form16.status" placeholder="选择状态">
+			  			     <el-option label="运行状态" value="2"></el-option>
+							 <el-option label="完成状态" value="3"></el-option>
+							 <el-option label="暂停状态" value="4"></el-option>
+							 <!--<el-option label="线边库暂停" value="5"></el-option>-->
+						</el-select>
+					</el-form-item>
+				</el-col>											
+			</el-row>
+			<el-form-item>
+    			<el-button type="primary" @click="updateBizStatus" >发送</el-button>    		
+  			</el-form-item>
+	  </el-form>
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">报销零件流程复原</div>
+		<el-form ref="form17" :model="form17" :rules="rules8" label-width="80px">
+			<el-row :gutter="12" >
+				<el-col :xs="6" :sm="8">
+					<el-form-item label="批次号:" prop="completeBatchNo">
+                    	<el-input  v-model="form17.completeBatchNo" placeholder="批次号"></el-input>
+					</el-form-item>
+				</el-col>											
+			</el-row>
+			<el-form-item>
+    			<el-button type="primary" @click="eraseWorkPiece" >发送</el-button>    		
+  			</el-form-item>
+	  </el-form>
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">清除过期缓存</div>
+		<el-form ref="form18" :model="form18" label-width="80px">			
+			<el-form-item>
+    			<el-button type="primary" @click="cleanCache" >发送</el-button>    		
+  			</el-form-item>
+	  </el-form>
+	</el-card>
+
+	<el-card class="box-card">
+        <div slot="header" class="clearfix">更改不加工自定义订单状态</div>
+		<el-form ref="form19" :model="form19" :rules="rules13" label-width="80px">
+			<el-row :gutter="12" >
+				<el-col :xs="6" :sm="6">
+					<el-form-item label="节点ID:" prop="taskNodeId">
+                    	<el-input  v-model="form19.taskNodeId" placeholder="节点ID"></el-input>
+					</el-form-item>
+				</el-col>
+			</el-row>			
+			<el-form-item>				
+    			<el-button type="primary" @click="updateUnExeTask" >发送</el-button>    		
+  			</el-form-item>
+	  </el-form>
+	</el-card>
   </div>
 </template>
 
@@ -379,9 +469,7 @@
 			taskId: '',
 		  },
 		  form7:{
-            zoneId: "",
-			startpointId: "",
-			endpointId: "",
+            line: "",			
 		  },
 		  form8:{
 			taskId: "",
@@ -410,7 +498,26 @@
 			targetNo:0,
 			msgType:"KT_125"
 		  },
-		  lineList: [],
+		  form15:{
+			taskNodeId: "",
+			taskId: "",
+			ip:""
+		  },
+		  form16:{
+			taskNodeId: "",
+			taskId: "",
+			status:""
+		  },
+		  form17:{
+            completeBatchNo: ""
+		  },
+		  form18:{
+
+		  },
+		  form19:{
+            taskNodeId: "",
+		 },
+		  lineList: [{"name":"框体","value":"KT"},{"name":"舱体","value":"CT"},{"name":"保障中心","value":"BZ"}],
 		  typeList: [{"name":"全部","value":"0"},{"name":"FANUC","value":"1"},{"name":"HEIDENHAIN","value":"2"},{"name":"DMG","value":"3"},{"name":"HELLER","value":"4"}],
 	      tenantViewVisible: false,
 	      tableKey: 0,
@@ -449,14 +556,8 @@
         		{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
         	],
       	  },
-		 rules5: {
-        	startpointId: [
-        		{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
-        	],
-			endpointId: [
-        		{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
-        	],
-			zoneId: [
+		 rules5: {        	
+			line: [
         		{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
         	],
       	  },
@@ -498,6 +599,27 @@
 			],
 			targetNo: [
         		{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        	],
+		  },
+		  rules11: {
+			taskNodeId: [
+        		{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        	],
+			taskId: [
+				{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+			],
+			ip: [
+        		{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        	],
+		  },
+		  rules12: {
+			status:  [
+        		{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        	],
+		  },
+		  rules13: {
+			taskNodeId: [
+        		{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
         	],
 		  }
 		}
@@ -509,7 +631,7 @@
 	  	// 加载【字典】
 	  	initDicts(['NATION'], this.dicts);
 	  	// 加载列表数据
-	  	this.fetch()
+	  	//this.fetch()
 		},
 	  computed: {
 	    currentUser () {
@@ -767,12 +889,10 @@
 				}				
 			}); 
 		},
-		manualTask(){			
+		updateDeviceStatus(){			
 			this.$refs.form7.validate((valid) => {
-				if(valid){
-					this.form7.startpointId = this.form7.startpointId.toString()
-					this.form7.endpointId = this.form7.endpointId.toString()
-					toolbarApi.manualTask(this.form7).then(response=>{
+				if(valid){					
+					toolbarApi.updateDeviceStatus(this.form7).then(response=>{
 						const res = response.data
 						if(res.isSuccess){
 							this.$message({
@@ -865,6 +985,182 @@
 				}				
 			});
 		},
+		addMachineCallback(){
+			this.$refs.form15.validate((valid) => {
+				if(valid){
+					toolbarApi.addMachineCallback(this.form15).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.$message({
+              					message: this.$t('tips.updateSuccess'),
+              					type: 'success'
+            				})
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+					}).finally(()=>{
+					   return true		
+					})					
+				}else{
+					return false
+				}				
+			});
+		},
+		updateBizStatus(){
+			let  bool = this.form16.taskId!='' || this.form16.taskNodeId!=''
+			if(!bool) {
+				this.$message({
+              			message: "业务数据二选一不能都为空",
+              			type: 'warning'
+            	})
+				return false;
+			}
+			this.$refs.form16.validate((valid) => {
+				if(valid){
+					toolbarApi.updateBizStatus(this.form16).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.$message({
+              					message: this.$t('tips.updateSuccess'),
+              					type: 'success'
+            				})
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+					}).finally(()=>{
+					   return true		
+					})					
+				}else{
+					return false
+				}				
+			});
+		},
+		eraseWorkPiece(){
+			this.$refs.form17.validate((valid) => {
+				if(valid){
+					toolbarApi.eraseWorkPiece(this.form17).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.$message({
+              					message: this.$t('tips.updateSuccess'),
+              					type: 'success'
+            				})
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+					}).finally(()=>{
+					   return true		
+					})					
+				}else{
+					return false
+				}				
+			});
+		},
+		refreshXbk(){
+			this.$refs.form10.validate((valid) => {
+				if(valid){
+					toolbarApi.refreshXbk(this.form10).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.$message({
+              					message: this.$t('tips.updateSuccess'),
+              					type: 'success'
+            				})
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+					}).finally(()=>{
+					   return true		
+					})					
+				}else{
+					return false
+				}				
+			}); 
+		},
+		eraseWorkPiece(){
+			this.$refs.form17.validate((valid) => {
+				if(valid){
+					toolbarApi.eraseWorkPiece(this.form17).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.$message({
+              					message: this.$t('tips.updateSuccess'),
+              					type: 'success'
+            				})
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+					}).finally(()=>{
+					   return true		
+					})					
+				}else{
+					return false
+				}				
+			});
+		},
+		updateUnExeTask(){
+			this.$refs.form19.validate((valid) => {
+				if(valid){
+					toolbarApi.updateUnExeTask(this.form19).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.$message({
+              					message: this.$t('tips.updateSuccess'),
+              					type: 'success'
+            				})
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+					}).finally(()=>{
+					   return true		
+					})					
+				}else{
+					return false
+				}				
+			}); 
+		},
+		cleanCache(){			
+			this.$refs.form18.validate((valid) => {
+				if(valid){					
+					toolbarApi.cleanCache(this.form18).then(response=>{
+						const res = response.data
+						if(res.isSuccess){
+							this.$message({
+              					message: this.$t('tips.updateSuccess'),
+              					type: 'success'
+            				})
+						}else{
+							this.$message({
+              					message: res.msg,
+              					type: 'warning'
+            				})
+						}
+					}).finally(()=>{
+					   return true		
+					})					
+				}else{
+					return false
+				}				
+			});		
+		},
 		refreshPriority(){
 			this.$refs.form13.validate((valid) => {
 				if(valid){

+ 2 - 2
imcs-ui/src/views/zuihou/machiningClient/touchScreen/components/View1.vue

@@ -235,7 +235,7 @@ export default {
         });        
       },
 	  callRobot(){
-        machiningClientApi.getValidTrayCount({"clampNo": this.tenant.clampNo}).then((res) => {
+        machiningClientApi.getValidTrayCount({"clampNo": this.tenant.clampNo, "taskId": this.tenant.id}).then((res) => {
         	res = res.data
         	if (!res.isSuccess || res.data.length==0) {                
 				let msg = res.data.length==0? "没有可用的工装,请耐心等待": res.msg
@@ -245,7 +245,7 @@ export default {
 	      		})
 		 		return false	
 			}else{
-                this.callRobotFlag = false     	
+                this.callRobotFlag = false				    	
       			machiningClientApi.callRobot({ "taskNodeId" : this.tenant.taskNodeId, "callType":"1"}).then((res) => {
         			res = res.data
         			if (res.isSuccess) {

+ 1 - 1
imcs-ui/src/views/zuihou/machiningClient/touchScreen/components/View5.vue

@@ -248,7 +248,7 @@
         
       },
       callRobot(){        
-        machiningClientApi.getValidTrayCount({"clampNo": this.tenant.clampNo}).then((res) => {
+        machiningClientApi.getValidTrayCount({"clampNo": this.tenant.clampNo, "taskId": this.tenant.id}).then((res) => {
         	res = res.data
         	if (!res.isSuccess || res.data.length==0) {                
 				    let msg = res.data.length==0? "没有可替换的工装,请耐心等待": res.msg

+ 448 - 0
imcs-ui/src/views/zuihou/runManageCenter/mesNotice/Index.vue

@@ -0,0 +1,448 @@
+<template>
+  <div class="app-container">
+		<!-- 搜索模块 -->
+    <div class="filter-container">
+    	<span>
+    		<span>{{$t("lineSide.searchForm.name")}}:</span>
+    		<el-input v-model="queryParams.model.orderNo" :placeholder='$t("common.pleaseEnter")' style="width: 150px;" size="medium"/>
+    	</span>
+    	<span>
+    		<span>{{$t("resource.searchForm.startEndTime")}}:</span>
+    		<el-date-picker
+		      v-model="queryParams.timeRange"
+		      type="daterange"
+		      :picker-options="pickerOptions"
+		      :range-separator='$t("common.separator")'
+		      :start-placeholder='$t("common.startTime")'
+		      :end-placeholder='$t("common.endTime")'
+		      format="yyyy-MM-dd"
+			    value-format="yyyy-MM-dd"
+		      align="right">
+		    </el-date-picker>
+    	</span>
+    	<!--<span style="margin-left: 15px;">
+    		<span>{{$t("lineSide.common.type")}}:</span>
+    		<el-select v-model="queryParams.model.optType" :placeholder='$t("common.pleaseSelect")' size="medium" style="width: 150px;">
+        	<el-option
+			      v-for="item in audioStatus"
+			      :key="item.value"
+			      :label="item.label"
+			      :value="item.value">
+			    </el-option>
+      	</el-select>
+    	</span>-->
+      <span style="margin-left: 15px;">
+	      <el-button plain type="primary" icon="el-icon-search" size="medium" @click="search">
+	        {{ $t("table.search") }}
+	      </el-button>
+	      <el-button plain type="warning" icon="el-icon-refresh" size="medium" @click="reset">
+	        {{ $t("table.reset") }}
+	      </el-button>
+      </span>
+    </div>
+    
+    <!-- 功能按钮 -->
+    <el-row class="filter-container">
+    	<el-col>
+    		<el-button v-has-permission="['mesNotice:delete']" type="danger" icon="el-icon-delete" size="medium" @click="batchDelete">
+	        {{ $t("table.delete") }}
+	      </el-button>
+    		<el-button type="primary" icon="el-icon-plus" size="medium" @click="marking">{{ $t("developer.buttons.marking") }}</el-button>
+	      <!--<el-button type="success" icon="el-icon-edit" size="medium" @click="editOne">
+	        {{ $t("common.edit") }}
+	      </el-button>-->
+    	</el-col>
+    </el-row>
+	    
+		<!-- 列表数据 -->
+    <el-table
+      :key="tableKey"
+      ref="table"
+      v-loading="loading"
+      :data="tableData.records"
+      border
+      fit
+      row-key="id"
+      style="width: 100%;"
+      @selection-change="onSelectChange"
+      @cell-click="cellClick"
+    >
+    	<!-- 序号 -->
+    	<el-table-column :label='$t("common.serialNo")' width="55px" align="center">
+	      <template slot-scope="scope">
+	        <div>
+	          {{scope.$index+(queryParams.current - 1) * queryParams.size + 1}}
+	        </div>
+	      </template>
+      </el-table-column>
+      <!-- CheckBox -->
+      <el-table-column align="center" type="selection" width="50" :reserve-selection="true" />
+      <!-- 编码 -->
+      <el-table-column prop="orderNo" label='订单编号' :show-overflow-tooltip="true" width="160"></el-table-column>
+      <!-- 设备 -->
+      <el-table-column prop="buType" label='业务类型' width="120" >
+		<template slot-scope="{ row }">			
+			 <div v-for="item in buTypeList" :key="item.value" :value="item" >				
+			 <el-tag v-if="item.value == row.buType">{{ item.text }}</el-tag>
+			 </div>
+		  </template>
+	  </el-table-column>
+
+	  <el-table-column prop="apiType" label='接口类型' width="200" >
+		  <template slot-scope="{ row }">			
+			 <div v-for="item in apiTypeList" :key="item.value" :value="item" >				
+			 <el-tag v-if="item.value == row.apiType">{{ item.text }}</el-tag>
+			 </div>
+		  </template>
+	  </el-table-column>
+      <!-- 报警内容 -->
+      <el-table-column prop="lineCode"  label='产线编码' width="100"></el-table-column>
+      <!-- 报警时间 -->
+      <el-table-column prop="createTime" label='创建时间' width="160px"></el-table-column>
+      <!-- 是否需要人员处理 -->
+      <el-table-column prop="apiAddress" label='接口地址' align="center" width="200px"></el-table-column>
+      <!-- 处理状态 -->
+      <el-table-column prop="status" label='状态' align="center" width="120px">
+      	<template slot-scope="{ row }">
+      		    <el-tag v-if="row.status == '0'" type="failed">已处理</el-tag>
+	      	    <el-tag v-if="row.status == '1'" type="success">未处理</el-tag>
+					
+		</template>
+      </el-table-column>
+      <!-- 处理时间 -->
+      <el-table-column prop="updateTime" :label='$t("developer.table.warnLong.chuliTime")' width="160px">
+	     <template slot-scope="{ row }">
+	         <span v-if="row.status == '1'">{{row.updateTime}}</span>
+	     </template>
+	  </el-table-column>
+
+	  <el-table-column 	  		
+	       :label="$t('table.operation')"
+		   fixed="right"
+		    align="center"
+		    column-key="operation"
+		    width="85px">
+			<template slot-scope="{ row }">		        	
+				  <el-tooltip class="item" content='执行处理' effect="dark" placement="top-start" v-if="row.status=='1'">
+			          <i
+			            class="el-icon-bell table-operation"
+			            style="color: #87d068;"
+			            @click="marking(row)"
+			          />
+		          </el-tooltip>
+				  <el-tooltip class="item" content='页面跳转' effect="dark" placement="top-start" v-if="row.status=='0'">
+			          <i
+			            class="el-icon-bell table-operation"
+			            style="color: #87d068;"
+			            @click="redirect(row)"
+			          />
+		          </el-tooltip>
+		    </template>	
+	  </el-table-column>
+    </el-table>
+    <pagination
+      v-show="tableData.total > 0"
+      :limit.sync="queryParams.size"
+      :page.sync="queryParams.current"
+      :total="Number(tableData.total)"
+      @pagination="fetch"
+    />
+    <tenant-edit
+      ref="edit"
+      :dialog-visible="dialog.isVisible"
+      :title="dialog.title"
+      @close="editClose"
+      @success="editSuccess"
+    />
+    <tenant-view
+      ref="view"
+      :dialog-visible="tenantViewVisible"
+      @close="viewClose"
+    />
+    <el-dialog
+      v-el-drag-dialog
+      :close-on-click-modal="false"
+      :close-on-press-escape="true"
+      title="预览"
+      width="100%"
+      top="50px"
+	  customClass="customWidth"
+      :visible.sync="preview.isVisible"
+    >
+      <el-scrollbar>
+        <div v-html="preview.context" />
+      </el-scrollbar>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+	import Pagination from "@/components/Pagination"
+	import TenantEdit from "./components/Edit"
+	import TenantView from "./components/View"
+	// 【锁定记录、出入库记录】-API
+	//import lockingRecordApi from "@/api/lineSideLibrary/lockingRecord"
+	import mesNoticeApi from "@/api/runManageCenter/mesNotice"
+	import elDragDialog from '@/directive/el-drag-dialog'
+	import { convertEnum } from '@/utils/utils'
+	import { initDicts, initQueryParams } from '@/utils/commons'
+	export default {
+	  name: "InOutRecord",
+	  directives: { elDragDialog },
+	  components: { Pagination, TenantEdit, TenantView },
+	  props: {
+	  },
+	  data () {
+	    return {
+	    	audioStatus: [],
+	      dialog: {
+	        isVisible: false,
+	        title: ""
+	      },
+	      preview: {
+	        isVisible: false,
+	        context: ''
+	      },
+	      tenantViewVisible: false,
+	      tableKey: 0,
+	      queryParams: initQueryParams({}),
+	      selection: [],
+	      loading: false,
+	      tableData: {
+	        total: 0
+	      },
+	      dicts: {
+			API_TYPE: {}
+        },
+	      enums: {
+	        TenantTypeEnum: {},
+	        TenantStatusEnum: {}
+	      },
+	      pickerOptions: {
+          shortcuts: [{
+            text: '最近一周',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit('pick', [start, end]);
+            }
+          }, {
+            text: '最近一个月',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit('pick', [start, end]);
+            }
+          }, {
+            text: '最近三个月',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit('pick', [start, end]);
+            }
+          }]
+        }
+	    }
+	  },
+	  // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
+	  created() {
+	  	// 调用常量-审核状态
+	  	this.audioStatus = this.$constWKS.OPTTYPE
+	  	// 加载【字典】
+	  	initDicts(['API_TYPE','BU_TYPE'], this.dicts);		
+	  	// 加载列表数据
+	  	this.fetch()
+		},
+	  computed: {
+	    currentUser () {
+	      return this.$store.state.account.user
+	    },
+	    apiTypeList() {
+        return convertEnum(this.dicts.API_TYPE)
+        },
+		buTypeList() {
+        return convertEnum(this.dicts.BU_TYPE)
+        }
+	  },
+	  mounted () {
+	    
+	  },
+	  methods: {
+	    viewClose () {
+	      this.tenantViewVisible = false
+	    },
+	    editClose () {
+	      this.dialog.isVisible = false
+	    },
+	    editSuccess () {
+	      this.search()
+	    },
+	    onSelectChange (selection) {
+	      this.selection = selection
+	    },
+	    search () {
+	      this.fetch({
+	        ...this.queryParams
+	      })
+	    },
+	    reset () {
+	      this.queryParams = initQueryParams({})
+	      this.$refs.table.clearSort()
+	      this.$refs.table.clearFilter()
+	      this.search()
+	    },
+	    add () {
+	      this.$refs.edit.type = "add"
+	      this.$refs.edit.setTenant(false, this.dicts)
+	      this.dialog.title = this.$t("common.add")
+	      this.dialog.isVisible = true
+	    },
+	    singleDelete (row) {
+	      this.$refs.table.clearSelection()
+	      this.$refs.table.toggleRowSelection(row, true)
+	      this.batchDelete()
+	    },
+	    batchDelete () {
+	      if (!this.selection.length) {
+	        this.$message({
+	          message: this.$t("tips.noDataSelected"),
+	          type: "warning"
+	        })
+	        return
+	      }
+	
+	      this.$confirm(this.$t("developer.tips.wareTips"), this.$t("common.tips"), {
+	      	distinguishCancelAndClose: true,
+	        confirmButtonText: this.$t("common.confirm"),
+	        cancelButtonText: this.$t("common.cancel"),
+	        type: "warning"
+	      }).then(() => {
+	      	const ids = []
+		      this.selection.forEach(item => {
+		        ids.push(item.id)
+		      })
+		      this.delete(ids)
+	      }).catch(() => {})
+	    },
+	    clearSelections () {
+	      this.$refs.table.clearSelection()
+	    },
+		view(row){
+			this.$refs.view.setTenant(row)
+			this.tenantViewVisible = true
+		},
+		redirect(){
+
+		},
+		marking(){
+		   if (!this.selection.length) {
+	        this.$message({
+	          message: this.$t("tips.noDataSelected"),
+	          type: "warning"
+	        })
+	        return false
+	      }
+		    const ids = []
+		    this.selection.forEach(item => {
+		        ids.push(item.id)
+		    })
+		    this.updateStatus(ids)	      		
+		},
+		updateStatus(ids){		   
+			mesNoticeApi.updateStatus({ids: ids}).then(response => {
+			const res = response.data
+			if (res.isSuccess) {
+				this.$message({
+					message: '处理成功',
+					type: "success"
+				})
+				this.search()
+			}
+         })
+		},
+	    delete (ids) {
+			mesNoticeApi.remove({ ids: ids }).then(response => {
+	        const res = response.data
+	        if (res.isSuccess) {
+	          this.$message({
+	            message: this.$t("tips.deleteSuccess"),
+	            type: "success"
+	          })
+	          this.search()
+	          // 清理已经删除的数据
+	          this.$refs.table.clearSelection()
+	        }
+	      })
+	    },		
+	    // 【修改】表头上Btn-事件
+	    editOne() {
+	    	if (!this.selection.length) {
+	        this.$message({
+	          message: this.$t("tips.noDataSelected"),
+	          type: "warning"
+	        })
+	        return
+	      }
+	    	if (this.selection.length > 1) {
+	        this.$message({
+	          message: this.$t("tips.mustOne"),
+	          type: "warning"
+	        })
+	        return
+	      }
+	    	this.edit(this.selection[0]);
+	    },
+	    edit (row) {
+	      this.$refs.edit.setTenant(row, this.dicts)
+	      this.$refs.edit.type = "edit"
+	      this.dialog.title = this.$t("common.edit")
+	      this.dialog.isVisible = true
+	    },
+	    fetch (params = {}) {
+	      this.loading = true		  
+	      if (this.queryParams.timeRange) {
+	        this.queryParams.map.createTime_st = this.queryParams.timeRange[0]
+	        this.queryParams.map.createTime_ed = this.queryParams.timeRange[1]
+	      }
+		  let id = this.$route.query.id
+		  if(id!=null && id!=""){
+			this.queryParams.model.id = id
+		  }
+	
+	      this.queryParams.current = params.current ? params.current : this.queryParams.current
+	      this.queryParams.size = params.size ? params.size : this.queryParams.size
+	      // 固定参数:dataStatus = 1-入库/出库,2-解锁/锁定
+	      this.queryParams.model.status = '1'
+	      mesNoticeApi.page(this.queryParams).then(response => {
+	        const res = response.data
+	        if (res.isSuccess) {
+	          this.tableData = res.data
+	        }
+	        // eslint-disable-next-line no-return-assign
+	      }).finally(() => this.loading = false)
+	     
+	    },
+	    cellClick (row, column) {
+	      if (column['columnKey'] === "operation") {
+	        return
+	      }
+	      let flag = false
+	      this.selection.forEach((item) => {
+	        if (item.id === row.id) {
+	          flag = true
+	          this.$refs.table.toggleRowSelection(row)
+	        }
+	      })
+	
+	      if (!flag) {
+	        this.$refs.table.toggleRowSelection(row, true)
+	      }
+	    }
+	  }
+	}
+</script>
+<style lang="scss" scoped>
+</style>

+ 201 - 0
imcs-ui/src/views/zuihou/runManageCenter/mesNotice/components/Edit.vue

@@ -0,0 +1,201 @@
+<template>
+  <el-dialog 
+  	:close-on-click-modal="false" 
+  	:close-on-press-escape="false" 
+  	:title="title" 
+  	:append-to-body="true"
+  	:visible.sync="isVisible" 
+  	:width="width" 
+  	top="50px"
+  >
+    <el-form ref="form" :model="tenant" :rules="rules" label-position="right" label-width="130px">
+      <el-form-item :label='$t("lineSide.form.name")' prop="name">
+          <el-input v-model="tenant.name" :placeholder='$t("common.pleaseEnter")'/>
+      </el-form-item>
+      <el-form-item :label='$t("lineSide.form.status")' prop="status">
+        <template>
+				  <el-radio v-model="tenant.status" label="1">{{$t("common.show")}}</el-radio>
+				  <el-radio v-model="tenant.status" label="0">{{$t("common.hide")}}</el-radio>
+				</template>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button plain type="warning" @click="isVisible = false">{{ $t('common.cancel') }}</el-button>
+      <el-button plain type="primary" :disabled="confirmDisabled" @click="submitForm">{{ $t('common.confirm') }}</el-button>
+    </div>
+  </el-dialog>
+</template>
+<script>
+// 【仓库类型管理】-API
+import warehouseTypeMgrApi from "@/api/modelingCenter/warehouseTypeMgr"
+
+export default {
+  name: 'TenantEdit',
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      type: 'add',
+      tenant: this.initTenant(),
+      screenWidth: 0,
+      width: this.initWidth(),
+      confirmDisabled: false,
+      dicts:{
+        NATION: {}
+      },
+      roles: [],
+      rules: {
+        name: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  computed: {
+    isVisible: {
+      get () {
+        return this.dialogVisible
+      },
+      set () {
+        this.close()
+        this.reset()
+      }
+    }
+  },
+  mounted () {
+    window.onresize = () => {
+      return (() => {
+        this.width = this.initWidth()
+      })()
+    }
+  },
+  methods: {
+    initTenant () {
+      return {
+        id: '',
+        name: '',
+        status: '1'
+      }
+    },
+    initWidth () {
+      this.screenWidth = document.body.clientWidth
+      if (this.screenWidth < 991) {
+        return '90%'
+      } else if (this.screenWidth < 1400) {
+        return '45%'
+      } else {
+        return '800px'
+      }
+    },
+    setTenant (val, dicts) {
+    	if(val){
+    		this.tenant = { ...val }
+    	}
+      // 字典表
+      this.dicts = dicts
+    },
+    close () {
+      this.$emit('close')
+    },
+    reset () {
+      // 先清除校验,再清除表单,不然有奇怪的bug
+      this.$refs.form.clearValidate()
+      this.$refs.form.resetFields()
+      this.tenant = this.initTenant()
+    },
+    submitForm () {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.confirmDisabled = true
+          if (this.type === 'add') {
+            this.save()
+          } else {
+            this.update()
+          }
+        } else {
+          return false
+        }
+      })
+    },
+    save () {
+      warehouseTypeMgrApi.save(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.createSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+    update () {
+      warehouseTypeMgrApi.update(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.updateSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    }
+
+  }
+}
+</script>
+<style lang="scss" >
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 100px;
+  height: 100px;
+  line-height: 100px;
+  text-align: center;
+}
+.avatar {
+  width: 100px;
+  height: 100px;
+  display: block;
+}
+.checkUsed{
+	display: inline-block;
+	margin-left: 10px;
+	color: #1890ff;
+}
+</style>

+ 464 - 0
imcs-ui/src/views/zuihou/runManageCenter/mesNotice/components/View.vue

@@ -0,0 +1,464 @@
+<template>
+  <el-dialog
+    :title="$t(&quot;common.view&quot;)"
+    :width="width"
+    :append-to-body="true"
+    :visible.sync="isVisible"
+    class="tenant-view"
+  >
+  
+   <div style="height: 800px;">
+   
+  <el-tabs :tab-position="tabPosition" style="height: 800px">
+    <el-tab-pane label="基础信息">
+
+      <el-row :gutter="12">
+      <el-col :xs="24" :sm="24">
+        <div class="view-item">
+          <i class="el-icon-user" />
+          <span>节点名称</span>
+          <h3>{{ tenant.nodeNo }}</h3>
+        </div>
+      </el-col>      
+    </el-row>
+    <el-row :gutter="12">
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-trophy" />
+          <span>执行设备</span>
+          <h3>{{tenant.category == '1' ? tenant.resourceName :(tenant.category== '2'? 'AGV': (tenant.category== '3'? tenant.zoneName+'机器人':'其它设备'))}}
+          </h3>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-suitcase" />
+          <span>目标设备</span>
+          <h3>{{ tenant.resourceName }}</h3>
+        </div>
+      </el-col>     
+    </el-row>
+    <el-row  :gutter="12">
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-phone-outline" />
+          <span>操作状态</span>
+          <h3>指令{{tenant.exeStatus=='1'? "已发送":( tenant.exeStatus=='2'?'进行中':'已完成')}}</h3>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-phone-outline" />
+          <span>结果状态</span>
+          <h3>结果执行{{ tenant.exeResult=='1'?'成功':(tenant.exeResult=='0'?'失败':'响应超时') }}</h3>
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="12">
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-star-off" />
+          <span>异常反馈</span>
+          <h3>{{ tenant.feedback }}</h3>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-bangzhu" />
+          <span>当前工序</span>
+          <h3>{{ tenant.procedureName }}</h3>          
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="12">
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-time" />
+          <span>计划时间</span>
+          <h3>{{ dataList[1] && dataList[1].planTime||'无' }}</h3>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-brush" />
+          <span>执行时间</span>
+          <h3>{{ dataList[1] && dataList[1].actualTime || '无' }}</h3>
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="12">
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-time" />
+          <span>执行设备状态</span>
+          <h3>{{ dataList[1] && dataList[1].resourceStatus=="1"? "设备可用": "设备不可用" }}</h3>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-brush" />
+          <span>执行设备工作状态</span>
+          <h3>{{ dataList[1] && dataList[1].onlineStatus=="1"? "设备在线":(dataList[1] && dataList[1].onlineStatus=='0'?'离线':(dataList[1] && dataList[1].onlineStatus=='2')?'加工中':'报警') }}</h3>
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="18">
+      <el-col :xs="24" :sm="24">
+        <div class="view-item">
+          <i class="el-icon-date" />
+          <span>情况分析</span>         
+        </div>
+        <div class="view-item">
+          <el-alert v-if="tenant.exeResult=='0' && tenant.exeStatus=='1'" title="请求指令发送成功,执行设备操作未完成" type="error" :closable="false" effect="dark"> </el-alert>
+          <el-alert v-if="tenant.exeResult=='0' && tenant.exeStatus=='3'" title="执行设备操作已完成,但返回信号未确认成功" type="error" :closable="false" effect="dark"> </el-alert>
+          <el-alert v-if="tenant.exeResult==null" title="设备操作执行中返回信号中断或者丢弃" type="error" :closable="false" effect="dark"> </el-alert>
+          <el-alert v-if="dataList[1] && (dataList[1].resourceStatus=='0'|| dataList[1].onlineStatus=='3')" title="执行设备状态异常,请检查设备是否故障" type="error" :closable="false" effect="dark"> </el-alert>
+
+          <el-alert v-if="dataList[1] && dataList[1].onlineStatus=='0'" title="执行设备工作状态异常,请检查设备是否在线" type="error" :closable="false" effect="dark"> </el-alert>
+
+          <el-alert v-if="dataList[1] && dataList[1].onlineStatus=='2'" title="执行设备正在工作中,请耐心等待资源释放" type="warning" :closable="false" effect="dark"> </el-alert>
+
+        </div>
+      </el-col>      
+    </el-row>
+
+    </el-tab-pane>
+    <el-tab-pane label="关联信息">      
+      <el-card class="box-card">
+        <div slot="header" class="clearfix">
+            <span>前序节点</span>
+            <el-button style="float: right; padding: 3px 0" type="text"></el-button>
+        </div>
+        <div class="text item">
+          <el-row :gutter="12" >
+              <el-col :xs="24" :sm="8"  v-for="(key, index) in keys" :key="index">
+                <div class="view-item">
+                   <span>{{ key.value }}</span>  
+                   <h3>{{ dataList[0] && dataList[0][key.name]|| '无' }}</h3>
+                </div>                   
+              </el-col>
+              <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-phone-outline" />
+          <span>操作状态</span>
+          <h3>指令{{dataList[0] && dataList[0].exeStatus=='1'? "已发送":(dataList[0] && dataList[0].exeStatus=='2'?'进行中':'已完成')}}</h3>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-phone-outline" />
+          <span>结果状态</span>
+          <h3>结果执行{{dataList[0] && dataList[0].exeResult=='1'?'成功':(dataList[0] && dataList[0].exeResult=='0'?'失败':'响应超时') }}</h3>
+        </div>
+      </el-col>
+                
+          </el-row>
+       </div>
+      </el-card>      
+      <el-card class="box-card">
+        <div slot="header" class="clearfix">
+            <span>后序节点</span>
+            <el-button style="float: right; padding: 3px 0" type="text"></el-button>
+        </div>
+        <div class="text item">
+          <el-row :gutter="12" >
+              <el-col :xs="24" :sm="8"  v-for="(key, index) in keys" :key="index">
+                <div class="view-item">
+                   <span>{{ key.value }}</span>  
+                   <h3>{{ dataList[2] && dataList[2][key.name] || '无' }}</h3>
+                </div>                   
+              </el-col>
+              <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-phone-outline" />
+          <span>操作状态</span>
+          <h3>指令{{dataList[2] && dataList[2].exeStatus=='1'? "已发送":( dataList[2] && dataList[2].exeStatus=='2'?'进行中':'已完成')}}</h3>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-phone-outline" />
+          <span>结果状态</span>
+          <h3>结果执行{{ dataList[2] && dataList[2].exeResult=='1'?'成功':(dataList[2] && dataList[2].exeResult=='0'?'失败':'响应超时') }}</h3>
+        </div>
+      </el-col>  
+          </el-row>
+       </div>
+      </el-card>
+      <el-card class="box-card">
+        <div slot="header" class="clearfix">
+            <span>资源占用</span>
+            <el-button style="float: right; padding: 3px 0" type="text"></el-button>
+        </div>
+        <div class="text item" v-if="storageNodeList.data">
+          <el-row :gutter="12" >
+               <el-col :xs="24" :sm="8"  v-for="(taskNode, index) in storageNodeList.data" :key="index">
+                <div class="view-item">
+                   <span>占位节点及设备名</span>  
+                   <h3>{{ taskNode.nodeNo }}/ {{ taskNode.resourceName }}</h3>
+                </div>                   
+              </el-col>
+          </el-row>
+        </div>
+        <div class="text item" v-else><h3>执行设备未处于锁定状态中</h3></div>
+      </el-card>
+    </el-tab-pane>
+    <el-tab-pane label="解决策略">
+      <el-card class="box-card">
+        <div slot="header" class="clearfix">
+            <span>解决步骤</span>
+            <el-button style="float: right; padding: 3px 0" type="text"></el-button>
+        </div>
+        <div class="text item">
+          <el-steps :active="active" direction="vertical">
+            <el-step class="offset" title="准备工作" @click.native="clickStep(1)" description="查看节点以及前序节点状态,检查硬件是否正常工作"></el-step>
+            <el-step class="offset" title="切换手动"  @click.native="clickStep(2)" description="切换到手动模式(防止其它干扰因素的影响)"></el-step>
+            <el-step class="offset" title="命令处理" @click.native="clickStep(3)" description="依据指令的状态来考虑是否重发指令或是手动验证设备反馈"></el-step>
+            <el-step class="offset" title="切换自动" @click.native="clickStep(4)" description="节点异常问题解决,重新切换回自动状态"></el-step>
+          </el-steps>
+        </div>
+      </el-card>
+      <el-card class="box-card">
+        <div slot="header" class="clearfix">
+            <span>数据接口</span>
+            <el-button style="float: right; padding: 3px 0" type="text"></el-button>
+        </div>
+        <div class="text item">
+          <el-row :gutter="12" >
+            <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-time" />
+          <span>日志ID</span>
+          <el-input v-model="logId" :placeholder="tenant.id"></el-input>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-brush" />
+          <span>回调ID</span>
+          <el-input v-model="callbackId"  :placeholder="dataList[1]?dataList[1].taskNodeId:''"></el-input>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-brush" />
+          <span>设备ID</span>
+          <el-input v-model="deviceId" :placeholder="dataList[1]?dataList[1].deviceId:''"></el-input>
+        </div>
+      </el-col>      
+       <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-time" />
+          <span>指令重发</span>
+          <div class="btn">
+            <el-button type="primary" icon="el-icon-edit" :disabled="confirmDisabled" @click="resend(this.logId)">重发指令</el-button>
+          </div>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-brush" />
+          <span>校验回调</span>
+          <div class="btn">
+            <el-button type="primary" icon="el-icon-edit" :disabled="confirmDisabled" @click="nodeCallback(this.callbackId)">检验回调</el-button>
+          </div>  
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="8">
+        <div class="view-item">
+          <i class="el-icon-brush" />
+          <span>释放锁定设备</span>
+          <div class="btn">
+            <el-button type="primary" icon="el-icon-edit" :disabled="confirmDisabled" @click="freeLock(this.deviceId)">释放设备</el-button>
+          </div>
+        </div>
+      </el-col>
+      </el-row>
+    </div>
+  </el-card>
+      <el-card class="box-card">
+        <div slot="header" class="clearfix">
+            <span>求助</span>
+            <el-button style="float: right; padding: 3px 0" type="text"></el-button>
+        </div>
+        <div class="text item">
+             问题仍未解决,求助专业人员处理 
+        </div>
+      </el-card>  
+    </el-tab-pane>
+  </el-tabs>
+
+
+  </div>
+  </el-dialog>
+</template>
+<script>
+import warnLogApi from "@/api/lineSideLibrary/warnLog"
+export default {
+  name: 'TenantView',
+  filters: {
+    passwordErrorLockTimeFilter (time) {
+      if (time === '0') {
+        return '当天23点59分'
+      }
+      return time
+    }
+  },
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false
+    },
+    width: {
+      type: String,
+      default: '70%'
+    }
+  },
+  data () {
+    return {      
+      screenWidth: 0,      
+      active: 1,
+      dataList: [], 
+      storageNodeList:[],
+      confirmDisabled: false,
+      taskNodeId: '',
+      deviceId: '',
+      logId:'',
+      callbackId: '',
+      keys: [{name:'nodeName', value:'节点名称'},{name:'resourceDesc', value:'执行设备'},{name:'overtimeStatus', value:'是否超时'},{name:'procedureDesc', value:'工序名称'},{name:'targetResourceDesc', value:'目标设备'},{name:'planTime', value:'计划时间'},{name:'actualTime', value:'执行时间'}],
+      //robotNodes:[{label:'舱体线机器人',value:"1"},{label:'伺服舵机',value:"2"},{label:'框体线机器人',value:"3"}], 
+      tabPosition: 'left',
+      tenant: {
+       
+      }
+    }
+  },
+  computed: {
+    isVisible: {
+      get () {
+        return this.dialogVisible
+      },
+      set () {
+        this.close()
+      }
+    }
+  },
+  mounted () {
+    window.onresize = () => {
+      return (() => {
+        this.width = this.initWidth()
+      })()
+    }
+  },
+  methods: {
+    initWidth () {
+      this.screenWidth = document.body.clientWidth
+      if (this.screenWidth < 550) {
+        return '95%'
+      } else if (this.screenWidth < 990) {
+        return '580px'
+      } else if (this.screenWidth < 1400) {
+        return '600px'
+      } else {
+        return '650px'
+      }
+    },
+    setTenant (val) {
+      this.tenant = { ...val }
+      console.log(this.tenant)
+      this.taskNodeId = this.tenant.taskNodeId
+      this.callbackId = this.tenant.taskNodeId 
+      this.logId = this.tenant.id      
+      this.fetch()
+    },
+    fetch(){      
+        warnLogApi.connected({id: this.tenant.taskNodeId}).then(response => {
+	        const res = response.data
+	        if (res.isSuccess) {
+	          this.dataList = res.data
+            this.deviceId = this.dataList[1]? this.dataList[1].deviceId : ''
+            console.log(this.dataList[1])
+            if(this.deviceId!=''){
+              warnLogApi.getStorageNode({resourceId: this.dataList[1].deviceId}).then(response => {
+	                const res = response.data
+	               if (res.isSuccess) {
+	                  this.storageNodeList = res.data
+                    console.log(this.storageNodeList)
+	               }	        
+	            })
+            }
+	        }	        
+	      }).finally(() => this.loading = false)       
+       
+    },
+    close () {
+      this.$emit('close')
+    },
+    clickStep(e){
+      if(e != '' || e != null){ this.active = e }
+    },
+    resend(logId){
+      this.confirmDisabled = true
+      warnLogApi.resend({id: logId}).then(response => {
+			const res = response.data
+			if (res.isSuccess) {
+				this.$message({
+					message: '重发成功',
+					type: "success"
+				})
+				this.fetch()
+			}
+     }).finally(()=>{
+       this.confirmDisabled = false
+     }) 
+    },
+    nodeCallback(callbackId){
+      this.confirmDisabled = true
+      warnLogApi.nodeCallback({id: callbackId}).then(response => {
+			const res = response.data
+			if (res.isSuccess) {
+				this.$message({
+					message: '回调验证成功',
+					type: "success"
+				})
+				this.fetch()
+			}
+     }).finally(()=>{
+       this.confirmDisabled = false
+     })
+    },
+    freeLog(deviceId){
+      
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.tenant-view {  
+  .img-wrapper {
+    text-align: center;
+    margin-top: -1.5rem;
+    margin-bottom: 10px;
+    img {
+      width: 4rem;
+      border-radius: 50%;
+    }
+  }
+  .view-item {
+    margin: 7px;
+    i {
+      font-size: 0.97rem;
+    }
+    span {
+      margin-left: 5px;
+    }
+  }
+  .offset{
+    margin:5px 0; 
+  } 
+  .btn {
+    text-align: center;
+    margin-top: 10px;
+  }
+}
+</style>

+ 302 - 0
imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/DetailConf.vue

@@ -0,0 +1,302 @@
+<template>
+  <el-dialog 
+  	:close-on-click-modal="false" 
+  	:close-on-press-escape="false" 
+  	:title="title" 
+  	:append-to-body="true"
+  	:visible.sync="isVisible" 
+  	width="550px" 
+  	top="50px"
+  >
+    <el-form ref="form" :model="tenant" :rules="rules" label-position="right" label-width="130px"  :disabled="formDisabled">
+    	<!-- 包含CNC程序 -->
+    	<el-form-item :label='$t("dispatch.detailConf.hasMaterial")+":"' prop="hasMaterial">
+        <template>
+				  <el-radio v-model="tenant.hasMaterial" label="1">{{$t("common.yes")}}</el-radio>
+				  <el-radio v-model="tenant.hasMaterial" label="0">{{$t("common.no")}}</el-radio>
+				</template>
+      </el-form-item>
+      <!-- 包含刀具库 -->
+      <el-form-item :label='$t("dispatch.detailConf.isMachine")+":"' prop="isMachine">
+        <template>
+				  <el-radio v-model="tenant.isMachine" label="1">{{$t("common.yes")}}</el-radio>
+				  <el-radio v-model="tenant.isMachine" label="0">{{$t("common.no")}}</el-radio>
+				</template>
+      </el-form-item>
+      <!-- 具备进度条 -->
+      <el-form-item :label='$t("dispatch.detailConf.isXbk")+":"' prop="isXbk">
+        <template>
+				  <el-radio v-model="tenant.isXbk" label="1">{{$t("common.yes")}}</el-radio>
+				  <el-radio v-model="tenant.isXbk" label="0">{{$t("common.no")}}</el-radio>
+				</template>
+      </el-form-item>
+      <!-- 具备状态 
+      <el-form-item :label='$t("resource.searchForm.isStatus")+":"' prop="showStatus">
+        <template>
+				  <el-radio v-model="tenant.showStatus" label="1">{{$t("common.yes")}}</el-radio>
+				  <el-radio v-model="tenant.showStatus" label="0">{{$t("common.no")}}</el-radio>
+				</template>
+      </el-form-item>       
+      <el-form-item :label='$t("resource.searchForm.isProStaus")+":"' prop="productionLineControl">
+        <template>
+				  <el-radio v-model="tenant.productionLineControl" label="1">{{$t("common.yes")}}</el-radio>
+				  <el-radio v-model="tenant.productionLineControl" label="0">{{$t("common.no")}}</el-radio>
+				</template>
+      </el-form-item> -->      
+      <el-form-item :label='$t("dispatch.detailConf.start")+":"' prop="start">
+      	   <el-tooltip content="例如:BZ_361" placement="top">
+              <el-input v-model="tenant.start" placeholder="起始库位"></el-input>
+					</el-tooltip>
+      </el-form-item>
+      <!-- 临近保养-小时(不派任务) -->
+      <el-form-item :label='$t("dispatch.detailConf.goal")+":"' prop="goal">
+           <el-tooltip content="例如:KT_130" placement="top">
+                <el-input  v-model="tenant.goal" placeholder="目的库位"></el-input>
+						</el-tooltip>
+      </el-form-item>
+       <!-- 是否工序节点 
+      <el-form-item :label='$t("resource.searchForm.isAutoCode")+":"' prop="productionLineControl">
+        <template>
+				  <el-radio v-model="tenant.isAutoCode" label="1">{{$t("common.yes")}}</el-radio>
+				  <el-radio v-model="tenant.isAutoCode" label="0">{{$t("common.no")}}</el-radio>
+				</template>
+      </el-form-item>
+      <!-- 是否显示 
+      <el-form-item :label='$t("resource.common.displayStatus")+":"' prop="displayStatus">
+        <template>
+				  <el-radio v-model="tenant.displayStatus" label="1">{{$t("common.yes")}}</el-radio>
+				  <el-radio v-model="tenant.displayStatus" label="0">{{$t("common.no")}}</el-radio>
+				</template>
+      </el-form-item> -->
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button plain type="warning" @click="isVisible = false">{{ $t('common.cancel') }}</el-button>
+      <el-button plain type="primary" :disabled="confirmDisabled" @click="submitForm">{{ $t('common.confirm') }}</el-button>
+    </div>
+  </el-dialog>
+</template>
+<script>
+
+// 【自定义订单配置】-API
+import orderTaskMgrApi from "@/api/runManageCenter/orderTaskMgr"
+
+export default {
+  name: 'TenantEdit',
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      type: 'add',
+      tenant: this.initTenant(),
+      screenWidth: 0,
+      width: this.initWidth(),
+      confirmDisabled: false,
+      dicts:{
+        NATION: {}
+      },
+      roles: [],
+      rules: {
+        hasMaterial: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ],
+        isMachine: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ],
+        isXbk: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ],
+        showStatus: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ],
+        productionLineControl: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'change' }
+        ],
+        start: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ],
+        goal: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  computed: {
+    formDisabled(){      
+  		if(this.type == "view"){
+  			this.confirmDisabled = true
+  			return true
+  		}else{
+  			this.confirmDisabled = false
+  			return false
+  		}
+  	},
+    isVisible: {
+      get () {
+        return this.dialogVisible
+      },
+      set () {
+        this.close()
+        this.reset()
+      }
+    }
+  },
+  mounted () {
+    window.onresize = () => {
+      return (() => {
+        this.width = this.initWidth()
+      })()
+    }
+  },
+  methods: {
+    initTenant () {
+      return {
+        id: '',
+        hasMaterial: '1',
+        isXbk:'1',
+        isMachine: '1',
+        start: '',
+        goal: ''
+      }
+    },
+    initWidth () {
+      this.screenWidth = document.body.clientWidth
+      if (this.screenWidth < 991) {
+        return '90%'
+      } else if (this.screenWidth < 1400) {
+        return '45%'
+      } else {
+        return '800px'
+      }
+    },
+    setTenant (val, dicts) {
+    	if(val){
+    		// this.tenant = { ...val }
+    		// 查询表单数据
+    		this.getFormData(val)                
+    	}
+      // 字典表
+      this.dicts = dicts
+    },
+    getFormData(obj){      
+    	orderTaskMgrApi.get({orderId: obj.id}).then(res => {
+    		res = res.data
+    		// console.log("虎丘的数据:", res)
+    		if(res.isSuccess){
+    			// 如果查询到数据
+    			if(res.data){
+    				this.tenant = res.data
+    			}else{
+    				// 如果没有查询到数据,就是【新增】
+    				this.type="add"
+    				this.tenant.orderId = obj.id
+    			}
+    		}
+    		
+    	})
+    },
+    close () {
+      this.$emit('close')
+    },
+    reset () {
+      // 先清除校验,再清除表单,不然有奇怪的bug
+      this.$refs.form.clearValidate()
+      this.$refs.form.resetFields()
+      this.tenant = this.initTenant()
+    },
+    submitForm () {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.confirmDisabled = true
+          if (this.type === 'add') {
+            this.save()
+          } else {
+            this.update()
+          }
+        } else {
+          return false
+        }
+      })
+    },
+    save () {
+      orderTaskMgrApi.save(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.createSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+    update () {
+      console.log(this.tenant)
+      orderTaskMgrApi.update(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.updateSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    }
+
+  }
+}
+</script>
+<style lang="scss" >
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 100px;
+  height: 100px;
+  line-height: 100px;
+  text-align: center;
+}
+.avatar {
+  width: 100px;
+  height: 100px;
+  display: block;
+}
+.checkUsed{
+	display: inline-block;
+	margin-left: 10px;
+	color: #1890ff;
+}
+</style>

+ 826 - 0
imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/Edit.vue

@@ -0,0 +1,826 @@
+<template>
+  <el-dialog
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :title="title"
+    :append-to-body="true"
+    :visible.sync="isVisible"
+    width="950px"
+    top="50px"
+  >
+    <el-form
+      ref="form"
+      :disabled="formDisabled"
+      :model="tenant"
+      :rules="rules"
+      label-position="right"
+      label-width="100px"
+    >
+    	<!--订单名称-->
+      <el-form-item :label="$t(&quot;runCenter.form.orderName&quot;)+&quot;:&quot;" prop="orderName">
+        <el-input v-model="tenant.orderName" :placeholder='$t("common.pleaseEnter")' style="width: 50%;"/>
+      </el-form-item>
+      <!-- 所属产线 -->
+      <el-form-item
+        :label="$t(&quot;runCenter.form.zoneId&quot;)+&quot;:&quot;"
+        prop="zoneId"
+      >
+        <el-select
+          v-model="tenant.zoneId"
+          :placeholder="$t(&quot;common.pleaseSelect&quot;)"
+          style="width: 50%;"
+        >
+          <el-option
+            v-for="item in zoneList"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
+      <!-- 交付时间 -->
+      <el-form-item
+        :label="$t(&quot;runCenter.form.deliveryTime&quot;)+&quot;:&quot;"
+        prop="deliveryTime"
+      >
+        <el-date-picker
+          v-model="tenant.deliveryTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          :placeholder="$t(&quot;common.pleaseSelect&quot;)"
+          :picker-options="pickerOptions"
+          style="width: 50%;"
+          :readonly="true"
+        />
+      </el-form-item>
+      <!-- 下单时间 -->
+      <el-form-item
+        :label="$t(&quot;runCenter.form.orderTime&quot;)+&quot;:&quot;"
+        prop="orderTime"
+      >
+        <el-date-picker
+          v-model="tenant.orderTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          :placeholder="$t(&quot;common.pleaseSelect&quot;)"
+          :picker-options="pickerOptions"
+          style="width: 50%;"
+          :readonly="true"
+        />
+      </el-form-item>
+      <!-- 启用状态 -->
+      <el-form-item
+        :label="$t(&quot;runCenter.form.status&quot;)+&quot;:&quot;"
+        prop="status"
+      >
+        <template>
+          <el-radio
+            v-model="tenant.status"
+            label="1"
+          >
+            {{ $t("common.show") }}
+          </el-radio>
+          <el-radio
+            v-model="tenant.status"
+            label="0"
+          >
+            {{ $t("common.hide") }}
+          </el-radio>
+        </template>
+      </el-form-item>
+      <el-form-item
+        label="包含零件:"
+        prop="hasMaterial"
+      >
+        <template>          
+        <el-radio-group v-model="tenant.hasMaterial" @change="switchMaterial">
+            <el-radio label="1" >{{ $t("common.yes") }}</el-radio>
+            <el-radio label="0" >{{ $t("common.no") }}</el-radio>
+        </el-radio-group>
+        </template>
+      </el-form-item>
+      
+      <!-- 零件 -->
+      <el-form-item
+        :label="$t(&quot;runCenter.form.lingjian&quot;)+&quot;:&quot;"
+        v-show="this.show"
+        prop="product"
+      >
+        <el-button
+          type="primary"
+          :disabled="type == 'view' ? true : false"
+          icon="el-icon-plus"
+          size="small"
+          circle
+          @click="add"
+        />
+      </el-form-item>
+
+      <!-- Table数据 -->
+      <el-table
+        ref="table"
+        :data="tableData"
+        border
+        fit
+        style="width: 100%;"
+        v-show="this.show"
+      >
+      	<!-- 零部件编号 -->
+        <el-table-column
+          prop="partsNo"
+          :label="$t(&quot;runCenter.table.orderSldPro.partsNo&quot;)"
+          align="center"
+          :show-overflow-tooltip="true"
+          width="120px"
+        >
+          <template slot-scope="{ row }">
+            <span>{{ row.partsNo }}</span>
+          </template>
+        </el-table-column>
+        <!-- 产品代号 -->
+        <el-table-column
+          prop="bomAlias"
+          :label="$t(&quot;runCenter.table.orderSldPro.bomAlias&quot;)"
+          align="center"
+          :show-overflow-tooltip="true"
+          width="100px"
+        />
+        <!-- 零件名称 -->
+        <el-table-column
+          prop="bomName"
+          :label="$t(&quot;runCenter.table.orderSldPro.name&quot;)"
+          align="center"
+          width="100px"
+        >
+	        <template slot-scope="{ row }">
+			      {{ row.name || row.bomName }}
+					</template>
+        </el-table-column>
+
+        <!-- 零件代号 -->
+        <el-table-column
+          prop="partsAlias"
+          :label="$t(&quot;runCenter.table.orderSldPro.partsAlias&quot;)"
+          align="center"
+          width="100px"
+        />
+        <!-- 零件批号 -->
+        <!--<el-table-column
+          prop="brand"
+          :label="$t(&quot;runCenter.table.orderSldPro.brand&quot;)"
+          align="center"
+          width="100px"
+        />-->
+        <!-- 原料炉批号 -->
+        <el-table-column
+          prop="furnaceBatchNo"
+          label="原料炉批号"
+          align="center"
+          width="150px"
+        >
+         <template slot="header">			   
+			    <span>原料炉批号</span>
+			    <span class="star">*</span>	 
+			   </template>  
+        	<template slot-scope="{ row }">
+			      <div style="color: #42d885;cursor: pointer;" @click="changeMetral(row)">
+			      	<span v-if="row.furnaceBatchNo">{{ row.furnaceBatchNo }}</span>
+			      	<a v-else>请选择</a>
+			      </div>
+					</template>
+        </el-table-column>
+
+        <!-- 数量 -->
+        <el-table-column
+          prop="bomNum"
+          :label="$t(&quot;runCenter.table.orderSldPro.bomNum&quot;)"
+          width="150px"
+          align="center"
+        >
+         <template slot="header">			   
+			   <span>{{$t("runCenter.table.orderSldPro.bomNum")}}</span>
+			   <span class="star">*</span>	 
+			   </template> 
+          <template slot-scope="{ row }">
+            <el-input-number
+              v-model="row.bomNum"
+              :min="1"
+              :max="999999999"
+              :label="$t(&quot;common.pleaseEnter&quot;)"
+              size="small"
+              :readonly="true"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="deliveryTime"
+          :label="$t(&quot;runCenter.table.orderSldPro.deliveryTime&quot;)"
+          width="220px"
+          align="center"
+        >
+          <template slot="header">			   
+			     <span>{{$t("runCenter.table.orderSldPro.deliveryTime")}}</span>
+			     <span class="star">*</span>	 
+			    </template>
+          <template slot-scope="{ row }">
+            <el-date-picker
+              v-model="row.deliveryTime"
+              type="date"
+              value-format="yyyy-MM-dd"
+              size="small"
+              :placeholder="$t(&quot;common.pleaseSelect&quot;)"
+              :picker-options="pickerOptions"
+              style="width: 100%;"   
+              :readonly="true"           
+            />
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="remark"
+          :label="$t(&quot;common.remark&quot;)"
+          :show-overflow-tooltip="true"
+          width="180px"
+          align="center"
+        >
+          <template slot-scope="{ row }">
+            <el-input
+              v-model="row.remark"
+              size="small"
+              :label="$t(&quot;common.pleaseEnter&quot;)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-if="type != 'view'"
+          :label="$t('table.operation')"
+          fixed="right"
+          align="center"
+          column-key="operation"
+          width="60px"
+        >
+          <template slot-scope="{ row }">
+            <!--<el-tooltip class="item" :content='$t("common.edit")' effect="dark" placement="top-start">
+			          <i
+			            class="el-icon-edit table-operation"
+			            style="color: #2db7f5;"
+			            @click="edit(row)"
+			          />
+			        </el-tooltip>-->
+            <el-tooltip
+              class="item"
+              :content="$t(&quot;common.delete&quot;)"
+              effect="dark"
+              placement="top-start"
+            >
+              <i
+                class="el-icon-delete table-operation"
+                style="color: #f50;"
+                @click="domDelete(row)"
+              />
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+    <div
+      slot="footer"
+      class="dialog-footer"
+    >
+      <el-button
+        plain
+        type="warning"
+        @click="isVisible = false"
+      >
+        {{ $t('common.cancel') }}
+      </el-button>
+      <el-button
+        plain
+        type="primary"
+        :disabled="confirmDisabled"
+        @click="submitForm"
+      >
+        {{ $t('common.confirm') }}
+      </el-button>
+    </div>
+
+    <!-- 选择数据的组件 -->
+    <select-table
+      ref="edit"
+      :dialog-visible="dialog.isVisible"
+      :title="dialog.title"
+      @close="editClose"
+      @success="editSuccess"
+    />
+
+    <!-- 选择数据的组件 -->
+    <meterial-select
+      ref="meterial"
+      :dialog-visible="dialogMeterial.isVisible"
+      :title="dialogMeterial.title"
+      @close="editMeterialClose"
+      @success="editMeterialSuccess"
+    />
+
+  </el-dialog>
+</template>
+<script>
+	// 日期格式化组件
+	import moment from 'moment'
+	// 选择【新增】组件
+	import SelectTable from "./Select"
+	// 选择【原料炉批号】组件
+	import MeterialSelect from "./MeterialSelect"
+	// 【客户管理】-API
+	import customerMgrApi from "@/api/basicConfiguration/customerMgr"
+  //【所属产线】-API
+  import areaMgrApi from "@/api/resourceProductMgr/areaMgr"
+	// 【订单管理】-API
+	import orderMgrApi from "@/api/runManageCenter/orderMgr"
+	// 【订单明细】-API
+	import orderDetailApi from "@/api/runManageCenter/orderDetail"
+	import { arrReduce } from '@/utils/commons'
+export default {
+  name: 'TenantEdit',
+  components: { SelectTable, MeterialSelect },
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    let validateExsit = (rule, value, callback) => {
+      //后台方法
+      if(this.type=="edit" && value === this.oldName){
+        return callback()
+      }
+      this.checkExist(value).then(res => {
+        res = res.data               
+        if (res && res.data) {         
+          callback(new Error('名称已存在'))
+        }else{
+          callback()
+        }
+      })
+    }
+    return {
+      type: 'add',
+      tenant: this.initTenant(),
+      screenWidth: 0,
+      width: this.initWidth(),
+      confirmDisabled: false,
+      oldName: '',
+      show: true,      
+      dialog: {
+        isVisible: false,
+        title: ""
+      },
+      dialogMeterial: {
+        isVisible: false,
+        title: ""
+      },
+      customList: [],
+      currRow: {}, // 当前选择的Row
+      zoneList: [],
+      tableData: [],
+      dicts:{
+        NATION: {}
+      },
+      roles: [],
+      pickerOptions: {
+        disabledDate: (time) => {
+          return time.getTime() < Date.now() - 86400000;
+        },
+      },
+      rules: {
+        orderName: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' },
+          { validator: validateExsit, trigger: 'blur'}
+        ],
+        zoneId: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ],
+        deliveryTime: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'change' }
+        ],
+        orderTime: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'change' }
+        ],
+        status: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'change' }
+        ]
+      }
+    }
+  },
+  computed: {
+  	formDisabled(){
+  		if(this.type == "view"){
+  			this.confirmDisabled = true
+  			return true
+  		}else{
+  			this.confirmDisabled = false
+  			return false
+  		}
+  	},
+    isVisible: {
+      get () {
+      	// 清空数据
+      	this.tableData = [];
+        return this.dialogVisible
+      },
+      set () {
+        this.close()
+        this.reset()
+      }
+    }
+  },
+  // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
+  created() {
+  	// 加载客户列表数据
+  	this.customerList()
+    this.getZoneList()
+	},
+  mounted () {
+    window.onresize = () => {
+      return (() => {
+        this.width = this.initWidth()
+      })()
+    }
+  },
+  methods: {
+    switchMaterial(val){          
+      if(val =='1'){
+        this.show = true;  
+      }else{
+        this.show = false;
+      }
+    },
+  	// 【原料炉批号】点击-事件
+  	changeMetral(row) {
+  		// 当前选择的行。row
+  		this.currRow = row;
+      row.bomNum = 1
+      row.deliveryTime = moment(new Date()).format('YYYY-MM-DD')
+  		this.$refs.meterial.type = "edit";
+  		this.$refs.meterial.setTenant(row);
+      this.dialogMeterial.title = "选择原料炉批号";
+      this.dialogMeterial.isVisible = true;
+  	},
+
+  	// 【原料炉批号-修改】弹出框,关闭
+  	editMeterialClose () {
+      this.dialogMeterial.isVisible = false
+    },
+
+    // 【原料炉批号-修改】弹出框,确定事件
+    editMeterialSuccess (obj) {
+    	console.log("【原料炉批号-修改】: ", obj);
+    	let arr = [];
+    	this.tableData.map(item => {
+    		if(item.id == this.currRow.id) {
+    			// 赋值,原料炉批号
+    			item.furnaceBatchNo = obj.furnaceBatchNo;
+    			// 带入参数
+    			item.meterialReceiveId = obj.id;
+    		}
+    		arr.push(item);
+    	})
+    	// 赋值
+    	this.tableData = arr;
+    },
+
+  	// 【删除】按钮-事件
+  	domDelete(row){
+  		this.$confirm(this.$t("tips.comTips"), this.$t("common.tips"), {
+      	distinguishCancelAndClose: true,
+        confirmButtonText: this.$t("common.confirm"),
+        cancelButtonText: this.$t("common.cancel"),
+        type: "warning"
+      }).then(() => {
+      	// 过滤我们需要的数据
+	  		let list = this.tableData.filter(item => item.id != row.id)
+	  		// 重新赋值
+	  		this.tableData = list
+      }).catch(() => {})
+
+  	},
+
+  	// 【新增-修改】弹出框,关闭
+  	editClose () {
+      this.dialog.isVisible = false
+    },
+
+    // 【新增-修改】弹出框,确定事件
+    editSuccess (arr) {
+    	// 清除备注
+    	arr.forEach(item => {
+    		item.remark = "";
+    	});
+    	// 合并当前数组,和新增的数组
+    	let list = [...this.tableData, ...arr];
+    	// 去除数组中重复的数据
+    	this.tableData = arrReduce(list, "id");
+    },
+
+    add () {
+      this.$refs.edit.type = "add"
+      this.dialog.title = this.$t("runCenter.common.selectPro")
+      this.dialog.isVisible = true
+    },
+
+    initTenant () {
+      return {
+        orderTime: moment(new Date()).format('YYYY-MM-DD'),
+        deliveryTime: moment(new Date()).format('YYYY-MM-DD'),
+        status: '1',
+        hasMaterial: '1',
+        zoneId: ''        
+      }
+    },
+    checkExist(name){
+      return orderMgrApi.checkField({"orderName":name})
+    },
+
+    initWidth () {
+      this.screenWidth = document.body.clientWidth
+      if (this.screenWidth < 991) {
+        return '90%'
+      } else if (this.screenWidth < 1400) {
+        return '45%'
+      } else {
+        return '800px'
+      }
+    },
+
+    setTenant (val, dicts) {      
+    	if(val){
+    		this.tenant = { ...val }
+    		// 修改的时候,订单详情数据(BOM产品)
+        this.oldName = val.orderName        
+        this.show = val.hasMaterial=='1'?true : false
+    		this.getBomList()        
+    	}      
+      // 字典表
+      this.dicts = dicts
+    },
+
+    close () {
+      this.$emit('close')
+    },
+
+    reset () {
+      // 先清除校验,再清除表单,不然有奇怪的bug
+      this.$refs.form.clearValidate()
+      this.$refs.form.resetFields()
+      this.tenant = this.initTenant()
+      // 关闭时候,清空数据
+      this.tableData = []
+    },
+
+    submitForm () {
+      let hasMaterial = this.tenant.hasMaterial      
+      this.$refs.form.validate((valid) => {
+        if (valid) {         
+          this.confirmDisabled = true
+          // 验证【数量】不能不填写
+          let flag = false, flagBatchNo = false          
+          if(hasMaterial == '1'){
+            this.tableData.map(item => {
+          	  if(!item.bomNum){
+          		    flag = true
+          	  }
+              if(!item.deliveryTime){
+                  flag = true
+              }
+            // 验证【原料炉批号】
+              if(!item.furnaceBatchNo){
+                  flagBatchNo = true
+              }
+             })
+          }
+          if(flag){
+          	this.$message({
+	              message: this.$t('runCenter.tips.prodNums'),
+	              type: 'warning'
+	            })
+          	this.confirmDisabled = false
+          	return false
+          }
+          if(flagBatchNo){
+          	this.$message({
+	              message: this.$t('请选择【原料炉批号】~'),
+	              type: 'warning'
+	            })
+          	this.confirmDisabled = false
+          	return false
+          }
+          // 添加数据
+          this.tenant.orderProductList = []
+          this.tenant.singleTaskFlag = '1'
+          if(hasMaterial == '1'){
+          this.tableData.map(item => {
+          	// 添加数据
+          	this.tenant.orderProductList.push({
+              id:item.id,
+          		bomId: item.bomId,
+          		bomNum: item.bomNum,
+          		meterialReceiveId: item.meterialReceiveId,
+          		furnaceBatchNo: item.furnaceBatchNo,
+          		deliveryTime: item.deliveryTime,                           
+          		remark: item.remark
+          	})
+          })
+          
+          // 验证订单是否是否有待生产产品
+          if(this.tenant.orderProductList.length == 0){
+            this.$message({
+              message: this.$t('runCenter.tips.prods'),
+              type: 'warning'
+            })
+            this.confirmDisabled = false
+            return false
+          }
+        }else{
+          this.confirmDisabled = true
+        }
+
+          if (this.type === 'add') {
+            if(hasMaterial=='1'){
+              this.save()
+            }else{              
+              this.saveOrder()
+            }
+          } else {
+            if(hasMaterial=='1'){
+                this.update()
+            }else{
+                this.updateOrder()
+            }
+          }
+        } else {
+          return false
+        }
+      })
+    },
+
+    saveOrder () {
+      orderMgrApi.saveOrder(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.createSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+
+    save () {
+      orderMgrApi.save(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.createSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+
+    update () {
+      orderMgrApi.update(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.updateSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+
+    updateOrder () {
+      orderMgrApi.updateOrder(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.updateSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+
+    // 客户下拉数据
+    customerList(){
+    	customerMgrApi.getList({}).then(res => {
+    		res = res.data
+    		if(res.isSuccess){
+    			// console.log("88888== ",res)
+    			this.customList = res.data.data
+    		}
+    	})
+    },
+    //获取产线数据
+    getZoneList(){
+        areaMgrApi.getList({status:1}).then(res => {
+    		res = res.data
+    		if(res.isSuccess){
+          //this.zoneList = res.data
+           res.data.forEach((element) => {
+             if(element.name != '智能生产保障系统')
+              this.zoneList.push({
+                  id: element.id,
+                  name: element.name
+              })
+          });
+    		}
+    	})
+    },
+    // [BOM产品]数据-修改的时候
+    getBomList(){
+    	orderDetailApi.getList({orderId: this.tenant.id}).then(res => {
+    		res = res.data
+    		if(res.isSuccess){
+    			this.tableData = res.data
+    		}
+    	})
+    }
+  }
+}
+</script>
+<style lang="scss" >
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 100px;
+  height: 100px;
+  line-height: 100px;
+  text-align: center;
+}
+.avatar {
+  width: 100px;
+  height: 100px;
+  display: block;
+}
+.checkUsed{
+	display: inline-block;
+	margin-left: 10px;
+	color: #1890ff;
+}
+.star {
+	color: #F56C6C;
+	font-size: 14px;
+	margin-right: 4px;
+ }
+</style>

+ 403 - 0
imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/MeterialSelect.vue

@@ -0,0 +1,403 @@
+<!-- 【原料炉批号】选择-列表 -->
+<template>
+  <el-dialog
+  	:close-on-click-modal="false"
+  	:close-on-press-escape="false"
+  	:title="title"
+  	:append-to-body="true"
+  	:visible.sync="isVisible"
+  	width="1060px"
+  	top="50px"
+  >
+    <el-form ref="form" :model="tenant" :rules="rules" label-position="right" label-width="130px">
+
+    	<div class="filter-container">
+    	<span>
+    		<span>物料牌号:{{ material.tradeMark ? material.tradeMark : '-' }}</span>
+    	</span>
+      <span style="margin-left: 15px;">
+    		<span>器材名称:{{ material.equipmentName ? material.equipmentName : '' }}</span>
+    	</span>
+    	<span style="margin-left: 15px;">
+    		<span>规格型号:{{ material.specification ? material.specification : '' }}</span>
+    	</span>
+    	<span style="margin-left: 15px;">
+    		<span>处理状态:{{ material.handleStatus ? material.handleStatus : '' }}</span>
+    	</span>
+    </div>
+
+	    <!-- 列表数据
+	    	:expand-row-keys="expands"
+	      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+	    -->
+	    <el-table
+	      :key="tableKey"
+	      ref="table"
+	      v-loading="loading"
+	      :data="tableData.records"
+	      border
+	      fit
+	      row-key="id"
+	      highlight-current-row
+	      style="width: 100%;"
+	      @selection-change="onSelectChange"
+	      @cell-click="cellClick"
+	    >
+	      <!-- 序号 -->
+	    	<el-table-column :label='$t("common.serialNo")' width="55px" align="center">
+		      <template slot-scope="scope">
+		        <div>
+		          {{scope.$index+(queryParams.current - 1) * queryParams.size + 1}}
+		        </div>
+		      </template>
+	      </el-table-column>
+	      <!-- CheckBox -->
+	      <el-table-column align="center" type="selection" width="50" :reserve-selection="true" />
+        <el-table-column prop="furnaceBatchNo" label='原炉(批)号' :show-overflow-tooltip="true" width="150px"></el-table-column>
+        <el-table-column prop="meterialCode" label='物料编码' :show-overflow-tooltip="true" width="200px"></el-table-column>
+<!--        <el-table-column prop="tradeMark" label='材料牌号' :show-overflow-tooltip="true" width="150px"></el-table-column>-->
+        <el-table-column prop="factory" label='毛坯生产厂' :show-overflow-tooltip="true" width="150px"></el-table-column>
+        <el-table-column prop="meterialBatchNo" label='毛坯批号' :show-overflow-tooltip="true" width="150px"></el-table-column>
+        <el-table-column prop="factoryDate" label='入厂日期' :show-overflow-tooltip="true" width="150px"></el-table-column>
+        <el-table-column prop="batchStand" label='批量标准' :show-overflow-tooltip="true" width="150px"></el-table-column>
+        <el-table-column prop="createUser" label='操作人员' :show-overflow-tooltip="true" width="150px"></el-table-column>
+        <el-table-column prop="createTime" label='操作时间' :show-overflow-tooltip="true" width="150px"></el-table-column>
+        <el-table-column prop="usedNum" label='订单消耗数量' :show-overflow-tooltip="true" width="150px"></el-table-column>
+        <el-table-column prop="lastNum" label='剩余数量' :show-overflow-tooltip="true" width="150px"></el-table-column>
+	      <!--<el-table-column v-for="item in tableData.titleList" :key="item.id" :prop="item.field" :label='item.text' :show-overflow-tooltip="true" width="180px"></el-table-column>-->
+	    </el-table>
+
+	    <!-- 【分页组件】-->
+	    <pagination
+	      v-show="tableData.total > 0"
+	      :limit.sync="queryParams.size"
+	      :page.sync="queryParams.current"
+	      :total="Number(tableData.total)"
+	      @pagination="fetch"
+	    />
+
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button plain type="warning" @click="isVisible = false">{{ $t('common.cancel') }}</el-button>
+      <el-button plain type="primary" :disabled="confirmDisabled" @click="submitForm">{{ $t('common.confirm') }}</el-button>
+    </div>
+  </el-dialog>
+</template>
+<script>
+// 【夹具管理】-API
+import trayMgrApi from "@/api/prepareProductMgr/trayMgr"
+// 【分页】组件
+import Pagination from "@/components/Pagination"
+// 【BOM管理】-API
+import bomMgrApi from "@/api/prepareProductMgr/bomMgr"
+// 【原材料接收管理】-API
+import ReceiveApi from "@/api/prepareProductMgr/receive"
+// 【原材料管理】-API
+import MaterialApi from "@/api/prepareProductMgr/material"
+// 【共通】函数
+import { initQueryParams } from '@/utils/commons'
+export default {
+  name: 'TenantEdit',
+  components: { Pagination },
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+    	expands: [], // 展开行的key
+    	qiyongStatus: [], //状态
+    	statusList: [], // 启用状态
+    	queryParams: initQueryParams({}),
+    	selection: [],
+    	loading: false,
+    	tableKey: 0,
+      type: 'add',
+      tableData: {
+        total: 0
+      },
+      material: {}, // 原材料详情信息
+      tenant: this.initTenant(),
+      screenWidth: 0,
+      width: this.initWidth(),
+      confirmDisabled: false,
+      roles: [],
+      rules: {
+        name: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
+  created() {
+  	// 加载列表数据
+  	this.fetch()
+  	// 调用常量-初始化值
+  	this.qiyongStatus = this.$constWKS.AUDIOLIST;
+  	this.statusList = this.$constWKS.STATUSORTHERLIST;
+	},
+  computed: {
+    isVisible: {
+      get () {
+        return this.dialogVisible
+      },
+      set () {
+        this.close()
+        this.reset()
+      }
+    }
+  },
+  mounted () {
+    window.onresize = () => {
+      return (() => {
+        this.width = this.initWidth()
+      })()
+    }
+  },
+  methods: {
+  	// 【新增】按钮-事件
+    addRes(){
+      this.tableData.push({
+      	key: "WKS_"+ Math.random(),
+      	id: '',
+      	positionSort: this.tableData.length + 1,
+      	size: '',
+      	remark: '',
+      	isEdit: true
+      })
+    },
+    // 【搜索】按钮-事件
+    search () {
+      this.fetch({
+        ...this.queryParams
+      })
+    },
+    // Table的选择事件
+    onSelectChange (selection) {
+      this.selection = selection
+    },
+    cellClick (row, column) {
+      if (column['columnKey'] === "operation") {
+        return
+      }
+      let flag = false
+      this.selection.forEach((item) => {
+        if (item.id === row.id) {
+          flag = true
+          this.$refs.table.toggleRowSelection(row)
+        }
+      })
+
+      if (!flag) {
+        this.$refs.table.toggleRowSelection(row, true)
+      }
+    },
+    // 【删除】按钮事件
+    singleDelete(row){
+    	this.$confirm(this.$t("tips.comTips"), this.$t("common.tips"), {
+      	distinguishCancelAndClose: true,
+        confirmButtonText: this.$t("common.confirm"),
+        cancelButtonText: this.$t("common.cancel"),
+        type: "warning"
+      }).then(() => {
+      	// 过滤符合条件的数据
+      	let arr = this.tableData.filter(item => item.key != row.key || item.id != row.id)
+      	// 给数据排序
+    		arr.forEach((item, index) => {
+    			item.positionSort = index + 1
+    		})
+      	// 给新的数据赋值
+    		this.tableData = arr;
+
+      }).catch(() => {})
+    },
+    // 【修改】按钮事件
+    edit(row){
+    	let list = new Array();
+    	this.tableData.forEach((item, index) => {
+    		// 当前编辑行
+    		if(!!item.id && item.id == row.id){
+    			item.isEdit = true
+    		}
+    		list.push(item)
+    	})
+    	// 赋值给当前
+    	this.tableData = list
+    },
+    initTenant () {
+      return {
+      	model: '',
+        name: '',
+        category: {
+          key: ''
+        },
+        brand: {
+          key: ''
+        },
+        status: '1'
+      }
+    },
+    initWidth () {
+      this.screenWidth = document.body.clientWidth
+      if (this.screenWidth < 991) {
+        return '90%'
+      } else if (this.screenWidth < 1400) {
+        return '45%'
+      } else {
+        return '800px'
+      }
+    },
+    setTenant (val) {
+    	if(val){
+    		this.tenant = { ...val };
+    		// 获取原材料详情
+    		this.getMaterial(val.meterialId);
+    		// 获取。列表
+    		this.search();
+    	}
+    },
+
+    // 获取原材料详情
+    getMaterial(id) {
+    	MaterialApi.get({ id }).then(res=> {
+    		res = res.data;
+    		if(res.code == 0) {
+    			// 如果存在,才赋值
+    			if(res.data) {
+    				this.material = res.data;
+    			}
+    		}
+    	})
+    },
+
+    close () {
+      this.$emit('close')
+    },
+    // 【重置】按钮-事件
+    reset () {
+    	// 初始化表单
+      this.queryParams = initQueryParams({})
+      // 清空列表选中的数据
+      this.$refs.table.clearSelection()
+    },
+    submitForm () {
+    	if(this.selection && this.selection.length == 1) {
+    		// 把选择的数据提交到父组件
+    		this.$emit("success", this.selection[0]);
+    		// 关闭弹出框
+    		this.isVisible = false
+    	}else if(!this.selection.length){
+	        this.$message({
+          message: this.$t('tips.noDataSelected'),
+          type: 'warning'
+        })
+      } else {
+    		this.$message({
+          message: this.$t('tips.mustOne'),
+          type: 'warning'
+        })
+    	}
+    },
+    save () {
+      trayMgrApi.save(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.createSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+    update () {
+      trayMgrApi.update(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.updateSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+    fetch (params = {}) {
+      this.loading = true
+
+			// 分页信息
+      this.queryParams.current = params.current ? params.current : this.queryParams.current
+      this.queryParams.size = params.size ? params.size : this.queryParams.size
+			// 必须传的参数
+			// this.queryParams.model.auditStatus = '2'
+			// 原材料Id
+			this.queryParams.model.meterialId = this.tenant.meterialId;
+
+			// 测试数据,真实数据,请使用page
+      ReceiveApi.page(this.queryParams).then(response => {
+      	const res = response.data
+        console.log("列表的数据111122233:", res)
+        if (res.isSuccess) {
+        	// 总数
+        	this.tableData = res.data;
+        }
+        // eslint-disable-next-line no-return-assign
+      }).finally(() => this.loading = false)
+
+    },
+  }
+}
+</script>
+<style lang="scss" >
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 100px;
+  height: 100px;
+  line-height: 100px;
+  text-align: center;
+}
+.avatar {
+  width: 100px;
+  height: 100px;
+  display: block;
+}
+.checkUsed{
+	display: inline-block;
+	margin-left: 10px;
+	color: #1890ff;
+}
+</style>

+ 423 - 0
imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/Select.vue

@@ -0,0 +1,423 @@
+<template>
+  <el-dialog
+  	:close-on-click-modal="false"
+  	:close-on-press-escape="false"
+  	:title="title"
+  	:append-to-body="true"
+  	:visible.sync="isVisible"
+  	width="960px"
+  	top="50px"
+  >
+    <el-form ref="form" :model="tenant" :rules="rules" label-position="right" label-width="130px">
+
+    	<div class="filter-container">
+    	<span>
+    		<span>{{$t("runCenter.searchForm.bomName")}}:</span>
+    		<el-input v-model="queryParams.model.name" :placeholder='$t("common.pleaseEnter")' style="width: 150px;" size="medium"/>
+    	</span>
+      <span style="margin-left: 15px;">
+    		<span>{{$t("runCenter.searchForm.bomAlias")}}:</span>
+    		<el-input v-model="queryParams.model.bomAlias" :placeholder='$t("common.pleaseEnter")' style="width: 150px;" size="medium"/>
+    	</span>
+    	<!--<span style="margin-left: 15px;">
+    		<span>{{$t("prepare.searchForm.auditStatus")}}:</span>
+    		<el-select v-model="queryParams.model.audit_status" :placeholder='$t("common.pleaseSelect")' size="medium" style="width: 120px;">
+        	<el-option
+			      v-for="item in qiyongStatus"
+			      :key="item.value"
+			      :label="item.label"
+			      :value="item.value">
+			    </el-option>
+      	</el-select>
+    	</span>
+    	<span style="margin-left: 15px;">
+    		<span>{{$t("prepare.searchForm.qiyongStatus")}}:</span>
+    		<el-select v-model="queryParams.model.status" :placeholder='$t("common.pleaseSelect")' size="medium" style="width: 120px;">
+        	<el-option
+			      v-for="item in statusList"
+			      :key="item.value"
+			      :label="item.label"
+			      :value="item.value">
+			    </el-option>
+      	</el-select>
+    	</span>-->
+      <span style="margin-left: 15px;">
+	      <el-button plain type="primary" icon="el-icon-search" size="medium" @click="search">
+	        {{ $t("table.search") }}
+	      </el-button>
+	      <el-button plain type="warning" icon="el-icon-refresh" size="medium" @click="reset">
+	        {{ $t("table.reset") }}
+	      </el-button>
+      </span>
+    </div>
+
+	    <!-- 列表数据
+	    	:expand-row-keys="expands"
+	      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+	    -->
+	    <el-table
+	      :key="tableKey"
+	      ref="table"
+	      v-loading="loading"
+	      :data="tableData.records"
+	      border
+	      fit
+	      row-key="id"
+	      highlight-current-row
+	      style="width: 100%;"
+	      @selection-change="onSelectChange"
+	      @cell-click="cellClick"
+	    >
+	      <el-table-column align="center" type="selection" width="40px" :reserve-selection="true" />
+	      <!-- 零部件编号 -->
+        <el-table-column
+          prop="partsNo"
+          :label="$t(&quot;runCenter.table.orderSldPro.partsNo&quot;)"
+          align="center"
+          :show-overflow-tooltip="true"
+          width="150px"
+        >
+          <template slot-scope="{ row }">
+            <span>{{ row.partsNo }}</span>
+          </template>
+        </el-table-column>
+        <!-- 产品代号 -->
+        <el-table-column
+          prop="bomAlias"
+          :label="$t(&quot;runCenter.table.orderSldPro.bomAlias&quot;)"
+          align="center"
+          :show-overflow-tooltip="true"
+          width="120px"
+        />
+        <!-- 零件名称 -->
+        <el-table-column
+          prop="name"
+          :label="$t(&quot;runCenter.table.orderSldPro.name&quot;)"
+          align="center"
+        />
+        <!-- 零件代号 -->
+        <el-table-column
+          prop="partsAlias"
+          :label="$t(&quot;runCenter.table.orderSldPro.partsAlias&quot;)"
+          align="center"
+          width="150px"
+        />
+        <!-- 材料牌号 -->
+        <el-table-column
+          prop="materialBrandName"
+          :label="$t(&quot;runCenter.table.orderSldPro.materialBrandName&quot;)"
+          align="center"
+          width="150px"
+        />
+	      <!--<el-table-column v-for="item in tableData.titleList" :key="item.id" :prop="item.field" :label='item.text' :show-overflow-tooltip="true" width="180px"></el-table-column>-->
+	    </el-table>
+
+	    <!-- 【分页组件】-->
+	    <pagination
+	      v-show="tableData.total > 0"
+	      :limit.sync="queryParams.size"
+	      :page.sync="queryParams.current"
+	      :total="Number(tableData.total)"
+	      @pagination="fetch"
+	    />
+
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button plain type="warning" @click="isVisible = false">{{ $t('common.cancel') }}</el-button>
+      <el-button plain type="primary" :disabled="confirmDisabled" @click="submitForm">{{ $t('common.confirm') }}</el-button>
+    </div>
+  </el-dialog>
+</template>
+<script>
+// 【夹具管理】-API
+import trayMgrApi from "@/api/prepareProductMgr/trayMgr"
+// 【分页】组件
+import Pagination from "@/components/Pagination"
+// 【BOM管理】-API
+import bomMgrApi from "@/api/prepareProductMgr/bomMgr"
+// 【共通】函数
+import { initQueryParams } from '@/utils/commons'
+export default {
+  name: 'TenantEdit',
+  components: { Pagination },
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+    	expands: [], // 展开行的key
+    	qiyongStatus: [], //状态
+    	statusList: [], // 启用状态
+    	queryParams: initQueryParams({}),
+    	selection: [],
+    	loading: false,
+    	tableKey: 0,
+      type: 'add',
+      tableData: {
+        total: 0
+      },
+      tenant: this.initTenant(),
+      screenWidth: 0,
+      width: this.initWidth(),
+      confirmDisabled: false,
+      roles: [],
+      rules: {
+        name: [
+        	{ required: true, message: this.$t("rules.require"), trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
+  created() {
+  	// 加载列表数据
+  	this.fetch()
+  	// 调用常量-初始化值
+  	this.qiyongStatus = this.$constWKS.AUDIOLIST;
+  	this.statusList = this.$constWKS.STATUSORTHERLIST;
+	},
+  computed: {
+    isVisible: {
+      get () {
+        return this.dialogVisible
+      },
+      set () {
+        this.close()
+        this.reset()
+      }
+    }
+  },
+  mounted () {
+    window.onresize = () => {
+      return (() => {
+        this.width = this.initWidth()
+      })()
+    }
+  },
+  methods: {
+  	// 【新增】按钮-事件
+    addRes(){
+      this.tableData.push({
+      	key: "WKS_"+ Math.random(),
+      	id: '',
+      	positionSort: this.tableData.length + 1,
+      	size: '',
+      	remark: '',
+      	isEdit: true
+      })
+    },
+    // 【搜索】按钮-事件
+    search () {
+      this.fetch({
+        ...this.queryParams
+      })
+    },
+    // Table的选择事件
+    onSelectChange (selection) {
+      this.selection = selection
+    },
+    cellClick (row, column) {
+      if (column['columnKey'] === "operation") {
+        return
+      }
+      let flag = false
+      this.selection.forEach((item) => {
+        if (item.id === row.id) {
+          flag = true
+          this.$refs.table.toggleRowSelection(row)
+        }
+      })
+
+      if (!flag) {
+        this.$refs.table.toggleRowSelection(row, true)
+      }
+    },
+    // 【删除】按钮事件
+    singleDelete(row){
+    	this.$confirm(this.$t("tips.comTips"), this.$t("common.tips"), {
+      	distinguishCancelAndClose: true,
+        confirmButtonText: this.$t("common.confirm"),
+        cancelButtonText: this.$t("common.cancel"),
+        type: "warning"
+      }).then(() => {
+      	// 过滤符合条件的数据
+      	let arr = this.tableData.filter(item => item.key != row.key || item.id != row.id)
+      	// 给数据排序
+    		arr.forEach((item, index) => {
+    			item.positionSort = index + 1
+    		})
+      	// 给新的数据赋值
+    		this.tableData = arr;
+
+      }).catch(() => {})
+    },
+    // 【修改】按钮事件
+    edit(row){
+    	let list = new Array();
+    	this.tableData.forEach((item, index) => {
+    		// 当前编辑行
+    		if(!!item.id && item.id == row.id){
+    			item.isEdit = true
+    		}
+    		list.push(item)
+    	})
+    	// 赋值给当前
+    	this.tableData = list
+    },
+    initTenant () {
+      return {
+      	model: '',
+        name: '',
+        category: {
+          key: ''
+        },
+        brand: {
+          key: ''
+        },
+        status: '1'
+      }
+    },
+    initWidth () {
+      this.screenWidth = document.body.clientWidth
+      if (this.screenWidth < 991) {
+        return '90%'
+      } else if (this.screenWidth < 1400) {
+        return '45%'
+      } else {
+        return '800px'
+      }
+    },
+    setTenant (val) {
+    	if(val){
+    		this.tenant = { ...val }
+    	}
+    },
+    close () {
+      this.$emit('close')
+    },
+    // 【重置】按钮-事件
+    reset () {
+    	// 初始化表单
+      this.queryParams = initQueryParams({})
+      // 清空列表选中的数据
+      this.$refs.table.clearSelection()
+      this.fetch()
+    },
+    submitForm () {
+      if(this.selection && this.selection.length==0){
+        this.$message({
+              message: this.$t('tips.unSelected'),
+              type: 'warning'
+        })
+        return false
+      }
+
+    	this.selection.forEach(item => {
+    		// 页面需要参数: bomId
+    		item.bomId = item.id
+    	})
+    	// 把选择的数据提交到父组件
+    	this.$emit("success", this.selection)
+    	// 关闭弹出框
+    	this.isVisible = false
+    },
+    save () {
+      trayMgrApi.save(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.createSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+    update () {
+      trayMgrApi.update(this.tenant)
+        .then((response) => {
+          const res = response.data
+          if (res.isSuccess) {
+            this.isVisible = false
+            this.$message({
+              message: this.$t('tips.updateSuccess'),
+              type: 'success'
+            })
+            // 通知列表
+	          this.$emit("success");
+	          // 通知列表-并关闭弹出框
+	          this.$emit("close");
+          }
+        }).finally(() => {
+          this.confirmDisabled = false
+          return true
+        })
+    },
+    fetch (params = {}) {
+      this.loading = true
+
+			// 分页信息
+      this.queryParams.current = params.current ? params.current : this.queryParams.current
+      this.queryParams.size = params.size ? params.size : this.queryParams.size
+			// 必须传的参数
+			this.queryParams.model.auditStatus = '2'
+			// 测试数据,真实数据,请使用page
+      bomMgrApi.page(this.queryParams).then(response => {
+      	const res = response.data
+        console.log("列表的数据111122233:", res)
+        if (res.isSuccess) {
+        	// 总数
+        	this.tableData = res.data;
+        }
+        // eslint-disable-next-line no-return-assign
+      }).finally(() => this.loading = false)
+
+    },
+  }
+}
+</script>
+<style lang="scss" >
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 100px;
+  height: 100px;
+  line-height: 100px;
+  text-align: center;
+}
+.avatar {
+  width: 100px;
+  height: 100px;
+  display: block;
+}
+.checkUsed{
+	display: inline-block;
+	margin-left: 10px;
+	color: #1890ff;
+}
+</style>

+ 214 - 0
imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/components/View.vue

@@ -0,0 +1,214 @@
+<template>
+  <el-dialog
+    :title="$t(&quot;common.view&quot;)"
+    :width="width"
+    :append-to-body="true"
+    :visible.sync="isVisible"
+    class="tenant-view"
+  >
+    <el-row :gutter="10">
+      <el-col :xs="24" :sm="24">
+        <div class="img-wrapper">
+          <img :src="tenant.logo">
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="10">
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-user" />
+          <span>{{ $t('table.tenant.code') +':' }}</span>
+          {{ tenant.code }}
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-suitcase" />
+          <span>{{ $t('table.tenant.name') +':' }}</span>
+          {{ tenant.name }}
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="10">
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-trophy" />
+          <span>{{ $t('table.tenant.type') +':' }}</span>
+          {{ tenant.type.desc }}
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-phone-outline" />
+          <span>{{ $t('table.tenant.status') +':' }}</span>
+          {{ tenant.status.desc }}
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="10">
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-star-off" />
+          <span>{{ $t('table.tenant.duty') +':' }}</span>
+          {{ tenant.duty }}
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-bangzhu" />
+          <span>{{ $t('table.tenant.expirationTime') +':' }}</span>
+          {{ tenant.expirationTime ? tenant.expirationTime : '永久' }}
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="10">
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-time" />
+          <span>{{ $t('table.createTime') +':' }}</span>
+          {{ tenant.createTime }}
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="12">
+        <div class="view-item">
+          <i class="el-icon-brush" />
+          <span>{{ $t('table.updateTime') +':' }}</span>
+          {{ tenant.updateTime }}
+        </div>
+      </el-col>
+    </el-row>
+    <!--    <el-row :gutter='10'>-->
+    <!--      <el-col :xs='24' :sm='12'>-->
+    <!--        <div class='view-item'>-->
+    <!--          <i class='el-icon-date' />-->
+    <!--          <span>{{ $t('table.tenant.isMultipleLogin') +':' }}</span>-->
+    <!--          {{ tenant.isMultipleLogin ? '是' : '否'}}-->
+    <!--        </div>-->
+    <!--      </el-col>-->
+    <!--      <el-col :xs='24' :sm='12'>-->
+    <!--        <div class='view-item'>-->
+    <!--          <i class='el-icon-document' />-->
+    <!--          <span>{{ $t('table.tenant.passwordExpire') +':' }}</span>-->
+    <!--          {{ tenant.passwordExpire == '0' ? '永久有效' :tenant.passwordExpire}}-->
+    <!--        </div>-->
+    <!--      </el-col>-->
+    <!--    </el-row>-->
+    <!--    <el-row :gutter='10'>-->
+    <!--      <el-col :xs='24' :sm='12'>-->
+    <!--        <div class='view-item'>-->
+    <!--          <i class='el-icon-document' />-->
+    <!--          <span>{{ $t('table.tenant.passwordErrorNum') +':' }}</span>-->
+    <!--          {{ tenant.passwordErrorNum}}-->
+    <!--        </div>-->
+    <!--      </el-col>-->
+    <!--      <el-col :xs='24' :sm='12'>-->
+    <!--        <div class='view-item'>-->
+    <!--          <i class='el-icon-date' />-->
+    <!--          <span>{{ $t('table.tenant.passwordErrorLockTime') +':' }}</span>-->
+    <!--          {{ tenant.passwordErrorLockTime | passwordErrorLockTimeFilter }}-->
+    <!--        </div>-->
+    <!--      </el-col>-->
+    <!--    </el-row>-->
+    <el-row :gutter="10">
+      <el-col :xs="24" :sm="24">
+        <div class="view-item">
+          <i class="el-icon-date" />
+          <span>{{ $t('table.tenant.describe') +':' }}</span>
+          {{ tenant.describe }}
+        </div>
+      </el-col>
+    </el-row>
+  </el-dialog>
+</template>
+<script>
+export default {
+  name: 'TenantView',
+  filters: {
+    passwordErrorLockTimeFilter (time) {
+      if (time === '0') {
+        return '当天23点59分'
+      }
+      return time
+    }
+  },
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      screenWidth: 0,
+      width: this.initWidth(),
+      tenant: {
+        type: {
+          desc: ''
+        },
+        status: {
+          desc: ''
+        }
+      }
+    }
+  },
+  computed: {
+    isVisible: {
+      get () {
+        return this.dialogVisible
+      },
+      set () {
+        this.close()
+      }
+    }
+  },
+  mounted () {
+    window.onresize = () => {
+      return (() => {
+        this.width = this.initWidth()
+      })()
+    }
+  },
+  methods: {
+    initWidth () {
+      this.screenWidth = document.body.clientWidth
+      if (this.screenWidth < 550) {
+        return '95%'
+      } else if (this.screenWidth < 990) {
+        return '580px'
+      } else if (this.screenWidth < 1400) {
+        return '600px'
+      } else {
+        return '650px'
+      }
+    },
+    setTenant (val) {
+      this.tenant = { ...val }
+    },
+    close () {
+      this.$emit('close')
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.tenant-view {
+  .img-wrapper {
+    text-align: center;
+    margin-top: -1.5rem;
+    margin-bottom: 10px;
+    img {
+      width: 4rem;
+      border-radius: 50%;
+    }
+  }
+  .view-item {
+    margin: 7px;
+    i {
+      font-size: 0.97rem;
+    }
+    span {
+      margin-left: 5px;
+    }
+  }
+}
+</style>

+ 658 - 0
imcs-ui/src/views/zuihou/runManageCenter/orderMgr/components/orderTask/index.vue

@@ -0,0 +1,658 @@
+<template>
+	<div class="app-container">
+		  <!-- 搜索模块 -->
+	  <div class="filter-container">
+		<!-- 订单名称 -->
+		<span style="margin-left: 15px;">
+			  <span>{{$t("runCenter.searchForm.orderName")}}:</span>
+			  <el-input v-model="queryParams.model.orderName" :placeholder='$t("common.pleaseEnter")' style="width: 120px;" size="medium"/>
+		  </span>
+		  <span style="margin-left: 15px;">
+			  <span>{{$t("runCenter.searchForm.deliveryTime")}}:</span>
+			  <el-date-picker
+				v-model="queryParams.timeRange"
+				type="daterange"
+				:picker-options="pickerOptions"
+				:range-separator='$t("common.separator")'
+				:start-placeholder='$t("common.startTime")'
+				:end-placeholder='$t("common.endTime")'
+				format="yyyy-MM-dd"
+				  value-format="yyyy-MM-dd"
+				align="right">
+			  </el-date-picker>
+		  </span>
+		<span style="margin-left: 15px;">
+			<el-button plain type="primary" icon="el-icon-search" size="medium" @click="search">
+			  {{ $t("table.search") }}
+			</el-button>
+			<el-button plain type="warning" icon="el-icon-refresh" size="medium" @click="reset">
+			  {{ $t("table.reset") }}
+			</el-button>
+		</span>
+	  </div>
+  
+	  <!-- 功能按钮 -->
+	  <el-row class="filter-container">
+		  <el-col>
+			  <el-button type="primary" icon="el-icon-plus" size="medium" v-has-permission="['order:add']" @click="add">{{ $t("common.add") }}</el-button>
+			<el-button type="success" icon="el-icon-edit" size="medium" v-has-permission="['order:update']" @click="editOne">
+			  {{ $t("common.edit") }}
+			</el-button>
+			<el-button type="danger" icon="el-icon-delete" size="medium" v-has-permission="['order:delete']" @click="orderDelete">
+			  {{ $t("table.delete") }}
+			</el-button>
+			<!--<el-button type="primary" icon="el-icon-thumb" size="medium" v-has-permission="['order:pushaudit']" @click="audioStatu('1')">{{$t("common.audio.addAudio")}}</el-button>-->
+		 </el-col>
+	  </el-row>
+  
+		  <!-- 列表数据 -->
+	  <el-table
+		:key="tableKey"
+		ref="table"
+		v-loading="loading"
+		:data="tableData.records"
+		border
+		fit
+		row-key="id"
+		style="width: 100%;"
+		@selection-change="onSelectChange"
+		@cell-click="cellClick"
+	  >
+		  <el-table-column :label='$t("common.serialNo")' width="55px" align="center">
+			<template slot-scope="scope">
+			  <div>
+				{{scope.$index+(queryParams.current - 1) * queryParams.size + 1}}
+			  </div>
+			</template>
+		</el-table-column>
+		<el-table-column align="center" type="selection" width="55px" :reserve-selection="true" />
+		<!-- 订单编号
+		<el-table-column prop="orderNo" :label='$t("runCenter.table.oder.orderNo")' :show-overflow-tooltip="true"></el-table-column>-->
+		<!-- 订单名称 -->
+		<el-table-column prop="orderName" :label='$t("runCenter.table.oder.orderName")' :show-overflow-tooltip="true"></el-table-column>
+		<!-- 简称 -->
+		<!--<el-table-column prop="custDesc" :label='$t("runCenter.table.oder.custDesc")' :show-overflow-tooltip="true"></el-table-column>-->
+		<!-- 来源 -->
+		<el-table-column prop="source" :label='$t("runCenter.table.oder.source")' :show-overflow-tooltip="true" style="width: 9%;">
+			<template slot-scope="{ row }">
+				<el-tag v-if="row.source == '1'">{{$t("runCenter.common.source.self")}}</el-tag>
+					  <el-tag v-if="row.source == '2'" type="success">{{$t("runCenter.common.source.out")}}</el-tag>
+				  </template>
+		</el-table-column>
+		<!-- 交货日期 -->
+		<el-table-column prop="deliveryTime" :label='$t("runCenter.table.oder.deliveryTime")' :show-overflow-tooltip="true" style="width: 12%;"></el-table-column>
+		<!-- 启用状态 -->
+		<el-table-column prop="status" :label='$t("runCenter.table.oder.status")' align="center" style="width: 9%;">
+			<template slot-scope="{ row }">
+			<el-tag :type="row.status=='1' ? 'success' : 'danger'">
+				{{ row.status=='1' ? $t("common.status.valid") : $t("common.frozen") }}
+			</el-tag>
+		  </template>
+		</el-table-column>
+		<!-- 下单日期 -->
+		<el-table-column prop="orderTime" :label='$t("runCenter.table.oder.orderTime")' style="width: 12%;"></el-table-column>
+		<!-- 创建时间 -->
+		<el-table-column prop="createTime" :label='$t("runCenter.table.oder.createTime")' style="width: 12%;"></el-table-column>
+		<!-- 操作 -->
+		<el-table-column
+		  :label="$t('table.operation')"
+		  fixed="right"
+		  align="center"
+		  column-key="operation"
+		  style="width: 8%;"
+		>
+		  <template slot-scope="{ row }">
+			  <el-tooltip class="item" :content='$t("runCenter.buttons.viewOrder")' effect="dark" placement="top-start">
+				<i
+				  class="el-icon-view table-operation"
+				  style="color: #87d068;"
+				  @click="view(row)"
+				/>
+			</el-tooltip>
+			<el-tooltip class="item" :content='$t("common.edit")' effect="dark" placement="top-start">
+				<i
+				  class="el-icon-edit table-operation"
+				  style="color: #2db7f5;"
+				  @click="edit(row)"
+				/>
+			</el-tooltip>			
+			<el-tooltip v-if="row.produceStatus == '1' || row.produceStatus == '2'" class="item" content='暂停' effect="dark" placement="top-start">
+	          <i
+	            class="el-icon-video-pause table-operation"
+	            style="color: #2db7f5;"
+	            @click="orderOperateBtn(row,'stop')"
+	          />
+          </el-tooltip>
+          <!-- 继续生产-->
+          <el-tooltip v-if="row.produceStatus == '3'" class="item" content='继续生产' effect="dark" placement="top-start">
+	          <i
+	            class="el-icon-video-play table-operation"
+	            style="color: #2db7f5;"
+	            @click="orderOperateBtn(row,'start')"
+	          />
+          </el-tooltip>
+		  <el-tooltip
+            class="item"
+            :content="$t('resource.buttons.setting')"
+            effect="dark"
+            placement="top-start"
+          >
+            <i
+              class="el-icon-setting table-operation"
+              style="color: #2db7f5"
+              @click="orderConf(row)"
+            />
+          </el-tooltip>
+		  <el-tooltip v-if="row.orderStatus == '1' && row.singleTaskFlag == '1' && row.hasMaterial == '0'" class="item" :content='$t("runCenter.buttons.prodNode")' effect="dark" placement="top-start">
+	          <i
+	            class="el-icon-monitor table-operation"
+	            style="color: #2db7f5;"
+	            @click="prodNode(row)"
+	          />
+          </el-tooltip>
+		  <el-tooltip v-if="row.orderStatus == '1' && row.singleTaskFlag == '1' && row.hasMaterial == '1'" class="item" :content='$t("common.audio.addAudio")' effect="dark" placement="top-start">
+	          <i
+	            class="el-icon-thumb table-operation"
+	            style="color: #2db7f5;"
+	            @click="audioStatu(row, '1')"
+	          />
+          </el-tooltip>
+		  </template>
+		</el-table-column>
+	  </el-table>
+	  <pagination
+		v-show="tableData.total > 0"
+		:limit.sync="queryParams.size"
+		:page.sync="queryParams.current"
+		:total="Number(tableData.total)"
+		@pagination="fetch"
+	  />
+	  <tenant-edit
+		ref="edit"
+		:dialog-visible="dialog.isVisible"
+		:title="dialog.title"
+		@close="editClose"
+		@success="editSuccess"
+	  />
+	  <tenant-view
+		ref="view"
+		:dialog-visible="tenantViewVisible"
+		@close="viewClose"
+	  />
+	  <!-- 生产资源资料  -->
+	  <detail-conf
+      	 ref="detailConf"
+      	:dialog-visible="dialogDetailConf.isVisible"
+      	:title="dialogDetailConf.title"
+      	@close="editDetailConfClose"
+      	@success="editDetailConfSuccess"
+    />
+	  <el-dialog
+		v-el-drag-dialog
+		:close-on-click-modal="false"
+		:close-on-press-escape="true"
+		:title='$t("common.preview")'
+		width="80%"
+		top="50px"
+		:visible.sync="preview.isVisible"
+	  >
+		<el-scrollbar>
+		  <div v-html="preview.context" />
+		</el-scrollbar>
+	  </el-dialog>
+	  <file-import
+		ref="import"
+		:dialog-visible="fileImport.isVisible"
+		:type="fileImport.type"
+		:exportErrorUrl="fileImport.exportErrorUrl"
+		:action="fileImport.action"
+		accept=".xls,.xlsx"
+		@close="importClose"
+		@success="importSuccess"
+	  />
+	</div>
+  </template>
+  
+  <script>
+	  import Pagination from "@/components/Pagination"
+	  import TenantEdit from "./components/Edit"
+	  import TenantView from "./components/View"
+	  import DetailConf from "./components/DetailConf"
+	  // 【订单管理】-API
+	  import orderMgrApi from "@/api/runManageCenter/orderMgr"
+	  import orderTaskMgrApi from "@/api/runManageCenter/orderTaskMgr"
+	  import elDragDialog from '@/directive/el-drag-dialog'
+	  import { downloadFile,  initQueryParams } from '@/utils/commons'
+	import FileImport from "@/components/zuihou/Import";
+	  export default {
+		name: "DraftOrder",
+		directives: { elDragDialog },
+		components: { Pagination, TenantEdit, TenantView,FileImport,DetailConf },
+		props: {
+		},
+		data () {
+		  return {
+			dialog: {
+			  isVisible: false,
+			  title: ""
+			},
+			preview: {
+			  isVisible: false,
+			  context: ''
+			},
+			dialogDetailConf: {
+        	  isVisible: false,
+        	  title: "",
+            },
+			tenantViewVisible: false,
+			tableKey: 0,
+			queryParams: initQueryParams({}),
+			selection: [],
+			loading: false,
+			tableData: {
+			  total: 0
+			},
+			dicts: {
+			NATION: {}
+		  },
+			enums: {
+			  TenantTypeEnum: {},
+			  TenantStatusEnum: {}
+			},
+			pickerOptions: {
+			shortcuts: [{
+			  text: this.$t("common.timeArea.lastWeek"),
+			  onClick(picker) {
+				const end = new Date();
+				const start = new Date();
+				start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+				picker.$emit('pick', [start, end]);
+			  }
+			}, {
+			  text: this.$t("common.timeArea.lastMonth"),
+			  onClick(picker) {
+				const end = new Date();
+				const start = new Date();
+				start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+				picker.$emit('pick', [start, end]);
+			  }
+			}, {
+			  text: this.$t("common.timeArea.lastThreeMonth"),
+			  onClick(picker) {
+				const end = new Date();
+				const start = new Date();
+				start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+				picker.$emit('pick', [start, end]);
+			  }
+			}]
+		  },
+		  fileImport: {
+			isVisible: false,
+			type: "import",
+			action: `${process.env.VUE_APP_BASE_API}/authority/order/import`,
+			exportErrorUrl: `/authority/order/exportError`
+		  },
+		  }
+		},
+		// 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
+		created() {
+			// 加载列表数据
+			this.fetch()
+		  },
+		computed: {
+		},
+		mounted () {
+  
+		},
+		methods: {
+			// 【提交审核】按钮-事件
+		  audioStatu(row, status){
+			  if (!row.id) {
+			  this.$message({
+				message: this.$t("tips.noDataSelected"),
+				type: "warning"
+			  })
+			  return
+			}
+
+		let bool = true;	
+		orderTaskMgrApi.get({orderId: row.id}).then(res => {
+    		res = res.data    		
+    		if(res.isSuccess){
+    			if(res.data == null || res.data.start == '' || res.data.goal == ''){
+					bool = false		
+				}
+    		}else{
+				bool = false
+			}    		
+
+			if(!bool){
+				this.$message({
+				message: '订单任务尚未配置',
+				type: "warning"
+			  })
+			  return
+		}
+  
+		  const ids = []
+		  ids.push(row.id)
+		    
+			  // 确认【提交审核】
+		this.$confirm(this.$t("tips.audioTips"), this.$t("common.tips"), {
+				distinguishCancelAndClose: true,
+			  confirmButtonText: this.$t("common.confirm"),
+			  cancelButtonText: this.$t("common.cancel"),
+			  type: "warning"
+			}).then(() => {
+				// 调用API
+				this.audio(ids,status)
+			}).catch(() => {})
+
+    	})	
+		
+		  },
+		  // 【审核通过/审核不通过】接口-事件
+		  audio(ids,status){
+			  if(!status){
+				  status =  this.audioVal
+			  }
+			  // 赋值
+			  //this.selection[0].status = status
+			  let msg = this.$t("common.audio.addAudioTips")
+			  if(status == "2"){
+				  msg = this.$t("common.audio.audioOk")+"!"
+			  }
+			  if(status == "3"){
+				  msg = this.$t("common.audio.aduioFail")+"!"
+			  }
+			  orderMgrApi.updateStatus({ ids: ids, auditStatus: status}).then(response => {
+			  if (response.status == 200) {
+				  // 如果是审核,成功后,关闭弹出框
+				  if(status == '2' || status == '3'){
+					  this.audioIsVisible = false
+					  // 审核成功后,改成默认值
+					  this.audioVal = '2'
+				  }
+				this.$message({
+				  message: msg,
+				  type: "success"
+				})
+				// 重新查询列表数据
+				this.search()
+				// 通知父组件,相关设置
+				this.$emit("audioStatus", status)
+				// 清除table的选择状态
+				this.$refs.table.clearSelection()
+			  }
+			})
+		  },
+		  viewClose () {
+			this.tenantViewVisible = false
+		  },
+		// 验证是否选中数据-函数
+		checkData(){
+		  let flag = true
+		  if (!this.selection.length) {
+			this.$message({
+			  message: this.$t("tips.noDataSelected"),
+			  type: "warning"
+			})
+			flag = false
+		  }
+		  if (this.selection.length > 1) {
+			this.$message({
+			  message: this.$t("tips.mustOne"),
+			  type: "warning"
+			})
+			flag = false
+		  }
+		  return flag
+		},
+		  editClose () {
+			this.dialog.isVisible = false
+		  },
+		  editSuccess () {
+			this.search()
+		  },
+		  onSelectChange (selection) {
+			this.selection = selection
+		  },
+		  search () {
+			this.fetch({
+			  ...this.queryParams
+			})
+		  },
+		orderOperateBtn(row,command){
+        // 如果是:【暂停】
+        if(command == "stop"){
+            const produceStatus = row.produceStatus
+            console.log("produceStatus="+produceStatus)
+            if (produceStatus === '1' || produceStatus === '4') {
+                this.$message({
+                    message: this.$t("订单未开始生产或已经生产完成,无需暂停"),
+                    type: "warning"
+                })
+                return false
+            }
+            this.panseBtn('0', row)
+        }
+
+        // 如果是:【启用】
+        if(command == "start"){
+            const produceStatus = row.produceStatus
+            if (produceStatus != '3') {
+                this.$message({
+                    message: this.$t("订单未暂停,无需启用"),
+                    type: "warning"
+                })
+                return false
+            }
+            this.panseBtn('1', row)
+        }
+      },
+		  reset () {
+			this.queryParams = initQueryParams({})
+			this.$refs.table.clearSort()
+			this.$refs.table.clearFilter()
+			this.search()
+		  },
+		  add () {
+			this.$refs.edit.type = "add"
+			this.$refs.edit.setTenant(false, this.dicts)
+			this.dialog.title = this.$t("common.add")
+			this.dialog.isVisible = true
+		  },
+		  singleDelete (row) {
+			this.$refs.table.clearSelection()
+			this.$refs.table.toggleRowSelection(row, true)
+			this.batchDelete()
+		  },
+		  batchDelete () {
+			if (!this.selection.length) {
+			  this.$message({
+				message: this.$t("tips.noDataSelected"),
+				type: "warning"
+			  })
+			  return
+			}
+  
+			this.$confirm(this.$t("runCenter.tips.orderTips"), this.$t("common.tips"), {
+				distinguishCancelAndClose: true,
+			  confirmButtonText: this.$t("common.confirm"),
+			  cancelButtonText: this.$t("common.cancel"),
+			  type: "warning"
+			}).then(() => {
+				const ids = []
+				this.selection.forEach(item => {
+				  ids.push(item.id)
+				})
+				this.delete(ids)
+			}).catch(() => {})
+		  },
+		orderConf(row){
+			this.$refs.detailConf.setTenant(row, this.dicts);
+      		this.$refs.detailConf.type = "edit";
+      		this.dialogDetailConf.title = "任务配置"
+      		this.dialogDetailConf.isVisible = true	
+		},
+		orderDelete(){
+		  if(this.checkData()){
+			this.$confirm(this.$t("runCenter.tips.orderTips"), this.$t("common.tips"), {
+			  distinguishCancelAndClose: true,
+			  confirmButtonText: this.$t("common.confirm"),
+			  cancelButtonText: this.$t("common.cancel"),
+			  type: "warning"
+			}).then(() => {
+			  let obj = {
+				id: this.selection[0].id
+			  }
+			  orderMgrApi.delete(obj).then(res => {
+				res = res.data
+				if (res.isSuccess) {
+				  this.$message({
+					message: this.$t('tips.optionSuccess'),
+					type: 'success'
+				  })
+				  // 更新列表
+				  this.search()
+				  // 清理Table的选择数据
+				  this.$refs.table.clearSelection()
+				}
+			  })
+			}).catch(() => {})
+		  }
+		},
+		  clearSelections () {
+			this.$refs.table.clearSelection()
+		  },
+		  delete (ids) {
+			orderMgrApi.remove({ ids: ids }).then(response => {
+			  const res = response.data
+			  if (res.isSuccess) {
+				this.$message({
+				  message: this.$t("tips.deleteSuccess"),
+				  type: "success"
+				})
+				this.search()
+				// 清理已经删除的数据
+				this.$refs.table.clearSelection()
+			  }
+			})
+		  },
+		  editDetailConfClose() {
+      		this.dialogDetailConf.isVisible = false;
+    	  },
+    	  editDetailConfSuccess() {
+      		this.search();
+    	  },
+		  // 【修改】表头上Btn-事件
+		  editOne() {
+			  if (!this.selection.length) {
+			  this.$message({
+				message: this.$t("tips.noDataSelected"),
+				type: "warning"
+			  })
+			  return
+			}
+			  if (this.selection.length > 1) {
+			  this.$message({
+				message: this.$t("tips.mustOne"),
+				type: "warning"
+			  })
+			  return
+			}
+			  this.edit(this.selection[0]);
+		  },
+		  prodNode(row){
+			orderMgrApi.prodNode({id:"1234567890", orderId:row.id}).then(response => {
+	        const res = response.data
+	        if (res.isSuccess) {
+	          this.$message({
+	            message: this.$t("tips.createSuccess"),
+	            type: "success"
+	          })
+	          this.search()
+	          // 清理已经删除的数据
+	          this.$refs.table.clearSelection()
+	        }
+	      })	
+		},
+		  view (row) {
+			  this.$refs.edit.setTenant(row, this.dicts)
+			this.$refs.edit.type = "view"
+			this.dialog.title = this.$t("common.view")
+			this.dialog.isVisible = true
+		  },
+		  edit (row) {
+			this.$refs.edit.setTenant(row, this.dicts)
+			this.$refs.edit.type = "edit"
+			this.dialog.title = this.$t("common.edit")
+			this.dialog.isVisible = true
+		  },
+		  fetch (params = {}) {
+			this.loading = true
+			if (this.queryParams.timeRange) {
+			  this.queryParams.model.deliveryTime_st = this.queryParams.timeRange[0] + " 00:00:00"
+			  this.queryParams.model.deliveryTime_ed = this.queryParams.timeRange[1] + " 23:59:59"
+			}
+  
+		  // 如果【零件交货日期】有值
+		  if (this.queryParams.timeRange1) {
+			this.queryParams.model.pdeliveryTimeStart = this.queryParams.timeRange1[0] + " 00:00:00"
+			this.queryParams.model.pdeliveryTimeEnd = this.queryParams.timeRange1[1] + " 23:59:59"
+		  }
+  
+			this.queryParams.current = params.current ? params.current : this.queryParams.current
+			this.queryParams.size = params.size ? params.size : this.queryParams.size
+			// 查询必须参数-草稿:orderstatus = 1 and source = 1
+			this.queryParams.model.orderStatus = '1'
+			this.queryParams.model.source = '1'
+			this.queryParams.model.singleTaskFlag = '1'
+			orderMgrApi.page(this.queryParams).then(response => {
+			  const res = response.data
+			  if (res.isSuccess) {
+				this.tableData = res.data
+				// 给列表设置条数
+				this.$emit('setTabNums', res.data.total, 'tab7')
+			  }
+			  // eslint-disable-next-line no-return-assign
+			}).finally(() => this.loading = false)
+  
+		  },
+		  cellClick (row, column) {
+			if (column['columnKey'] === "operation") {
+			  return
+			}
+			let flag = false
+			this.selection.forEach((item) => {
+			  if (item.id === row.id) {
+				flag = true
+				this.$refs.table.toggleRowSelection(row)
+			  }
+			})
+  
+			if (!flag) {
+			  this.$refs.table.toggleRowSelection(row, true)
+			}
+		  },
+		downloadOrderTemplate(){
+		  orderMgrApi.downloadOrderTemplate({}).then(response => {
+			downloadFile(response)
+		  })
+		},
+		uploadOrder() {
+		  this.fileImport.type = "upload";
+		  this.fileImport.isVisible = true;
+		  this.$refs.import.setModel(false);
+		},
+		importSuccess() {
+		  this.search();
+		},
+		importClose() {
+		  this.fileImport.isVisible = false;
+		},
+		}
+	  }
+  </script>
+  <style lang="scss" scoped></style>
+  

+ 314 - 0
imcs-ui/src/views/zuihou/statisticalAnalysis/otherWorkHour/Index.vue

@@ -0,0 +1,314 @@
+<template>
+  <div class="app-container">
+    <!--查询表单-->
+    <el-card class="operate-container" shadow="never">
+      <el-form :inline="true" class="demo-form-inline">
+        <el-form-item label="所属产线">
+          <el-select
+            v-model="searchObj.zoneId"
+            clearable
+            placeholder="请选择"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="(item, index) in zoneList"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="分配设备">
+          <el-input v-model="searchObj.resourceName" placeholder="设备名称" />
+        </el-form-item>
+        <el-form-item label="生产时间">
+          <el-date-picker
+            v-model="searchObj.startDate"
+            placeholder="开始时间"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item label="-">
+          <el-date-picker
+            v-model="searchObj.endDate"
+            placeholder="结束时间"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item label="生产月份">
+          <el-date-picker
+            v-model="searchObj.month"
+            type="month"
+            placeholder="选择月"
+            value-format="yyyy-MM"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="生产年份">
+          <el-date-picker
+            v-model="searchObj.years"
+            type="year"
+            placeholder="选择年"
+            value-format="yyyy"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="fetch()"
+        >查询</el-button
+        >
+        <el-button type="default" @click="resetData()">清空</el-button>
+      </el-form>
+    </el-card>
+    <!-- 列表数据 -->
+    <el-table
+      :key="tableKey"
+      ref="table"
+      :data="tableData"
+      border
+      fit
+      style="width: 100%"
+      @selection-change="onSelectChange"
+      @cell-click="cellClick"
+    >
+      <el-table-column
+        :label="$t('common.serialNo')"
+        width="55px"
+        align="center"
+      >
+        <template slot-scope="scope">
+          {{ (page - 1) * limit + scope.$index + 1 }}
+        </template>
+      </el-table-column>
+      <el-table-column label="工时定额统计表" :resizable="false" align="center">
+        <!--订单号-->
+        <el-table-column
+          prop="zoneName"
+          :label="$t('statisticalAnalysis.table.workHourReport.orderNo')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--产线-->
+        <el-table-column
+          prop="zoneName"
+          :label="$t('statisticalAnalysis.table.workHourReport.zoneName')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--分配设备-->
+        <el-table-column
+          prop="resourceName"
+          :label="$t('statisticalAnalysis.table.workHourReport.resourceName')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--零件名称-->
+        <el-table-column
+          prop="bomName"
+          :label="$t('statisticalAnalysis.table.workHourReport.bomName')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--工序-->
+        <el-table-column
+          prop="procedureNo"
+          :label="$t('statisticalAnalysis.table.workHourReport.procedureNo')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--开始时间-->
+        <el-table-column
+          prop="startTime"
+          :label="$t('statisticalAnalysis.table.workHourReport.startTime')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--结束时间-->
+        <el-table-column
+          prop="endTime"
+          :label="$t('statisticalAnalysis.table.workHourReport.endTime')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--等待时长-->
+        <el-table-column
+          prop="actualWorkHour"
+          label="等待时长(分钟)"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--报警时长-->
+        <el-table-column
+          prop="alarmHour"
+          :label="$t('statisticalAnalysis.table.workHourReport.alarmHour')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <el-pagination
+      :current-page="page"
+      :total="total"
+      :page-size="limit"
+      :page-sizes="[5, 10, 20, 30, 40, 50, 100]"
+      style="padding: 30px 0; text-align: center"
+      layout="total, sizes, prev, pager, next, jumper"
+      @size-change="changePageSize"
+      @current-change="changeCurrentPage"
+    />
+  </div>
+</template>
+
+<script>
+// 【产品加工汇总】-API
+import productlineAvailabilityApi from "@/api/statisticalAnalysis/productlineAvailability";
+// 【弹出框】elementui组件
+import elDragDialog from "@/directive/el-drag-dialog";
+import Pagination from "@/components/Pagination";
+import areaMgrApi from "@/api/resourceProductMgr/areaMgr";
+export default {
+  name: "productStatistics",
+  directives: {
+    elDragDialog,
+  },
+  components: {},
+  data() {
+    return {
+      tableData: [], // 讲师列表
+      formData: [],
+      total: 0, // 总记录数
+      page: 1, // 当前页码
+      limit: 10, // 每页记录数
+      page2: 1, // 当前页码
+      limit2: 10, // 每页记录数
+      total2: 0, // 总记录数
+      searchObj: {}, // 查询条件
+      dialogVisible: false, //是否弹框
+      zoneList: [],
+      row2: {},
+      totalNum: 0
+    };
+  },
+  computed: {},
+  // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
+  created() {
+    // 加载列表数据
+    this.fetch();
+    this.getZoneList();
+  },
+  watch: {
+    loadingId: {
+      handler(val, oldVal) {
+        // 加载列表数据
+        this.fetch();
+      },
+    },
+    loadingDate: {
+      handler(val, oldVal) {
+        // 加载列表数据
+        this.fetch();
+      },
+    },
+  },
+  mounted() {},
+  methods: {
+    view(row) {
+      this.$refs.view.setOperatorDetailPerformance(row);
+      this.operatorViewVisible = true;
+    },
+    fetch() {
+      let index = 0;
+      if(this.searchObj.startDate) index++;
+      if(this.searchObj.month) index++;
+      if(this.searchObj.years) index++;
+
+      if(index>1) {
+        this.$message({
+          message: "时间,月份,年份只能选择一个",
+          type: "warning"
+        })
+        return
+      }
+      this.tableKey = !this.tableKey;
+      productlineAvailabilityApi
+        .otherHourReport(this.page, this.limit, this.searchObj)
+        .then((response) => {
+          const res = response.data;
+          this.tableData = (res.data || []).records;
+          this.totalNum = 0
+          if(this.tableData){
+            this.tableData.forEach(item => {
+              this.totalNum += Number(item.totalNum)
+            })
+          }
+          this.total = (res.data || []).total;
+        });
+    },
+    // 每页记录数改变,size:回调参数,表示当前选中的“每页条数”
+    changePageSize(size) {
+      this.limit = size;
+      this.fetch();
+    },
+    // 改变页码,page:回调参数,表示当前选中的“页码”
+    changeCurrentPage(page) {
+      this.page = page;
+      this.fetch();
+    },
+    changePageSize2(size) {
+      this.limit2 = size;
+      console.log("执行")
+      this.fetchDataById(this.row2);
+    },
+    changeCurrentPage2(page) {
+      this.page2 = page;
+      console.log("执行")
+      this.fetchDataById(this.row2);
+    },
+    //清空
+    resetData() {
+      this.searchObj = {};
+      this.fetch();
+    },
+    cellClick(row, column) {
+      if (column["columnKey"] === "operation") {
+        return;
+      }
+      let flag = false;
+      this.selection.forEach((item) => {
+        if (item.id === row.id) {
+          flag = true;
+          this.$refs.table.toggleRowSelection(row);
+        }
+      });
+
+      if (!flag) {
+        this.$refs.table.toggleRowSelection(row, true);
+      }
+    },
+    onSelectChange(selection) {
+      this.selection = selection;
+    },
+    getZoneList() {
+      areaMgrApi.getList({ status: 1 }).then((res) => {
+        res = res.data;
+        if (res.isSuccess) {
+          if(res.data){
+            this.zoneList = res.data.filter(item => item.name.indexOf('保障') ==-1)
+          }
+        }
+      });
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.rowBtn {
+  margin: 0 5px;
+  color: #1890ff;
+}
+
+.rowBtn:hover {
+  opacity: 0.7;
+}
+</style>

+ 453 - 0
imcs-ui/src/views/zuihou/statisticalAnalysis/taskAnalysis/Index.vue

@@ -0,0 +1,453 @@
+<template>
+  <div class="app-container">
+    <!--查询表单-->
+    <el-card class="operate-container" shadow="never">
+      <el-form :inline="true" class="demo-form-inline">
+        <el-form-item label="任务类型">
+          <el-select
+            v-model="searchObj.taskType"
+            clearable
+            placeholder="请选择"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="(item, index) in taskType"
+              :key="index"
+              :label="item.name"
+              :value="item.key"
+            />
+          </el-select>
+        </el-form-item>        
+        <el-form-item label="生产时间">
+          <el-date-picker
+            v-model="searchObj.startDate"
+            placeholder="开始时间"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item label="-">
+          <el-date-picker
+            v-model="searchObj.endDate"
+            placeholder="结束时间"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item label="生产月份">
+          <el-date-picker
+            v-model="searchObj.month"
+            type="month"
+            placeholder="选择月"
+            value-format="yyyy-MM"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="生产年份">
+          <el-date-picker
+            v-model="searchObj.years"
+            type="year"
+            placeholder="选择年"
+            value-format="yyyy"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="fetch()"
+          >查询</el-button
+        >
+        <el-button type="default" @click="resetData()">清空</el-button>
+      </el-form>
+    </el-card>
+    <!-- 列表数据 -->
+    <el-table
+      :key="tableKey"
+      ref="table"
+      :data="tableData"
+      border
+      fit
+      style="width: 100%"
+      @selection-change="onSelectChange"
+      @cell-click="cellClick"
+    >
+      <el-table-column
+        :label="$t('common.serialNo')"
+        width="55px"
+        align="center"
+      >
+        <template slot-scope="scope">
+          {{ (page - 1) * limit + scope.$index + 1 }}
+        </template>
+      </el-table-column>
+      <el-table-column label="设备资源生产表" :resizable="false" align="center">
+        <!--产线-->
+        <el-table-column          
+          label="任务类型"
+          :show-overflow-tooltip="true"
+        >
+        <template slot-scope="scope">
+          {{ scope.row.modeSpecification? '加工设备':(scope.row.resourceName.includes('上下料站')? '上下料站':'其它设备')}}
+        </template>
+        </el-table-column>
+        <!--分配设备-->
+        <el-table-column
+          prop="resourceName"
+          :label="$t('statisticalAnalysis.table.deviceResource.resourceName')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--总数量-->
+        <el-table-column
+          prop="totalNum"
+          :label="$t('statisticalAnalysis.table.deviceResource.totalNum')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--日期-->
+        <el-table-column
+          prop="time"
+          :label="$t('statisticalAnalysis.table.deviceResource.time')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+
+        <!--操作-->
+        <el-table-column label="操作" width="210" align="center">
+          <template slot-scope="scope">
+            <el-button type="text" @click="fetchDataById(scope.row)"
+              >查看详情</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table-column>
+    </el-table>
+    <p style="color: #E96767;size: 10px;float: right">生产总数:{{totalNum}}</p>
+    <!-- 分页组件 -->
+    <el-pagination
+      :current-page="page"
+      :total="total"
+      :page-size="limit"
+      :page-sizes="[5, 10, 20, 30, 40, 50, 100]"
+      style="padding: 30px 0; text-align: center"
+      layout="total, sizes, prev, pager, next, jumper"
+      @size-change="changePageSize"
+      @current-change="changeCurrentPage"
+    />
+
+
+
+    <el-dialog title="产品加工详情" :close-on-click-modal="false" :visible.sync="dialogVisible"  style="width: 110%; margin-top: 20px">
+      <el-table
+        :key="tableKey"
+        ref="table"
+        :data="formData"
+        border
+        fit
+        style="width: 100%"
+      >
+        <!--订单号-->
+        <el-table-column
+          prop="orderNo"
+          :label="$t('statisticalAnalysis.table.deviceResourceDetail.orderNo')"
+          :show-overflow-tooltip="true"
+          width="140"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="bomDesc"
+          label="工艺名称"
+          :show-overflow-tooltip="true"
+          width="140"
+        >
+        </el-table-column>        
+        <!--分配设备名称-->
+        <el-table-column
+          prop="resourceDesc"
+          :label="$t('statisticalAnalysis.table.deviceResourceDetail.resourceName')"
+          :show-overflow-tooltip="true"
+          width="160"
+        >
+        </el-table-column>
+        <!--产品名称-->
+        <el-table-column
+          prop="userName"
+          label="操作人员"
+          :show-overflow-tooltip="true"
+          width="130"
+        >
+        </el-table-column>
+        <!--工序-->
+        <el-table-column
+          prop="procedureNo"
+          :label="$t('statisticalAnalysis.table.deviceResourceDetail.procedureNo')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--工序名称-->
+        <el-table-column
+          prop="procedureDesc"
+          label="工序名称"
+          :show-overflow-tooltip="true"
+          width="145"
+        >
+      </el-table-column>        
+        <!--开始时间-->
+        <el-table-column
+          prop="startTime"
+          :label="$t('statisticalAnalysis.table.deviceResourceDetail.startTime')"
+          :show-overflow-tooltip="true"
+          width="160"
+        >
+        </el-table-column>
+        <!--结束时间-->
+        <el-table-column
+          prop="endTime"
+          :label="$t('statisticalAnalysis.table.deviceResourceDetail.endTime')"
+          :show-overflow-tooltip="true"
+          width="160"
+        >
+        </el-table-column>
+      </el-table>
+      <!-- 分页组件 -->
+      <el-pagination
+        :current-page="page2"
+        :total="total2"
+        :page-size="limit2"
+        :page-sizes="[5, 10, 20, 30, 40, 50, 100]"
+        style="padding: 30px 0; text-align: center"
+        layout="total, sizes, prev, pager, next, jumper"
+        @size-change="changePageSize2"
+        @current-change="changeCurrentPage2"
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+// 【产品加工汇总】-API
+import productlineAvailabilityApi from "@/api/statisticalAnalysis/productlineAvailability";
+// 【弹出框】elementui组件
+import elDragDialog from "@/directive/el-drag-dialog";
+import Pagination from "@/components/Pagination";
+import areaMgrApi from "@/api/resourceProductMgr/areaMgr";
+export default {
+  name: "productStatistics",
+  directives: {
+    elDragDialog,
+  },
+  components: {},
+  data() {
+    return {
+      tableData: [], // 讲师列表
+      formData: [],
+      total: 0, // 总记录数
+      page: 1, // 当前页码
+      limit: 10, // 每页记录数
+      page2: 1, // 当前页码
+      limit2: 10, // 每页记录数
+      total2: 0, // 总记录数
+      searchObj: {}, // 查询条件
+      dialogVisible: false, //是否弹框
+      taskType: [{id:"1",name:"上下料站",key:"2,6"},{id:"2",name:"加工设备",key:"0"},{id:"3",name:"其他设备",key:"1"}],
+      resourceIds: [],
+      row2: {},
+      totalNum: 0
+    };
+  },
+  computed: {},
+  // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
+  created() {
+    // 加载列表数据
+    this.fetch() 
+    this.getResources()   
+  },
+  watch: {
+    loadingId: {
+      handler(val, oldVal) {
+        // 加载列表数据
+        this.fetch();
+      },
+    },
+    loadingDate: {
+      handler(val, oldVal) {
+        // 加载列表数据
+        this.fetch();
+      },
+    },
+  },
+  mounted() {},
+  methods: {
+    view(row) {
+      this.$refs.view.setOperatorDetailPerformance(row);
+      this.operatorViewVisible = true;
+    },
+    fetch() {
+      let index = 0;
+      if(this.searchObj.startDate) index++;
+      if(this.searchObj.month) index++;
+      if(this.searchObj.years) index++;
+
+      if(index>1) {
+        this.$message({
+          message: "时间,月份,年份只能选择一个",
+          type: "warning"
+        })
+        return
+      }
+      this.tableKey = !this.tableKey;
+      productlineAvailabilityApi
+        .taskResourceSum(this.searchObj)
+        .then((response) => {
+          const res = response.data;          
+          this.tableData = (res.data || []);
+          this.totalNum = 0
+          if(this.tableData){
+            this.tableData.forEach(item => {
+              this.totalNum += Number(item.totalNum)
+            })
+          }
+          this.total = (res.data || []).total;
+        });
+    },
+    //根据id查询
+    fetchDataById(row) {
+      //弹出框
+      console.log(row)
+      this.row2 = row
+      this.dialogVisible = true;
+      const obj = {
+        resourceId: row.resourceId,        
+        taskType: this.searchObj.taskType,
+        startDate: this.searchObj.startDate,        
+        endDate: this.searchObj.endDate,      
+      }
+      if(this.searchObj.month){
+        obj['month']=this.searchObj.month
+      }
+      if(this.searchObj.years){
+        obj['years']=this.searchObj.years
+      }
+           
+      this.tableKey = !this.tableKey;
+      productlineAvailabilityApi
+        .taskResourceDetail(this.page2,this.limit2,obj)
+        .then((response) => {
+          const res = response.data;
+          this.formData = (res.data || []).records;
+          this.total2 = (res.data || []).total;
+        });
+    },
+    // 每页记录数改变,size:回调参数,表示当前选中的“每页条数”
+    changePageSize(size) {
+      this.limit = size;
+      this.fetch();
+    },
+    // 改变页码,page:回调参数,表示当前选中的“页码”
+    changeCurrentPage(page) {
+      this.page = page;
+      this.fetch();
+    },
+    changePageSize2(size) {
+      this.limit2 = size;
+      console.log("执行")
+      this.fetchDataById(this.row2);
+    },
+    changeCurrentPage2(page) {
+      this.page2 = page;
+      console.log("执行")
+      this.fetchDataById(this.row2);
+    },
+    //清空
+    resetData() {
+      this.searchObj = {};
+      this.fetch();
+    },
+    cellClick(row, column) {
+      if (column["columnKey"] === "operation") {
+        return;
+      }
+      let flag = false;
+      this.selection.forEach((item) => {
+        if (item.id === row.id) {
+          flag = true;
+          this.$refs.table.toggleRowSelection(row);
+        }
+      });
+
+      if (!flag) {
+        this.$refs.table.toggleRowSelection(row, true);
+      }
+    },
+    onSelectChange(selection) {
+      this.selection = selection;
+    },    
+    getResources(){
+
+    },
+    //导出
+    exportData() {
+      productlineAvailabilityApi.expectprocedureSum().then((res) => {
+        if (!res) return;
+        const blob = new Blob([res.data], {
+          type: "application/vnd.ms-excel;",
+        });
+        const a = document.createElement("a");
+        // 生成文件路径
+        let href = window.URL.createObjectURL(blob);
+        a.href = href;
+        // 文件名中有中文 则对文件名进行转码
+        a.download = decodeURIComponent("产品加工汇总");
+        // 利用a标签做下载
+        document.body.appendChild(a);
+        a.click();
+        document.body.removeChild(a);
+        window.URL.revokeObjectURL(href);
+        this.allloading = false;
+      });
+    },
+    //
+     objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2) {
+		  const _row = this.flitterData(this.formData).one[rowIndex];
+		  const _col = _row > 0 ? 1 : 0;
+		  return {
+		    rowspan: _row,
+		    colspan: _col,
+		  };
+		}
+	},
+	/**合并表格的第一列,处理表格数据 */
+	flitterData(arr) {
+	  let spanOneArr = [];
+	  let concatOne = 0;
+	  arr.forEach((item, index) => {
+	    if (index === 0) {
+	      spanOneArr.push(1);
+	    } else {
+	    //注意这里的quarterly是表格绑定的字段,根据自己的需求来改
+	      if (item.quarterly === arr[index - 1].quarterly) {
+	        //第一列需合并相同内容的判断条件
+	        spanOneArr[concatOne] += 1;
+	        spanOneArr.push(0);
+	      } else {
+	        spanOneArr.push(1);
+	        concatOne = index;
+	      }
+	    }
+	  });
+	  return {
+	    one: spanOneArr,
+	  };
+
+     }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.rowBtn {
+  margin: 0 5px;
+  color: #1890ff;
+}
+
+.rowBtn:hover {
+  opacity: 0.7;
+}
+</style>

+ 321 - 0
imcs-ui/src/views/zuihou/statisticalAnalysis/workHour/Index.vue

@@ -0,0 +1,321 @@
+<template>
+  <div class="app-container">
+    <!--查询表单-->
+    <el-card class="operate-container" shadow="never">
+      <el-form :inline="true" class="demo-form-inline">
+        <el-form-item label="所属产线">
+          <el-select
+            v-model="searchObj.zoneId"
+            clearable
+            placeholder="请选择"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="(item, index) in zoneList"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="分配设备">
+          <el-input v-model="searchObj.resourceName" placeholder="设备名称" />
+        </el-form-item>
+        <el-form-item label="生产时间">
+          <el-date-picker
+            v-model="searchObj.startDate"
+            placeholder="开始时间"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item label="-">
+          <el-date-picker
+            v-model="searchObj.endDate"
+            placeholder="结束时间"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item label="生产月份">
+          <el-date-picker
+            v-model="searchObj.month"
+            type="month"
+            placeholder="选择月"
+            value-format="yyyy-MM"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="生产年份">
+          <el-date-picker
+            v-model="searchObj.years"
+            type="year"
+            placeholder="选择年"
+            value-format="yyyy"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="fetch()"
+        >查询</el-button
+        >
+        <el-button type="default" @click="resetData()">清空</el-button>
+      </el-form>
+    </el-card>
+    <!-- 列表数据 -->
+    <el-table
+      :key="tableKey"
+      ref="table"
+      :data="tableData"
+      border
+      fit
+      style="width: 100%"
+      @selection-change="onSelectChange"
+      @cell-click="cellClick"
+    >
+      <el-table-column
+        :label="$t('common.serialNo')"
+        width="55px"
+        align="center"
+      >
+        <template slot-scope="scope">
+          {{ (page - 1) * limit + scope.$index + 1 }}
+        </template>
+      </el-table-column>
+      <el-table-column label="工时定额统计表" :resizable="false" align="center">
+        <!--订单号-->
+        <el-table-column
+          prop="zoneName"
+          :label="$t('statisticalAnalysis.table.workHourReport.orderNo')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--产线-->
+        <el-table-column
+          prop="zoneName"
+          :label="$t('statisticalAnalysis.table.workHourReport.zoneName')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--分配设备-->
+        <el-table-column
+          prop="resourceName"
+          :label="$t('statisticalAnalysis.table.workHourReport.resourceName')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--零件名称-->
+        <el-table-column
+          prop="bomName"
+          :label="$t('statisticalAnalysis.table.workHourReport.bomName')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--工序-->
+        <el-table-column
+          prop="procedureNo"
+          :label="$t('statisticalAnalysis.table.workHourReport.procedureNo')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--开始时间-->
+        <el-table-column
+          prop="startTime"
+          :label="$t('statisticalAnalysis.table.workHourReport.startTime')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--结束时间-->
+        <el-table-column
+          prop="endTime"
+          :label="$t('statisticalAnalysis.table.workHourReport.endTime')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--实际加工时长-->
+        <el-table-column
+          prop="actualWorkHour"
+          :label="$t('statisticalAnalysis.table.workHourReport.actualWorkHour')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--额定工时-->
+        <el-table-column
+          prop="workHour"
+          :label="$t('statisticalAnalysis.table.workHourReport.workHour')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <!--差值(额定-实际)-->
+        <el-table-column
+          prop="hour"
+          :label="$t('statisticalAnalysis.table.workHourReport.hour')"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <el-pagination
+      :current-page="page"
+      :total="total"
+      :page-size="limit"
+      :page-sizes="[5, 10, 20, 30, 40, 50, 100]"
+      style="padding: 30px 0; text-align: center"
+      layout="total, sizes, prev, pager, next, jumper"
+      @size-change="changePageSize"
+      @current-change="changeCurrentPage"
+    />
+  </div>
+</template>
+
+<script>
+// 【产品加工汇总】-API
+import productlineAvailabilityApi from "@/api/statisticalAnalysis/productlineAvailability";
+// 【弹出框】elementui组件
+import elDragDialog from "@/directive/el-drag-dialog";
+import Pagination from "@/components/Pagination";
+import areaMgrApi from "@/api/resourceProductMgr/areaMgr";
+export default {
+  name: "productStatistics",
+  directives: {
+    elDragDialog,
+  },
+  components: {},
+  data() {
+    return {
+      tableData: [], // 讲师列表
+      formData: [],
+      total: 0, // 总记录数
+      page: 1, // 当前页码
+      limit: 10, // 每页记录数
+      page2: 1, // 当前页码
+      limit2: 10, // 每页记录数
+      total2: 0, // 总记录数
+      searchObj: {}, // 查询条件
+      dialogVisible: false, //是否弹框
+      zoneList: [],
+      row2: {},
+      totalNum: 0
+    };
+  },
+  computed: {},
+  // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
+  created() {
+    // 加载列表数据
+    this.fetch();
+    this.getZoneList();
+  },
+  watch: {
+    loadingId: {
+      handler(val, oldVal) {
+        // 加载列表数据
+        this.fetch();
+      },
+    },
+    loadingDate: {
+      handler(val, oldVal) {
+        // 加载列表数据
+        this.fetch();
+      },
+    },
+  },
+  mounted() {},
+  methods: {
+    view(row) {
+      this.$refs.view.setOperatorDetailPerformance(row);
+      this.operatorViewVisible = true;
+    },
+    fetch() {
+      let index = 0;
+      if(this.searchObj.startDate) index++;
+      if(this.searchObj.month) index++;
+      if(this.searchObj.years) index++;
+
+      if(index>1) {
+        this.$message({
+          message: "时间,月份,年份只能选择一个",
+          type: "warning"
+        })
+        return
+      }
+      this.tableKey = !this.tableKey;
+      productlineAvailabilityApi
+        .workHourReport(this.page, this.limit, this.searchObj)
+        .then((response) => {
+          const res = response.data;
+          this.tableData = (res.data || []).records;
+          this.totalNum = 0
+          if(this.tableData){
+            this.tableData.forEach(item => {
+              this.totalNum += Number(item.totalNum)
+            })
+          }
+          this.total = (res.data || []).total;
+        });
+    },
+    // 每页记录数改变,size:回调参数,表示当前选中的“每页条数”
+    changePageSize(size) {
+      this.limit = size;
+      this.fetch();
+    },
+    // 改变页码,page:回调参数,表示当前选中的“页码”
+    changeCurrentPage(page) {
+      this.page = page;
+      this.fetch();
+    },
+    changePageSize2(size) {
+      this.limit2 = size;
+      console.log("执行")
+      this.fetchDataById(this.row2);
+    },
+    changeCurrentPage2(page) {
+      this.page2 = page;
+      console.log("执行")
+      this.fetchDataById(this.row2);
+    },
+    //清空
+    resetData() {
+      this.searchObj = {};
+      this.fetch();
+    },
+    cellClick(row, column) {
+      if (column["columnKey"] === "operation") {
+        return;
+      }
+      let flag = false;
+      this.selection.forEach((item) => {
+        if (item.id === row.id) {
+          flag = true;
+          this.$refs.table.toggleRowSelection(row);
+        }
+      });
+
+      if (!flag) {
+        this.$refs.table.toggleRowSelection(row, true);
+      }
+    },
+    onSelectChange(selection) {
+      this.selection = selection;
+    },
+    getZoneList() {
+      areaMgrApi.getList({ status: 1 }).then((res) => {
+        res = res.data;
+        if (res.isSuccess) {
+          if(res.data){
+            this.zoneList = res.data.filter(item => item.name.indexOf('保障') ==-1)
+          }
+        }
+      });
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.rowBtn {
+  margin: 0 5px;
+  color: #1890ff;
+}
+
+.rowBtn:hover {
+  opacity: 0.7;
+}
+</style>