modelContent.vue 4.1 KB

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