CloseCommand.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <template>
  2. <Dialog
  3. custom-show
  4. :type="props.flag ? 'xs' : 'sm'"
  5. :title="title"
  6. confirm-text="结束指挥"
  7. confirm-class="common-btn-danger"
  8. @close="closeDialog"
  9. @confirm="endProcess"
  10. >
  11. <el-form v-if="!props.flag" ref="eventFormRef" :model="form" :rules="rules" label-width="190px">
  12. <el-form-item label="灾害事件" prop="event_title">
  13. <el-select
  14. v-model="form.event_title"
  15. placeholder="请选择事件"
  16. class="custom-select"
  17. size="large"
  18. popper-class="custom-select-popper"
  19. :teleported="false"
  20. clearable
  21. @change="selectEvent"
  22. >
  23. <el-option v-for="item in events" :key="item.event_id" :label="item.event_title" :value="item.event_title"></el-option>
  24. </el-select>
  25. </el-form-item>
  26. <span style="color: red; display: block; margin-top: 10px; margin-left: 10px"
  27. >注意:本次指挥未关联事件,指挥记录将不会保留,若需要保留指挥记录,请关联事件</span
  28. >
  29. </el-form>
  30. <div v-else>{{ form.event_title }}</div>
  31. </Dialog>
  32. </template>
  33. <script lang="ts" setup>
  34. import { ref, reactive, toRefs, watch, onMounted } from 'vue';
  35. import { editEvent, registeredEvent, closeEvent, getEventDetail } from '@/api/duty/eventing';
  36. import { useRouter, useRoute } from 'vue-router';
  37. import { ElMessage } from 'element-plus'; // 确保已正确导入 ElMessage
  38. const proxy = getCurrentInstance()?.proxy;
  39. const router = useRouter();
  40. const buttonLoading = ref(false);
  41. const eventFormRef = ref();
  42. const events = ref([]);
  43. const route = useRoute();
  44. const urlParams = new URLSearchParams(route.query);
  45. const address = urlParams.get('address') || '';
  46. const latitude = urlParams.get('latitude') || '';
  47. const longitude = urlParams.get('longitude') || '';
  48. interface Props {
  49. modelValue: boolean;
  50. flag: boolean;
  51. eventId: string;
  52. title: string;
  53. }
  54. const props = withDefaults(defineProps<Props>(), {
  55. modelValue: false,
  56. flag: false,
  57. eventId: '',
  58. title: ''
  59. });
  60. const emits = defineEmits(['update:modelValue', 'closeEvent']);
  61. // 表单初始数据
  62. const initFormData = {
  63. event_title: '', // 事件标题
  64. event_id: '',
  65. event_type: '', // 事件类型
  66. event_level: '', // 事件等级
  67. event_status: '0', // 事件状态
  68. address: address, // 地址
  69. latitude: latitude, // 纬度
  70. longitude: longitude // 经度
  71. };
  72. // 表单数据
  73. const data = reactive({
  74. form: { ...initFormData },
  75. rules: {
  76. event_title: [{ required: true, message: '事件标题不能为空', trigger: 'blur' }]
  77. }
  78. });
  79. const { form, rules } = toRefs(data);
  80. // 获取事件详情
  81. const fetchEventDetail = async (id: string) => {
  82. try {
  83. const response = await getEventDetail({ event_id: id });
  84. if (response && response.data) {
  85. form.value = response.data;
  86. }
  87. console.log('Event detail:', form.value);
  88. } catch (error) {
  89. console.error('Failed to fetch event detail:', error);
  90. }
  91. };
  92. // 获取注册的事件列表
  93. const fetchEvents = async () => {
  94. try {
  95. const response = await registeredEvent({});
  96. if (response && response.data && Array.isArray(response.data)) {
  97. events.value = response.data;
  98. }
  99. } catch (error) {
  100. console.error('Failed to fetch events:', error);
  101. }
  102. };
  103. // 初始化事件列表
  104. onMounted(() => {
  105. fetchEvents();
  106. });
  107. // 监听 modelValue 变化
  108. watch(
  109. () => props.modelValue,
  110. async (newVal) => {
  111. if (newVal) {
  112. if (props.eventId) {
  113. await fetchEventDetail(props.eventId);
  114. } else {
  115. form.value = { ...initFormData };
  116. eventFormRef.value?.resetFields();
  117. }
  118. }
  119. },
  120. {
  121. immediate: true
  122. }
  123. );
  124. // 关闭对话框
  125. const closeDialog = () => {
  126. emits('update:modelValue', false);
  127. if (eventFormRef.value) {
  128. eventFormRef.value.resetFields(); // 仅重置表单验证状态
  129. }
  130. // 不需要重置 form.value.event_id 和 form.value.event_title
  131. };
  132. // 结束指挥
  133. const endProcess = () => {
  134. // 如果 flag 为 false,则需要选择一个事件
  135. if (!props.flag) {
  136. if (!form.value.event_id) {
  137. proxy?.$message.error('请先选择一个事件');
  138. return;
  139. }
  140. // 提交选择的事件信息
  141. submitSelectedEvent()
  142. .then(() => {
  143. console.log('Selected event updated successfully.');
  144. // 调用 closeEvent 接口关闭事件
  145. submitForm()
  146. .then(() => {
  147. closeDialog();
  148. router.go(-1);
  149. })
  150. .catch((error) => {
  151. console.error('Failed to close event:', error);
  152. proxy?.$message.error('关闭事件失败,请检查您的输入');
  153. });
  154. })
  155. .catch((error) => {
  156. console.error('Failed to submit the form:', error);
  157. proxy?.$message.error('提交表单失败,请检查您的输入');
  158. });
  159. } else {
  160. // 如果 flag 为 true,则直接调用 closeEvent 接口关闭事件
  161. submitForm()
  162. .then(() => {
  163. closeDialog();
  164. router.go(-1); // 立即返回上一级页面
  165. })
  166. .catch((error) => {
  167. console.error('Failed to submit the form:', error);
  168. proxy?.$message.error('提交表单失败,请检查您的输入');
  169. });
  170. }
  171. };
  172. // 提交表单
  173. /*const submitForm = async () => {
  174. return new Promise((resolve, reject) => {
  175. eventFormRef.value?.validate(async (valid) => {
  176. if (valid) {
  177. buttonLoading.value = true;
  178. try {
  179. // 构造请求参数
  180. const params = {
  181. eventId: form.value.event_id,
  182. address: form.value.address,
  183. latitude: form.value.latitude,
  184. longitude: form.value.longitude
  185. };
  186. console.log('使用参数发送请求:', params); // 添加调试信息
  187. // 提交关闭事件请求
  188. await closeEvent(params);
  189. proxy?.$modal.msgSuccess('已成功关闭');
  190. resolve(); // 解析Promise表示成功
  191. closeDialog();
  192. } catch (error) {
  193. console.error('Failed to close event:', error);
  194. reject(error); // 拒绝Promise表示失败
  195. proxy?.$message.error('关闭事件失败,请检查您的输入');
  196. } finally {
  197. buttonLoading.value = false;
  198. }
  199. } else {
  200. reject(new Error('Validation failed')); // 验证失败也拒绝Promise
  201. proxy?.$message.error('表单验证失败,请检查您的输入');
  202. }
  203. });
  204. });
  205. };*/
  206. // 提交选择的事件信息
  207. const submitForm = async () => {
  208. // 仅在 props.flag 为 false 时进行表单验证
  209. if (!props.flag) {
  210. const valid = await eventFormRef.value?.validate();
  211. if (!valid) {
  212. ElMessage.error('表单验证失败,请检查您的输入');
  213. throw new Error('Validation failed');
  214. }
  215. }
  216. // 设置按钮加载状态
  217. buttonLoading.value = true;
  218. try {
  219. // 构造请求参数
  220. const params = {
  221. eventId: form.value.event_id,
  222. address: form.value.address,
  223. latitude: form.value.latitude,
  224. longitude: form.value.longitude
  225. };
  226. console.log('使用参数发送请求:', params); // 添加调试信息
  227. // 提交关闭事件请求
  228. await closeEvent(params);
  229. // 显示成功消息
  230. ElMessage.success('已成功关闭');
  231. // 关闭对话框
  232. closeDialog();
  233. // 如果需要返回特定信息,可以在这里返回
  234. return;
  235. } catch (error) {
  236. console.error('Failed to close event:', error);
  237. ElMessage.error('关闭事件失败,请检查您的输入');
  238. throw error; // 继续抛出错误以便上层处理
  239. } finally {
  240. // 重置按钮加载状态
  241. buttonLoading.value = false;
  242. }
  243. };
  244. // 提交选择的事件信息
  245. const submitSelectedEvent = async () => {
  246. // 提交选择的事件信息
  247. if (form.value.event_id) {
  248. // 更新事件信息
  249. const updateParams = {
  250. event_id: form.value.event_id,
  251. address: form.value.address,
  252. latitude: form.value.latitude,
  253. longitude: form.value.longitude
  254. };
  255. try {
  256. await editEvent(updateParams);
  257. // 提交关闭事件请求
  258. } catch (error) {
  259. console.error('Failed to update or close event:', error);
  260. throw error; // 抛出错误以便外层处理
  261. }
  262. }
  263. };
  264. // 选择事件
  265. const selectEvent = (eventTitle) => {
  266. const selectedItem = events.value.find((event) => event.event_title === eventTitle);
  267. if (selectedItem) {
  268. form.value.event_id = selectedItem.event_id;
  269. form.value.event_title = selectedItem.event_title;
  270. console.log('Selected Event ID:', form.value.event_id);
  271. console.log('Selected Event Title:', form.value.event_title);
  272. }
  273. };
  274. </script>
  275. <style lang="scss" scoped>
  276. .dialog-footer {
  277. height: 150px;
  278. display: flex;
  279. justify-content: flex-end;
  280. align-items: center;
  281. }
  282. </style>