QhseFaultReportForm.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. <template>
  2. <Dialog :title="dialogTitle" v-model="dialogVisible" style="width: 800px">
  3. <!-- 表单弹窗 -->
  4. <el-form
  5. ref="formRef"
  6. :model="formData"
  7. :rules="formRules"
  8. label-width="120px"
  9. :disabled="disabled"
  10. >
  11. <el-row :gutter="20">
  12. <el-col :span="24" :xs="24" :sm="24" :md="12">
  13. <el-form-item label="事件时间" prop="actualTime">
  14. <el-date-picker
  15. v-model="formData.actualTime"
  16. type="datetime"
  17. format="YYYY-MM-DD HH:mm:ss"
  18. value-format="x"
  19. placeholder="选择事件发生时间"
  20. style="width: 100%"
  21. :disabled="disabled"
  22. />
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="24" :xs="24" :sm="24" :md="12">
  26. <el-form-item label="事件级别" prop="accidentGrade">
  27. <el-input
  28. v-model="formData.accidentGrade"
  29. placeholder="请输入事件级别"
  30. clearable
  31. :disabled="disabled"
  32. />
  33. </el-form-item>
  34. </el-col>
  35. </el-row>
  36. <el-row :gutter="20">
  37. <el-col :span="24" :xs="24" :sm="24" :md="12">
  38. <el-form-item label="事件类型" prop="accidentType">
  39. <el-input
  40. v-model="formData.accidentType"
  41. placeholder="请选择事件类型"
  42. clearable
  43. style="width: 100%"
  44. :disabled="disabled"
  45. />
  46. </el-form-item>
  47. </el-col>
  48. <el-col :span="24" :xs="24" :sm="24" :md="12">
  49. <el-form-item label="事件地址" prop="accidentAddress">
  50. <el-input
  51. v-model="formData.accidentAddress"
  52. placeholder="请输入事件地址"
  53. clearable
  54. :disabled="disabled"
  55. />
  56. </el-form-item>
  57. </el-col>
  58. </el-row>
  59. <el-row :gutter="20">
  60. <el-col :span="24" :xs="24" :sm="24" :md="12">
  61. <el-form-item label="现场负责人" prop="dutyPerson">
  62. <el-input
  63. v-model="formData.dutyPerson"
  64. placeholder="请输入现场负责人姓名"
  65. clearable
  66. :disabled="disabled"
  67. />
  68. </el-form-item>
  69. </el-col>
  70. </el-row>
  71. <el-row :gutter="20">
  72. <el-col :span="24">
  73. <el-form-item label="事件损失情况" prop="lossSituation">
  74. <el-input
  75. v-model="formData.lossSituation"
  76. placeholder="请输入事件损失情况"
  77. clearable
  78. type="textarea"
  79. :rows="2"
  80. :disabled="disabled"
  81. />
  82. </el-form-item>
  83. </el-col>
  84. </el-row>
  85. <el-row :gutter="20">
  86. <el-col :span="24">
  87. <el-form-item label="现场采取措施" prop="emergencyMeasure">
  88. <el-input
  89. v-model="formData.emergencyMeasure"
  90. type="textarea"
  91. :rows="2"
  92. placeholder="请输入现场采取的应急措施"
  93. maxlength="500"
  94. show-word-limit
  95. :disabled="disabled"
  96. />
  97. </el-form-item>
  98. </el-col>
  99. </el-row>
  100. <el-row :gutter="20">
  101. <el-col :span="24">
  102. <el-form-item label="事件简要经过" prop="description">
  103. <el-input
  104. v-model="formData.description"
  105. type="textarea"
  106. :rows="2"
  107. placeholder="请输入事件详细经过"
  108. maxlength="1000"
  109. show-word-limit
  110. :disabled="disabled"
  111. />
  112. </el-form-item>
  113. </el-col>
  114. </el-row>
  115. <el-row :gutter="20">
  116. <el-col :span="12">
  117. <el-form-item label="附件/现场图片" prop="pic">
  118. <UploadImage v-model="formData.pic" width="260px" :disabled="disabled" />
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="12">
  122. <el-form-item label="备注" prop="remark">
  123. <el-input
  124. v-model="formData.remark"
  125. type="textarea"
  126. :rows="3"
  127. placeholder="请输入备注信息"
  128. maxlength="500"
  129. show-word-limit
  130. :disabled="disabled"
  131. />
  132. </el-form-item>
  133. </el-col>
  134. </el-row>
  135. </el-form>
  136. <template #footer>
  137. <div class="dialog-footer">
  138. <el-button type="primary" @click="submitForm" :loading="submitLoading" color="#626aef">
  139. 确 定
  140. </el-button>
  141. <el-button @click="dialogVisible = false">取 消</el-button>
  142. </div>
  143. </template>
  144. </Dialog>
  145. </template>
  146. <script setup>
  147. import { ref, reactive } from 'vue'
  148. import { ElMessage } from 'element-plus'
  149. import { IotFailureApi } from '@/api/pms/qhse/index'
  150. import UploadImage from '@/components/UploadFile/src/UploadImg.vue'
  151. // Data
  152. const loading = ref(false)
  153. const submitLoading = ref(false)
  154. const dialogVisible = ref(false) // 弹窗的是否展示
  155. const dialogTitle = ref('') // 弹窗的标题
  156. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  157. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  158. const formRef = ref()
  159. const disabled = ref(false)
  160. const { t } = useI18n() // 国际化
  161. // 表单数据
  162. const formData = ref({
  163. actualTime: null, // 使用时间戳格式
  164. accidentGrade: '',
  165. accidentType: '',
  166. accidentAddress: '',
  167. dutyPerson: '',
  168. lossSituation: '',
  169. emergencyMeasure: '',
  170. description: '',
  171. pic: '',
  172. remark: ''
  173. })
  174. // 表单验证规则
  175. const formRules = reactive({
  176. actualTime: [{ required: true, message: '请选择事件时间', trigger: 'change' }],
  177. accidentGrade: [{ required: true, message: '请输入事件级别', trigger: 'blur' }],
  178. accidentType: [{ required: true, message: '请选择事件类型', trigger: 'change' }],
  179. accidentAddress: [{ required: true, message: '请输入事件地址', trigger: 'blur' }],
  180. deptId: [{ required: true, message: '请选择所属部门', trigger: 'change' }],
  181. deptName: [{ required: true, message: '请输入队伍名称', trigger: 'blur' }],
  182. dutyPerson: [{ required: true, message: '请输入现场负责人', trigger: 'blur' }]
  183. })
  184. const open = async (type, id, disable) => {
  185. disabled.value = disable
  186. dialogVisible.value = true
  187. dialogTitle.value = t('action.' + type)
  188. formType.value = type
  189. reset()
  190. // 修改时,设置数据
  191. if (id) {
  192. formLoading.value = true
  193. try {
  194. formData.value = await IotFailureApi.getFailure(id)
  195. } finally {
  196. formLoading.value = false
  197. }
  198. }
  199. }
  200. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  201. const reset = () => {
  202. formData.value = {
  203. id: undefined,
  204. actualTime: null,
  205. accidentGrade: '',
  206. accidentType: '',
  207. accidentAddress: '',
  208. // deptId: null,
  209. // deptName: '',
  210. dutyPerson: '',
  211. lossSituation: '',
  212. emergencyMeasure: '',
  213. description: '',
  214. pic: '',
  215. remark: ''
  216. }
  217. if (formRef.value) {
  218. formRef.value.resetFields()
  219. }
  220. }
  221. /** 提交表单 */
  222. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  223. const submitForm = async () => {
  224. if (!formRef.value) return
  225. await formRef.value.validate(async (valid) => {
  226. if (valid) {
  227. submitLoading.value = true
  228. try {
  229. // 在提交前确保时间是时间戳格式
  230. const submitData = { ...formData.value }
  231. if (formType.value === 'create' && formData.value.id) {
  232. // 更新API调用
  233. submitData.id = formData.value.id
  234. await IotFailureApi.updateFailure(submitData)
  235. ElMessage.success('更新成功')
  236. } else {
  237. // 创建API调用
  238. await IotFailureApi.createFailure(submitData)
  239. ElMessage.success('新增成功')
  240. }
  241. dialogVisible.value = false
  242. emit('success')
  243. } catch (error) {
  244. ElMessage.error(error.message || '操作失败')
  245. } finally {
  246. submitLoading.value = false
  247. }
  248. } else {
  249. ElMessage.error('请填写必填项')
  250. }
  251. })
  252. }
  253. </script>