EventEditDialog.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <template>
  2. <el-dialog ref="formDialogRef" :model-value="visible" :title="props.title" width="650px" append-to-body @close="closeDialog">
  3. <el-form ref="eventFormRef" :model="form" :rules="rules" label-width="80px">
  4. <el-form-item label="事件标题" prop="event_title">
  5. <el-input v-model="form.event_title" placeholder="请输入事件标题" />
  6. </el-form-item>
  7. <el-form-item label="事件类型" prop="event_type">
  8. <el-select v-model="form.event_type" placeholder="请选择事件类型" clearable>
  9. <el-option v-for="item in mm_event_type" :key="item.value" :label="item.label" :value="item.value"></el-option>
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item label="事件等级" prop="event_level">
  13. <el-select v-model="form.event_level" placeholder="请选择事件等级" clearable style="width:calc(100% - 30px)">
  14. <el-option v-for="item in mm_event_level" :key="item.value" :label="item.label" :value="item.value"></el-option>
  15. </el-select>
  16. <el-icon @click="eventLevelInfoDialogVisible = true" size="large" style="margin-left:8px"><WarningFilled /></el-icon>
  17. </el-form-item>
  18. <el-form-item label="事件状态" prop="event_status">
  19. <el-select v-model="form.event_status" placeholder="请选择事件状态" clearable :readonly="true">
  20. <el-option v-for="item in mm_event_state" :key="item.value" :label="item.label" :value="item.value"></el-option>
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item label="事发时间" prop="event_time">
  24. <el-date-picker v-model="form.event_time" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择事发时间"></el-date-picker>
  25. </el-form-item>
  26. <el-form-item label="上报时间" prop="report_time">
  27. <el-date-picker v-model="form.report_time" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择上报时间"></el-date-picker>
  28. </el-form-item>
  29. <el-form-item label="伤亡情况">
  30. <el-row :gutter="10">
  31. <el-col :span="6">
  32. <el-switch
  33. size="large"
  34. v-model="form.casualties"
  35. inline-prompt
  36. active-text="已上报"
  37. inactive-text="未上报"
  38. active-value="1"
  39. inactive-value="0"
  40. />
  41. </el-col>
  42. <el-col :span="4" v-show="form.casualties === '1'">
  43. <el-input v-model="form.deaths" placeholder="死亡">
  44. <template #suffix>人</template>
  45. </el-input>
  46. </el-col>
  47. <el-col :span="4" v-show="form.casualties === '1'">
  48. <el-input v-model="form.injuries" placeholder="受伤">
  49. <template #suffix>人</template>
  50. </el-input>
  51. </el-col>
  52. <el-col :span="4" v-show="form.casualties === '1'">
  53. <el-input v-model="form.missing" placeholder="失踪">
  54. <template #suffix>人</template>
  55. </el-input>
  56. </el-col>
  57. </el-row>
  58. </el-form-item>
  59. <el-form-item label="联系方式" prop="contact">
  60. <el-input v-model="form.contact" placeholder="请输入联系方式" />
  61. </el-form-item>
  62. <el-form-item label="事件来源" prop="event_source">
  63. <el-input v-model="form.event_source" placeholder="请输入事件来源" />
  64. </el-form-item>
  65. <el-form-item label="事件地点" prop="address">
  66. <el-input v-model="form.address" placeholder="请输入事件地点" readonly >
  67. <template #append>
  68. <el-button @click="openMapDialog" type="primary">地图定位</el-button>
  69. </template>
  70. </el-input>
  71. </el-form-item>
  72. <el-form-item label="事件描述" prop="event_description">
  73. <el-input type="textarea" v-model="form.event_description" placeholder="请输入事件描述" />
  74. </el-form-item>
  75. </el-form>
  76. <template #footer>
  77. <div class="dialog-footer">
  78. <el-button :loading="buttonLoading" type="primary" @click="submitForm">确定</el-button>
  79. <el-button @click="closeDialog">取消</el-button>
  80. </div>
  81. </template>
  82. </el-dialog>
  83. <!-- 事故等级弹窗 -->
  84. <EventLevelInfoDialog v-model="eventLevelInfoDialogVisible" @closeDialog="closeEventLevelInfoDialog" />
  85. <!-- 地图弹窗 -->
  86. <company-map v-model:visible="mapDialogVisible" :address="form.address" @confirm="handleMapChange"></company-map>
  87. </template>
  88. <script lang="ts" setup>
  89. import { ref, reactive, toRefs } from 'vue';
  90. import { addEvent, editEvent, postEditEvent } from '@/api/duty/eventing';
  91. import EventLevelInfoDialog from './EventLevelInfoDialog.vue';
  92. const proxy = getCurrentInstance()?.proxy;
  93. const { mm_event_type, mm_event_level, mm_event_state, region } = toRefs<any>(proxy?.useDict('mm_event_type', 'mm_event_level', 'mm_event_state', 'region'));
  94. const buttonLoading = ref(false);
  95. const eventFormRef = ref();
  96. const visible = ref(false);
  97. interface Props {
  98. modelValue: boolean;
  99. eventId: string;
  100. title: string;
  101. }
  102. const props = withDefaults(defineProps<Props>(), {
  103. modelValue: false
  104. });
  105. const emits = defineEmits(['update:modelValue']);
  106. watch(
  107. () => props.modelValue,
  108. () => {
  109. // 界面显示初始化
  110. if (props.modelValue) {
  111. if(props.eventId != "") {
  112. editEvent({ event_id: props.eventId }).then((res) => {
  113. form.value = res.data
  114. });
  115. }
  116. else {
  117. form.value = { ...initFormData };
  118. eventFormRef.value?.resetFields();
  119. }
  120. }
  121. visible.value = props.modelValue;
  122. }
  123. );
  124. // 表单初始数据
  125. const initFormData = {
  126. event_title: '', // 事件标题
  127. event_type: '', // 事件类型
  128. event_level: '', // 事件等级
  129. event_status: '0', // 事件状态
  130. address: '', // 事件地点
  131. longitude: '', // 经度
  132. latitude: '', // 纬度
  133. event_time: '',// 事发时间
  134. report_time: '',// 上报时间
  135. casualties: '0', // 伤亡情况
  136. deaths: '',
  137. injuries: '',
  138. missing: '',
  139. event_source: '', // 事件来源
  140. event_description: '', // 事件描述
  141. contact: '' // 联系方式
  142. };
  143. // 表单数据
  144. const data = reactive({
  145. form: { ...initFormData },
  146. rules: {
  147. event_title: [{ required: true, message: '事件标题不能为空', trigger: 'blur' }],
  148. event_type: [{ required: true, message: '事件类型不能为空', trigger: 'blur' }],
  149. event_level: [{ required: true, message: '事件等级不能为空', trigger: 'blur' }],
  150. event_status: [{ required: true, message: '事件状态不能为空', trigger: 'blur' }],
  151. address: [{ required: true, message: '事件地点不能为空', trigger: 'blur' }],
  152. event_time: [{ required: true, message: '事发时间不能为空', trigger: 'blur' }],
  153. report_time: [{ required: true, message: '上报时间不能为空', trigger: 'blur' }],
  154. event_source: [{ required: true, message: '事件来源不能为空', trigger: 'blur' }],
  155. event_description: [{ required: true, message: '事件描述不能为空', trigger: 'blur' }],
  156. contact: [{ required: true, message: '联系方式不能为空', trigger: 'blur' }]
  157. }
  158. });
  159. const { form, rules } = toRefs(data);
  160. // 提交表单
  161. const submitForm = () => {
  162. eventFormRef.value?.validate((valid) => {
  163. if (valid) {
  164. buttonLoading.value = true;
  165. // 打印表单数据
  166. console.log('表单数据', form.value);
  167. if(props.eventId === "") {
  168. addEvent(form.value)
  169. .then((res) => {
  170. proxy?.$modal.msgSuccess(res.msg);
  171. closeDialog()
  172. })
  173. .finally(() => {
  174. buttonLoading.value = false;
  175. });
  176. }
  177. else {
  178. postEditEvent(form.value)
  179. .then((res) => {
  180. proxy?.$modal.msgSuccess(res.msg);
  181. closeDialog()
  182. })
  183. .finally(() => {
  184. buttonLoading.value = false;
  185. });
  186. }
  187. }
  188. });
  189. }
  190. const closeDialog = () => {
  191. emits('update:modelValue', false);
  192. };
  193. // 地图定位
  194. const mapDialogVisible = ref(false);
  195. const openMapDialog = () => {
  196. mapDialogVisible.value = true;
  197. };
  198. const handleMapChange = (data) => {
  199. form.value.address = data.address;
  200. form.value.longitude = data.lnglat[0];
  201. form.value.latitude = data.lnglat[1];
  202. mapDialogVisible.value = false;
  203. };
  204. // 事故等级弹窗
  205. const eventLevelInfoDialogVisible = ref(false);
  206. const closeEventLevelInfoDialog = () => {
  207. eventLevelInfoDialogVisible.value = false;
  208. };
  209. </script>