FlawForm.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <template>
  2. <tf-dialog
  3. v-bind="$attrs"
  4. v-on="listeners"
  5. @submit="onSubmit"
  6. :loading="loading"
  7. :width="formData.defectinfo.interfaceCode ? '1280px' : '768px'"
  8. >
  9. <el-form class="form" ref="form" v-bind="{ labelWidth: 'auto', size: 'small' }" :model="formData" :rules="rules">
  10. <el-row type="flex" :gutter="15">
  11. <el-col :span="formData.defectinfo.interfaceCode ? 12 : 24">
  12. <el-row :gutter="15">
  13. <el-col :span="12">
  14. <el-form-item label="排水类型" prop="defectinfo.type">
  15. <el-select v-model="formData.defectinfo.type" style="wdith: 100%">
  16. <el-option v-for="item of types" :key="item.codeValue" :label="item.notes" :value="item.notes" />
  17. </el-select>
  18. </el-form-item>
  19. </el-col>
  20. <el-col :span="12">
  21. <el-form-item label="缺陷名称" prop="defectinfo.name">
  22. <el-input v-model="formData.defectinfo.name" placeholder="请输入缺陷名称" maxlength="51" />
  23. </el-form-item>
  24. </el-col>
  25. </el-row>
  26. <el-form-item label="缺陷描述" prop="defectinfo.description">
  27. <el-input
  28. v-model="formData.defectinfo.description"
  29. type="textarea"
  30. placeholder="请输入缺陷描述"
  31. clearable
  32. rows="3"
  33. maxlength="1001"
  34. />
  35. </el-form-item>
  36. <el-form-item label="分析依据" prop="defectinfo.according">
  37. <el-input
  38. v-model="formData.defectinfo.according"
  39. type="textarea"
  40. placeholder="请输入分析依据"
  41. clearable
  42. rows="3"
  43. maxlength="1001"
  44. />
  45. </el-form-item>
  46. <el-form-item label="监测点" prop="defectinfo.monitorIds">
  47. <el-select
  48. v-model="formData.defectinfo.monitorIds"
  49. placeholder="请选择监测点"
  50. style="width: 100%"
  51. multiple
  52. clearable
  53. filterable
  54. :collapse-tags="formData.defectinfo.monitorIds.length > 3"
  55. >
  56. <el-option v-for="item of points" :key="item.id" :value="item.id" :label="item.siteName" />
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item label="接口名称" prop="defectinfo.interfaceName">
  60. <el-select
  61. v-model="formData.defectinfo.interfaceCode"
  62. placeholder="请选择接口名称"
  63. @change="onInterfaceChange"
  64. style="width: 100%"
  65. >
  66. <el-option
  67. v-for="item of interfaces"
  68. :key="item.id"
  69. :value="item.interfaceCode"
  70. :label="item.interfaceName"
  71. />
  72. </el-select>
  73. </el-form-item>
  74. <el-form-item label="接口说明" prop="defectinfo.interfaceDescription">
  75. <el-input
  76. v-model="formData.defectinfo.interfaceDescription"
  77. type="textarea"
  78. placeholder="请输入接口说明"
  79. clearable
  80. rows="3"
  81. maxlength="1001"
  82. disabled
  83. />
  84. </el-form-item>
  85. <el-form-item label="算法说明" prop="defectinfo.algorithmNote">
  86. <el-input
  87. v-model="formData.defectinfo.algorithmNote"
  88. type="textarea"
  89. placeholder="请输入算法说明"
  90. clearable
  91. rows="3"
  92. maxlength="1001"
  93. disabled
  94. />
  95. </el-form-item>
  96. <el-form-item label="备注" prop="defectinfo.note">
  97. <el-input
  98. v-model="formData.defectinfo.note"
  99. type="textarea"
  100. placeholder="请输入备注"
  101. clearable
  102. rows="3"
  103. maxlength="1001"
  104. />
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="12" v-if="!!formData.defectinfo.interfaceCode">
  108. <div>
  109. <tf-title>参数设置</tf-title>
  110. <tf-table
  111. :columns="columns"
  112. :data="formData.defectinfoParmSet"
  113. v-loading="fetchingParams"
  114. auto-height
  115. style="padding: 0"
  116. >
  117. <template v-slot:paramValue="{ $index }">
  118. <el-form-item
  119. :show-message="false"
  120. label-width="0"
  121. style="margin-bottom: 0"
  122. :rules="[{ required: true, message: '' }]"
  123. :prop="`defectinfoParmSet[${$index}].paramValue`"
  124. >
  125. <el-input v-model="formData.defectinfoParmSet[$index].paramValue" class="input" />
  126. </el-form-item>
  127. </template>
  128. </tf-table>
  129. </div>
  130. </el-col>
  131. </el-row>
  132. </el-form>
  133. </tf-dialog>
  134. </template>
  135. <script lang="ts">
  136. import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
  137. import { ElForm } from 'element-ui/types/form'
  138. import { IFlaw, IFlawParam, IInterface, IParam } from '../api/common'
  139. import { IDictionary } from '@/api/common'
  140. import { fetchParams } from '../api/flaw'
  141. import { IPoint } from '../../configuration/api/common'
  142. import { flawPointParamCols } from '../utils'
  143. const getDefaultFormData = () => ({
  144. defectinfo: {
  145. according: '',
  146. algorithmNote: '',
  147. description: '',
  148. id: undefined,
  149. interfaceDescription: '',
  150. interfaceName: '',
  151. name: '',
  152. note: '',
  153. type: '',
  154. monitorIds: []
  155. },
  156. defectinfoParmSet: []
  157. })
  158. @Component({ name: 'TeamForm', components: {} })
  159. export default class TeamForm extends Vue {
  160. @Prop({ type: Object, default: () => ({}) }) data!: object
  161. @Prop({ type: Boolean, default: false }) loading!: boolean
  162. @Prop({ type: Array, default: () => [] }) types!: IDictionary[]
  163. @Prop({ type: Array, default: () => ({}) }) interfaces!: IInterface[]
  164. @Prop({ type: Array, default: () => ({}) }) points!: IPoint[]
  165. $refs!: { form: ElForm }
  166. formData: IFlawParam = getDefaultFormData()
  167. currentInterface: Partial<IInterface> = {}
  168. params: IParam[] = []
  169. columns = flawPointParamCols
  170. fetchingParams: boolean = false
  171. get listeners() {
  172. const { submit, ...rest } = this.$listeners
  173. return rest
  174. }
  175. rules = {
  176. 'defectinfo.type': [{ required: true, message: '请选择排水类型', trigger: 'blur' }],
  177. 'defectinfo.name': [
  178. { required: true, message: '请输入缺陷名称', trigger: 'blur' },
  179. { max: 50, message: '缺陷名称不能超过50个字符', trigger: 'blur' }
  180. ],
  181. 'defectinfo.description': [
  182. { required: true, message: '请输入缺陷描述', trigger: 'blur' },
  183. { max: 1000, message: '缺陷描述不能超过1000字符', trigger: 'blur' }
  184. ],
  185. 'defectinfo.according': [
  186. { required: true, message: '请输入分析依据', trigger: 'blur' },
  187. { max: 1000, message: '分析依据不能超过1000字符', trigger: 'blur' }
  188. ],
  189. 'defectinfo.interfaceName': [
  190. { required: false, max: 1000, message: '接口名称不能超过1000字符', trigger: 'blur' }
  191. ],
  192. 'defectinfo.interfaceDescription': [
  193. { required: false, max: 1000, message: '接口说明不能超过1000字符', trigger: 'blur' }
  194. ],
  195. 'defectinfo.algorithmNote': [
  196. { required: false, max: 1000, message: '算法说明不能超过1000字符', trigger: 'blur' }
  197. ],
  198. 'defectinfo.note': [{ required: false, max: 1000, message: '备注不能超过1000字符', trigger: 'blur' }],
  199. 'defectinfo.monitorIds': [
  200. {
  201. type: 'array',
  202. required: true,
  203. message: '请选择监测点',
  204. fields: {
  205. 0: { type: 'number', required: true, message: '请选择监测点' }
  206. }
  207. }
  208. ]
  209. }
  210. onInterfaceChange(code: string) {
  211. const current = this.interfaces.find((item) => item.interfaceCode === code)
  212. this.currentInterface = current
  213. const { interfaceName, interfaceCode, interfaceDescription, algorithmNote } = current || {}
  214. this.formData = {
  215. ...this.formData,
  216. defectinfo: { ...this.formData.defectinfo, interfaceName, interfaceDescription, algorithmNote }
  217. }
  218. this.fetchParams(interfaceCode)
  219. }
  220. async fetchParams(code: string) {
  221. this.fetchingParams = true
  222. try {
  223. const { result } = await fetchParams(code)
  224. this.formData.defectinfoParmSet = result || []
  225. } catch (error) {
  226. console.log(error)
  227. }
  228. this.fetchingParams = false
  229. }
  230. onSubmit() {
  231. this.$refs.form.validate((valid) => {
  232. if (valid) {
  233. const {
  234. defectinfo: { monitorIds, ...rest },
  235. defectinfoParmSet
  236. } = this.formData
  237. this.$emit('submit', { defectinfo: { ...rest, monitorIds: monitorIds.join() }, defectinfoParmSet })
  238. }
  239. })
  240. }
  241. @Watch('data', { immediate: true })
  242. setDefaultData(val: IFlaw) {
  243. const { id, interfaceCode, monitorIds } = val || {}
  244. this.formData = id
  245. ? {
  246. defectinfo: {
  247. ...val,
  248. monitorIds: String(monitorIds || '')
  249. .split(',')
  250. .filter((item) => !!item)
  251. .map((num) => Number(num))
  252. },
  253. defectinfoParmSet: []
  254. }
  255. : getDefaultFormData()
  256. this.currentInterface = {}
  257. if (interfaceCode) {
  258. this.onInterfaceChange(interfaceCode)
  259. }
  260. }
  261. }
  262. </script>
  263. <style lang="scss" scoped>
  264. .form {
  265. /deep/ .input input {
  266. text-align: center;
  267. }
  268. }
  269. </style>