Index.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <template>
  2. <div id="playerMap" ref="playerMap" class="app-container yunMapDiv" style="height:200%;">
  3. <!-- 全屏 -->
  4. <el-row :gutter="20" class="rowCls">
  5. <div class="headerBg">
  6. <h2>现场工控端</h2>
  7. <div class="battonDiv">
  8. <el-tooltip v-if="!isFullSreen" class="item" effect="dark" :content="$t('largeScreen.common.screening')" placement="top-start">
  9. <a @click="fullPing()"><i class="el-icon-full-screen"></i></a>
  10. </el-tooltip>
  11. <el-tooltip v-else class="item" effect="dark" :content="$t('largeScreen.common.cancel')" placement="top-start">
  12. <a @click="exitFullPing()"><i class="el-icon-switch-button"></i></a>
  13. </el-tooltip>
  14. </div>
  15. </div>
  16. <!--
  17. <el-image
  18. style="width: 100%; height: 100%"
  19. :src="url"
  20. fit="fill"
  21. ></el-image> -->
  22. </el-row>
  23. <!-- 区域模块 -->
  24. <div style="text-align:left;margin-left:5%;">
  25. <!-- 搜索-部分 -->
  26. <div class="defaultRow noBorder">
  27. <el-select v-model="opValue" :span="2" @change="selectChange" :placeholder='$t("common.pleaseSelect")'>
  28. <el-option
  29. v-for="item in options"
  30. :key="item.value"
  31. :label="item.name"
  32. :value="item.value">
  33. </el-option>
  34. </el-select>
  35. <span :span="2" style="margin-left: 2%;">
  36. <el-button plain type="primary" icon="el-icon-view" size="medium" @click="readView" >
  37. 读RFID
  38. </el-button>
  39. </span>
  40. <span :span="2" style="margin-right: 5%; float:right;">
  41. <el-button plain type="primary" icon="el-icon-view" size="medium" @click="navigator">
  42. 我的班表
  43. </el-button>
  44. </span>
  45. </div>
  46. <el-tabs style="text-align: left;margin-top:25px;">
  47. <el-tab-pane label="未完成">
  48. <span class="tabTitle" slot="label"><el-badge :value="taskCount" class="badge"><i class="el-icon-date"></i> 未完成</el-badge> </span>
  49. <el-col :span="(index==0)? 12:8" :gutter="24" v-for="(item, index) in taskData.slice(0,3)" :key="item.id" :offset="(index==0)?0:1" v-show="(item.status==0)?true:false" :style="(index==0)?'zoom:1;min-width:300px;':'zoom:0.6;min-width:180px;'">
  50. <el-card :gutter="24" class="box-card" style="margin:5px;" >
  51. <div class="card_content">
  52. <div class="block card_header">
  53. <el-image
  54. style="width: 90px; height: 80px;max-width:200%;max-height:200%;"
  55. :src="resolveLogo('status'+(index+1)+'.png')"
  56. fit="fill"
  57. >
  58. </el-image>
  59. <span>{{ item.taskName }}</span>
  60. <div class="itemNo">任务编号: {{ item.no }}</div>
  61. </div>
  62. <el-form style="margin-top:10px;">
  63. <el-form-item label="零件名称:" >
  64. <span>{{ item.name }}</span>
  65. </el-form-item>
  66. <el-form-item label="工序号:" >
  67. <span>{{ item.taskNo }}</span>
  68. </el-form-item>
  69. <el-form-item label="托盘编号:" >
  70. <span>{{ item.trayNo }}</span>
  71. </el-form-item>
  72. <el-form-item label="额定时间:" >
  73. <span>{{ item.time }}分钟</span>
  74. <div class="timeprogress">
  75. <el-progress :text-inside="true" :stroke-width="15" :percentage="setPercentage(item.time, item.left)" color="#FF3366" :format="setItemText(item.time, item.left)" ></el-progress>
  76. </div>
  77. </el-form-item>
  78. <el-form-item>
  79. <span style="margin:2% 0; float:right;">
  80. <el-button plain type="primary" icon="el-icon-view" size="medium" @click="finishTask(item)">
  81. 完成
  82. </el-button>
  83. </span>
  84. </el-form-item>
  85. </el-form>
  86. </div>
  87. </el-card>
  88. </el-col>
  89. </el-tab-pane>
  90. <el-tab-pane label="已完成">
  91. <span class="tabTitle" slot="label">
  92. <i class="el-icon-date"></i> 已完成
  93. </span>
  94. <el-table
  95. :data="finishData"
  96. stripe
  97. style="width: 100%">
  98. <el-table-column
  99. prop="taskName"
  100. label="名称"
  101. width="200">
  102. </el-table-column>
  103. <el-table-column
  104. prop="name"
  105. label="零件名"
  106. width="200">
  107. </el-table-column>
  108. <el-table-column
  109. prop="no"
  110. label="编号"
  111. width="200">
  112. </el-table-column>
  113. <el-table-column
  114. prop="taskNo"
  115. label="工序号"
  116. width="150">
  117. </el-table-column>
  118. <el-table-column
  119. prop="trayNo"
  120. label="托盘编号"
  121. width="200">
  122. </el-table-column>
  123. </el-table>
  124. </el-tab-pane>
  125. </el-tabs>
  126. </div>
  127. <!-- 【查看】组件 -->
  128. <task-view
  129. ref="view"
  130. :dialog-visible="tenantViewVisible"
  131. @get-data="showRFID"
  132. @close="viewClose"
  133. />
  134. </div>
  135. </template>
  136. <script>
  137. // 【查看】组件
  138. import TaskView from "../waitingTasks/components/View"
  139. import { fullScreen, exitFullScreen } from '@/utils/commons'
  140. import stationMgrApi from "@/api/machiningClient/stationMgr";
  141. export default {
  142. name: 'TouchScreen',
  143. components: { TaskView },
  144. props: {
  145. },
  146. data () {
  147. return {
  148. options:[{name:"上下料站1",value:1},{name:"上下料站2",value:2},{name:"上下料站2",value:3},{name:"上下料站4",value:4}],
  149. opValue: 1,
  150. taskCount:6,
  151. taskData:[{id:1,taskName:"上料",no:"12235566",name:"框体",taskNo:"OP10",trayNo:"TP7788",time:15,left:2,status:0},{id:2,taskName:"翻面",no:"12235566",name:"框体",taskNo:"OP50",trayNo:"TP7788",time:25,left:6,status:0},{id:3,taskName:"下料",no:"12235566",name:"框体",taskNo:"OP90",trayNo:"TP7788",time:5,left:1,status:0},{id:4,taskName:"下料",no:"12235566",name:"框体",taskNo:"OP90",trayNo:"TP7788",time:5,left:1,status:0}],
  152. finishData:[],
  153. step: 1,
  154. tenantViewVisible: false,
  155. isFullSreen: false, // 默认不全屏
  156. }
  157. },
  158. // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
  159. created() {
  160. this.fetch()
  161. },
  162. computed: {
  163. currentUser () {
  164. return this.$store.state.account.user
  165. }
  166. },
  167. mounted () {
  168. },
  169. methods: {
  170. // 全屏
  171. fullPing(){
  172. this.$nextTick(() => {
  173. // 显示【退出全屏】
  174. this.isFullSreen = true
  175. // 如果是退出全屏
  176. let $playerMap = this.$refs.playerMap
  177. if($playerMap){
  178. fullScreen($playerMap)
  179. }
  180. })
  181. },
  182. // 退出全屏
  183. exitFullPing(){
  184. this.$nextTick(() => {
  185. // 显示【全屏】
  186. this.isFullSreen = false
  187. // 如果是全屏
  188. exitFullScreen(document.getElementById('playerMap'))
  189. })
  190. },
  191. selectChange(value){
  192. console.log(value)
  193. },
  194. fetch(){
  195. stationMgrApi.getStation({userId:this.$store.state.account.user.id}).then((res) => {
  196. res = res.data;
  197. if(res.isSuccess){
  198. if(res.data.length>0){
  199. this.options = res.data
  200. }
  201. }
  202. });
  203. },
  204. readView(){
  205. //this.tenantViewVisible = true
  206. this.$refs.view.read(null)
  207. },
  208. showRFID(code){
  209. console.log(code)
  210. },
  211. resolveLogo(logo) {
  212. return require(`@/assets/yunMap/${logo}`);
  213. },
  214. viewClose () {
  215. this.tenantViewVisible = false
  216. },
  217. setPercentage(time, left){
  218. return this.formatGap(time, left)[0]>100? 100 : this.formatGap(time, left)[0]
  219. },
  220. // 设置进度文本内容
  221. setItemText(time, left){
  222. return () => {
  223. return this.formatGap(time, left)[1]
  224. }
  225. },
  226. //时间差转换
  227. formatGap(time, left) {
  228. return [Number(parseInt(100*left/time)), "剩余"+ left +"分钟"]
  229. },
  230. finishTask(item){
  231. item.status = 1
  232. this.taskCount = this.taskCount - 1
  233. this.finishData.push(item)
  234. this.taskData.shift()
  235. },
  236. navigator(){
  237. this.$router.push("/classScheduleMgr/classScheduleMgr")
  238. }
  239. }
  240. }
  241. </script>
  242. <style lang="scss" scoped>
  243. .tabDiv{
  244. position: relative;
  245. overflow: hidden;
  246. width: 100%;
  247. height: 100%;
  248. .battonDiv {
  249. z-index: 9;
  250. }
  251. }
  252. .tabTitle {
  253. font-size: 24px;
  254. height: 24px;
  255. line-height:24px;
  256. }
  257. .card_content{
  258. padding: 8px;
  259. width:100%;
  260. text-align:left;
  261. color:#fff;
  262. }
  263. .card_header{
  264. position:relative;
  265. border-bottom:1px solid #fff;
  266. margin:10px 0;
  267. }
  268. .indexNo {
  269. position:absolute;
  270. top:25%;
  271. left:9%;
  272. font-size:24px;
  273. line-height:24px;
  274. height:24px;
  275. color:#fff;
  276. z-index:999;
  277. }
  278. .indexNo2 {
  279. position:absolute;
  280. top:25%;
  281. left:6%;
  282. font-size:24px;
  283. line-height:24px;
  284. height:24px;
  285. color:#fff;
  286. z-index:999;
  287. }
  288. .itemNo {
  289. font-size:12px;
  290. line-height:12px;
  291. height:12px;
  292. text-align:right;
  293. color:#fff;
  294. margin-left:20%;
  295. margin-bottom:10px;
  296. }
  297. .timeprogress >>> .el-progress-bar__outer {
  298. background-color: #1890ff;
  299. }
  300. .timeprogress .el-progress-bar__inner {
  301. text-align:center;
  302. }
  303. .el-form-item >>> .el-form-item__label {
  304. color: #fff;
  305. }
  306. .el-form-item {
  307. margin-bottom: 0;
  308. }
  309. .tabTitle >>> .el-badge {
  310. position: relative;
  311. display: inline-block;
  312. vertical-align: baseline;
  313. }
  314. .badge {
  315. margin-top: 10px;
  316. margin-right: 20px;
  317. }
  318. </style>