modelContent.vue 5.9 KB

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