PageDefenseNoticeItem.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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" 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 { useRoute, useRouter } from 'vue-router';
  19. import { ref, computed, defineAsyncComponent } from 'vue';
  20. import { ElMessage } from 'element-plus';
  21. import UploadLoading from '@/components/UploadLoading.vue';
  22. import type { DefenseNoticeRuleForm } from './src/type';
  23. import type { FileItem } from '@/views/disaster/types';
  24. import { uploadFileApi, UPLOAD_BIZ_TYPE } from '@/api/minio';
  25. import { createDefenseNoticeItem, editDefenseNoticeItem } from '@/api/disaster-warning';
  26. import BackIcon from 'assets/svg/back.svg';
  27. const router = useRouter();
  28. const route = useRoute();
  29. const operate = route.query.operate;
  30. const id = route.query.id;
  31. const headerTitle = computed(() => {
  32. const fixedTitle = '管理规定与通知';
  33. if (operate === 'create') {
  34. return `创建${fixedTitle}`;
  35. } else if (operate === 'edit') {
  36. return `编辑${fixedTitle}`;
  37. }
  38. return '详情';
  39. });
  40. const dynamicComponent = computed(() => {
  41. if (operate === 'create') {
  42. return defineAsyncComponent(() => import('./src/components/CreateDefenseNoticeItem.vue'));
  43. } else if (operate === 'edit') {
  44. return defineAsyncComponent(() => import('./src/components/EditDefenseNoticeItem.vue'));
  45. } else {
  46. return defineAsyncComponent(() => import('./src/components/ViewDefenseNoticeItem.vue'));
  47. }
  48. });
  49. const dynamicComponentRef = ref();
  50. const formLoading = ref(false);
  51. const formatAttachmentList = async (file: FileItem) => {
  52. if (!file.file) return file;
  53. const fileName = file.fileName;
  54. const res = await uploadFileApi({ bizType: UPLOAD_BIZ_TYPE.ATTACHMENT, fileName, file: file.file });
  55. const fileType = file.fileType;
  56. const fileSize = file.fileSize;
  57. const fileId = file.fileId;
  58. const fileUrl = res.url;
  59. return {
  60. fileName,
  61. fileType,
  62. fileSize,
  63. fileUrl,
  64. fileId,
  65. };
  66. };
  67. const createDefenseNoticeItemFunc = async (formData: DefenseNoticeRuleForm) => {
  68. const attachmentListRes: FileItem[] = await Promise.all(
  69. formData.attachmentListRes.map((item) => formatAttachmentList(item)),
  70. );
  71. const createParam = {
  72. disasterType: formData.disasterType,
  73. disasterLevel: formData.disasterLevel,
  74. title: formData.title,
  75. content: formData.content,
  76. attachmentListRes,
  77. isPush: formData.isPush,
  78. userGroupList: formData.isPush ? formData.userGroupList : [],
  79. };
  80. await createDefenseNoticeItem(createParam);
  81. };
  82. const editDefenseNoticeItemFunc = async (formData: DefenseNoticeRuleForm) => {
  83. const attachmentListRes: FileItem[] = await Promise.all(
  84. formData.attachmentListRes.map((item) => formatAttachmentList(item)),
  85. );
  86. const editParam = {
  87. id: Number(id),
  88. disasterType: formData.disasterType,
  89. disasterLevel: formData.disasterLevel,
  90. title: formData.title,
  91. content: formData.content,
  92. attachmentListRes,
  93. isPush: formData.isPush,
  94. userGroupList: formData.isPush ? formData.userGroupList : [],
  95. };
  96. await editDefenseNoticeItem(editParam);
  97. };
  98. const submit = async () => {
  99. if (!dynamicComponentRef.value) return;
  100. const res = await dynamicComponentRef.value.handleValidate();
  101. if (!res) return;
  102. const formData = dynamicComponentRef.value.getFormData();
  103. let message;
  104. try {
  105. formLoading.value = true;
  106. if (operate === 'create') {
  107. await createDefenseNoticeItemFunc(formData);
  108. message = '创建成功';
  109. } else if (operate === 'edit') {
  110. await editDefenseNoticeItemFunc(formData);
  111. message = '编辑成功';
  112. }
  113. ElMessage.success(message);
  114. router.back();
  115. } finally {
  116. formLoading.value = false;
  117. }
  118. };
  119. </script>
  120. <style lang="scss" scoped>
  121. @use '@/styles/page-details-layout.scss' as *;
  122. @use './src/common.scss' as *;
  123. </style>