ProblemMatrixCard.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. <template>
  2. <div class="main" v-if="values.length > 0">
  3. <div>{{ title }}</div>
  4. <div class="content">
  5. <div class="card" v-for="(item, index) in values" :key="index" :class="
  6. item.active
  7. ? 'card-select-' + item.status
  8. : 'card-unselect-' + item.status
  9. " @click="onSelectHandler(item)" @dblclick="sendMsg(item)">
  10. <div class="card-left" :class="
  11. item.active
  12. ? 'card-left-select-' + item.status
  13. : 'card-left-unselect-' + item.status
  14. ">
  15. <div>{{ item.windturbineId.slice(0, 2) }}</div>
  16. <div>{{ item.windturbineId.slice(5) }}</div>
  17. </div>
  18. <div class="card-right" :class="
  19. item.active
  20. ? 'card-right-select-' + item.status
  21. : 'card-right-unselect-' + item.status
  22. ">
  23. <div class="rightrow">{{ item.windSpeed.toFixed(2) }} m/s</div>
  24. <div class="rightrow">{{ item.power.toFixed(2) }} kw</div>
  25. <div class="rightrow">{{ item.rollSpeed.toFixed(2) }} rpm</div>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="bottom"></div>
  30. </div>
  31. <!-- <WindturbineDetailPages v-model="dialogVisible" :windturbine="currentWindturbine"></WindturbineDetailPages> -->
  32. </template>
  33. <script>
  34. // import WindturbineDetailPages from "../WindturbineDetailPages.vue";
  35. export default {
  36. name: "ControlMatrixCard",
  37. props: {
  38. // dateClick,
  39. title: String,
  40. type: Number,
  41. datas: Object,
  42. flag: {
  43. type: Boolean,
  44. default: false,
  45. }
  46. },
  47. data() {
  48. return {
  49. values: [],
  50. dialogVisible: false,
  51. currentWindturbine: {},
  52. cacheFlag: false,
  53. };
  54. },
  55. components: {
  56. // WindturbineDetailPages,
  57. },
  58. methods: {
  59. // 点击卡片事件
  60. onSelectHandler(item) {
  61. item.active = !item.active;
  62. },
  63. sendMsg: function (itm) {
  64. if (this.flag) {
  65. this.$emit("showWindows", itm);
  66. } else {
  67. this.dialogVisible = true;
  68. this.currentWindturbine = itm;
  69. }
  70. },
  71. filter(value, windturbineId) {
  72. var array = [];
  73. var flag = false;
  74. for (var i = 0; i < value.length; i++) {
  75. if (value[i].windturbineId == windturbineId) {
  76. flag = true;
  77. array.push(flag); // 风机是否已经存在
  78. array.push(i); // 风机在values数组的位置
  79. array.push(value[i].active); // 当前风机是否被选中
  80. break;
  81. }
  82. }
  83. return array;
  84. },
  85. addCard(val) {
  86. var active = false;
  87. var array = this.filter(this.values, val.windturbineId);
  88. if (!array[0]) {
  89. // 维护
  90. val.active = active;
  91. if (val.modelId.indexOf("105") >= 0) {
  92. val.rollSpeed *= 9.55;
  93. }
  94. this.values.push(val);
  95. } else {
  96. val.active = array[2];
  97. this.values.splice(array[1], 1, val);
  98. }
  99. },
  100. /* 获取选中的项目 */
  101. getSelectedItems() {
  102. var ls = new Array();
  103. this.values.forEach((item) => {
  104. if (item.active) {
  105. ls.push(item);
  106. }
  107. });
  108. return ls;
  109. },
  110. /* 将选中的项目填充到数组中 */
  111. outputSelectedItems(ls) {
  112. this.values.forEach((item) => {
  113. if (item.active && !this.isHas(item, ls)) {
  114. ls.push(item);
  115. }
  116. });
  117. },
  118. /* 清除选中的项目 */
  119. clearSelected() {
  120. this.values.forEach((item) => (item.active = false));
  121. },
  122. isHas(item, ls) {
  123. for (var id in ls) {
  124. if (ls[id].windturbineId == item.windturbineId) {
  125. return true;
  126. }
  127. }
  128. return false;
  129. },
  130. clear(vs) {
  131. var ll = new Array();
  132. this.values.forEach((item) => {
  133. var it = vs[item.windturbineId];
  134. if (typeof it === "undefined") {
  135. ll.push(item);
  136. }
  137. });
  138. for (var v1 in ll) {
  139. var ind = this.values.indexOf(ll[v1]);
  140. if (ind < 0) continue;
  141. this.values.splice(ind, 1);
  142. }
  143. },
  144. dateClick(type){
  145. console.log(this.cacheDate);
  146. var vs = {};
  147. var address = ''
  148. switch (type) {
  149. case 0:
  150. address = 'MG'
  151. break;
  152. case 1:
  153. address = 'NG'
  154. break;
  155. case 2:
  156. address = 'QG'
  157. break;
  158. case 3:
  159. address = 'SG'
  160. break;
  161. case 4:
  162. address = 'XG'
  163. break;
  164. }
  165. let arr = Object.keys(this.cacheDate).sort()
  166. for (var id of arr) {
  167. var val = this.cacheDate[id];
  168. if (val.windturbineId.substring(0, 2) === address) {
  169. this.addCard(val);
  170. vs[val.windturbineId] = 0;
  171. }
  172. }
  173. this.clear(vs);
  174. },
  175. },
  176. watch: {
  177. "$store.getters.windturbinelist": {
  178. deep: true,
  179. handler: function (json) {
  180. var vs = {};
  181. var address = ''
  182. switch (this.type) {
  183. case 0:
  184. address = 'MG'
  185. break;
  186. case 1:
  187. address = 'NG'
  188. break;
  189. case 2:
  190. address = 'QG'
  191. break;
  192. case 3:
  193. address = 'SG'
  194. break;
  195. case 4:
  196. address = 'XG'
  197. break;
  198. }
  199. if (this.flag && !this.cacheFlag){
  200. this.cacheDate = json
  201. this.cacheFlag = true
  202. }
  203. let arr = Object.keys(json).sort()
  204. for (var id of arr) {
  205. var val = json[id];
  206. if (this.flag) {
  207. if (val.windturbineId.substring(0, 2) === address) {
  208. this.addCard(val);
  209. vs[val.windturbineId] = 0;
  210. }
  211. } else {
  212. if (val.status == this.type) {
  213. this.addCard(val);
  214. vs[val.windturbineId] = 0;
  215. }
  216. if (this.type < 0 && val.lockValue) {
  217. this.addCard(val);
  218. vs[val.windturbineId] = 0;
  219. }
  220. }
  221. }
  222. // console.log(this.values);
  223. this.clear(vs);
  224. },
  225. },
  226. },
  227. };
  228. </script>
  229. <style scoped>
  230. .rightrow {
  231. margin-right: 3px;
  232. }
  233. .content {
  234. display: flex;
  235. flex-direction: row;
  236. flex-wrap: wrap;
  237. }
  238. .bottom {
  239. background-color: #292929;
  240. width: 100%;
  241. height: 2px;
  242. margin-top: 5px;
  243. }
  244. .main {
  245. margin: 0 5px 15px 5px;
  246. }
  247. /* 最外层卡片 */
  248. .card {
  249. width: 112px;
  250. height: 49px;
  251. font-size: 12px;
  252. margin-left: 3px;
  253. margin-top: 4px;
  254. display: flex;
  255. flex-direction: row;
  256. cursor: pointer;
  257. /* border: 2px solid rgb(75, 85, 174); */
  258. }
  259. /* 卡片左边部分 */
  260. .card-left {
  261. width: 25px;
  262. margin: 3px;
  263. font-size: 14px;
  264. display: flex;
  265. flex-direction: column;
  266. justify-content: space-around;
  267. align-items: center;
  268. /* background-color: rgb(75, 85, 174); */
  269. }
  270. /* 卡片右边部分 */
  271. .card-right {
  272. display: flex;
  273. flex: 1;
  274. flex-direction: column;
  275. justify-content: space-around;
  276. align-items: flex-end;
  277. padding-right: 3px;
  278. /* border-left: 2px dashed rgb(75, 85, 174); */
  279. }
  280. /* ***********颜色************ */
  281. /* *********************** */
  282. /* 最外层卡片选中和未选中 */
  283. .card-select-0 {
  284. border: 2px solid rgb(255, 255, 255, 0.5);
  285. }
  286. .card-unselect-0 {
  287. border: 2px solid rgb(255, 255, 255);
  288. }
  289. /* 左边卡片选中和未选中 */
  290. .card-left-select-0 {
  291. background-color: rgb(255, 255, 255, 0.5);
  292. color: rgb(0, 0, 0, 0.5);
  293. }
  294. .card-left-unselect-0 {
  295. background-color: rgb(255, 255, 255, .5);
  296. color: rgb(0, 0, 0);
  297. }
  298. /* 右边卡片选中和未选中 */
  299. .card-right-select-0 {
  300. border-left: 2px dashed rgb(255, 255, 255, 0.5);
  301. }
  302. .card-right-unselect-0 {
  303. border-left: 2px dashed rgb(255, 255, 255, .5);
  304. background-color: rgb(255, 255, 255, .15);
  305. }
  306. /* ***********颜色************ */
  307. /* *********************** */
  308. /* 最外层卡片选中和未选中 */
  309. .card-select-1 {
  310. border: 2px solid rgb(197, 48, 200, 0.5);
  311. }
  312. .card-unselect-1 {
  313. border: 2px solid rgb(197, 48, 200);
  314. }
  315. .card-select-1 {
  316. border: 2px solid rgb(197, 48, 200, 0.5);
  317. }
  318. /* 左边卡片选中和未选中 */
  319. .card-left-select-1 {
  320. background-color: rgb(197, 48, 200, 0.5);
  321. }
  322. .card-left-unselect-1 {
  323. background-color: rgb(197, 48, 200, .5);
  324. }
  325. /* 右边卡片选中和未选中 */
  326. .card-right-select-1 {
  327. border-left: 2px dashed rgb(197, 48, 200, 0.5);
  328. }
  329. .card-right-unselect-1 {
  330. border-left: 2px dashed rgb(197, 48, 200, .5);
  331. background-color: rgb(197, 48, 200, .15);
  332. }
  333. /* ***********颜色************ */
  334. /* *********************** */
  335. /* 最外层卡片选中和未选中 */
  336. .card-select-2 {
  337. border: 2px solid rgb(05, 187, 76, 0.5);
  338. }
  339. .card-unselect-2 {
  340. border: 2px solid rgb(05, 187, 76);
  341. }
  342. .card-select-2 {
  343. border: 2px solid rgb(05, 187, 76, 0.5);
  344. }
  345. /* 左边卡片选中和未选中 */
  346. .card-left-select-2 {
  347. background-color: rgb(05, 187, 76, 0.5);
  348. }
  349. .card-left-unselect-2 {
  350. background-color: rgb(05, 187, 76, .5);
  351. }
  352. /* 右边卡片选中和未选中 */
  353. .card-right-select-2 {
  354. border-left: 2px dashed rgb(05, 187, 76, 0.5);
  355. }
  356. .card-right-unselect-2 {
  357. border-left: 2px dashed rgb(05, 187, 76, .5);
  358. background-color: rgb(05, 187, 76, .15);
  359. }
  360. /* ***********颜色************ */
  361. /* *********************** */
  362. /* 最外层卡片选中和未选中 */
  363. .card-select-3 {
  364. border: 2px solid rgb(05, 187, 76, 0.5);
  365. }
  366. .card-unselect-3 {
  367. border: 2px solid rgb(05, 187, 76);
  368. }
  369. .card-select-3 {
  370. border: 2px solid rgb(05, 187, 76, 0.5);
  371. }
  372. /* 左边卡片选中和未选中 */
  373. .card-left-select-3 {
  374. background-color: rgb(05, 187, 76, 0.5);
  375. }
  376. .card-left-unselect-3 {
  377. background-color: rgb(05, 187, 76, .5);
  378. }
  379. /* 右边卡片选中和未选中 */
  380. .card-right-select-3 {
  381. border-left: 2px dashed rgb(05, 187, 76, 0.5);
  382. }
  383. .card-right-unselect-3 {
  384. border-left: 2px dashed rgb(05, 187, 76, .5);
  385. background-color: rgb(05, 187, 76, .15);
  386. }
  387. /* ***********颜色************ */
  388. /* *********************** */
  389. /* 最外层卡片选中和未选中 */
  390. .card-select-4 {
  391. border: 2px solid rgb(75, 85, 174, 0.5);
  392. }
  393. .card-unselect-4 {
  394. border: 2px solid rgb(75, 85, 174);
  395. }
  396. .card-select-4 {
  397. border: 2px solid rgb(75, 85, 174, 0.5);
  398. }
  399. /* 左边卡片选中和未选中 */
  400. .card-left-select-4 {
  401. background-color: rgb(75, 85, 174, 0.5);
  402. }
  403. .card-left-unselect-4 {
  404. background-color: rgb(75, 85, 174, .5);
  405. }
  406. /* 右边卡片选中和未选中 */
  407. .card-right-select-4 {
  408. border-left: 2px dashed rgb(75, 85, 174, 0.5);
  409. }
  410. .card-right-unselect-4 {
  411. border-left: 2px dashed rgb(75, 85, 174, .5);
  412. background-color: rgb(75, 85, 174, .15);
  413. }
  414. /* ***********颜色************ */
  415. /* *********************** *
  416. /* 最外层卡片选中和未选中 */
  417. .card-select-5 {
  418. border: 2px solid rgb(186, 50, 55, 0.5);
  419. }
  420. .card-unselect-5 {
  421. border: 2px solid rgb(186, 50, 55);
  422. }
  423. .card-select-5 {
  424. border: 2px solid rgb(186, 50, 55, 0.5);
  425. }
  426. /* 左边卡片选中和未选中 */
  427. .card-left-select-5 {
  428. background-color: rgb(186, 50, 55, 0.5);
  429. }
  430. .card-left-unselect-5 {
  431. background-color: rgb(186, 50, 55, .5);
  432. }
  433. /* 右边卡片选中和未选中 */
  434. .card-right-select-5 {
  435. border-left: 2px dashed rgb(186, 50, 55, 0.5);
  436. }
  437. .card-right-unselect-5 {
  438. border-left: 2px dashed rgb(186, 50, 55, .5);
  439. background-color: rgb(186, 50, 55, .15);
  440. }
  441. /* ***********颜色************ */
  442. /* *********************** *
  443. /* 最外层卡片选中和未选中 */
  444. .card-select-6 {
  445. border: 2px solid rgb(225, 125, 36, 0.5);
  446. }
  447. .card-unselect-6 {
  448. border: 2px solid rgb(225, 125, 36);
  449. }
  450. .card-select-6 {
  451. border: 2px solid rgb(225, 125, 36, 0.5);
  452. }
  453. /* 左边卡片选中和未选中 */
  454. .card-left-select-6 {
  455. background-color: rgb(225, 125, 36, 0.5);
  456. }
  457. .card-left-unselect-6 {
  458. background-color: rgb(225, 125, 36, .5);
  459. }
  460. /* 右边卡片选中和未选中 */
  461. .card-right-select-6 {
  462. border-left: 2px dashed rgb(225, 125, 36, 0.5);
  463. }
  464. .card-right-unselect-6 {
  465. border-left: 2px dashed rgb(225, 125, 36, .5);
  466. background-color: rgb(225, 125, 36, .15);
  467. }
  468. /* ***********颜色************ */
  469. /* *********************** *
  470. /* 最外层卡片选中和未选中 */
  471. .card-select-7 {
  472. border: 2px solid rgb(96, 103, 105, 0.5);
  473. }
  474. .card-unselect-7 {
  475. border: 2px solid rgb(96, 103, 105);
  476. }
  477. .card-select-7 {
  478. border: 2px solid rgb(96, 103, 105, 0.5);
  479. }
  480. /* 左边卡片选中和未选中 */
  481. .card-left-select-7 {
  482. background-color: rgb(96, 103, 105, 0.5);
  483. }
  484. .card-left-unselect-7 {
  485. background-color: rgb(96, 103, 105, .5);
  486. }
  487. /* 右边卡片选中和未选中 */
  488. .card-right-select-7 {
  489. border-left: 2px dashed rgb(96, 103, 105, 0.5);
  490. }
  491. .card-right-unselect-7 {
  492. border-left: 2px dashed rgb(96, 103, 105, .5);
  493. background-color: rgb(96, 103, 105, .15);
  494. }
  495. </style>