PageDisposalManagementItem.vue 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <template>
  2. <div class="disaster-precaution-container">
  3. <header class="disaster-precaution-container__header">
  4. <img :src="BackIcon" alt="back" class="back-icon" @click="router.back()" />
  5. <span class="disaster-precaution-container__title">{{ headerTitle }}</span>
  6. </header>
  7. <main class="disaster-precaution-container__main">
  8. <component :is="dynamicComponent" :id="id" ref="dynamicComponentRef" />
  9. </main>
  10. <footer class="disaster-precaution-container__footer" v-if="operate">
  11. <el-button @click="router.back()">取消</el-button>
  12. <el-button type="primary" @click="submit">提交</el-button>
  13. </footer>
  14. <UploadLoading :form-loading="formLoading" v-if="formLoading" />
  15. </div>
  16. </template>
  17. <script lang="ts" setup>
  18. import { ref, computed, defineAsyncComponent } from 'vue';
  19. import UploadLoading from '@/components/UploadLoading.vue';
  20. import { useRoute, useRouter } from 'vue-router';
  21. import BackIcon from 'assets/svg/back.svg';
  22. import { ElMessage } from 'element-plus';
  23. import { createDisasterReportTask, editDisasterReportTask } from '@/api/disaster-control';
  24. import type { DisposalManagementCreateQuery, DisasterReportEditQuery } from '@/types/disaster-control';
  25. const router = useRouter();
  26. const route = useRoute();
  27. const operate = route.query.operate;
  28. const id = Number(route.params.id);
  29. const reportTaskId = Number(route.query.reportTaskId);
  30. const headerTitle = computed(() => {
  31. const fixedTitle = '灾害处置任务';
  32. if (operate === 'create') {
  33. return `创建${fixedTitle}`;
  34. } else if (operate === 'edit') {
  35. return `编辑${fixedTitle}`;
  36. }
  37. return `查看${fixedTitle}`;
  38. });
  39. const dynamicComponent = computed(() => {
  40. if (operate === 'create') {
  41. return defineAsyncComponent(() => import('./src/components/CreateDisposalManagementItem.vue'));
  42. } else if (operate === 'edit') {
  43. return defineAsyncComponent(() => import('./src/components/EditDisposalManagementItem.vue'));
  44. } else {
  45. return defineAsyncComponent(() => import('./src/components/ViewDisposalManagementItem.vue'));
  46. }
  47. });
  48. const dynamicComponentRef = ref();
  49. const createDisposalManagementItemFunc = async (formData: DisposalManagementCreateQuery) => {
  50. await createDisasterReportTask({ handleTaskId: id, ...formData });
  51. };
  52. const editDisposalManagementItemFunc = async (formData: DisasterReportEditQuery) => {
  53. if (!reportTaskId) return;
  54. await editDisasterReportTask({ ...formData, id: reportTaskId, handleTaskId: id });
  55. };
  56. const formLoading = ref(false);
  57. const submit = async () => {
  58. if (!dynamicComponentRef.value) return;
  59. const res = await dynamicComponentRef.value.handleValidate();
  60. if (!res) return;
  61. formLoading.value = true;
  62. const formData = dynamicComponentRef.value.getFormData();
  63. let message;
  64. try {
  65. if (operate === 'create') {
  66. await createDisposalManagementItemFunc(formData);
  67. message = '创建成功';
  68. } else {
  69. await editDisposalManagementItemFunc(formData);
  70. message = '编辑成功';
  71. }
  72. ElMessage.success(message);
  73. router.back();
  74. } finally {
  75. formLoading.value = false;
  76. }
  77. };
  78. </script>
  79. <style lang="scss" scoped>
  80. @use '../style/disaster.scss' as *;
  81. @use './src/style/common.scss' as *;
  82. </style>