index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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="lamp-box" style="position: absolute;margin: 70px 0 0 20px;">
  13. <Lamp bgStart="green" bgEnd="rgb(0, 255, 0)" :isTrue="detail.params.solenoid1 ? detail.params.solenoid1.lastvalue == 1 : false">{{ detail.params.solenoid1 && detail.params.solenoid1.paramname }}</Lamp>
  14. <Lamp bgStart="green" bgEnd="rgb(0, 255, 0)" :isTrue="detail.params.solenoid2 ? detail.params.solenoid2.lastvalue == 1 : false">{{ detail.params.solenoid2 && detail.params.solenoid2.paramname }}</Lamp>
  15. <Lamp bgStart="green" bgEnd="rgb(0, 255, 0)" :isTrue="detail.params.solenoid3 ? detail.params.solenoid3.lastvalue == 1 : false">{{ detail.params.solenoid3 && detail.params.solenoid3.paramname }}</Lamp>
  16. <Lamp bgStart="green" bgEnd="rgb(0, 255, 0)" :isTrue="detail.params.solenoid4 ? detail.params.solenoid4.lastvalue == 1 : false">{{ detail.params.solenoid4 && detail.params.solenoid4.paramname }}</Lamp>
  17. <Lamp bgStart="green" bgEnd="rgb(0, 255, 0)" :isTrue="detail.params.solenoid5 ? detail.params.solenoid5.lastvalue == 1 : false">{{ detail.params.solenoid5 && detail.params.solenoid5.paramname }}</Lamp>
  18. </div>
  19. <div class="map" :style="{transform:`scale(${calcSize})`}">
  20. <div style="display: inline-block;position: relative">
  21. <dataBlock
  22. v-if="detail.params.oilpressure"
  23. :top="-35"
  24. :left="40"
  25. :data="[
  26. {title:detail.params.oilpressure.paramname,value:detail.params.oilpressure.lastvalue,unit:detail.params.oilpressure.unit},
  27. {title:detail.params.tanklevel.paramname,value:detail.params.tanklevel.lastvalue,unit:detail.params.tanklevel.unit},
  28. {title:detail.params.tanktemp.paramname,value:detail.params.tanktemp.lastvalue,unit:detail.params.tanktemp.unit}
  29. ]"
  30. ></dataBlock>
  31. <dataBlock
  32. style="transform: scale(0.9);"
  33. v-if="detail.params.closepressure"
  34. :top="-50"
  35. :left="300"
  36. :data="[
  37. {title:detail.params.closepressure.paramname,value:detail.params.closepressure.lastvalue,unit:detail.params.closepressure.unit},
  38. {title:detail.params.FMKQS120S.paramname,value:detail.params.FMKQS120S.lastvalue,unit:detail.params.FMKQS120S.unit},
  39. {title:detail.params.closetime.paramname,value:detail.params.closetime.lastvalue,unit:detail.params.closetime.unit},
  40. {title:detail.params.kv.paramname,value:detail.params.kv.lastvalue,unit:detail.params.kv.unit},
  41. {title:detail.params.flowresistance.paramname,value:detail.params.flowresistance.lastvalue,unit:detail.params.flowresistance.unit}
  42. ]"
  43. ></dataBlock>
  44. <dataBlock
  45. v-if="detail.params.pipeflow"
  46. :top="200"
  47. :left="40"
  48. :data="[
  49. {title:detail.params.pipeflow.paramname,value:detail.params.pipeflow.lastvalue,unit:detail.params.pipeflow.unit},
  50. {title:detail.params.position.paramname,value:detail.params.position.lastvalue,unit:detail.params.position.unit},
  51. ]"
  52. ></dataBlock>
  53. <dataBlock
  54. v-if="detail.params.flowspeed"
  55. :top="200"
  56. :left="300"
  57. :data="[
  58. {title:detail.params.flowspeed.paramname,value:detail.params.flowspeed.lastvalue,unit:detail.params.flowspeed.unit},
  59. {title:detail.params.headloss.paramname,value:detail.params.headloss.lastvalue,unit:detail.params.headloss.unit},
  60. ]"
  61. ></dataBlock>
  62. <div class="stop" v-if="detail.isSite && detail.params.open">
  63. <a-button @click="StopFun('open')" size="small">{{ detail.params.open && detail.params.open.paramname }}</a-button>
  64. <a-button @click="StopFun('close')" size="small">{{ detail.params.close && detail.params.close.paramname }}</a-button>
  65. <a-button @click="StopFun('stop')" size="small">{{ detail.params.stop && detail.params.stop.paramname }}</a-button>
  66. </div>
  67. <img :src="imgUrl" alt="">
  68. <div style="clear: both;"></div>
  69. </div>
  70. </div>
  71. <div class="chart">
  72. <MyChart :options="[{label:'阀门关闭起阀后压力',value:['closepressure'],sumShow:true}]"></MyChart>
  73. </div>
  74. <div class="message-header">
  75. <customBtn :btnOptions="[{label:wrapper ? '退出全屏' : '进入全屏'}]" :btn="true" style="width:70px" @clickBtn="clickBtn"></customBtn>
  76. <!-- <Message></Message> -->
  77. </div>
  78. </div>
  79. <div class="control-right">
  80. <timeControl>
  81. </timeControl>
  82. </div>
  83. </div>
  84. </template>
  85. <script setup>
  86. import infoPanel from '../../modules/infoPanel.vue'
  87. import MyChart from '../../modules/MyChart.vue'
  88. import timeControl from './modules/statusContent.vue'
  89. import controlPanel from './modules/controlPanel.vue'
  90. import customBtn from '../../modules/customBtn.vue'
  91. import Lamp from '../../modules/lamp.vue'
  92. import Message from '../../modules/message.vue'
  93. import dataBlock from '../../modules/dataBlock.vue'
  94. import updataBtn from '../../modules/updataBtn.vue'
  95. import {ref, defineProps, defineEmits, onMounted, provide, onBeforeMount, onUnmounted, computed, watch, nextTick} from 'vue'
  96. import {Modal} from 'ant-design-vue'
  97. import { onBeforeRouteUpdate, useRouter } from 'vue-router'
  98. import { useAuthStore } from '@/stores/modules/auth'
  99. import Api from '@/api/api'
  100. import Http from '@/api/http'
  101. import utils from '@/utils/utils'
  102. import { calcSizeFun,setIntervalFun } from '../../modules/util.js'
  103. let status = ref('')
  104. let AuthStore = useAuthStore()
  105. let router = useRouter()
  106. let emit = defineEmits(['onSuccess'])
  107. let props = defineProps({})
  108. let refresh = ref(true)
  109. let wrapper = ref(false)
  110. let detail = ref('')
  111. provide('detail',detail)
  112. let calcSize = ref(1)
  113. calcSizeFun((size) => {
  114. calcSize.value = size
  115. })
  116. let imgUrl = computed(() => {
  117. let arr = detail.value.attinfos.filter(item => item.usetype == 'previewImage')
  118. return arr[arr.length - 1] && arr[arr.length - 1].url
  119. })
  120. let clickBtn = (tag) => {
  121. tag.label == '进入全屏' ? wrapper.value = true : wrapper.value = false
  122. refresh.value = false
  123. setTimeout(() => {
  124. refresh.value = true
  125. })
  126. }
  127. let StopFun = (type) => {
  128. Modal.confirm({
  129. title:`确定${type == 'stop' ? '暂停' : type == 'close' ? '关阀' : '开阀'}吗?`,
  130. async onOk () {
  131. let res = await Api.requested({
  132. "id": "20230627163701",
  133. "content": {
  134. "w_deviceid": router.currentRoute.value.query.id,
  135. "w_functionid": detail.value.function[type].w_functionid,
  136. "params": {
  137. [type]:1
  138. }
  139. }
  140. })
  141. utils.message(res,'操作成功', async () => {
  142. detailFun()
  143. })
  144. },
  145. onCancel () {
  146. status.value = detail.value.paramvalues.open == 1 ? 'open' : detail.value.paramvalues.close == 1 ? 'close' : 'stop'
  147. }
  148. })
  149. }
  150. let controlBtn = async (data) => {
  151. Modal.confirm({
  152. title:'确定更新数据吗?',
  153. async onOk () {
  154. let res = await Api.requested({
  155. "id": "20230627163701",
  156. "content": {
  157. "w_deviceid": router.currentRoute.value.query.id,
  158. "w_functionid": detail.value.function['Pilot valve'].w_functionid,
  159. "params": {
  160. 'DaoFa':data.value
  161. }
  162. }
  163. })
  164. utils.message(res,'操作成功', async () => {
  165. detailFun()
  166. })
  167. }
  168. })
  169. }
  170. let detailFun = async () => {
  171. let res = await Api.requested({
  172. "id": "20230628084901",
  173. "content": {
  174. "w_deviceid": router.currentRoute.value.query.id
  175. }
  176. })
  177. detail.value = res.data
  178. detail.value.isSite = AuthStore.nowAccount.sitename == detail.value.sitename //是否本站点设备
  179. if (!detail.value.isfeedback) {
  180. let keys = Object.keys(detail.value.paramcmdvalues)
  181. keys.forEach(item => {
  182. detail.value.paramcmdvalues[item] = detail.value.paramvalues[item]
  183. })
  184. }
  185. status.value = detail.value.paramvalues.open == 1 ? 'open' : detail.value.paramvalues.close == 1 ? 'close' : 'stop'
  186. }
  187. provide('detailFun',detailFun)
  188. let timer = setIntervalFun(detailFun,router.currentRoute.value.query.id)
  189. onMounted( () => {
  190. detailFun()
  191. })
  192. onUnmounted(() => {
  193. clearInterval(timer)
  194. })
  195. </script>
  196. <style scoped>
  197. *{
  198. box-sizing: border-box;
  199. }
  200. .control {
  201. display: flex;
  202. height: calc(100vh - 60px);
  203. width: 100%;
  204. padding: 10px 0;
  205. background: linear-gradient(90deg, #001D6A 0%, #0060B2 82%, #007BD5 100%) !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%;
  225. min-height: 330px;
  226. background: rgb(0, 0, 0,.05);
  227. padding: 10px;
  228. }
  229. .control .control-left .bottom {
  230. width: 100%;
  231. min-width: 290px;
  232. height: 49%;
  233. min-height: 330px;
  234. background: rgb(0, 0, 0,.05);
  235. padding: 10px;
  236. }
  237. .control .control-content {
  238. flex:1;
  239. height: 100%;
  240. padding: 0 10px;
  241. display: flex;
  242. flex-direction: column;
  243. justify-content: space-between;
  244. position: relative;
  245. overflow: hidden;
  246. }
  247. .control .control-content .message-header {
  248. display: flex;
  249. justify-content: space-between;
  250. align-items: center;
  251. position: absolute;
  252. top: 0;
  253. left: 0;
  254. width: 100%;
  255. padding-left: 10px;
  256. }
  257. .control .control-content .map {
  258. width: 100%;
  259. height: calc(100vh - 245px);
  260. position: relative;
  261. display: flex;
  262. align-items: center;
  263. width: 684px;
  264. padding: 10px 70px 0 70px;
  265. margin: auto;
  266. }
  267. .control .control-content .map img {
  268. width: 100%;
  269. object-fit: scale-down;
  270. z-index: 1;
  271. margin-bottom: 30px;
  272. }
  273. .control .control-content .chart {
  274. width: 100%;
  275. height: 255px;
  276. background: rgb(0, 0, 0,.05);
  277. padding: 0 10px 10px 0;
  278. }
  279. .control .control-right {
  280. width: 272px;
  281. height: 100%;
  282. background: rgb(0, 0, 0,.05);
  283. padding: 10px;
  284. }
  285. .stop {
  286. /* border-radius: 50%;
  287. background: #ffffff; */
  288. position: absolute;
  289. top: -30px;
  290. right: -60px;
  291. display: flex;
  292. flex-direction: column;
  293. align-items: center;
  294. }
  295. /deep/ .stop .ant-radio-button {
  296. font-size: 12px !important;
  297. }
  298. </style>