index.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. <div class="camera-container">
  3. <div class="left-area">
  4. <cameraTree :selected="selected" :list="listArr" :draggable="true" @detail-node="onDetail" @on-click="onClick">
  5. <template #icon="{ item }">
  6. <template v-if="item.isFolder">
  7. <SvgIcon v-if="item.expanded" size="18" name="file-open" />
  8. <SvgIcon v-else size="18" name="file-close" />
  9. </template>
  10. <treeIcon class="iconfont" :title="item.title" v-else />
  11. </template>
  12. <template #operation="{ type }">
  13. <!-- <i class="iconfont icon-eyeoutlined"></i> -->
  14. <span style="color: #ccc; font-size: 12px">详情</span>
  15. </template>
  16. </cameraTree>
  17. </div>
  18. <div class="right-area">
  19. <div v-if="renderPlayer" ref="playerRef"
  20. style="display: flex; width: 100%; height: calc(100% - 60px); overflow-y: auto; pointer-events: none"> </div>
  21. <div class="camera-box" v-else>
  22. <Empty />
  23. </div>
  24. <div class="pagination">
  25. <Pagination v-model:current="pagination.current" v-model:page-size="pagination.pageSize" :total="Total"
  26. @change="onChange" />
  27. </div>
  28. </div>
  29. </div>
  30. </template>
  31. <script lang="ts" setup>
  32. import { onMounted, onUnmounted, ref, reactive, computed, onBeforeUnmount } from 'vue';
  33. import { useRouter } from 'vue-router';
  34. import { list, cameraAddr, getCameraDevKind, getDevice, getVentanalyCamera } from './camera.api';
  35. import cameraTree from './common/cameraTree.vue';
  36. import { SvgIcon } from '/@/components/Icon';
  37. import treeIcon from './common/Icon/treeIcon.vue';
  38. import { useCamera } from '/@/hooks/system/useCameraPianation';
  39. import { Pagination, Empty } from 'ant-design-vue';
  40. const { getCamera, removeCamera, Total } = useCamera();
  41. const playerRef = ref();
  42. const renderPlayer = ref(true);
  43. //当前选中树节点
  44. let selected = reactive<any>({
  45. id: null,
  46. pid: null,
  47. title: '',
  48. isFolder: false,
  49. });
  50. //tree菜单列表
  51. let listArr = reactive<any[]>([]);
  52. let searchParam = reactive({
  53. devKind: '',
  54. strType: '',
  55. });
  56. let pagination = reactive({
  57. current: 1,
  58. pageSize: 6,
  59. })
  60. let router = useRouter(); //路由
  61. let nodeData = reactive<any>({})
  62. async function getCameraDevKindList() {
  63. let res = await getCameraDevKind();
  64. if (res.length != 0) {
  65. listArr.length = 0;
  66. listArr.push({
  67. pid: 'root',
  68. isFolder: true,
  69. expanded: true,
  70. title: '全部',
  71. id: 0,
  72. children: [],
  73. });
  74. res.forEach((el) => {
  75. el.pid = 0;
  76. el.isFolder = true;
  77. el.expanded = false;
  78. el.title = el.itemText;
  79. el.id = el.subDictId;
  80. el.children = [];
  81. listArr[0].children.push(el);
  82. });
  83. selected.id = listArr[0].id;
  84. selected.pid = listArr[0].pid;
  85. selected.title = listArr[0].title;
  86. selected.isFolder = listArr[0].isFolder;
  87. }
  88. }
  89. //点击目录
  90. async function onClick(node) {
  91. if (selected.title === node.title && selected.id === node.id) return;
  92. selected.id = node.id;
  93. selected.pid = node.pid;
  94. selected.title = node.title;
  95. selected.isFolder = node.isFolder;
  96. pagination.current = 1;
  97. if (node.pid != 'root') {
  98. nodeData = Object.assign({}, node)
  99. if (node.isFolder) {
  100. let types, devicetype;
  101. if (node.itemValue.indexOf('&') != -1) {
  102. types = node.itemValue.substring(node.itemValue.indexOf('&') + 1);
  103. devicetype = node.itemValue.substring(0, node.itemValue.indexOf('&'));
  104. } else {
  105. types = '';
  106. devicetype = '';
  107. }
  108. let res = await getDevice({ ids: types, devicetype: devicetype });
  109. if (res.msgTxt.length != 0) {
  110. res.msgTxt[0].datalist.forEach((el) => {
  111. el.pid = node.id;
  112. el.isFolder = false;
  113. el.title = el.strinstallpos;
  114. el.id = el.deviceID;
  115. });
  116. listArr[0].children.forEach((v) => {
  117. if (v.id == node.id) {
  118. v.children = res.msgTxt[0].datalist;
  119. }
  120. });
  121. }
  122. searchParam.devKind = node.itemValue;
  123. searchParam.strType = '';
  124. let paramKind = searchParam.devKind.substring(0, searchParam.devKind.indexOf('&'));
  125. await getCamera('', playerRef, renderPlayer, pagination, '', paramKind);
  126. } else {
  127. await getCamera(node.deviceID, playerRef, renderPlayer, pagination);
  128. }
  129. } else {
  130. searchParam.devKind = '';
  131. searchParam.strType = '';
  132. await getCamera('', playerRef, renderPlayer, pagination);
  133. }
  134. }
  135. //点击详情跳转
  136. function onDetail(node) {
  137. let str = listArr[0].children.filter((v) => v.id == node.pid)[0].itemValue;
  138. let type = str.indexOf('&') != -1 ? str.substring(0, str.indexOf('&')) : '';
  139. console.log(type, 'type--------');
  140. switch (type) {
  141. case 'pulping': //注浆
  142. router.push('/grout-home');
  143. break;
  144. case 'window': //自动风窗
  145. router.push('/monitorChannel/monitor-window?id=' + node.deviceID);
  146. break;
  147. case 'gate': //自动风门
  148. router.push('/monitorChannel/monitor-gate?id=' + node.deviceID + '&deviceType=' + node.deviceType);
  149. break;
  150. case 'fanlocal': //局部风机
  151. router.push('/monitorChannel/monitor-fanlocal?id=' + node.deviceID + '&deviceType=fanlocal');
  152. break;
  153. case 'fanmain': //主风机
  154. router.push('/monitorChannel/monitor-fanmain?id=' + node.deviceID);
  155. break;
  156. case 'forcFan': //压风机
  157. router.push('/forcFan/home');
  158. break;
  159. case 'pump': //瓦斯抽采泵
  160. router.push('/monitorChannel/gasPump-home');
  161. break;
  162. case 'nitrogen': //制氮
  163. router.push('/nitrogen-home');
  164. break;
  165. }
  166. }
  167. //分页
  168. async function onChange(page) {
  169. pagination.current = page
  170. console.log()
  171. if (nodeData.isFolder) {
  172. let paramKind = nodeData.itemValue.substring(0, searchParam.devKind.indexOf('&'));
  173. await getCamera('', playerRef, renderPlayer, pagination, '', paramKind);
  174. } else if (!nodeData.isFolder) {
  175. await getCamera(nodeData.deviceID, playerRef, renderPlayer, pagination);
  176. } else {
  177. await getCamera('', playerRef, renderPlayer, pagination);
  178. }
  179. }
  180. onMounted(async () => {
  181. await getCameraDevKindList();
  182. await getCamera('', playerRef, renderPlayer, pagination);
  183. });
  184. onBeforeUnmount(() => {
  185. removeCamera(playerRef);
  186. });
  187. </script>
  188. <style lang="less" scoped>
  189. @import '/@/design/theme.less';
  190. @{theme-deepblue} {
  191. .camera-container {
  192. --image-camera_bg: url('/@/assets/images/themify/deepblue/vent/camera_bg.png');
  193. }
  194. }
  195. .camera-container {
  196. --image-camera_bg: url('/@/assets/images/vent/camera_bg.png');
  197. position: relative;
  198. width: calc(100% - 30px);
  199. height: calc(100% - 84px);
  200. display: flex;
  201. margin: 15px;
  202. justify-content: space-between;
  203. align-items: center;
  204. .left-area {
  205. width: 15%;
  206. height: 100%;
  207. padding: 20px;
  208. border: 1px solid #99e8ff66;
  209. background: #27546e1a;
  210. box-shadow: 0px 0px 20px 7px rgba(145, 233, 254, 0.7) inset;
  211. -moz-box-shadow: 0px 0px 20px 7px rgba(145, 233, 254, 0.7) inset;
  212. -webkit-box-shadow: 0px 0px 50px 1px rgb(149 235 255 / 5%) inset;
  213. box-sizing: border-box;
  214. // lxh
  215. .iconfont {
  216. color: #fff;
  217. font-size: 12px;
  218. margin-left: 5px;
  219. }
  220. }
  221. .right-area {
  222. width: 85%;
  223. height: 100%;
  224. padding: 0px 0px 0px 15px;
  225. box-sizing: border-box;
  226. }
  227. .pagination {
  228. width: 100%;
  229. height: 60px;
  230. display: flex;
  231. justify-content: center;
  232. align-items: center;
  233. }
  234. }
  235. :deep(#LivePlayerBox) {
  236. display: flex;
  237. flex-direction: row;
  238. justify-content: flex-start;
  239. flex-wrap: wrap;
  240. pointer-events: none;
  241. .liveVideo {
  242. width: 510px !important;
  243. height: 320px !important;
  244. align-self: auto !important;
  245. margin: 10px 8px !important;
  246. background-size: 100% 100% !important;
  247. padding: 15px !important;
  248. }
  249. .video-parent {
  250. pointer-events: auto !important;
  251. align-self: auto !important;
  252. }
  253. }
  254. </style>