AssociatedEvent.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <Dialog custom-show type="sm" :title="title" confirm-text="关联事件" confirm-class="common-btn-danger" @close="closeDialog" @confirm="submitEvent">
  3. <el-form ref="eventFormRef" :model="form" :rules="rules" label-width="190px">
  4. <el-form-item label="灾害事件" prop="event_title">
  5. <el-select
  6. v-model="form.event_title"
  7. placeholder="请选择事件"
  8. class="custom-select"
  9. size="large"
  10. popper-class="custom-select-popper"
  11. :teleported="false"
  12. clearable
  13. @change="selectEvent"
  14. >
  15. <el-option v-for="item in events" :key="item.event_id" :label="item.event_title" :value="item.event_title"></el-option>
  16. </el-select>
  17. </el-form-item>
  18. </el-form>
  19. </Dialog>
  20. </template>
  21. <script lang="ts" setup>
  22. import { ref, reactive, toRefs, watch, onMounted } from 'vue';
  23. import { editEvent, registeredEvent, getEventDetail, assEvent } from '@/api/duty/eventing';
  24. import { useRouter, useRoute } from 'vue-router';
  25. import { ElMessage } from 'element-plus';
  26. const proxy = getCurrentInstance()?.proxy;
  27. const router = useRouter();
  28. const eventFormRef = ref();
  29. const events = ref([]);
  30. const route = useRoute();
  31. const urlParams = new URLSearchParams(route.query);
  32. const address = urlParams.get('address') || '';
  33. const latitude = urlParams.get('latitude') || '';
  34. const longitude = urlParams.get('longitude') || '';
  35. interface Props {
  36. modelValue: boolean;
  37. eventId: string;
  38. title: string;
  39. }
  40. const props = withDefaults(defineProps<Props>(), {
  41. modelValue: false,
  42. eventId: '',
  43. title: ''
  44. });
  45. const emit = defineEmits(['update:modelValue', 'update:event-title']);
  46. // 表单初始数据
  47. const initFormData = {
  48. event_title: '', // 事件标题
  49. event_id: '',
  50. event_type: '', // 事件类型
  51. event_level: '', // 事件等级
  52. event_status: '0', // 事件状态
  53. address: address, // 地址
  54. latitude: latitude, // 纬度
  55. longitude: longitude // 经度
  56. };
  57. // 表单数据
  58. const data = reactive({
  59. form: { ...initFormData },
  60. rules: {
  61. event_title: [{ required: true, message: '事件标题不能为空', trigger: 'blur' }]
  62. }
  63. });
  64. const { form, rules } = toRefs(data);
  65. // 获取事件详情
  66. const fetchEventDetail = async (id: string) => {
  67. try {
  68. const response = await getEventDetail({ event_id: id });
  69. if (response && response.data) {
  70. form.value = response.data;
  71. }
  72. console.log('Event detail:', form.value);
  73. } catch (error) {
  74. console.error('Failed to fetch event detail:', error);
  75. }
  76. };
  77. // 获取注册的事件列表
  78. const fetchEvents = async () => {
  79. try {
  80. const response = await registeredEvent({});
  81. if (response && response.data && Array.isArray(response.data)) {
  82. events.value = response.data;
  83. }
  84. } catch (error) {
  85. console.error('Failed to fetch events:', error);
  86. }
  87. };
  88. // 初始化事件列表
  89. onMounted(() => {
  90. fetchEvents();
  91. });
  92. // 监听 modelValue 变化
  93. watch(
  94. () => props.modelValue,
  95. async (newVal) => {
  96. if (newVal) {
  97. if (props.eventId) {
  98. await fetchEventDetail(props.eventId);
  99. } else {
  100. form.value = { ...initFormData };
  101. eventFormRef.value?.resetFields();
  102. }
  103. }
  104. },
  105. {
  106. immediate: true
  107. }
  108. );
  109. // 关闭对话框
  110. const closeDialog = () => {
  111. emit('update:modelValue', false);
  112. if (eventFormRef.value) {
  113. eventFormRef.value.resetFields(); // 仅重置表单验证状态
  114. }
  115. };
  116. // 提交事件信息
  117. const submitEvent = async () => {
  118. if (!form.value.event_title) {
  119. proxy?.$modal.msgError('请先选择一个事件');
  120. return;
  121. }
  122. try {
  123. // 关联事件信息
  124. const associateParams = {
  125. temp_event_id: props.eventId, // 页面上的临时事件ID
  126. event_id: form.value.event_id // 用户选择的事件ID
  127. };
  128. await assEvent(associateParams);
  129. console.log('Event associated successfully.');
  130. // 更新 modelValue 状态以关闭对话框
  131. emit('update:modelValue', false);
  132. // 发送事件名称到父组件
  133. emit('update:event-title', form.value.event_title);
  134. // 执行其他操作,如更新页面数据等
  135. refreshPageData();
  136. } catch (error) {
  137. console.error('Failed to associate event:', error);
  138. proxy?.$modal.msgError('提交表单失败,请检查您的输入');
  139. }
  140. };
  141. // 示例:更新页面数据的方法
  142. const refreshPageData = () => {
  143. // 这里可以放置更新页面数据的逻辑
  144. console.log('页面数据已更新');
  145. };
  146. // 选择事件
  147. const selectEvent = (eventTitle) => {
  148. const selectedItem = events.value.find((event) => event.event_title === eventTitle);
  149. if (selectedItem) {
  150. form.value.event_id = selectedItem.event_id; // 保存所选事件的ID
  151. form.value.event_title = selectedItem.event_title; // 确保事件名称被正确设置
  152. console.log('Selected Event ID:', form.value.event_id);
  153. console.log('Selected Event Title:', form.value.event_title);
  154. }
  155. };
  156. </script>
  157. <style lang="scss" scoped>
  158. .dialog-footer {
  159. height: 150px;
  160. display: flex;
  161. justify-content: flex-end;
  162. align-items: center;
  163. }
  164. </style>