measurePoint.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <div class="content">
  3. <div class="title">
  4. <div class="text">{{ title }}</div>
  5. <!-- <a-radio-group v-model:value="shown" button-style="solid">
  6. <a-radio-button value="default">测点信息</a-radio-button>
  7. <a-radio-button value="chart">预测曲线</a-radio-button>
  8. </a-radio-group> -->
  9. <BaseTab
  10. style="width: 200px"
  11. :tabs="[
  12. { name: '测点信息', id: 'default' },
  13. { name: '预测曲线', id: 'chart' },
  14. ]"
  15. v-model:id="shown"
  16. />
  17. </div>
  18. <div v-if="shown === 'default'" class="content-item">
  19. <div class="card-content" v-for="(item, index) in cards" :key="`vmac${index}`">
  20. <div class="item-l">
  21. <div class="label-l">{{ item.label }}</div>
  22. <div class="value-l">{{ item.value }}</div>
  23. </div>
  24. <div class="item-r">
  25. <div class="content-r" v-for="el in item.listR" :key="el.id">
  26. <span>{{ `${el.label} : ` }}</span>
  27. <span
  28. :class="{
  29. 'status-f': el.value == 1,
  30. 'status-l': el.value == 0,
  31. }"
  32. >
  33. {{ el.value == 1 ? '异常' : el.value == 0 ? '正常' : el.value }}
  34. </span>
  35. </div>
  36. </div>
  37. </div>
  38. </div>
  39. <div v-if="shown === 'chart'" class="chart-item">
  40. <div v-for="(item, index) in charts" :key="`acmt${index}`" class="chart-content">
  41. <div class="text-center">
  42. {{ item.label }}
  43. </div>
  44. <PredictionCurve style="height: 300px; width: 480px; margin: 15px" :chart="item" :timeout="timeout" />
  45. </div>
  46. </div>
  47. </div>
  48. </template>
  49. <script setup lang="ts">
  50. import { ref } from 'vue';
  51. import BaseTab from '../../../gas/components/tab/baseTab.vue';
  52. import PredictionCurve from './predictionCurve.vue';
  53. // well i know this is trash but the time is reaching
  54. defineProps<{
  55. cards: { label: string; value: any; listR: { id: number; label: string; dw: string; value: any }[] }[];
  56. charts: {
  57. label: string;
  58. time: Date;
  59. data: [number, number, number, number];
  60. }[];
  61. title: string;
  62. timeout?: number;
  63. }>();
  64. const shown = ref('default');
  65. // const chartsConfig = ref<
  66. // {
  67. // label: string;
  68. // /** 下一项数据更新后应该替换配置中的哪项数据的标志 */
  69. // indexMark: number;
  70. // x: string[];
  71. // y1: number[];
  72. // y2: number[];
  73. // y3: number[];
  74. // y4: number[];
  75. // }[]
  76. // >([]);
  77. // watch(
  78. // () => props.charts,
  79. // () => {
  80. // const arr = new Array(20).fill(0);
  81. // props.charts.forEach((el, i) => {
  82. // if (chartsConfig.value[i]) {
  83. // // 由于上面这些数据都是 20 项组成的,当指针移动到 20 时说明上次更新了最后一项
  84. // // 那么应该按先进后出的队列模式更新数据了
  85. // const val = chartsConfig.value[i];
  86. // if (val.indexMark === 20) {
  87. // val.x.shift();
  88. // val.y1.shift();
  89. // val.y2.shift();
  90. // val.y3.shift();
  91. // val.y4.shift();
  92. // val.indexMark = 19;
  93. // }
  94. // val.x[val.indexMark] = moment(el.time).format('HH:mm:ss');
  95. // val.y1[val.indexMark] = el.data[0];
  96. // val.y2[val.indexMark] = el.data[1];
  97. // val.y3[val.indexMark] = el.data[2];
  98. // val.y4[val.indexMark] = el.data[3];
  99. // // 指针向后移动1
  100. // val.indexMark += 1;
  101. // } else {
  102. // // 更新配置
  103. // // 初始化配置数据,按照一项数据,生成一个由 20 项数据组成的数组,该数组由此项数据衍生
  104. // const startFrom = moment(el.time);
  105. // chartsConfig.value[i] = {
  106. // label: el.label,
  107. // indexMark: 1,
  108. // x: arr.map(() => {
  109. // const str = startFrom.format('HH:mm:ss');
  110. // startFrom.add(props.timeout || 3000);
  111. // return str;
  112. // }),
  113. // y1: arr.map(() => {
  114. // return el.data[0];
  115. // }),
  116. // y2: arr.map(() => {
  117. // return el.data[1];
  118. // }),
  119. // y3: arr.map(() => {
  120. // return el.data[2];
  121. // }),
  122. // y4: arr.map(() => {
  123. // return el.data[3];
  124. // }),
  125. // };
  126. // }
  127. // });
  128. // },
  129. // { immediate: true, deep: true }
  130. // );
  131. </script>
  132. <style lang="less">
  133. @import '/@/design/theme.less';
  134. @{theme-deepblue} {
  135. .content {
  136. --image-bot-area: url('/@/assets/images/themify/deepblue/fire/bot-area.png');
  137. --image-bot-area1: url('/@/assets/images/themify/deepblue/fire/bot-area1.png');
  138. }
  139. }
  140. .content {
  141. --image-bot-area: url('/@/assets/images/fire/bot-area.png');
  142. --image-bot-area1: url('/@/assets/images/fire/bot-area1.png');
  143. height: 100%;
  144. color: var(--vent-font-color);
  145. .title {
  146. height: 30px;
  147. margin-bottom: 10px;
  148. display: flex;
  149. justify-content: space-between;
  150. align-items: center;
  151. .text {
  152. font-family: 'douyuFont';
  153. font-size: 14px;
  154. }
  155. }
  156. .content-item {
  157. display: flex;
  158. justify-content: flex-start;
  159. align-items: flex-start;
  160. flex-wrap: wrap;
  161. height: calc(100% - 50px);
  162. overflow-y: auto;
  163. .card-content {
  164. position: relative;
  165. width: 30%;
  166. height: 128px;
  167. margin: 0px 15px 15px 15px;
  168. background: var(--image-bot-area) no-repeat center;
  169. background-size: 100% 100%;
  170. .item-l {
  171. position: absolute;
  172. left: 32px;
  173. top: 50%;
  174. transform: translate(0, -50%);
  175. width: 89px;
  176. height: 98px;
  177. background: var(--image-bot-area1) no-repeat center;
  178. .label-l {
  179. position: absolute;
  180. left: 50%;
  181. top: 7px;
  182. color: var(--vent-font-color);
  183. font-size: 14px;
  184. transform: translate(-50%, 0);
  185. }
  186. .value-l {
  187. position: absolute;
  188. left: 50%;
  189. top: 50px;
  190. transform: translate(-50%, 0);
  191. font-family: 'douyuFont';
  192. font-size: 14px;
  193. color: var(--vent-table-action-link);
  194. }
  195. }
  196. .item-r {
  197. position: absolute;
  198. left: 132px;
  199. top: 50%;
  200. transform: translate(0, -50%);
  201. height: 128px;
  202. padding: 5px 0px;
  203. display: flex;
  204. flex-direction: column;
  205. justify-content: space-around;
  206. box-sizing: border-box;
  207. .content-r {
  208. display: flex;
  209. span {
  210. font-size: 14px;
  211. color: var(--vent-font-color);
  212. &:first-child {
  213. display: inline-block;
  214. width: 68px;
  215. }
  216. &:last-child {
  217. display: inline-block;
  218. width: calc(100% - 68px);
  219. }
  220. }
  221. .status-f {
  222. color: #ff0000;
  223. }
  224. .status-l {
  225. color: var(--vent-table-action-link);
  226. }
  227. }
  228. }
  229. }
  230. }
  231. .chart-item {
  232. display: flex;
  233. justify-content: flex-start;
  234. align-items: flex-start;
  235. flex-wrap: wrap;
  236. height: calc(100% - 50px);
  237. overflow-y: auto;
  238. .chart-content {
  239. // border: 1px solid var(--vent-base-border);
  240. box-shadow: inset 0px 0px 10px 1px var(--vent-modal-box-shadow);
  241. padding: 10px 0;
  242. }
  243. }
  244. }
  245. </style>