AccidentItem.vue 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 { AddAccidentInfoStruct, addVehicleInfo, updateVehicleInfo } from '@/api/traffic-accident';
  23. const router = useRouter();
  24. const route = useRoute();
  25. const operate = route.query.operate;
  26. const id = route.query.id;
  27. const formLoading = ref(false);
  28. const headerTitle = computed(() => {
  29. const title = '交通事故记录';
  30. if (operate === 'create') {
  31. return `创建${title}`;
  32. } else if (operate === 'edit') {
  33. return `编辑${title}`;
  34. }
  35. return '事故详情';
  36. });
  37. const dynamicComponent = computed(() => {
  38. if (operate === 'create' || operate === 'edit')
  39. return defineAsyncComponent(() => import('./components/ManageAccidentItem.vue'));
  40. return defineAsyncComponent(() => import('./components/ViewAccidentItem.vue'));
  41. });
  42. const dynamicComponentRef = ref();
  43. const createTaskManagementItemFunc = async (formData: AddAccidentInfoStruct) => {
  44. await addVehicleInfo(formData);
  45. };
  46. const editTaskManagementItemFunc = async (formData: AddAccidentInfoStruct) => {
  47. await updateVehicleInfo(formData);
  48. };
  49. const submit = async () => {
  50. if (!dynamicComponentRef.value) return;
  51. const res = await dynamicComponentRef.value.handleValidate();
  52. if (res) {
  53. const formData = dynamicComponentRef.value.getFormData();
  54. let message;
  55. try {
  56. formLoading.value = true;
  57. if (operate === 'create') {
  58. await createTaskManagementItemFunc(formData);
  59. message = '创建成功';
  60. } else if (operate === 'edit') {
  61. await editTaskManagementItemFunc(formData);
  62. message = '编辑成功';
  63. }
  64. ElMessage.success(message);
  65. // 重置表单状态,避免触发二次确认
  66. if (dynamicComponentRef.value && dynamicComponentRef.value.resetFormState) {
  67. dynamicComponentRef.value.resetFormState();
  68. }
  69. router.back();
  70. } finally {
  71. formLoading.value = false;
  72. }
  73. } else {
  74. console.log('不提交');
  75. }
  76. };
  77. </script>
  78. <style lang="scss" scoped>
  79. @use '@/styles/page-details-layout.scss' as *;
  80. .safety-platform-container__header {
  81. flex-direction: row !important;
  82. justify-content: flex-start !important;
  83. gap: 8px !important;
  84. }
  85. </style>