PageDisposalManagementItem.vue 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. <TaskInfoSection :task-name="taskName" @export-loss-detail="exportLossDetail" v-if="!operate" />
  8. <main class="disaster-precaution-container__main">
  9. <component :is="dynamicComponent" :id="id" ref="dynamicComponentRef" />
  10. </main>
  11. <footer class="disaster-precaution-container__footer" v-if="operate">
  12. <el-button @click="router.back()">取消</el-button>
  13. <el-button type="primary" @click="submit">提交</el-button>
  14. </footer>
  15. <UploadLoading :form-loading="formLoading" v-if="formLoading" />
  16. </div>
  17. </template>
  18. <script lang="ts" setup>
  19. import { useRoute, useRouter } from 'vue-router';
  20. import { ref, computed, defineAsyncComponent } from 'vue';
  21. import { ElMessage } from 'element-plus';
  22. import UploadLoading from '@/components/UploadLoading.vue';
  23. import TaskInfoSection from './src/components/TaskInfoSection.vue';
  24. import { exportLossRecord } from '@/views/disaster/disaster-control/src/util';
  25. import type { DisposalManagementCreateQuery, DisasterReportEditQuery } from '@/types/disaster-control';
  26. import { createDisasterReportTask, editDisasterReportTask } from '@/api/disaster-control';
  27. import BackIcon from 'assets/svg/back.svg';
  28. const router = useRouter();
  29. const route = useRoute();
  30. const operate = route.query.operate;
  31. const id = Number(route.params.id);
  32. const taskName = String(route.query.taskName);
  33. const reportTaskId = Number(route.query.reportTaskId);
  34. const headerTitle = computed(() => {
  35. const fixedTitle = '灾害处置任务';
  36. if (operate === 'create') {
  37. return `创建${fixedTitle}`;
  38. } else if (operate === 'edit') {
  39. return `编辑${fixedTitle}`;
  40. }
  41. return '灾害损失记录明细';
  42. });
  43. const dynamicComponent = computed(() => {
  44. if (operate === 'create') {
  45. return defineAsyncComponent(() => import('./src/components/CreateDisposalManagementItem.vue'));
  46. } else if (operate === 'edit') {
  47. return defineAsyncComponent(() => import('./src/components/EditDisposalManagementItem.vue'));
  48. } else {
  49. return defineAsyncComponent(() => import('./src/components/ViewDisposalControlItem.vue'));
  50. }
  51. });
  52. const dynamicComponentRef = ref();
  53. const createDisposalManagementItemFunc = async (formData: DisposalManagementCreateQuery) => {
  54. await createDisasterReportTask({ handleTaskId: id, ...formData });
  55. };
  56. const editDisposalManagementItemFunc = async (formData: DisasterReportEditQuery) => {
  57. if (!reportTaskId) return;
  58. await editDisasterReportTask({ ...formData, id: reportTaskId, handleTaskId: id });
  59. };
  60. const formLoading = ref(false);
  61. const submit = async () => {
  62. if (!dynamicComponentRef.value) return;
  63. const res = await dynamicComponentRef.value.handleValidate();
  64. if (!res) return;
  65. formLoading.value = true;
  66. const formData = dynamicComponentRef.value.getFormData();
  67. let message;
  68. try {
  69. if (operate === 'create') {
  70. await createDisposalManagementItemFunc(formData);
  71. message = '创建成功';
  72. } else {
  73. await editDisposalManagementItemFunc(formData);
  74. message = '编辑成功';
  75. }
  76. ElMessage.success(message);
  77. router.back();
  78. } finally {
  79. formLoading.value = false;
  80. }
  81. };
  82. const exportLossDetail = async () => {
  83. await exportLossRecord({ handleTaskId: id }, taskName);
  84. ElMessage.success(`导出${taskName}损失明细成功`);
  85. };
  86. </script>
  87. <style lang="scss" scoped>
  88. @use '../style/disaster.scss' as *;
  89. @use './src/style/common.scss' as *;
  90. </style>