modelContent.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <template>
  2. <div class="body-head">
  3. <el-tooltip
  4. class="item"
  5. effect="dark"
  6. :content="`请上传${format}(支持obj/ply/las/osgb/b3dm格式的数据),大小在${size}以内 `"
  7. placement="bottom-start"
  8. ><el-upload
  9. class="upload-demo"
  10. :multiple="false"
  11. :limit="1"
  12. :accept="accept"
  13. :show-file-list="false"
  14. :http-request="() => {}"
  15. :file-list="fileList"
  16. :disabled="percentage || !operateIsPermissionByPath('sync')"
  17. :before-upload="uploadCheck"
  18. >
  19. <el-button v-pdpath="'sync'" type="primary">
  20. <el-icon><Upload /></el-icon>{{ percentage ? "文件上传中" : "上传数据" }}
  21. </el-button>
  22. </el-upload>
  23. </el-tooltip>
  24. </div>
  25. <el-table
  26. :data="pagging.state.table.rows"
  27. tooltip-effect="dark"
  28. style="width: 100%"
  29. size="large"
  30. >
  31. <el-table-column label="序号" width="70" v-slot:default="{ $index }">
  32. <div style="text-align: center">
  33. {{ pagging.state.pag.size * (pagging.state.pag.currentPage - 1) + $index + 1 }}
  34. </div>
  35. </el-table-column>
  36. <el-table-column label="标题" prop="modelTitle"></el-table-column>
  37. <el-table-column label="原始数据格式" prop="modelDateType"></el-table-column>
  38. <el-table-column label="大小" prop="modelSize"></el-table-column>
  39. <el-table-column label="上传时间" v-slot:default="{ row }: { row: ModelScene }">
  40. {{ getStatusText(row) }}
  41. </el-table-column>
  42. <el-table-column label="所属架构" prop="deptName"></el-table-column>
  43. <el-table-column label="操作" v-slot:default="{ row }">
  44. <span
  45. class="oper-span"
  46. v-pdpath="['edit']"
  47. @click="editHanlder(row)"
  48. v-if="row.createStatus === ModelSceneStatus.SUCCESS"
  49. >
  50. 修改
  51. </span>
  52. <span
  53. class="oper-span"
  54. v-pdpath="['view']"
  55. @click="openSceneUrl(row, OpenType.query)"
  56. v-if="row.createStatus === ModelSceneStatus.SUCCESS"
  57. >
  58. 查看
  59. </span>
  60. <span
  61. class="oper-span delBtn"
  62. v-pdscene="row"
  63. @click="delOrCancel(row)"
  64. v-pdpath="'del'"
  65. >
  66. {{ row.createStatus !== ModelSceneStatus.RUN ? "删除" : "取消上传" }}
  67. </span>
  68. </el-table-column>
  69. </el-table>
  70. <el-dialog
  71. :model-value="!!percentage"
  72. :show-close="false"
  73. title="文件上传中"
  74. :close-on-click-modal="false"
  75. >
  76. <el-progress :percentage="percentage" />
  77. </el-dialog>
  78. </template>
  79. <script setup lang="ts">
  80. import {
  81. ModelSceneStatus,
  82. ModelScene,
  83. cancelUploadModelScene,
  84. uploadModelScene,
  85. delModelScene,
  86. getModelSceneStatus,
  87. } from "@/store/scene";
  88. import {
  89. ModelMaxSize,
  90. ModelSceneStatusDesc,
  91. ModelSupportFormats,
  92. SceneTypePaths,
  93. } from "@/constant/scene";
  94. import { confirm } from "@/helper/message";
  95. import { useUpload } from "@/hook/upload";
  96. import { ScenePagging } from "./pagging";
  97. import { watchPolling } from "@/hook/watchPolling";
  98. import { OpenType, openSceneUrl } from "../case/help";
  99. import { operateIsPermissionByPath } from "@/directive/permission";
  100. import { editModelScene } from "./quisk";
  101. const props = defineProps<{ pagging: ScenePagging }>();
  102. const getStatusText = (scene: ModelScene) => {
  103. let desc = ModelSceneStatusDesc[scene.createStatus];
  104. if (scene.createStatus === ModelSceneStatus.RUN && scene.progress) {
  105. desc += ` ${scene.progress}% `;
  106. } else if (scene.createStatus === ModelSceneStatus.SUCCESS) {
  107. desc = scene.createTime;
  108. }
  109. return desc;
  110. };
  111. const delOrCancel = async (scene: ModelScene) => {
  112. const isDel = scene.createStatus !== ModelSceneStatus.RUN;
  113. const msg = isDel ? "确定要删除此数据?" : "确定要取消上传吗?";
  114. if (await confirm(msg)) {
  115. isDel ? await delModelScene(scene) : await cancelUploadModelScene(scene);
  116. props.pagging.refresh();
  117. }
  118. };
  119. const editHanlder = async (scene: ModelScene) => {
  120. if (await editModelScene({ model: scene })) {
  121. props.pagging.refresh();
  122. }
  123. };
  124. const {
  125. percentage,
  126. upload: uploadCheck,
  127. fileList,
  128. size,
  129. format,
  130. removeFile,
  131. accept,
  132. } = useUpload({
  133. maxSize: ModelMaxSize,
  134. formats: ModelSupportFormats,
  135. upload: async (file, onPercentage) => {
  136. try {
  137. await uploadModelScene(file, onPercentage);
  138. props.pagging.refresh();
  139. } catch {}
  140. removeFile();
  141. },
  142. });
  143. // 处理后台正在处理的模型类
  144. const refreshStatus = (models: ModelScene[]) => {
  145. const refreshStatusAll = models.map(async (scene) => {
  146. const { status, progress } = await getModelSceneStatus(scene);
  147. scene.createStatus = status;
  148. scene.progress = progress;
  149. if (status == ModelSceneStatus.SUCCESS) {
  150. props.pagging.refresh();
  151. }
  152. });
  153. return Promise.all(refreshStatusAll);
  154. };
  155. watchPolling(() => {
  156. const payload = (props.pagging.state.table.rows as ModelScene[]).filter(
  157. (item) => item.createStatus === ModelSceneStatus.RUN
  158. );
  159. return { start: payload.length > 0, payload };
  160. }, refreshStatus);
  161. </script>