IotFailureReportForm.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <template>
  2. <Dialog :title="dialogTitle" v-model="dialogVisible" style="width: 68em">
  3. <el-form
  4. ref="formRef"
  5. :model="formData"
  6. :rules="formRules"
  7. label-width="100px"
  8. v-loading="formLoading"
  9. >
  10. <el-row >
  11. <el-col :span="12">
  12. <el-form-item :label="t('faultForm.device')" prop="deviceName">
  13. <el-select
  14. :disabled="disabled"
  15. v-model="formData.deviceName"
  16. :placeholder="t('faultForm.choose')"
  17. @click="openForm"
  18. clearable
  19. @clear="handleClear"
  20. />
  21. </el-form-item>
  22. </el-col>
  23. <el-col :span="12">
  24. <el-form-item :label="t('faultForm.solve')" prop="ifDeal">
  25. <el-select v-model="formData.ifDeal" :placeholder="t('faultForm.choose')" @change="dealChange" clearable :disabled="disabled">
  26. <el-option
  27. v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
  28. :key="dict.label"
  29. :label="dict.label"
  30. :value="dict.value"
  31. />
  32. </el-select>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="12">
  36. <el-form-item :label="t('faultForm.assist')" prop="needHelp" >
  37. <el-select v-model="formData.needHelp" :placeholder="t('faultForm.choose')" @change="helpChange" clearable :disabled="disabled">
  38. <el-option
  39. v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
  40. :key="dict.label"
  41. :label="dict.label"
  42. :value="dict.value"
  43. />
  44. </el-select>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="12">
  48. <el-form-item :label="t('faultForm.faultySystem')" prop="failureSystem" :disabled="disabled">
  49. <el-input v-model="formData.failureSystem" :placeholder="t('faultForm.faultySystemHolder')" :disabled="disabled" />
  50. </el-form-item>
  51. </el-col>
  52. <el-col :span="12">
  53. <el-form-item :label="t('faultForm.failureTime')" prop="failureTime" :disabled="disabled">
  54. <el-date-picker
  55. :disabled="disabled"
  56. style="width: 150%"
  57. v-model="formData.failureTime"
  58. type="datetime"
  59. value-format="x"
  60. :placeholder="t('faultForm.failureTimeHolder')"
  61. />
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="12" v-if="formData.ifDeal">
  65. <el-form-item :label="t('faultForm.dealTime')" prop="dealTime">
  66. <el-date-picker
  67. @change="endTimeBlur"
  68. :disabled="disabled"
  69. style="width: 150%"
  70. v-model="formData.dealTime"
  71. type="datetime"
  72. value-format="x"
  73. placeholder="选择故障解决时间"
  74. />
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="12">
  78. <el-form-item :label="t('faultForm.shutDown')" prop="ifStop">
  79. <el-select v-model="formData.ifStop" :placeholder="t('faultForm.choose')" clearable :disabled="disabled">
  80. <el-option
  81. v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
  82. :key="dict.label"
  83. :label="dict.label"
  84. :value="dict.value"
  85. />
  86. </el-select>
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="12">
  90. <el-form-item :label="t('faultForm.picture')" prop="pic">
  91. <UploadImg v-model="formData.pic" height="60px" :disabled="disabled" />
  92. </el-form-item>
  93. </el-col>
  94. <el-col :span="24">
  95. <el-form-item :label="t('faultForm.faultImpact')" prop="failureInfluence">
  96. <el-input type="textarea" v-model="formData.failureInfluence" :placeholder="t('faultForm.faultImpactHolder')" :disabled="disabled" />
  97. </el-form-item>
  98. </el-col>
  99. <el-col :span="24">
  100. <el-form-item label="解决办法" v-if="formData.ifDeal" prop="solution" :rules="formData.ifDeal?solutionRule:[]">
  101. <el-input v-model="formData.solution" type="textarea" placeholder="请输入解决办法" :disabled="disabled" />
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="24">
  105. <el-form-item :label="t('faultForm.faultDescription')" prop="description">
  106. <el-input type="textarea" v-model="formData.description" :disabled="disabled" />
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="24">
  110. <el-form-item :label="t('faultForm.remark')" prop="remark">
  111. <el-input v-model="formData.remark" type="textarea" :placeholder="t('faultForm.rHolder')" :disabled="disabled" />
  112. </el-form-item>
  113. </el-col>
  114. </el-row>
  115. </el-form>
  116. <template #footer>
  117. <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('faultForm.ok')}}</el-button>
  118. <el-button @click="dialogVisible = false">{{t('faultForm.cancel')}}</el-button>
  119. </template>
  120. <DeviceList ref="deviceFormRef" @choose="deviceChoose" />
  121. </Dialog>
  122. </template>
  123. <script setup lang="ts">
  124. import { IotFailureReportApi, IotFailureReportVO } from '@/api/pms/failure'
  125. import {DICT_TYPE, getBoolDictOptions} from "@/utils/dict";
  126. import DeviceList from "@/views/pms/failure/DeviceList.vue";
  127. import dayjs from "dayjs";
  128. /** 故障上报 表单 */
  129. defineOptions({ name: 'IotFailureReportForm' })
  130. const { t } = useI18n() // 国际化
  131. const message = useMessage() // 消息弹窗
  132. const dialogVisible = ref(false) // 弹窗的是否展示
  133. const dialogTitle = ref('') // 弹窗的标题
  134. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  135. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  136. const deviceLabel = ref('') // 表单的类型:create - 新增;update - 修改
  137. const formData = ref({
  138. id: undefined,
  139. failureCode: undefined,
  140. failureName: undefined,
  141. deviceId: undefined,
  142. deviceName: undefined,
  143. status: undefined,
  144. ifStop: undefined,
  145. failureTime: undefined,
  146. dealTime: undefined,
  147. failureInfluence: undefined,
  148. failureSystem: undefined,
  149. description: undefined,
  150. pic: undefined,
  151. ifDeal: undefined,
  152. needHelp: undefined,
  153. solution: undefined,
  154. remark: undefined,
  155. deptId: undefined,
  156. })
  157. const dealChange = () => {
  158. console.log(formData.value.ifDeal)
  159. formData.value.needHelp = !formData.value.ifDeal
  160. }
  161. const helpChange = () => {
  162. formData.value.ifDeal = !formData.value.needHelp
  163. }
  164. const deviceChoose = (row) => {
  165. formData.value.deviceId = row.id
  166. formData.value.deviceName = row.deviceName
  167. formData.value.deptId = row.deptId;
  168. // deviceLabel.value = row.deviceName
  169. }
  170. const endTimeBlur = () => {
  171. if (formData.value.dealTime <= formData.value.failureTime) {
  172. message.error('故障解决时间不得早于故障时间')
  173. formData.value.dealTime = undefined
  174. }
  175. const now = dayjs();
  176. const target = dayjs(formData.value.dealTime);
  177. if (target.isAfter(now)) {
  178. message.error('故障解决时间不得晚于当前时间')
  179. formData.value.dealTime = undefined
  180. }
  181. }
  182. const handleClear = () =>{
  183. formData.value.deviceId = undefined
  184. formData.value.deviceName = undefined
  185. formData.value.deptId = undefined
  186. }
  187. /** 添加/修改操作 */
  188. const deviceFormRef = ref()
  189. const openForm = () => {
  190. deviceFormRef.value.open()
  191. }
  192. const formRules = ref({
  193. deviceName: [{ required: true, message: '设备不能为空', trigger: 'blur' }],
  194. ifDeal: [{ required: true, message: '是否解决不能为空', trigger: 'blur' }],
  195. needHelp: [{ required: true, message: '是否协助不能为空', trigger: 'blur' }],
  196. failureTime:[{ required: true, message: '故障时间不能为空', trigger: 'blur' }],
  197. failureSystem:[{ required: true, message: '故障系统不能为空', trigger: 'blur' }],
  198. dealTime:[{ required: true, message: '故障解决时间不能为空', trigger: 'blur' }],
  199. // solution:[{required: ()=> formData.value.ifDeal==='true', message: '解决办法不能为空', trigger: 'blur'}],
  200. })
  201. const solutionRule = [
  202. { required: true, message: '解决办法不能为空', trigger: 'blur' }
  203. ];
  204. const formRef = ref() // 表单 Ref
  205. const disabled = ref(false)
  206. /** 打开弹窗 */
  207. const open = async (type: string, id?: number, disable?:boolean) => {
  208. disabled.value = disable
  209. dialogVisible.value = true
  210. dialogTitle.value = t('action.' + type)
  211. formType.value = type
  212. resetForm()
  213. formData.value.deviceId = null;
  214. formData.value.deviceName = null;
  215. // 修改时,设置数据
  216. if (id) {
  217. formLoading.value = true
  218. try {
  219. formData.value = await IotFailureReportApi.getIotFailureReport(id)
  220. } finally {
  221. formLoading.value = false
  222. }
  223. }
  224. }
  225. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  226. /** 提交表单 */
  227. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  228. const submitForm = async () => {
  229. // 校验表单
  230. await formRef.value.validate()
  231. // 提交请求
  232. formLoading.value = true
  233. try {
  234. // formData.value.pic = formData.value.pic.path;
  235. const data = formData.value as unknown as IotFailureReportVO
  236. if (formType.value === 'create') {
  237. await IotFailureReportApi.createIotFailureReport(data)
  238. message.success(t('common.createSuccess'))
  239. } else {
  240. await IotFailureReportApi.updateIotFailureReport(data)
  241. message.success(t('common.updateSuccess'))
  242. }
  243. dialogVisible.value = false
  244. // 发送操作成功的事件
  245. emit('success')
  246. } finally {
  247. formLoading.value = false
  248. }
  249. }
  250. /** 重置表单 */
  251. const resetForm = () => {
  252. formData.value = {
  253. id: undefined,
  254. failureCode: undefined,
  255. failureName: undefined,
  256. deviceId: undefined,
  257. status: undefined,
  258. ifStop: undefined,
  259. failureTime: undefined,
  260. failureInfluence: undefined,
  261. failureSystem: undefined,
  262. description: undefined,
  263. pic: undefined,
  264. ifDeal: undefined,
  265. needHelp: undefined,
  266. solution: undefined,
  267. remark: undefined,
  268. }
  269. formRef.value?.resetFields()
  270. }
  271. </script>