ofilm-dalianxian.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. <html lang="en">
  2. <head>
  3. <meta charset="UTF-8" />
  4. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>信息化展示平台-大连线体</title>
  7. <link rel="stylesheet" href="../css/ofilm-dalianxian/dalianxin.css" />
  8. <link rel="stylesheet" href="../css/ofilm-dalianxian/switch.css" />
  9. <script src="../js/dataHelper.js"></script>
  10. <script src="../lib/vue.min.js"></script>
  11. <script src="../lib/oidc-client.js"></script>
  12. <script src="../lib/axios.js"></script>
  13. <script src="../js/server-config.js"></script>
  14. <script src="../js/macstatus/oauth-client-config.js"></script>
  15. <script src="../js/macstatus/auth.js"></script>
  16. <script src="../js/request.js"></script>
  17. <script src="../lib/jquery/jquery.min.js"></script>
  18. <link rel="stylesheet" href="../lib/element-ui/element-chalk-theme.css" />
  19. <script src="../lib/element-ui/element-ui.js"></script>
  20. </head>
  21. <body>
  22. <div class="home" id="app">
  23. <div class="home-content">
  24. <div class="big-title">
  25. <div class="total-info">
  26. <span>机种:{{recipe}}</span>
  27. <span>总投入数:{{output}}</span>
  28. <span>总产出数:{{output}}</span>
  29. </div>
  30. <p>
  31. <span class="left"></span>信息化展示平台-大连线体<span
  32. class="right"
  33. ></span>
  34. </p>
  35. <span class="timer">{{ currentTime }}</span>
  36. </div>
  37. <div class="main-content">
  38. <div class="mac-info-category">
  39. <table border="1" cellspacing="0">
  40. <tbody>
  41. <tr>
  42. <td class="category" rowspan="3">
  43. 关<br />键<br />设<br />备
  44. </td>
  45. <td style="text-align: center">实<br />时<br />状<br />态</td>
  46. </tr>
  47. <tr>
  48. <td></td>
  49. </tr>
  50. <tr>
  51. <td style="border-top: none"></td>
  52. </tr>
  53. <tr>
  54. <td rowspan="3" class="category">
  55. 稼<br />动<br />管<br />理
  56. </td>
  57. <td class="sub-category">产量</td>
  58. </tr>
  59. <tr>
  60. <td class="sub-category">稼动率</td>
  61. </tr>
  62. <tr>
  63. <td class="sub-category">报警率</td>
  64. </tr>
  65. <tr>
  66. <td rowspan="4" class="category">
  67. O<br />E<br />E<br />管<br />理
  68. </td>
  69. <td
  70. class="sub-category"
  71. style="padding-left: 0; padding-right: 0"
  72. >
  73. 报警TOP1
  74. </td>
  75. </tr>
  76. <tr>
  77. <td
  78. class="sub-category"
  79. style="padding-left: 0; padding-right: 0"
  80. >
  81. 报警TOP2
  82. </td>
  83. </tr>
  84. <tr>
  85. <td
  86. class="sub-category"
  87. style="padding-left: 0; padding-right: 0"
  88. >
  89. 报警TOP3
  90. </td>
  91. </tr>
  92. <tr>
  93. <td class="sub-category">MTBA</td>
  94. </tr>
  95. <tr>
  96. <td rowspan="3" class="category">
  97. 品<br />质<br />管<br />理
  98. </td>
  99. <td
  100. class="sub-category"
  101. style="padding-left: 0; padding-right: 0"
  102. >
  103. 首件时间
  104. </td>
  105. </tr>
  106. <tr>
  107. <td
  108. class="sub-category"
  109. style="padding-left: 0; padding-right: 0"
  110. >
  111. 首件结果
  112. </td>
  113. </tr>
  114. <tr>
  115. <td
  116. class="sub-category"
  117. style="padding-left: 0; padding-right: 0"
  118. >
  119. 定人定岗
  120. </td>
  121. </tr>
  122. <tr>
  123. <td rowspan="4" class="category" style="height: 9.7rem">
  124. 参<br />数<br />管<br />理
  125. </td>
  126. <td
  127. class="sub-category"
  128. style="padding-left: 0; padding-right: 0"
  129. >
  130. 功能开启
  131. </td>
  132. </tr>
  133. <tr>
  134. <td
  135. class="sub-category"
  136. rowspan="3"
  137. style="padding-left: 0; padding-right: 0"
  138. >
  139. 设备<br />控制
  140. </td>
  141. </tr>
  142. <tr>
  143. <td style="display: none"></td>
  144. </tr>
  145. <tr>
  146. <td style="display: none"></td>
  147. </tr>
  148. </tbody>
  149. </table>
  150. </div>
  151. <div class="mac-item" v-for="item in macInfoes">
  152. <div class="mac-img">
  153. <img
  154. :src="item.imgSrc"
  155. :alt="item.macCode"
  156. @click="toMacStatusDetail(item.macCode)"
  157. />
  158. </div>
  159. <div class="mac-info">
  160. <div class="mac-title" style="border-bottom: none">
  161. {{item.macCode}}
  162. </div>
  163. <div class="data-item">
  164. <!-- <div class="data-name">产<br />量<br />数<br />据</div> -->
  165. <div class="data-detail">
  166. <table border="1" cellspacing="0">
  167. <tr>
  168. <td>{{item.output}}</td>
  169. </tr>
  170. <tr>
  171. <td>{{item.runRate}}%</td>
  172. </tr>
  173. <tr>
  174. <td>{{item.alarmRate}}%</td>
  175. </tr>
  176. <tr>
  177. <td
  178. :title="item.alarm1"
  179. style="
  180. font-size: 0.8rem;
  181. padding-left: 0;
  182. padding-right: 0;
  183. "
  184. >
  185. {{item.alarm1.length>19?item.alarm1.substring(0,15)+'...':item.alarm1}}
  186. </td>
  187. </tr>
  188. <tr>
  189. <td
  190. :title="item.alarm2"
  191. style="
  192. font-size: 0.8rem;
  193. padding-left: 0;
  194. padding-right: 0;
  195. "
  196. >
  197. {{item.alarm2.length>19?item.alarm2.substring(0,15)+'...':item.alarm2}}
  198. </td>
  199. </tr>
  200. <tr>
  201. <td
  202. :title="item.alarm3"
  203. style="
  204. font-size: 0.8rem;
  205. padding-left: 0;
  206. padding-right: 0;
  207. "
  208. >
  209. {{item.alarm3.length>19?item.alarm3.substring(0,15)+'...':item.alarm3}}
  210. </td>
  211. </tr>
  212. <tr>
  213. <td>{{item.mtba}}</td>
  214. </tr>
  215. <tr>
  216. <td
  217. style="
  218. font-size: 0.8rem;
  219. padding-left: 0;
  220. padding-right: 0;
  221. "
  222. >
  223. {{item.firstTime}}
  224. </td>
  225. </tr>
  226. <tr>
  227. <td>{{item.firstResult}}</td>
  228. </tr>
  229. <tr>
  230. <td
  231. style="
  232. font-size: 0.8rem;
  233. padding-left: 0;
  234. padding-right: 0;
  235. "
  236. >
  237. {{item.fixedPersonPost}}
  238. </td>
  239. </tr>
  240. <tr>
  241. <td>{{item.functions}}</td>
  242. </tr>
  243. <tr>
  244. <td rowspan="3" style="height: 7.1rem">
  245. <a
  246. href="#"
  247. @click="changeSwitch(item)"
  248. :class="[item.isOn?'toggle--on':'toggle--off','toggle']"
  249. ></a>
  250. </td>
  251. </tr>
  252. <tr>
  253. <td style="display: none"></td>
  254. </tr>
  255. <tr>
  256. <td style="display: none"></td>
  257. </tr>
  258. </table>
  259. <!-- <div>{{item.output}}</div>
  260. <div>{{item.runRate}}%</div>
  261. <div>{{item.alarmRate}}%</div>
  262. <div>{{item.alarms[0]}}</div>
  263. <div>{{item.alarms[1]}}</div>
  264. <div>{{item.alarms[2]}}</div>
  265. <div>{{item.mtba}}</div>
  266. <div>{{item.firstTime}}</div>
  267. <div>{{item.firstResult}}</div>
  268. <div>{{item.staffCode}}</div>
  269. <div>{{item.functions[0]}}</div>
  270. <div>{{item.parameters[0]}}</div>
  271. <div>{{item.parameters[1]}}</div>
  272. <div>{{item.parameters[2]}}</div> -->
  273. </div>
  274. <!-- <table class="data-detail">
  275. <thead>
  276. <th>产量</th>
  277. <th>稼动率</th>
  278. <th>故障率</th>
  279. </thead>
  280. <tbody>
  281. <tr>
  282. <td>{{item.output}}</td>
  283. <td>{{item.runRate}}%</td>
  284. <td>{{item.alarmRate}}%</td>
  285. </tr>
  286. </tbody>
  287. </table> -->
  288. </div>
  289. </div>
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. </body>
  295. <!-- <script>
  296. $(".toggle").click(function (e) {
  297. var toggle = this;
  298. e.preventDefault();
  299. $(toggle)
  300. .toggleClass("toggle--on")
  301. .toggleClass("toggle--off")
  302. .addClass("toggle--moving");
  303. setTimeout(function () {
  304. $(toggle).removeClass("toggle--moving");
  305. }, 200);
  306. });
  307. </script> -->
  308. <script type="module">
  309. new Vue({
  310. el: "#app",
  311. data() {
  312. return {
  313. currentTime: "",
  314. macInfoes: [],
  315. recipe: "",
  316. output: 0,
  317. fullscreenLoading: null,
  318. };
  319. },
  320. created() {
  321. this.initTimer();
  322. // this.getMacData();
  323. this.getMacStatusFromApi();
  324. this.fullscreenLoading = this.$loading({
  325. lock: true,
  326. text: "加载中",
  327. background: "rgba(0, 0, 0, 0.7)",
  328. });
  329. },
  330. methods: {
  331. toMacStatusDetail(macCode) {
  332. window.open("./machine-detail.html?macCode=" + macCode);
  333. },
  334. initTimer() {
  335. setInterval(() => {
  336. this.currentTime = new Date().toLocaleString();
  337. }, 1000);
  338. },
  339. changeSwitch(item) {
  340. this.isAuthorized().then((authed) => {
  341. if (!authed) {
  342. alert("您没有权限操作,请联系管理员授权");
  343. } else {
  344. item.isOn = !item.isOn;
  345. if (item.isOn) {
  346. this.sendStopOrder(item);
  347. }
  348. }
  349. });
  350. },
  351. // 用户是否有权限操作
  352. isAuthorized() {
  353. return mgr.getUser().then((user) => {
  354. if (!user) return false;
  355. var usercode = user.profile.account;
  356. var btnCode = "DMacStop";
  357. return axios({
  358. method: "get",
  359. url: server + "/ufp/api/btnfunc/GetIsPermitted",
  360. headers: { usercode: usercode },
  361. params: { btnCode },
  362. }).then((res) => {
  363. if (res && res.code === 1) return true;
  364. else return false;
  365. });
  366. });
  367. },
  368. sendStopOrder(item) {
  369. axios({
  370. method: "post",
  371. url: "http://192.168.124.93:8606/eap/api/equipment/equipmentShutDown",
  372. headers: {
  373. "Content-Type": "application/x-www-form-urlencoded",
  374. },
  375. data: {
  376. equipmentID: item.macCode,
  377. message: "停机",
  378. type: 1,
  379. },
  380. transformRequest: [
  381. function (data) {
  382. let ret = "";
  383. for (let it in data) {
  384. ret +=
  385. encodeURIComponent(it) +
  386. "=" +
  387. encodeURIComponent(data[it]) +
  388. "&";
  389. }
  390. ret = ret.substring(0, ret.lastIndexOf("&"));
  391. return ret;
  392. },
  393. ],
  394. })
  395. .then((res) => {
  396. const data = res.data;
  397. if (data.code === "fail") {
  398. item.isOn = false;
  399. alert(data.message || "操作失败");
  400. } else {
  401. alert("操作成功");
  402. }
  403. })
  404. .catch(function (error) {
  405. console.log(error);
  406. });
  407. },
  408. dateFormat(fmt, date) {
  409. let ret;
  410. const opt = {
  411. "y+": date.getFullYear().toString(), // 年
  412. "M+": (date.getMonth() + 1).toString(), // 月
  413. "d+": date.getDate().toString(), // 日
  414. "H+": date.getHours().toString(), // 时
  415. "m+": date.getMinutes().toString(), // 分
  416. "s+": date.getSeconds().toString(), // 秒
  417. // 有其他格式化字符需求可以继续添加,必须转化成字符串
  418. };
  419. for (let k in opt) {
  420. ret = new RegExp("(" + k + ")").exec(fmt);
  421. if (ret) {
  422. fmt = fmt.replace(
  423. ret[1],
  424. ret[1].length == 1
  425. ? opt[k]
  426. : opt[k].padStart(ret[1].length, "0")
  427. );
  428. }
  429. }
  430. return fmt;
  431. },
  432. getMacStatusFromApi() {
  433. var macCodes = [
  434. "DA00027",
  435. "WB00151",
  436. "WB00152",
  437. "WB00153",
  438. "WB00154",
  439. "WB00155",
  440. "WB00156",
  441. "LHA0029",
  442. "AA00058",
  443. ];
  444. axios
  445. .get(`${server}/eap/api/MacStatusTotalInfo/GetMacDetail`, {
  446. params: {
  447. macCode: macCodes.join(","),
  448. date: this.dateFormat("yyyy-MM-dd HH:mm:ss", new Date()),
  449. },
  450. })
  451. .then((res) => {
  452. if (this.fullscreenLoading) {
  453. this.fullscreenLoading.close();
  454. }
  455. var befores = Object.create(this.macInfoes);
  456. if (res && res.data) {
  457. const data = res.data;
  458. this.recipe = data.recipe;
  459. this.output = data.totalCount;
  460. const macDtos = data.macInfoShowLineDtos;
  461. this.macInfoes = [];
  462. macDtos.forEach((element) => {
  463. const imgSrc = `../images/machines/${element.pCode}/${element.pCode}_${element.statusName}.png`;
  464. var alarm1 = "暂无",
  465. alarm2 = "暂无",
  466. alarm3 = "暂无";
  467. if (element.macAlarms && element.macAlarms.length > 0) {
  468. element.macAlarms.forEach((item, index) => {
  469. if (index === 0) {
  470. alarm1 = item.description;
  471. } else if (index == 1) {
  472. alarm2 = item.description;
  473. } else {
  474. alarm3 = item.description;
  475. }
  476. });
  477. }
  478. var isOn = false;
  479. if (befores && befores.length > 0) {
  480. var beforeMac = befores.find(
  481. (c) => c.macCode === element.macCode
  482. );
  483. if (beforeMac) {
  484. isOn = beforeMac.isOn;
  485. }
  486. }
  487. this.macInfoes.push({
  488. macCode: element.macCode,
  489. pCode: element.pCode,
  490. status: element.statusName,
  491. imgSrc: imgSrc,
  492. output: element.count,
  493. runRate: element.runRate,
  494. alarmRate: element.errorRate,
  495. alarm1,
  496. alarm2,
  497. alarm3,
  498. mtba: element.mtba,
  499. firstTime: element.falTime || "暂无",
  500. firstResult: element.falResult || "暂无",
  501. fixedPersonPost: element.fixedPersonPosts
  502. ? `${element.fixedPersonPosts.workNm} ${element.fixedPersonPosts.name}`
  503. : "暂无",
  504. functions: element.isControl === "1" ? "已开启" : "未开启",
  505. parameters: [" ", " ", " "],
  506. isOn: isOn,
  507. });
  508. });
  509. }
  510. })
  511. .catch((err) => {
  512. console.log(err);
  513. });
  514. setTimeout(() => {
  515. this.getMacStatusFromApi();
  516. }, 60 * 1000);
  517. },
  518. },
  519. });
  520. </script>
  521. </html>