Playback.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <template>
  2. <div>
  3. <div class="camera-main">
  4. <div class="camera-tree">
  5. <CameraTreeCom
  6. :loading="presetListStore.loading"
  7. :camera-tree="cameraTree || []"
  8. :total="codeShowList.length"
  9. :no-integration-num="noIntegrationNum"
  10. :no-networking-num="noNetworkingNum"
  11. />
  12. </div>
  13. <div class="camera-placeholder" v-if="!cameraDetailStore.cameraId">请选择左侧相机</div>
  14. <div v-else class="camera-setting-wrapper">
  15. <NvrCameraView ref="nvrCameraViewRef" :camera-id="cameraDetailStore.cameraId" />
  16. </div>
  17. </div>
  18. </div>
  19. </template>
  20. <script setup lang="ts">
  21. import NvrCameraView from './components/NvrCameraView.vue';
  22. import CameraTreeCom from '@/views/cameras/preview/components/CameraTree/CameraTreeOldVersion.vue';
  23. import { onUnmounted, onBeforeUnmount, ref, watch } from 'vue';
  24. import useCameraDetail from '@/views/cameras/preview/store/useCameraDetailStore';
  25. import usePresetListStore from '@/views/cameras/preview/store/usePresetListStore';
  26. import useFenceStore from '@/views/cameras/preview/store/useFenceStore';
  27. import useCameraAlgoStore from '@/views/cameras/preview/store/useCameraAlgoStore';
  28. import { onMounted } from 'vue';
  29. import { IsPtz } from '@/types/camera/constant';
  30. import { CameraDetailServer } from '@/types/camera/type';
  31. import { CameraTree, getCameraTreeOldVersion } from '@/api/camera/camera-preview';
  32. import useCameraStatus from '@/views/cameras/preview/store/useCameraStatus';
  33. const cameraStatus = useCameraStatus();
  34. const { noNetworkingNum, openInterval, closeInterval } = cameraStatus;
  35. const cameraDetailStore = useCameraDetail();
  36. const fenceStore = useFenceStore();
  37. const presetListStore = usePresetListStore();
  38. const cameraAlgoStore = useCameraAlgoStore();
  39. const cameraTree = ref<CameraTree[]>([]);
  40. const codeShowList = ref<string[]>([]);
  41. const noIntegrationNum = ref<number>(0);
  42. const nvrCameraViewRef = ref();
  43. // const { allAlgoList } = storeToRefs(cameraAlgoStore);
  44. function updateNetworkingState(data, targetData) {
  45. let integrationCount = 0;
  46. for (let i = 0; i < data.length; i++) {
  47. const node = data[i];
  48. const matchedNode = targetData.find((item) => item.cameraCode === node.code);
  49. if (matchedNode) {
  50. node.networkingState = matchedNode.networkingState;
  51. node.integrationState = matchedNode.integrationState;
  52. }
  53. if (node.integrationState === 1) {
  54. integrationCount++;
  55. }
  56. if (node.children && node.children.length > 0) {
  57. const childIntegrationCount = updateNetworkingState(node.children, targetData);
  58. integrationCount += childIntegrationCount;
  59. }
  60. }
  61. noIntegrationNum.value = integrationCount;
  62. return integrationCount;
  63. }
  64. function getCameraList(data) {
  65. let cameraList = [] as string[];
  66. for (let i = 0; i < data.length; i++) {
  67. const node = data[i];
  68. if (node.nodeType === 'camera') {
  69. cameraList.push(node.code);
  70. }
  71. if (node.children && node.children.length > 0) {
  72. const childCameraList = getCameraList(node.children);
  73. cameraList.push(...childCameraList);
  74. }
  75. }
  76. return cameraList;
  77. }
  78. watch(
  79. () => cameraDetailStore.cameraId,
  80. async (cameraId) => {
  81. fenceStore.clear();
  82. if (cameraId) {
  83. if (cameraTree.value.length === 0) {
  84. /** 如果当前树为空,那么切换相机的时候,要重新请求树结构 */
  85. const tree = await getCameraTreeOldVersion();
  86. cameraTree.value = tree as unknown as CameraTree[];
  87. codeShowList.value = getCameraList(tree);
  88. closeInterval();
  89. openInterval(codeShowList.value, (targetData) => {
  90. updateNetworkingState(cameraTree.value, targetData);
  91. });
  92. }
  93. const detail: CameraDetailServer = getCameraDetail(
  94. cameraTree.value,
  95. cameraDetailStore.cameraId,
  96. ) as unknown as CameraDetailServer;
  97. if (detail) {
  98. cameraDetailStore.setDetail(detail);
  99. }
  100. // cameraAlgoStore.getCameraAlgoList(cameraId);
  101. // cameraAlgoStore.selectedAlgoId = null;
  102. cameraAlgoStore.selectedAlgoList = [];
  103. cameraAlgoStore.getCameraAlgoList(cameraId).then();
  104. nvrCameraViewRef.value.clearNvrUrl();
  105. } else {
  106. /** 没有相机的时候也要请求相机树 */
  107. const tree = await getCameraTreeOldVersion();
  108. cameraTree.value = tree as unknown as CameraTree[];
  109. }
  110. },
  111. {
  112. immediate: true,
  113. },
  114. );
  115. onMounted(() => {
  116. // getCameraTreeOldVersion().then((res) => {
  117. // cameraTree.value = res;
  118. // codeShowList.value = getCameraList(res);
  119. // openInterval(codeShowList.value, (targetData) => {
  120. // updateNetworkingState(cameraTree.value, targetData);
  121. // });
  122. // });
  123. });
  124. onBeforeUnmount(() => {
  125. if (nvrCameraViewRef.value) {
  126. nvrCameraViewRef.value.clearNvrUrl();
  127. }
  128. });
  129. onUnmounted(() => {
  130. /** 离开页面要清理掉所有的store */
  131. cameraDetailStore.clear();
  132. cameraAlgoStore.clear();
  133. fenceStore.clear();
  134. presetListStore.clear();
  135. closeInterval();
  136. });
  137. function getCameraDetail(tree: CameraTree[], cameraId: number): CameraTree | null {
  138. let detail: CameraTree | null = null;
  139. function getDetail(t: CameraTree[]) {
  140. t.forEach((x) => {
  141. if (x.nodeType === 'camera' && x.id === cameraId) {
  142. detail = x;
  143. } else if (x.children && x.children.length > 0) {
  144. getDetail(x.children);
  145. }
  146. });
  147. }
  148. getDetail(tree);
  149. return detail;
  150. }
  151. </script>
  152. <style lang="scss" scoped>
  153. .camera-main {
  154. display: flex;
  155. background: #fff;
  156. .camera-tree {
  157. // width: 250px;
  158. flex-shrink: 0;
  159. border: 1px solid #f0f2f5;
  160. margin: 5px;
  161. }
  162. .camera-placeholder {
  163. color: #333;
  164. text-align: center;
  165. margin-top: 100px;
  166. margin-left: 100px;
  167. }
  168. .camera-setting-wrapper {
  169. width: 960px;
  170. }
  171. }
  172. </style>