common-green.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <template>
  2. <div class="company-home">
  3. <!-- 如果是有 deviceType、type 等 query,认为是详情页,不需要展示普通模块,只需要模型 -->
  4. <template v-if="!route.query.deviceType">
  5. <div class="main-container">
  6. <div class="left-area">
  7. <!-- 采用定位方式以避免出现各个模块隐藏时其他模块下移的问题 -->
  8. <ModuleOriginal
  9. v-for="cfg in configsLeft"
  10. :key="cfg.deviceType"
  11. :show-style="cfg.showStyle"
  12. :module-data="cfg.moduleData"
  13. :module-name="cfg.moduleName"
  14. :device-type="cfg.deviceType"
  15. :data="data"
  16. :visible="true"
  17. />
  18. </div>
  19. <div class="bottom-area">
  20. <!-- 采用定位方式以避免出现各个模块隐藏时其他模块下移的问题 -->
  21. <ModuleOriginal
  22. v-for="cfg in configsBottom"
  23. :key="cfg.deviceType"
  24. :show-style="cfg.showStyle"
  25. :module-data="cfg.moduleData"
  26. :module-name="cfg.moduleName"
  27. :device-type="cfg.deviceType"
  28. :data="data"
  29. :visible="true"
  30. />
  31. </div>
  32. <div class="right-area">
  33. <greenRightTag />
  34. </div>
  35. </div>
  36. </template>
  37. <div style="width: 1300px; height: 530px; position: absolute; left: 436px; top: 0">
  38. <VentModal />
  39. </div>
  40. </div>
  41. </template>
  42. <script lang="ts" setup>
  43. import { onMounted, onUnmounted, ref, watch, computed } from 'vue';
  44. import { useInitConfigs, useInitPage } from './hooks/useInit';
  45. import ModuleOriginal from './components/ModuleOriginal-green.vue';
  46. import greenRightTag from './components/green-right-tag.vue';
  47. import { list } from './configurable.api';
  48. import { useRoute, useRouter } from 'vue-router';
  49. import { useGlobSetting } from '/@/hooks/setting';
  50. import { testConfigVent, testConfigVentRealtime } from './configurable.data';
  51. import VentModal from '/@/components/vent/micro/ventModal.vue';
  52. const { title = '智能通风管控系统' } = useGlobSetting();
  53. // const { configs, isOriginal, isCommon, fetchConfigs } = useInitConfigs();
  54. const { isOriginal, fetchConfigs } = useInitConfigs();
  55. const { mainTitle, data, updateData, updateEnhancedConfigs } = useInitPage(title);
  56. const route = useRoute();
  57. let interval: number | undefined;
  58. let configs = ref<any[]>([]);
  59. let configsLeft = computed(() => {
  60. return configs.value.filter((v) => v.showStyle.position.includes('top'));
  61. });
  62. let configsBottom = computed(() => {
  63. return configs.value.filter((v) => v.showStyle.position.includes('bottom'));
  64. });
  65. function refresh() {
  66. fetchConfigs('vent').then(() => {
  67. configs.value = testConfigVent;
  68. updateEnhancedConfigs(configs.value);
  69. // 测风装置 windrect
  70. // 自动风窗 window
  71. // 自动风门 gate
  72. // 传感器 modelsensor
  73. // 局部通风机 fanlocal
  74. // 主通风机 fanmain
  75. // 密闭 obfurage
  76. // 安全监控 safetymonitor
  77. // 光纤测温 fiber
  78. // 束管监测 bundletube
  79. // 制氮 nitrogen
  80. // 制浆 pulping
  81. // 喷淋 spray
  82. // 喷粉 dustdev
  83. // 喷雾设备 atomizing
  84. // 除尘风机 dedustefan
  85. // 粉尘传感器 dustsensor
  86. // 转载点 transferpoint
  87. // 瓦斯抽采泵 pump
  88. // 粉尘 dusting
  89. // 瓦斯监测 gasmonitor
  90. // 球阀 ballvalve
  91. // 压风机 forcFan
  92. // 瓦斯巡检 gaspatrol
  93. // 防火门 firedoor
  94. // 隔爆设施 explosionProof
  95. // 瓦斯管道阀门 gasvalve
  96. list({
  97. types: configs.value
  98. .filter((e) => e.deviceType)
  99. .map((e) => e.deviceType)
  100. .join(','),
  101. }).then(updateData);
  102. });
  103. }
  104. function initInterval() {
  105. setInterval(() => {
  106. list({
  107. types: configs.value
  108. .filter((e) => e.deviceType)
  109. .map((e) => e.deviceType)
  110. .join(','),
  111. }).then(updateData);
  112. }, 60000);
  113. }
  114. watch(
  115. () => route.query,
  116. () => {
  117. if (route.query.deviceType) {
  118. // 仅需要展示子应用,模拟 unmounted
  119. clearInterval(interval);
  120. } else {
  121. // 模拟 mounted
  122. refresh();
  123. initInterval();
  124. }
  125. }
  126. );
  127. onMounted(() => {
  128. refresh();
  129. initInterval();
  130. });
  131. onUnmounted(() => {
  132. clearInterval(interval);
  133. });
  134. </script>
  135. <style lang="less" scoped>
  136. @import '/@/design/theme.less';
  137. @font-face {
  138. font-family: 'douyuFont';
  139. src: url('/@/assets/font/douyuFont.otf');
  140. }
  141. @{theme-deepblue} {
  142. .company-home {
  143. --image-modal-top: url('/@/assets/images/themify/deepblue/vent/home/modal-top.png');
  144. }
  145. }
  146. .company-home {
  147. --image-modal-top: url('/@/assets/images/vent/home/modal-top.png');
  148. --image-monitor-realtime: url('/@/assets/images/company/monitor-realtime.png');
  149. --image-monitor-doc: url('/@/assets/images/company/monitor-doc.png');
  150. --image-monitor-goto: url('/@/assets/images/company/monitor-goto.png');
  151. width: 100%;
  152. height: 100%;
  153. color: @white;
  154. position: relative;
  155. background: #181b24;
  156. .main-container {
  157. width: 100%;
  158. height: 100%;
  159. margin: 0px 15px;
  160. .left-area {
  161. position: absolute;
  162. left: 0;
  163. top: 0;
  164. width: 420px;
  165. height: 100%;
  166. padding: 15px;
  167. background: url('../../../../assets/images/home-green/green-bd-left.png') no-repeat;
  168. background-size: 100% 100%;
  169. box-sizing: border-box;
  170. overflow-y: auto;
  171. }
  172. .bottom-area {
  173. position: absolute;
  174. left: 435px;
  175. bottom: 0;
  176. width: calc(100% - 435px);
  177. height: 290px;
  178. padding: 15px;
  179. background: url('../../../../assets/images/home-green/green-bd-bottom.png') no-repeat;
  180. background-size: 100% 100%;
  181. box-sizing: border-box;
  182. }
  183. .right-area {
  184. position: absolute;
  185. right: 0px;
  186. top: 0px;
  187. width: 120px;
  188. height: calc(100% - 305px);
  189. }
  190. }
  191. .module-dropdown {
  192. padding: 5px;
  193. background-image: @vent-configurable-dropdown;
  194. border-bottom: 2px solid @vent-configurable-home-light-border;
  195. color: @vent-font-color;
  196. position: absolute;
  197. top: 60px;
  198. right: 480px;
  199. }
  200. .module-dropdown-original {
  201. padding: 10px;
  202. background-image: @vent-configurable-dropdown;
  203. border-bottom: 2px solid @vent-configurable-home-light-border;
  204. color: @vent-font-color;
  205. position: absolute;
  206. top: 70px;
  207. right: 460px;
  208. }
  209. .module-trigger-button {
  210. color: @vent-font-color;
  211. background-image: @vent-configurable-dropdown;
  212. border: none;
  213. border-bottom: 2px solid @vent-configurable-home-light-border;
  214. }
  215. .realtime-mode {
  216. background-image: var(--image-monitor-realtime);
  217. }
  218. .module-monitor-bar {
  219. position: absolute;
  220. top: 100px;
  221. width: 1000px;
  222. height: 200px;
  223. left: calc(50% - 500px);
  224. }
  225. }
  226. :deep(.loading-box) {
  227. position: unset;
  228. }
  229. </style>