PageDrillPlanItem.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <div class="safety-platform-container">
  3. <header class="safety-platform-container__header">
  4. <BreadcrumbBack />
  5. <span class="breadcrumb-title">{{ headerTitle }}</span>
  6. </header>
  7. <main class="safety-platform-container__main">
  8. <component :is="dynamicComponent" :id="id" ref="dynamicComponentRef" />
  9. </main>
  10. <footer class="safety-platform-container__footer">
  11. <!-- 提交按钮 -->
  12. <div v-if="operate === 'create'">
  13. <el-button @click="router.back()">取消</el-button>
  14. <el-button type="primary" @click="createSubmit">提交</el-button>
  15. </div>
  16. <div v-if="operate === 'execute'">
  17. <el-button @click="executeSave">保存</el-button>
  18. <el-button type="primary" @click="executeSubmit">提交</el-button>
  19. </div>
  20. <div v-if="operate === 'record'">
  21. <el-button @click="recordSave">保存</el-button>
  22. <el-button type="primary" @click="recordSubmit">提交审批</el-button>
  23. </div>
  24. </footer>
  25. <UploadLoading :form-loading="formLoading" v-if="formLoading" />
  26. </div>
  27. </template>
  28. <script setup lang="ts">
  29. import { ElMessage } from 'element-plus';
  30. import { ref, computed, defineAsyncComponent } from 'vue';
  31. import { useRoute, useRouter } from 'vue-router';
  32. import UploadLoading from '@/components/UploadLoading.vue';
  33. import { createEmergencyDrillPlan } from '@/api/emergency-drill/emergency-drill';
  34. const formLoading = ref(false);
  35. const router = useRouter();
  36. const route = useRoute();
  37. const operate = route.query.operate;
  38. const id = route.query.id;
  39. const headerTitle = computed(() => {
  40. switch (operate) {
  41. case 'create':
  42. return `创建演练计划`;
  43. case 'view':
  44. return `演练计划详情`;
  45. case 'execute':
  46. return `演练执行`;
  47. case 'record':
  48. return `演练记录`;
  49. default:
  50. return '未知操作';
  51. }
  52. });
  53. const dynamicComponent = computed(() => {
  54. switch (operate) {
  55. case 'create':
  56. return defineAsyncComponent(() => import('./components/DrillPlanCreateItem.vue'));
  57. case 'execute':
  58. return defineAsyncComponent(() => import('./components/DrillPlanExecuteItem.vue'));
  59. case 'record':
  60. return defineAsyncComponent(() => import('./components/DrillPlanRecordItem.vue'));
  61. default:
  62. return '';
  63. }
  64. });
  65. const dynamicComponentRef = ref();
  66. const createSubmit = async () => {
  67. if (!dynamicComponentRef.value) return;
  68. const res = await dynamicComponentRef.value.handleValidate();
  69. if (!res) return;
  70. const formData = dynamicComponentRef.value.getFormData();
  71. let message;
  72. try {
  73. formLoading.value = true;
  74. await createEmergencyDrillPlan(formData);
  75. message = '创建成功';
  76. ElMessage.success(message);
  77. router.back();
  78. } finally {
  79. formLoading.value = false;
  80. }
  81. };
  82. const executeSave = async () => {
  83. formLoading.value = true;
  84. await dynamicComponentRef.value.executeSaveOrSubmit('save');
  85. formLoading.value = false;
  86. };
  87. const executeSubmit = async () => {
  88. formLoading.value = true;
  89. await dynamicComponentRef.value.executeSaveOrSubmit('submit');
  90. formLoading.value = false;
  91. };
  92. const recordSave = async () => {
  93. formLoading.value = true;
  94. await dynamicComponentRef.value.saveDrillRecord();
  95. formLoading.value = false;
  96. };
  97. const recordSubmit = async () => {
  98. await dynamicComponentRef.value.submitDrillRecord();
  99. };
  100. </script>
  101. <style scoped lang="scss">
  102. @use '@/styles/page-details-layout.scss' as *;
  103. .safety-platform-container__header {
  104. flex-direction: row !important;
  105. justify-content: flex-start !important;
  106. gap: 8px !important;
  107. }
  108. </style>