PageDrillPlanItem.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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" @record-submitted="handleRecordSubmitted" />
  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. <div v-if="!isRecordSubmitted">
  22. <el-button @click="recordSave">保存</el-button>
  23. <el-button type="primary" @click="recordSubmit">提交审批</el-button>
  24. </div>
  25. <div v-else>
  26. <el-button type="primary" @click="enableEditRecord">修改</el-button>
  27. </div>
  28. </div>
  29. </footer>
  30. <UploadLoading :form-loading="formLoading" v-if="formLoading" />
  31. </div>
  32. </template>
  33. <script setup lang="ts">
  34. import { ElMessage } from 'element-plus';
  35. import { ref, computed, defineAsyncComponent } from 'vue';
  36. import { useRoute, useRouter } from 'vue-router';
  37. import UploadLoading from '@/components/UploadLoading.vue';
  38. import { createEmergencyDrillPlan } from '@/api/emergency-drill/emergency-drill';
  39. const formLoading = ref(false);
  40. const router = useRouter();
  41. const route = useRoute();
  42. const operate = route.query.operate;
  43. const id = route.query.id;
  44. const isRecordSubmitted = ref(false);
  45. const headerTitle = computed(() => {
  46. switch (operate) {
  47. case 'create':
  48. return `创建演练计划`;
  49. case 'view':
  50. return `演练计划详情`;
  51. case 'execute':
  52. return `演练执行`;
  53. case 'record':
  54. return `演练记录`;
  55. default:
  56. return '未知操作';
  57. }
  58. });
  59. const dynamicComponent = computed(() => {
  60. switch (operate) {
  61. case 'create':
  62. return defineAsyncComponent(() => import('./components/DrillPlanCreateItem.vue'));
  63. case 'execute':
  64. return defineAsyncComponent(() => import('./components/DrillPlanExecuteItem.vue'));
  65. case 'record':
  66. return defineAsyncComponent(() => import('./components/DrillPlanRecordItem.vue'));
  67. default:
  68. return '';
  69. }
  70. });
  71. const dynamicComponentRef = ref();
  72. // 创建演练计划页 提交按钮
  73. const createSubmit = async () => {
  74. if (!dynamicComponentRef.value) return;
  75. const res = await dynamicComponentRef.value.formValidate();
  76. if (!res) return;
  77. const formData = dynamicComponentRef.value.getFormData();
  78. let message;
  79. try {
  80. formLoading.value = true;
  81. await createEmergencyDrillPlan(formData);
  82. message = '创建成功';
  83. ElMessage.success(message);
  84. router.back();
  85. } finally {
  86. formLoading.value = false;
  87. }
  88. };
  89. // 演练执行页 保存按钮
  90. const executeSave = async () => {
  91. formLoading.value = true;
  92. await dynamicComponentRef.value.executeSaveOrSubmit('save');
  93. formLoading.value = false;
  94. };
  95. // 演练执行页 提交按钮
  96. const executeSubmit = async () => {
  97. formLoading.value = true;
  98. await dynamicComponentRef.value.executeSaveOrSubmit('submit');
  99. formLoading.value = false;
  100. };
  101. // 演练记录页 保存按钮
  102. const recordSave = async () => {
  103. formLoading.value = true;
  104. await dynamicComponentRef.value.saveDrillRecord();
  105. formLoading.value = false;
  106. };
  107. // 演练记录页 提交按钮
  108. const recordSubmit = async () => {
  109. await dynamicComponentRef.value.startSubmitDrillRecord();
  110. };
  111. function handleRecordSubmitted() {
  112. isRecordSubmitted.value = true;
  113. }
  114. function enableEditRecord() {
  115. isRecordSubmitted.value = false;
  116. dynamicComponentRef.value.enableEditRecord();
  117. }
  118. </script>
  119. <style scoped lang="scss">
  120. @use '@/styles/page-details-layout.scss' as *;
  121. .safety-platform-container__header {
  122. flex-direction: row !important;
  123. justify-content: flex-start !important;
  124. gap: 8px !important;
  125. }
  126. </style>