addScenes.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <template>
  2. <VRModel>
  3. <template v-slot:content="{ pagging }: { pagging: ScenePagging }">
  4. <div :style="{ display: 'none' }">{{ syncTableSelects(pagging) }}</div>
  5. <el-table
  6. :data="pagging.state.table.rows"
  7. tooltip-effect="dark"
  8. ref="tableRef"
  9. style="width: 100%"
  10. size="large"
  11. @selection-change="
  12. (val) =>
  13. changeSelection(val, pagging.state.table.rows, pagging.state.query.type)
  14. "
  15. >
  16. <el-table-column type="selection" width="50" />
  17. <el-table-column label="标题" v-slot:default="{ row }">
  18. {{
  19. pagging.state.query.type === SceneType.SWMX ? row.modelTitle : row.sceneName
  20. }}
  21. </el-table-column>
  22. <el-table-column
  23. label="原始数据格式"
  24. prop="modelDateType"
  25. v-if="pagging.state.query.type === SceneType.SWMX"
  26. />
  27. <el-table-column label="拍摄时间" prop="createTime" v-slot:default="{ row }">
  28. {{ row.createTime }}
  29. </el-table-column>
  30. </el-table>
  31. </template>
  32. </VRModel>
  33. </template>
  34. <script setup lang="ts">
  35. import VRModel from "@/view/vrmodel/index.vue";
  36. import { Scene, SceneType } from "@/store/scene";
  37. import { CaseScenes } from "@/store/case";
  38. import { ScenePagging } from "@/view/vrmodel/pagging";
  39. import { Ref, onMounted, onUnmounted, ref, watchEffect } from "vue";
  40. import {
  41. getCaseSceneList,
  42. getCaseScenes,
  43. getSceneKey,
  44. replaceCaseScenes,
  45. } from "@/store/case";
  46. import { QuiskExpose } from "@/helper/mount";
  47. import { ElTable } from "element-plus";
  48. const props = defineProps<{ caseId: number }>();
  49. const caseScenes = ref<CaseScenes>(getCaseScenes([]));
  50. const tableRef = ref<InstanceType<typeof ElTable>>();
  51. let paggingLoading: Ref<boolean>;
  52. // 同步table选择
  53. let stopSyncWatch: () => void;
  54. const syncTableSelects = (pagging: ScenePagging) => {
  55. stopSyncWatch && stopSyncWatch();
  56. const stopParamWatch = watchEffect(
  57. () => {
  58. if (pagging.state.query.type === SceneType.SWMX) {
  59. pagging.state.query.status = 2;
  60. } else {
  61. delete pagging.state.query.status;
  62. }
  63. },
  64. { flush: "sync" }
  65. );
  66. const stopSyncSelect = watchEffect(
  67. () => {
  68. paggingLoading = pagging.loading;
  69. if (paggingLoading.value) {
  70. return;
  71. }
  72. const selectKeys = caseScenes.value.find(
  73. (item) => item.type === pagging.state.query.type
  74. )!.numList;
  75. pagging.state.table.rows.forEach((scene) => {
  76. tableRef.value?.toggleRowSelection(
  77. scene,
  78. selectKeys.includes(getSceneKey(scene))
  79. );
  80. });
  81. },
  82. { flush: "post" }
  83. );
  84. stopSyncWatch = () => {
  85. stopSyncSelect();
  86. stopParamWatch();
  87. };
  88. };
  89. const changeSelection = (selectScenes: Scene[], pagScenes: Scene[], type: SceneType) => {
  90. if (paggingLoading.value) {
  91. return;
  92. }
  93. const typeCaseScenes = caseScenes.value.find((item) => item.type === type)!;
  94. const oldKeys = caseScenes.value.find((item) => item.type === type)!.numList;
  95. const selectKeys = selectScenes.map(getSceneKey);
  96. const pagKeys = pagScenes.map(getSceneKey);
  97. typeCaseScenes.numList = oldKeys
  98. // 保留其他页的key,剔除当前页的key
  99. .filter((key) => !pagKeys.includes(key))
  100. // 拼接上当前页选中的key
  101. .concat(selectKeys);
  102. };
  103. // 初始化数据
  104. onMounted(async () => {
  105. caseScenes.value = getCaseScenes(await getCaseSceneList(props.caseId));
  106. });
  107. onUnmounted(() => {
  108. stopSyncWatch();
  109. });
  110. defineExpose<QuiskExpose>({
  111. async submit() {
  112. await replaceCaseScenes(props.caseId, caseScenes.value);
  113. },
  114. });
  115. </script>