RealTimeMonitor.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <script setup lang="ts">
  2. import { onMounted, ref, useTemplateRef } from 'vue';
  3. import Visual2DEditor from '@/components/visual-2d/Visual2DEditor.vue';
  4. import Visual2DPreview from '@/components/visual-2d/Visual2DPreview.vue';
  5. import { useRequest } from '@/hooks/request';
  6. import { getGroupModuleInfo, getPageList, noPaginationDevicesList } from '@/api';
  7. import { VisualModuleType } from '@/constants';
  8. import DeviceControl from './device-control/DeviceControl.vue';
  9. import DeviceBatchExe from './DeviceBatchExe.vue';
  10. import DeviceCtrlModal from './DeviceCtrlModal.vue';
  11. import type {
  12. AllDevicesList,
  13. DevGroupTabCompProps,
  14. DeviceGroupItem,
  15. DeviceGroupTree,
  16. DeviceGroupTreeChild,
  17. GroupModuleInfo,
  18. } from '@/types';
  19. const props = defineProps<DevGroupTabCompProps>();
  20. const deviceControlRef = useTemplateRef('deviceControl');
  21. const deviceCtrlModalRef = useTemplateRef('deviceCtrlModal');
  22. const deviceBatchExeRef = useTemplateRef('deviceBatchExe');
  23. const visual2DEditorRef = useTemplateRef('visual2DEditor');
  24. const visual2DPreviewRef = useTemplateRef('visual2DPreview');
  25. const { isLoading, handleRequest } = useRequest();
  26. const moduleInfo = ref<GroupModuleInfo>();
  27. const deviceList = ref<DeviceGroupTree[]>([]);
  28. onMounted(() => {
  29. handleRequest(async () => {
  30. const groups = await getPageList();
  31. const devices = await noPaginationDevicesList();
  32. deviceList.value = transformGroupsAndDevices(groups, devices);
  33. moduleInfo.value = await getGroupModuleInfo({
  34. groupId: props.deviceGroupId,
  35. moduleType: VisualModuleType.Module2D,
  36. });
  37. });
  38. });
  39. const transformGroupsAndDevices = (groups: DeviceGroupItem[], devices: AllDevicesList[]): DeviceGroupTree[] => {
  40. // 创建一个映射表,用于快速查找每个组ID对应的设备
  41. const deviceMap = new Map<number, AllDevicesList[]>();
  42. devices.forEach((device) => {
  43. if (!deviceMap.has(device.groupId)) {
  44. deviceMap.set(device.groupId, []);
  45. }
  46. deviceMap.get(device.groupId)!.push(device);
  47. });
  48. // 转换顶级分组
  49. return groups.map((group) => {
  50. // 转换当前组
  51. const transformed: DeviceGroupTree = {
  52. ...group,
  53. label: group.groupName,
  54. children: [],
  55. };
  56. // 转换子分组(二级分组),并过滤掉没有设备的分组
  57. if (group.deviceGroupChilds && group.deviceGroupChilds.length > 0) {
  58. transformed.children = group.deviceGroupChilds
  59. .map((child) => {
  60. const transformedChild: DeviceGroupTreeChild = {
  61. ...child,
  62. label: child.groupName,
  63. children: [],
  64. };
  65. // 查找并添加属于这个二级分组的设备
  66. const childDevices = deviceMap.get(child.id) || [];
  67. transformedChild.children = childDevices.map((device) => ({
  68. ...device,
  69. label: device.deviceName,
  70. }));
  71. return transformedChild;
  72. })
  73. .filter((child) => child.children.length > 0); // 过滤掉没有设备的二级分组
  74. }
  75. return transformed;
  76. });
  77. };
  78. const openEditor = () => {
  79. visual2DEditorRef.value?.showView();
  80. };
  81. const openDevCtrlModal = (id: number) => {
  82. if (!id) {
  83. return;
  84. }
  85. deviceCtrlModalRef.value?.showView();
  86. };
  87. const exportImg = () => {
  88. visual2DPreviewRef.value?.exportImg();
  89. };
  90. const maximizeView = () => {
  91. console.log('maximize view');
  92. };
  93. defineExpose({
  94. openEditor,
  95. exportImg,
  96. maximizeView,
  97. });
  98. </script>
  99. <template>
  100. <div class="real-time-monitor-container">
  101. <template v-if="moduleInfo?.leId">
  102. <Visual2DPreview
  103. ref="visual2DPreview"
  104. :info="moduleInfo"
  105. :device-list="deviceList"
  106. @click="deviceControlRef?.closeCtrlPanel"
  107. @open-dev-ctrl-modal="openDevCtrlModal"
  108. />
  109. <Visual2DEditor ref="visual2DEditor" :info="moduleInfo" :device-list="deviceList" />
  110. </template>
  111. <DeviceControl ref="deviceControl" />
  112. <DeviceCtrlModal ref="deviceCtrlModal" @open-dev-batch-exe="deviceBatchExeRef?.showView" />
  113. <DeviceBatchExe ref="deviceBatchExe" />
  114. <ASpin v-if="isLoading" class="center-loading" :spinning="true" />
  115. </div>
  116. </template>
  117. <style lang="scss" scoped>
  118. .real-time-monitor-container {
  119. height: 100%;
  120. background: #1e2530;
  121. border-radius: 12px;
  122. }
  123. </style>