addScenes.vue 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <template>
  2. <VRModelList :params="params">
  3. <template v-slot:header>
  4. <el-form-item label="标题:" style="grid-area: 1 / 1 / 2 / 4">
  5. <el-input v-model="params.keyword" placeholder="请输入" />
  6. </el-form-item>
  7. </template>
  8. <template v-slot:content>
  9. <el-table
  10. :data="params.pagging.state.table.rows"
  11. tooltip-effect="dark"
  12. ref="tableRef"
  13. style="width: 100%"
  14. size="large"
  15. @selection-change="changeSelection"
  16. >
  17. <el-table-column type="selection" width="50" />
  18. <el-table-column label="标题" v-slot:default="{ row }">
  19. {{ params.isSwmx ? row.modelTitle : row.name }}
  20. </el-table-column>
  21. <el-table-column label="所属架构" prop="deptName"></el-table-column>
  22. <el-table-column label="原始数据格式" prop="modelDateType" v-if="params.isSwmx" />
  23. <el-table-column label="拍摄时间" prop="createTime" v-slot:default="{ row }">
  24. {{ row.createTime.substr(0, 16) }}
  25. </el-table-column>
  26. </el-table>
  27. </template>
  28. </VRModelList>
  29. </template>
  30. <script setup lang="ts">
  31. import VRModelList from "@/view/vrmodel/list.vue";
  32. import { Scene } from "@/store/scene";
  33. import { CaseScenes } from "@/store/case";
  34. import { useScenePaggingParams } from "@/view/vrmodel/pagging";
  35. import { onMounted, ref, watch, watchEffect } from "vue";
  36. import {
  37. getCaseSceneList,
  38. getCaseScenes,
  39. getSceneKey,
  40. replaceCaseScenes,
  41. } from "@/store/case";
  42. import { QuiskExpose } from "@/helper/mount";
  43. import { ElTable } from "element-plus";
  44. const props = defineProps<{ caseId: number }>();
  45. const params = useScenePaggingParams();
  46. const caseScenes = ref<CaseScenes>(getCaseScenes([]));
  47. const tableRef = ref<InstanceType<typeof ElTable>>();
  48. watch(
  49. () => params.pagging.state.query,
  50. () => {
  51. params.pagging.state.query.status = 2;
  52. params.pagging.state.query.caseId = props.caseId;
  53. },
  54. { immediate: true, deep: true }
  55. );
  56. // 复选框同步
  57. watchEffect(() => {
  58. if (!tableRef.value) return;
  59. const selectKeys = caseScenes.value.find(
  60. (item) => item.type === params.pagging.state.query.type
  61. )!.numList;
  62. params.pagging.state.table.rows.forEach((scene) => {
  63. tableRef.value!.toggleRowSelection(scene, selectKeys.includes(getSceneKey(scene)));
  64. });
  65. });
  66. const changeSelection = (selectScenes: Scene[]) => {
  67. if (params.pagging.loading) return;
  68. const pagScenes = params.pagging.state.table.rows;
  69. const type = params.pagging.state.query.type;
  70. const typeCaseScenes = caseScenes.value.find((item) => item.type === type)!;
  71. const oldKeys = caseScenes.value.find((item) => item.type === type)!.numList;
  72. const selectKeys = selectScenes.map(getSceneKey);
  73. const pagKeys = pagScenes.map(getSceneKey);
  74. typeCaseScenes.numList = oldKeys
  75. // 保留其他页的key,剔除当前页的key
  76. .filter((key) => !pagKeys.includes(key))
  77. // 拼接上当前页选中的key
  78. .concat(selectKeys);
  79. };
  80. // 初始化数据
  81. onMounted(async () => {
  82. caseScenes.value = getCaseScenes(await getCaseSceneList(props.caseId));
  83. });
  84. defineExpose<QuiskExpose>({
  85. submit: () => replaceCaseScenes(props.caseId, caseScenes.value),
  86. });
  87. </script>