index.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <template>
  2. <div :class="['control', { wrapper: wrapper }]" v-if="detail">
  3. <div class="control-left">
  4. <div class="top">
  5. <infoPanel></infoPanel>
  6. </div>
  7. <div class="bottom">
  8. <controlPanel @onSuccess="detailFun"></controlPanel>
  9. </div>
  10. </div>
  11. <div class="control-content" v-if="refresh">
  12. <div class="map" :style="{ transform: `scale(${calcSize})` }">
  13. <div style="display: inline-block; position: relative">
  14. <dataBlock
  15. v-if="detail.params.UpP"
  16. :title="detail.params.UpP.paramname"
  17. :data="[
  18. {
  19. value: detail.params.UpP.lastvalue,
  20. unit: detail.params.UpP.unit,
  21. },
  22. ]"
  23. ></dataBlock>
  24. <view style="position: absolute; right: 35%">
  25. <dataBlock
  26. v-if="detail.params.DownP"
  27. :title="detail.params.DownP.paramname"
  28. :data="[
  29. {
  30. value: detail.params.DownP.lastvalue,
  31. unit: detail.params.DownP.unit,
  32. },
  33. ]"
  34. ></dataBlock>
  35. </view>
  36. <img :src="imgUrl" alt="" />
  37. <div style="clear: both"></div>
  38. </div>
  39. </div>
  40. <div class="chart">
  41. <MyChart :options="options"></MyChart>
  42. </div>
  43. <div class="message-header">
  44. <customBtn
  45. :btnOptions="[{ label: wrapper ? '退出全屏' : '进入全屏' }]"
  46. :btn="true"
  47. style="width: 70px"
  48. @clickBtn="clickBtn"
  49. ></customBtn>
  50. <!-- <Message></Message> -->
  51. </div>
  52. </div>
  53. <div class="control-right">
  54. <timeControl></timeControl>
  55. </div>
  56. </div>
  57. </template>
  58. <script setup>
  59. import infoPanel from "../../modules/infoPanel.vue";
  60. import MyChart from "../../modules/MyChart.vue";
  61. import timeControl from "./modules/timeControl.vue";
  62. import controlPanel from "./modules/controlPanel.vue";
  63. import customBtn from "../../modules/customBtn.vue";
  64. import Message from "../../modules/message.vue";
  65. import dataBlock from "../../modules/dataBlock.vue";
  66. import updataBtn from "../../modules/updataBtn.vue";
  67. import {
  68. ref,
  69. defineProps,
  70. defineEmits,
  71. onMounted,
  72. provide,
  73. onBeforeMount,
  74. onUnmounted,
  75. computed,
  76. watch,
  77. } from "vue";
  78. import { Modal } from "ant-design-vue";
  79. import { onBeforeRouteUpdate, useRouter } from "vue-router";
  80. import { useAuthStore } from "@/stores/modules/auth";
  81. import Api from "@/api/api";
  82. import Http from "@/api/http";
  83. import utils from "@/utils/utils";
  84. import { calcSizeFun, setIntervalFun } from "../../modules/util.js";
  85. let AuthStore = useAuthStore();
  86. let router = useRouter();
  87. let emit = defineEmits(["onSuccess"]);
  88. let props = defineProps({});
  89. let refresh = ref(true);
  90. let wrapper = ref(false);
  91. let options = ref([
  92. { label: "压力历史曲线图", value: ["DownP", "UpP"], sumShow: true },
  93. { label: "流量历史曲线图", value: ["CumFlow"] },
  94. ]);
  95. let detail = ref("");
  96. let modelList = ref([
  97. { label: "就地模式", value: "LocalMode" },
  98. { label: "远程开关阀模式", value: "SwitchMode" },
  99. { label: "远程不利点模式", value: "DisadvantageMode" },
  100. { label: "恒压控制", value: "ConstantConON" },
  101. { label: "分时控制模式", value: "TimeConON" },
  102. ]);
  103. provide("detail", detail);
  104. provide("modelList", modelList);
  105. let calcSize = ref(1);
  106. calcSizeFun((size) => {
  107. calcSize.value = size;
  108. });
  109. let imgUrl = computed(() => {
  110. let arr = detail.value.attinfos.filter(
  111. (item) => item.usetype == "previewImage"
  112. );
  113. return arr[arr.length - 1] ? arr[arr.length - 1].url : "";
  114. });
  115. let clickBtn = (tag) => {
  116. tag.label == "进入全屏" ? (wrapper.value = true) : (wrapper.value = false);
  117. refresh.value = false;
  118. setTimeout(() => {
  119. refresh.value = true;
  120. });
  121. };
  122. let detailFun = async () => {
  123. let res = await Api.requested({
  124. id: "20230628084901",
  125. content: {
  126. w_deviceid: router.currentRoute.value.query.id,
  127. },
  128. });
  129. detail.value = res.data;
  130. for (let i = 1; i < 9; i++) {
  131. detail.value.paramvalues[`start${i}`] =
  132. (detail.value.paramvalues[`T${i}H`] !== ""
  133. ? detail.value.paramvalues[`T${i}H`] || 0
  134. : "-") +
  135. ":" +
  136. (detail.value.paramvalues[`T${i}M`] !== ""
  137. ? detail.value.paramvalues[`T${i}M`] || 0
  138. : "-");
  139. detail.value.paramvalues[`end${i}`] =
  140. (detail.value.paramvalues[`T${i}H1`] !== ""
  141. ? detail.value.paramvalues[`T${i}H1`] || 0
  142. : "-") +
  143. ":" +
  144. (detail.value.paramvalues[`T${i}M1`] !== ""
  145. ? detail.value.paramvalues[`T${i}M1`] || 0
  146. : "-");
  147. detail.value.paramcmdvalues[`start${i}`] =
  148. (detail.value.paramcmdvalues[`T${i}H`] !== ""
  149. ? detail.value.paramcmdvalues[`T${i}H`] || 0
  150. : "-") +
  151. ":" +
  152. (detail.value.paramcmdvalues[`T${i}M`] !== ""
  153. ? detail.value.paramcmdvalues[`T${i}M`] || 0
  154. : "-");
  155. detail.value.paramcmdvalues[`end${i}`] =
  156. (detail.value.paramcmdvalues[`T${i}H1`] !== ""
  157. ? detail.value.paramcmdvalues[`T${i}H1`] || 0
  158. : "-") +
  159. ":" +
  160. (detail.value.paramcmdvalues[`T${i}M1`] !== ""
  161. ? detail.value.paramcmdvalues[`T${i}M1`] || 0
  162. : "-");
  163. }
  164. modelList.value.forEach((item) => {
  165. console.log(detail.value.paramvalues[item.value]);
  166. if (detail.value.paramvalues[item.value] == "1") {
  167. detail.value.paramvalues.控制模式 = item.label;
  168. }
  169. if (detail.value.paramcmdvalues[item.value] == "1") {
  170. detail.value.paramcmdvalues.控制模式 = item.label;
  171. }
  172. });
  173. if (!detail.value.isfeedback) {
  174. let keys = Object.keys(detail.value.paramcmdvalues);
  175. keys.forEach((item) => {
  176. detail.value.paramcmdvalues[item] = detail.value.paramvalues[item];
  177. });
  178. }
  179. console.log(res.data);
  180. };
  181. provide("detailFun", detailFun);
  182. //刷新数据
  183. let timer = setIntervalFun(detailFun, router.currentRoute.value.query.id);
  184. onMounted(() => {
  185. detailFun();
  186. });
  187. onUnmounted(() => {
  188. clearInterval(timer);
  189. });
  190. </script>
  191. <style scoped>
  192. * {
  193. box-sizing: border-box;
  194. }
  195. .control {
  196. display: flex;
  197. height: calc(100vh - 60px);
  198. width: 100%;
  199. padding: 10px 0;
  200. background: linear-gradient(
  201. 90deg,
  202. #001d6a 0%,
  203. #0060b2 82%,
  204. #007bd5 100%
  205. ) !important;
  206. }
  207. .wrapper {
  208. position: absolute;
  209. top: 0;
  210. left: 0;
  211. z-index: 999;
  212. height: 100vh !important;
  213. padding: 20px;
  214. }
  215. .control .control-left {
  216. width: 290px;
  217. height: 100%;
  218. display: flex;
  219. flex-direction: column;
  220. justify-content: space-between;
  221. }
  222. .control .control-left .top {
  223. width: 100%;
  224. height: 49.5%;
  225. background: rgb(0, 0, 0, 0.05);
  226. padding: 10px;
  227. }
  228. .control .control-left .bottom {
  229. width: 100%;
  230. min-width: 290px;
  231. height: 49.5%;
  232. background: rgb(0, 0, 0, 0.05);
  233. padding: 10px;
  234. }
  235. .control .control-content {
  236. flex: 1;
  237. height: 100%;
  238. padding: 0 10px;
  239. display: flex;
  240. flex-direction: column;
  241. justify-content: space-between;
  242. position: relative;
  243. overflow: hidden;
  244. }
  245. .control .control-content .message-header {
  246. display: flex;
  247. justify-content: space-between;
  248. align-items: center;
  249. position: absolute;
  250. top: 0;
  251. left: 0;
  252. width: 100%;
  253. padding-left: 10px;
  254. }
  255. .control .control-content .map {
  256. width: 100%;
  257. height: calc(100vh - 255px);
  258. position: relative;
  259. display: flex;
  260. align-items: center;
  261. width: 684px;
  262. padding: 0 70px;
  263. margin: auto;
  264. }
  265. .control .control-content .map img {
  266. width: 100%;
  267. object-fit: scale-down;
  268. z-index: 1;
  269. }
  270. .control .control-content .chart {
  271. width: 100%;
  272. height: 255px;
  273. background: rgb(0, 0, 0, 0.05);
  274. padding: 0 10px 10px 0;
  275. }
  276. .control .control-right {
  277. width: 272px;
  278. height: 100%;
  279. background: rgb(0, 0, 0, 0.05);
  280. padding: 10px;
  281. }
  282. .stop {
  283. /* border-radius: 50%;
  284. background: #ffffff; */
  285. position: absolute;
  286. top: -30px;
  287. right: -60px;
  288. display: flex;
  289. flex-direction: column;
  290. align-items: center;
  291. }
  292. /deep/ .stop .ant-btn {
  293. border-radius: 50%;
  294. width: 60px;
  295. height: 60px;
  296. font-size: 12px;
  297. }
  298. </style>