sceneDownload.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <template>
  2. <!-- hideFloor: state === State.package -->
  3. <div>
  4. <div class="title">
  5. {{ stateTitle[state] }}
  6. </div>
  7. <div v-if="state === State.package">
  8. <div
  9. class="text"
  10. style="display: flex; justify-content: space-between; margin-top: 15px"
  11. >
  12. <span>{{ filename }}</span>
  13. <span>{{ percent }}%</span>
  14. </div>
  15. <div>
  16. <el-slider :disabled="true" v-model="percent" :show-tooltip="false" />
  17. </div>
  18. </div>
  19. <div v-else-if="state === State.readDown">
  20. <span>正在下载中……</span>
  21. </div>
  22. </div>
  23. </template>
  24. <script setup lang="ts">
  25. import { computed, onMounted, onUnmounted, ref } from "vue";
  26. import saveAs from "@/util/file-serve";
  27. import { checkHasDownload, getDownloadProcess, downloadScene, axios } from "@/request";
  28. import { ElMessage } from "element-plus";
  29. import { QuoteScene, SceneType } from "@/store/scene";
  30. import { QuiskExpose } from "@/helper/mount";
  31. const props = defineProps<{ scene: QuoteScene }>();
  32. console.log(props);
  33. enum State {
  34. uncreate,
  35. package,
  36. readDown,
  37. }
  38. const getState = (type: number) => {
  39. const stateTypes = [
  40. { codes: [0, 2], state: State.uncreate },
  41. { codes: [1], state: State.package },
  42. { codes: [3], state: State.readDown },
  43. ];
  44. return (
  45. stateTypes.find((stateType) => stateType.codes.includes(type))?.state ||
  46. State.uncreate
  47. );
  48. };
  49. const show = ref(false);
  50. const state = ref<State>(State.uncreate);
  51. const count = ref<number>(0);
  52. const filename = ref<string>(props.scene.title + ".zip");
  53. const downloadURL = ref<string>();
  54. const percent = ref(0);
  55. const stateTitle = {
  56. [State.uncreate]: "下载场景离线数据包,可在本地运行查看。",
  57. [State.package]: "正在打包场景离线数据",
  58. [State.readDown]: filename.value,
  59. };
  60. const params = {
  61. num: props.scene.num,
  62. isObj: Number(![SceneType.SWSS, SceneType.SWYDSS].includes(props.scene.type)),
  63. };
  64. // 初始化
  65. const initial = async () => {
  66. const res = await axios.get(checkHasDownload, { params });
  67. state.value = getState(res.data.downloadStatus);
  68. count.value = res.data.count;
  69. downloadURL.value = res.data.downloadUrl;
  70. if (state.value === State.uncreate) {
  71. const downRes = await axios.get(downloadScene, { params });
  72. state.value = getState(downRes.data.downloadStatus);
  73. // const unCountFlag =
  74. // count.value == 0 ||(await axios.get(downloadScene, { params })).data.downloadStatus !== 1;
  75. if (state.value === State.uncreate) {
  76. ElMessage.error("下载失败,请联系管理员");
  77. throw "暂无剩余下载次数";
  78. }
  79. }
  80. show.value = true;
  81. console.log(state.value === State.readDown);
  82. if (state.value === State.package) {
  83. refreshPercent();
  84. } else {
  85. downloadURL.value = res.data.downloadUrl;
  86. download();
  87. }
  88. };
  89. // 下载
  90. const download = () => {
  91. if (!downloadURL.value) {
  92. ElMessage.error("下载链接未生成,请稍等!");
  93. throw "下载链接未生成,请稍等!";
  94. } else {
  95. saveAs(downloadURL.value, filename.value);
  96. }
  97. };
  98. // 进度请求
  99. let timer: any;
  100. const refreshPercent = async () => {
  101. const res = await axios.get(getDownloadProcess, { params });
  102. percent.value = parseInt(res.data.percent);
  103. downloadURL.value = res.data.url;
  104. if (downloadURL.value) {
  105. state.value = State.readDown;
  106. download();
  107. } else {
  108. timer = setTimeout(refreshPercent, 1000);
  109. }
  110. };
  111. onUnmounted(() => clearTimeout(timer));
  112. onMounted(initial);
  113. defineExpose<QuiskExpose>({
  114. submit: download
  115. });
  116. </script>