PageDrillPlanView.vue 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <template>
  2. <div class="safety-platform-container">
  3. <header class="safety-platform-container__header">
  4. <div>
  5. <BreadcrumbBack />
  6. <span class="breadcrumb-title" style="margin-left: 8px">{{ '演练记录' }}</span>
  7. </div>
  8. <el-tabs v-model="activeName">
  9. <el-tab-pane
  10. v-for="item in EMERGENCY_DRILL_DETAIL_SUBPAGE"
  11. :key="item.value"
  12. :label="item.label"
  13. :name="item.value"
  14. />
  15. </el-tabs>
  16. </header>
  17. <main class="safety-platform-container__main">
  18. <component :is="dynamicComponent" :id="id" ref="dynamicComponentRef" />
  19. </main>
  20. <footer class="safety-platform-container__footer" v-if="activeName === EMERGENCY_DRILL_DETAIL_SUBPAGE[1].value">
  21. <!-- 按钮 -->
  22. <el-button type="primary" @click="downloadPDF">导出</el-button>
  23. </footer>
  24. <UploadLoading :form-loading="formLoading" v-if="formLoading" />
  25. </div>
  26. </template>
  27. <script setup lang="ts">
  28. import { ref, computed, defineAsyncComponent } from 'vue';
  29. import { ElMessage } from 'element-plus';
  30. import { useRoute } from 'vue-router';
  31. import UploadLoading from '@/components/UploadLoading.vue';
  32. import { EMERGENCY_DRILL_DETAIL_SUBPAGE } from './constants';
  33. import { exportEmergencyDrillRecord } from '@/api/emergency-drill/emergency-drill';
  34. import { downloadFile } from '@/views/disaster/utils/download';
  35. const formLoading = ref(false);
  36. const route = useRoute();
  37. const id = route.query.id;
  38. const activeName = ref(route.query.tab || EMERGENCY_DRILL_DETAIL_SUBPAGE[0].value);
  39. const dynamicComponent = computed(() => {
  40. switch (activeName.value) {
  41. case 'activities':
  42. return defineAsyncComponent(() => import('./components/DrillPlanViewActivities.vue'));
  43. case 'records':
  44. return defineAsyncComponent(() => import('./components/DrillPlanViewRecords.vue'));
  45. }
  46. });
  47. const downloadPDF = async () => {
  48. try {
  49. const res = await exportEmergencyDrillRecord(id);
  50. if (res.size === 0) return;
  51. const blob = new Blob([res], { type: 'application/pdf' });
  52. const url = window.URL.createObjectURL(blob);
  53. downloadFile(url, '应急演练记录及评估表.pdf');
  54. } catch (e) {
  55. ElMessage.error('下载失败');
  56. console.log(e);
  57. }
  58. };
  59. </script>
  60. <style scoped lang="scss">
  61. @use '@/styles/page-details-layout.scss' as *;
  62. .safety-platform-container__header {
  63. padding-bottom: 0 !important;
  64. }
  65. :deep(.el-tabs__header) {
  66. margin: 0;
  67. }
  68. :deep(.el-tabs__item) {
  69. font-size: 14px !important;
  70. }
  71. </style>