Index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. <template>
  2. <div
  3. id="playerMap"
  4. ref="playerMap"
  5. class="app-container yunMapDiv"
  6. style="height: 200%"
  7. >
  8. <!-- 全屏 -->
  9. <el-row :gutter="20" class="rowCls">
  10. <div class="headerBg">
  11. <h2>现场工控端</h2>
  12. <div class="battonDiv">
  13. <el-tooltip
  14. v-if="!isFullSreen"
  15. class="item"
  16. effect="dark"
  17. :content="$t('largeScreen.common.screening')"
  18. placement="top-start"
  19. >
  20. <a @click="fullPing()"><i class="el-icon-full-screen"></i></a>
  21. </el-tooltip>
  22. <el-tooltip
  23. v-else
  24. class="item"
  25. effect="dark"
  26. :content="$t('largeScreen.common.cancel')"
  27. placement="top-start"
  28. >
  29. <a @click="exitFullPing()"><i class="el-icon-switch-button"></i></a>
  30. </el-tooltip>
  31. </div>
  32. </div>
  33. <!--
  34. <el-image
  35. style="width: 100%; height: 100%"
  36. :src="url"
  37. fit="fill"
  38. ></el-image> -->
  39. </el-row>
  40. <!-- 区域模块 -->
  41. <div style="text-align: left; margin-left: 5%">
  42. <!-- 搜索-部分 -->
  43. <div class="defaultRow noBorder">
  44. <el-select
  45. v-model="opValue"
  46. :span="2"
  47. @change="selectChange"
  48. :placeholder="$t('common.pleaseSelect')"
  49. >
  50. <el-option
  51. v-for="item in options"
  52. :key="item.value"
  53. :label="item.name"
  54. :value="item.value"
  55. >
  56. </el-option>
  57. </el-select>
  58. <span :span="2" style="margin-left: 2%">
  59. <el-button
  60. plain
  61. type="primary"
  62. icon="el-icon-view"
  63. size="medium"
  64. @click="readView"
  65. >
  66. 读RFID
  67. </el-button>
  68. </span>
  69. <span :span="2" style="margin-right: 5%; float: right">
  70. <el-button
  71. plain
  72. type="primary"
  73. icon="el-icon-view"
  74. size="medium"
  75. @click="navigator"
  76. >
  77. 我的班表
  78. </el-button>
  79. </span>
  80. </div>
  81. <el-tabs style="text-align: left; margin-top: 25px">
  82. <el-tab-pane label="未完成">
  83. <span class="tabTitle" slot="label"
  84. ><el-badge :value="taskCount" class="badge"
  85. ><i class="el-icon-date"></i> 未完成</el-badge
  86. >
  87. </span>
  88. <el-col
  89. :span="index == 0 ? 12 : 8"
  90. :gutter="24"
  91. v-for="(item, index) in taskData.slice(0, 3)"
  92. :key="item.id"
  93. :offset="index == 0 ? 0 : 1"
  94. v-show="item.status < 2 ? true : false"
  95. :style="
  96. index == 0
  97. ? 'zoom:1;min-width:300px;'
  98. : 'zoom:0.6;min-width:180px;'
  99. "
  100. >
  101. <el-card :gutter="24" class="box-card" style="margin: 5px" >
  102. <div class="card_content" >
  103. <div class="block card_header" @click="view(item)">
  104. <el-image
  105. style="
  106. width: 90px;
  107. height: 80px;
  108. max-width: 200%;
  109. max-height: 200%;
  110. "
  111. :src="resolveLogo('status' + (index + 1) + '.png')"
  112. fit="fill"
  113. >
  114. </el-image>
  115. <span>{{ item.taskName }}</span>
  116. <div class="itemNo">任务编号: {{ item.no }}</div>
  117. </div>
  118. <el-form style="margin-top: 10px">
  119. <el-form-item label="零件名称:">
  120. <span>{{ item.name }}</span>
  121. </el-form-item>
  122. <el-form-item label="工序号:">
  123. <span>{{ item.taskNo }}</span>
  124. </el-form-item>
  125. <el-form-item label="托盘编号:">
  126. <span>{{ item.trayNo }}</span>
  127. </el-form-item>
  128. <el-form-item label="额定时间:">
  129. <span>{{ item.time }}分钟</span>
  130. <div class="timeprogress">
  131. <el-progress
  132. :text-inside="true"
  133. :stroke-width="15"
  134. :percentage="setPercentage(item.time, item.left)"
  135. color="#FF3366"
  136. :format="setItemText(item.time, item.left)"
  137. ></el-progress>
  138. </div>
  139. </el-form-item>
  140. <el-form-item>
  141. <span style="margin: 2% 0; float: right">
  142. <el-button
  143. plain
  144. type="primary"
  145. icon="el-icon-view"
  146. size="medium"
  147. :disabled="index == 0 ? false : true"
  148. @click.native="finishTask(item)"
  149. >
  150. 完成
  151. </el-button>
  152. </span>
  153. </el-form-item>
  154. </el-form>
  155. </div>
  156. </el-card>
  157. </el-col>
  158. </el-tab-pane>
  159. <el-tab-pane label="已完成">
  160. <span class="tabTitle" slot="label">
  161. <i class="el-icon-date"></i> 已完成
  162. </span>
  163. <div class="tableTransparent">
  164. <el-table
  165. :data="finishData"
  166. border
  167. style="height:100%;min-height:80px;"
  168. :header-cell-style="{ background: '#1890ff', color: '#fff' }"
  169. >
  170. <el-table-column
  171. :label="$t('common.serialNo')"
  172. width="55px"
  173. align="center"
  174. >
  175. <template slot-scope="scope">
  176. <div>
  177. {{
  178. scope.$index +
  179. (queryParams.current - 1) * queryParams.size +
  180. 1
  181. }}
  182. </div>
  183. </template>
  184. </el-table-column>
  185. <el-table-column prop="name" label="零件名称" align="center">
  186. </el-table-column>
  187. <el-table-column prop="taskNo" label="工序号" width="80" align="center">
  188. </el-table-column>
  189. <el-table-column prop="taskName" label="工序名称" align="center">
  190. </el-table-column>
  191. <el-table-column prop="planTime" label="额定时间" width="100" align="center">
  192. </el-table-column>
  193. <el-table-column prop="activeTime" label="实际时间" width="100" align="center">
  194. </el-table-column>
  195. <el-table-column prop="startTime" label="开始时间" width="150" align="center">
  196. </el-table-column>
  197. <el-table-column prop="endTime" label="结束时间" width="150" align="center">
  198. </el-table-column>
  199. <el-table-column prop="overTime" label="是否超时" width="100" align="center">
  200. <template slot-scope="scope">
  201. {{ scope.overTime ? "是" : "否" }}
  202. </template>
  203. </el-table-column>
  204. </el-table>
  205. </div>
  206. </el-tab-pane>
  207. </el-tabs>
  208. </div>
  209. <!-- 【查看】组件 -->
  210. <task-view
  211. ref="view"
  212. :dialog-visible="tenantViewVisible"
  213. @get-data="showRFID"
  214. @close="viewClose"
  215. />
  216. <!-- 【查看】组件 -->
  217. <task-view1
  218. ref="view1"
  219. :dialog-visible="view1Visible"
  220. @close="viewClose"
  221. />
  222. <task-view2
  223. ref="view2"
  224. :dialog-visible="view2Visible"
  225. @close="viewClose"
  226. />
  227. <!-- 【查看】组件 -->
  228. <task-view3
  229. ref="view3"
  230. :dialog-visible="view3Visible"
  231. @close="viewClose"
  232. />
  233. </div>
  234. </template>
  235. <script>
  236. // 【查看】组件
  237. import TaskView from "./components/View";
  238. import TaskView1 from "./components/View1";
  239. import TaskView2 from "./components/View2";
  240. import TaskView3 from "./components/View3";
  241. import { fullScreen, exitFullScreen, initQueryParams } from "@/utils/commons";
  242. import stationMgrApi from "@/api/machiningClient/stationMgr";
  243. export default {
  244. name: "TouchScreen",
  245. components: { TaskView,TaskView1,TaskView2,TaskView3 },
  246. props: {},
  247. data() {
  248. return {
  249. queryParams: initQueryParams({}),
  250. options: [
  251. { name: "上下料站1", value: 1 },
  252. { name: "上下料站2", value: 2 },
  253. { name: "上下料站2", value: 3 },
  254. { name: "上下料站4", value: 4 },
  255. ],
  256. opValue: 1,
  257. taskCount: 6,
  258. taskData: [
  259. {
  260. id: 1,
  261. taskName: "上料",
  262. no: "12235566",
  263. name: "框体",
  264. taskNo: "OP10",
  265. trayNo: "TP7788",
  266. time: 15,
  267. left: 2,
  268. status: 1,
  269. content: "完成装夹,rfid读写",
  270. step: 1,
  271. },
  272. {
  273. id: 2,
  274. taskName: "翻面",
  275. no: "12235566",
  276. name: "框体",
  277. taskNo: "OP50",
  278. trayNo: "TP7788",
  279. time: 25,
  280. left: 6,
  281. status: 1,
  282. content: "",
  283. step: 2,
  284. },
  285. {
  286. id: 3,
  287. taskName: "下料",
  288. no: "12235566",
  289. name: "框体",
  290. taskNo: "OP90",
  291. trayNo: "TP7788",
  292. time: 5,
  293. left: 1,
  294. status: 0,
  295. content: "",
  296. step: 3,
  297. },
  298. {
  299. id: 4,
  300. taskName: "下料",
  301. no: "12235566",
  302. name: "框体",
  303. taskNo: "OP90",
  304. trayNo: "TP7788",
  305. time: 5,
  306. left: 1,
  307. status: 0,
  308. content: "",
  309. step: 3
  310. },
  311. ],
  312. finishData: [],
  313. current: 1,
  314. confirmDisabled: true,
  315. tenantViewVisible: false,
  316. view1Visible: false,
  317. view2Visible: false,
  318. view3Visible: false,
  319. isFullSreen: false, // 默认不全屏
  320. };
  321. },
  322. // 实例已经在内存中创建好,此时data和methods已将ok,如果要操作data中的数据或是调用methods中的方法,最早只能在created中操作
  323. created() {
  324. this.fetch();
  325. },
  326. computed: {
  327. currentUser() {
  328. return this.$store.state.account.user;
  329. },
  330. },
  331. mounted() {},
  332. methods: {
  333. // 全屏
  334. fullPing() {
  335. this.$nextTick(() => {
  336. // 显示【退出全屏】
  337. this.isFullSreen = true;
  338. // 如果是退出全屏
  339. let $playerMap = this.$refs.playerMap;
  340. if ($playerMap) {
  341. fullScreen($playerMap);
  342. }
  343. });
  344. },
  345. // 退出全屏
  346. exitFullPing() {
  347. this.$nextTick(() => {
  348. // 显示【全屏】
  349. this.isFullSreen = false;
  350. // 如果是全屏
  351. exitFullScreen(document.getElementById("playerMap"));
  352. });
  353. },
  354. selectChange(value) {
  355. console.log(value);
  356. },
  357. fetch() {
  358. stationMgrApi
  359. .getStation({ userId: this.$store.state.account.user.id })
  360. .then((res) => {
  361. res = res.data;
  362. if (res.isSuccess) {
  363. if (res.data.length > 0) {
  364. this.options = res.data;
  365. }
  366. }
  367. });
  368. },
  369. readView() {
  370. //this.tenantViewVisible = true
  371. this.$refs.view.read(null);
  372. },
  373. showRFID(code) {
  374. console.log(code);
  375. },
  376. resolveLogo(logo) {
  377. return require(`@/assets/yunMap/${logo}`);
  378. },
  379. view (item) {
  380. let that = this;
  381. let current = that.options.filter(function (c, i, a) {
  382. if (c.value == that.opValue) {
  383. return c
  384. }
  385. })
  386. item.procedurePosition = current[0].name;
  387. let index = item.step;
  388. if(index % 3 == 1){
  389. this.$refs.view1.setTenant(item)
  390. this.view1Visible = true
  391. }else if(index % 3 == 2){
  392. this.$refs.view2.setTenant(item)
  393. this.view2Visible = true
  394. }else if(index % 3 == 0){
  395. this.$refs.view3.setTenant(item)
  396. this.view3Visible = true
  397. }
  398. },
  399. viewClose() {
  400. this.view1Visible = false
  401. this.view2Visible = false
  402. this.view3Visible = false
  403. },
  404. setPercentage(time, left) {
  405. return this.formatGap(time, left)[0] > 100
  406. ? 100
  407. : this.formatGap(time, left)[0];
  408. },
  409. // 设置进度文本内容
  410. setItemText(time, left) {
  411. return () => {
  412. return this.formatGap(time, left)[1];
  413. };
  414. },
  415. //时间差转换
  416. formatGap(time, left) {
  417. return [Number(parseInt((100 * left) / time)), "剩余" + left + "分钟"];
  418. },
  419. finishTask(item) {
  420. item.status = 1;
  421. this.taskCount = this.taskCount - 1;
  422. let planTime = Math.ceil(Math.random() * 30);
  423. let activeTime = Math.ceil(Math.random() * 30);
  424. let currentTime = new Date();
  425. //let currentTime2 = new Date(currentTime.valueOf() + activeTime * 60);
  426. currentTime.setMinutes(currentTime.getMinutes() + activeTime);
  427. let finishParams = {
  428. planTime: planTime,
  429. activeTime: activeTime,
  430. startTime: this.getFullTime(new Date()),
  431. endTime: this.getFullTime(currentTime),
  432. overTime: planTime < activeTime ? true : false,
  433. };
  434. let result = Object.assign(item, finishParams);
  435. this.finishData.push(result);
  436. console.log(this.finishData);
  437. this.taskData.shift();
  438. },
  439. getFullTime(date) {
  440. var yy = date.getFullYear(); //年
  441. var mm = date.getMonth() + 1; //月
  442. var dd = date.getDate(); //日
  443. var hh = date.getHours(); //时
  444. var ii = date.getMinutes(); //分
  445. var ss = date.getSeconds(); //秒
  446. var clock = yy + "-";
  447. if (mm < 10) clock += "0";
  448. clock += mm + "-";
  449. if (dd < 10) clock += "0";
  450. clock += dd + " ";
  451. if (hh < 10) clock += "0";
  452. clock += hh + ":";
  453. if (ii < 10) clock += "0";
  454. clock += ii + ":";
  455. if (ss < 10) clock += "0";
  456. clock += ss;
  457. return clock;
  458. },
  459. navigator() {
  460. this.$router.push("/classScheduleMgr/classScheduleMgr");
  461. },
  462. },
  463. };
  464. </script>
  465. <style lang="scss" scoped>
  466. .tabDiv {
  467. position: relative;
  468. overflow: hidden;
  469. width: 100%;
  470. height: 100%;
  471. .battonDiv {
  472. z-index: 9;
  473. }
  474. }
  475. .tabTitle {
  476. font-size: 24px;
  477. height: 24px;
  478. line-height: 24px;
  479. }
  480. .card_content {
  481. padding: 8px;
  482. width: 100%;
  483. text-align: left;
  484. color: #fff;
  485. }
  486. .card_header {
  487. position: relative;
  488. border-bottom: 1px solid #fff;
  489. margin: 10px 0;
  490. }
  491. .indexNo {
  492. position: absolute;
  493. top: 25%;
  494. left: 9%;
  495. font-size: 24px;
  496. line-height: 24px;
  497. height: 24px;
  498. color: #fff;
  499. z-index: 999;
  500. }
  501. .indexNo2 {
  502. position: absolute;
  503. top: 25%;
  504. left: 6%;
  505. font-size: 24px;
  506. line-height: 24px;
  507. height: 24px;
  508. color: #fff;
  509. z-index: 999;
  510. }
  511. .itemNo {
  512. font-size: 12px;
  513. line-height: 12px;
  514. height: 12px;
  515. text-align: right;
  516. color: #fff;
  517. margin-left: 20%;
  518. margin-bottom: 10px;
  519. }
  520. .timeprogress >>> .el-progress-bar__outer {
  521. background-color: #1890ff;
  522. }
  523. .timeprogress .el-progress-bar__inner {
  524. text-align: center;
  525. }
  526. .el-form-item >>> .el-form-item__label {
  527. color: #fff;
  528. }
  529. .el-form-item {
  530. margin-bottom: 0;
  531. }
  532. .tabTitle >>> .el-badge {
  533. position: relative;
  534. display: inline-block;
  535. vertical-align: baseline;
  536. }
  537. .badge {
  538. margin-top: 10px;
  539. margin-right: 20px;
  540. }
  541. .tableTransparent >>> .el-table,
  542. .el-table__expanded-cell {
  543. background-color: transparent;
  544. }
  545. </style>