BaseForm.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. <template>
  2. <a-modal
  3. :title="modalTitle"
  4. :width="900"
  5. :visible="visible"
  6. :confirmLoading="confirmLoading"
  7. class="ant-modal2"
  8. @cancel="handleCancel"
  9. >
  10. <a-form :form="form">
  11. <a-form-item v-show="false" >
  12. <a-input v-decorator="['id']" type="hidden"/>
  13. <a-input v-decorator="['sbId']" type="hidden"/>
  14. </a-form-item>
  15. <row-list :col="2">
  16. <row-item>
  17. <a-form-item
  18. label="设备名称"
  19. :labelCol="BaseTool.Constant.labelCol"
  20. :wrapperCol="BaseTool.Constant.wrapperCol"
  21. >
  22. <a-input
  23. style="width: 70%"
  24. disabled
  25. v-decorator="['sbName', {rules: [{required: true, message: '设备名称不能为空'}]}]" />
  26. <a-button style="width: 30%" type="primary" @click="handleSbSelect">选择</a-button>
  27. </a-form-item>
  28. </row-item>
  29. <row-item>
  30. <a-form-item
  31. label="使用位置"
  32. :labelCol="BaseTool.Constant.labelCol"
  33. :wrapperCol="BaseTool.Constant.wrapperCol"
  34. >
  35. <a-input
  36. v-decorator="['sbCph', {rules: [{required: true, message: '设备使用位置不能为空'}]}]" />
  37. </a-form-item>
  38. </row-item>
  39. <row-item>
  40. <a-form-item
  41. label="维修类别"
  42. :labelCol="BaseTool.Constant.labelCol"
  43. :wrapperCol="BaseTool.Constant.wrapperCol"
  44. >
  45. <a-select @change="changePlanFlag" v-decorator="['category', {rules: [{required: true, message: '计划性维修不能为空'}]}]" placeholder="请选择">
  46. <a-select-option
  47. v-for="(label,value) in planFlagMap"
  48. :key="value"
  49. :label="label"
  50. :value="parseInt(value)">{{ label }}
  51. </a-select-option>
  52. </a-select>
  53. </a-form-item>
  54. </row-item>
  55. <row-item>
  56. <a-form-item
  57. label="是否停机"
  58. :labelCol="BaseTool.Constant.labelCol"
  59. :wrapperCol="BaseTool.Constant.wrapperCol"
  60. >
  61. <a-select v-decorator="['needStop', {rules: [{required: true, message: '是否停机不能为空'}]}]" placeholder="请选择">
  62. <a-select-option
  63. v-for="(label,value) in needStopMap"
  64. :key="value"
  65. :label="label"
  66. :value="parseInt(value)">{{ label }}
  67. </a-select-option>
  68. </a-select>
  69. </a-form-item>
  70. </row-item>
  71. <row-item v-show="category === 1">
  72. <a-form-item
  73. label="要求日期"
  74. :labelCol="BaseTool.Constant.labelCol"
  75. :wrapperCol="BaseTool.Constant.wrapperCol"
  76. >
  77. <a-date-picker
  78. style="width: 100%"
  79. :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
  80. v-decorator="['limitDate']" />
  81. </a-form-item>
  82. </row-item>
  83. <row-item v-show="category === 2">
  84. <a-form-item
  85. label="要求时间"
  86. :labelCol="BaseTool.Constant.labelCol"
  87. :wrapperCol="BaseTool.Constant.wrapperCol"
  88. >
  89. <a-input
  90. style="width: 100%"
  91. suffix="小时"
  92. v-decorator="['limitHours']" />
  93. </a-form-item>
  94. </row-item>
  95. <row-item>
  96. <a-form-item
  97. label="报修单号"
  98. :labelCol="BaseTool.Constant.labelCol"
  99. :wrapperCol="BaseTool.Constant.wrapperCol"
  100. >
  101. <a-input
  102. disabled
  103. v-decorator="['no', {rules: [{required: false, message: '报修单号不能为空'}]}]" />
  104. </a-form-item>
  105. </row-item>
  106. <!-- <row-item>
  107. <a-form-item
  108. label="报修来源"
  109. :labelCol="BaseTool.Constant.labelCol"
  110. :wrapperCol="BaseTool.Constant.wrapperCol"
  111. >
  112. <a-select v-decorator="['source', {initialValue: DictCache.VALUE.REPAIR_APPLICATION_FORM_SOURCE.SCENE,rules: [{required: true, message: '报修来源不能为空'}]}]" placeholder="请选择">
  113. <a-select-option
  114. v-for="(label,value) in sourceMap"
  115. :key="value"
  116. :label="label"
  117. :value="parseInt(value)">{{ label }}
  118. </a-select-option>
  119. </a-select>
  120. </a-form-item>
  121. </row-item>-->
  122. <row-item>
  123. <a-form-item
  124. label="报修人"
  125. :labelCol="BaseTool.Constant.labelCol"
  126. :wrapperCol="BaseTool.Constant.wrapperCol"
  127. >
  128. <a-input
  129. v-decorator="['actualUser', {initialValue: userInfo.realName, rules: [{required: true, message: '报修人不能为空'}]}]"/>
  130. </a-form-item>
  131. </row-item>
  132. <!-- <row-item>
  133. <a-form-item
  134. label="紧急等级"
  135. :labelCol="BaseTool.Constant.labelCol"
  136. :wrapperCol="BaseTool.Constant.wrapperCol"
  137. >
  138. <a-select v-decorator="['level', {initialValue: 1, rules: [{required: true, message: '紧急等级不能为空'}]}]" placeholder="请选择">
  139. <a-select-option
  140. v-for="(label,value) in levelMap"
  141. :key="value"
  142. :label="label"
  143. :value="parseInt(value)">{{ label }}
  144. </a-select-option>
  145. </a-select>
  146. </a-form-item>
  147. </row-item>
  148. <row-item>
  149. <a-form-item
  150. label="异常类别"
  151. :labelCol="BaseTool.Constant.labelCol"
  152. :wrapperCol="BaseTool.Constant.wrapperCol"
  153. >
  154. <a-tree-select
  155. style="width: 100%"
  156. :dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }"
  157. :treeData="treeData"
  158. :treeNodeFilterProp="'title'"
  159. :showSearch="true"
  160. v-decorator="['repairErrorTypeId']"
  161. placeholder="请选择"
  162. >
  163. </a-tree-select>
  164. </a-form-item>
  165. </row-item>-->
  166. <row-item>
  167. <a-form-item
  168. label="报修图片"
  169. :labelCol="BaseTool.Constant.labelCol"
  170. :wrapperCol="BaseTool.Constant.wrapperCol"
  171. >
  172. <a-upload
  173. :action="uploadUrl"
  174. :multiple="true"
  175. list-type="picture"
  176. :file-list="this.defaultApplicationFileList"
  177. @change="handleApplicationFileChange"
  178. accept="image/*"
  179. :headers="headers"
  180. >
  181. <a-button> <a-icon type="upload" /> 上传图片 </a-button>
  182. </a-upload>
  183. </a-form-item>
  184. </row-item>
  185. </row-list>
  186. <row-list :col="1">
  187. <row-item v-if="false">
  188. <a-form-item
  189. label="报修状态"
  190. :labelCol="BaseTool.Constant.labelCol"
  191. :wrapperCol="BaseTool.Constant.wrapperCol"
  192. >
  193. <a-select disabled v-decorator="['status', {initialValue: DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED,rules: [{required: true, message: '报修状态不能为空'}]}]" placeholder="请选择">
  194. <a-select-option
  195. v-for="(label,value) in statusMap"
  196. :key="value"
  197. :label="label"
  198. :value="parseInt(value)">{{ label }}
  199. </a-select-option>
  200. </a-select>
  201. </a-form-item>
  202. </row-item>
  203. <!-- <row-item>
  204. <a-form-item
  205. label="故障描述"
  206. :labelCol="BaseTool.Constant.labelCol2"
  207. :wrapperCol="BaseTool.Constant.wrapperCol2"
  208. >
  209. <a-select v-decorator="['content']" placeholder="请选择">
  210. <a-select-option
  211. v-for="(label,value) in questionMap"
  212. :key="value"
  213. :label="label"
  214. :value="parseInt(value)">{{ label }}
  215. </a-select-option>
  216. </a-select>
  217. </a-form-item>
  218. </row-item>-->
  219. <row-item>
  220. <a-form-item
  221. label="故障描述"
  222. :labelCol="BaseTool.Constant.labelCol2"
  223. :wrapperCol="BaseTool.Constant.wrapperCol2"
  224. >
  225. <a-textarea
  226. :rows="4"
  227. v-decorator="['content', {rules: [{required: true, message: '故障描述不能为空'}]}]"/>
  228. </a-form-item>
  229. </row-item>
  230. </row-list>
  231. </a-form>
  232. <template slot="footer">
  233. <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
  234. </template>
  235. <sb-info-select-modal ref="sbInfoSelectModal" @selected="handleSbSelectd"/>
  236. <part-info-select-modal ref="partInfoSelectModal" @selected="handlePartSelected"/>
  237. </a-modal>
  238. </template>
  239. <script>
  240. import pick from 'lodash.pick'
  241. import BaseTool from '../../../../utils/tool'
  242. import { addRepairApplicationForm, updateRepairApplicationForm } from '@/api/repair/application-form'
  243. import PartInfoSelectModal from '@/views/part/info/modules/PartInfoSelectModal'
  244. import SbInfoSelectModal from '@/views/sb/info/modules/SbInfoSelectModal'
  245. import { queryUser } from '@/api/upms/user'
  246. import { uploadUrl } from '@/api/upms/file'
  247. import Vue from 'vue'
  248. import { ACCESS_TOKEN } from '@/store/mutation-types'
  249. import { fetchErrorTypeTree } from '@/api/repair/errortype'
  250. export default {
  251. name: 'BaseRepairApplicationForm',
  252. data () {
  253. return {
  254. confirmLoading: false,
  255. modalTitle: null,
  256. form: this.$form.createForm(this),
  257. visible: false,
  258. // 下拉框map
  259. sourceMap: {},
  260. levelMap: {},
  261. questionMap: {},
  262. treeData: [],
  263. needStop: null,
  264. needStopMap: {},
  265. category: 0,
  266. planFlagMap: {},
  267. statusMap: {},
  268. userInfo: this.$store.getters.userInfo,
  269. userList: [],
  270. uploadUrl: uploadUrl,
  271. defaultRepairFileList: [],
  272. defaultApplicationFileList: [],
  273. defaultCheckFileList: [],
  274. applicationFileList: [], // 报修图片
  275. checkFileList: [], // 审核图片
  276. repairFileList: [], // 维修图片,
  277. headers: {
  278. Authorization: 'Bearer ' + Vue.ls.get(ACCESS_TOKEN)
  279. }
  280. }
  281. },
  282. components: {
  283. SbInfoSelectModal,
  284. PartInfoSelectModal
  285. },
  286. props: {
  287. },
  288. created () {
  289. // 下拉框map
  290. this.sourceMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_SOURCE)
  291. this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_LEVEL)
  292. this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_STATUS)
  293. this.questionMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_QUESTION)
  294. this.needStopMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
  295. this.planFlagMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_CATEGORY)
  296. this.getUsers()
  297. },
  298. methods: {
  299. base (record) {
  300. this.visible = true
  301. fetchErrorTypeTree().then(res => {
  302. this.treeData = res.data
  303. })
  304. // 如果是空标识添加
  305. if (this.BaseTool.Object.isBlank(record)) {
  306. this.modalTitle = '添加'
  307. if (!this.BaseTool.Object.isBlank(record) && !this.BaseTool.Object.isBlank(record.sbId)) {
  308. const { form: { setFieldsValue } } = this
  309. this.$nextTick(() => {
  310. setFieldsValue(Object.assign(pick(record, [
  311. 'sbId',
  312. 'sbName'
  313. ])))
  314. })
  315. }
  316. return
  317. }
  318. if (this.BaseTool.Object.isBlank(record.id)) {
  319. this.modalTitle = '添加'
  320. if (!this.BaseTool.Object.isBlank(record.sbId)) {
  321. const { form: { setFieldsValue } } = this
  322. this.$nextTick(() => {
  323. setFieldsValue(Object.assign(pick(record, [
  324. 'sbId',
  325. 'sbName',
  326. 'sbCph'
  327. ])))
  328. })
  329. }
  330. return
  331. }
  332. this.modalTitle = '编辑'
  333. this.applicationFileList = record.applicationFileList
  334. this.repairFileList = record.repairFileList
  335. this.checkFileList = record.checkFileList
  336. this.defaultApplicationFileList = this.BaseTool.UPLOAD.transImg(this.applicationFileList)
  337. this.defaultRepairFileList = this.BaseTool.UPLOAD.transImg(this.repairFileList)
  338. this.defaultCheckFileList = this.BaseTool.UPLOAD.transImg(this.checkFileList)
  339. const { form: { setFieldsValue } } = this
  340. // 日期处理
  341. record.applyTime = this.BaseTool.Moment(record.applyTime, this.BaseTool.Date.PICKER_NORM_DATETIME_PATTERN)
  342. if (record.limitDate != null) {
  343. record.limitDate = this.BaseTool.Moment(record.limitDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
  344. this.$nextTick(() => {
  345. setFieldsValue(Object.assign(pick(record, [
  346. 'limitDate'
  347. ])))
  348. })
  349. }
  350. this.$nextTick(() => {
  351. setFieldsValue(Object.assign(pick(record, [
  352. 'id',
  353. 'sbId',
  354. 'sbCph',
  355. 'partId',
  356. 'repairUserId',
  357. 'no',
  358. 'category',
  359. 'limitDate',
  360. 'limitHours',
  361. 'source',
  362. 'level',
  363. 'content',
  364. 'status',
  365. 'sbName',
  366. 'needStop',
  367. 'category',
  368. 'partName',
  369. 'remark'
  370. ])))
  371. })
  372. },
  373. getUsers () {
  374. queryUser({ status: 1 }).then(res => {
  375. this.userList = res.data
  376. })
  377. },
  378. save () {
  379. const { form: { validateFieldsAndScroll } } = this
  380. this.confirmLoading = true
  381. validateFieldsAndScroll((errors, values) => {
  382. if (errors) {
  383. this.confirmLoading = false
  384. return
  385. }
  386. // 日期处理
  387. values.applyTime = this.BaseTool.Date.formatter(values.applyTime, this.BaseTool.Date.PICKER_NORM_DATETIME_PATTERN)
  388. values.limitDate = BaseTool.Date.formatter(values.limitDate, BaseTool.Date.PICKER_NORM_DATE_PATTERN)
  389. // 上传文件
  390. values.repairFileList = this.repairFileList
  391. values.applicationFileList = this.applicationFileList
  392. values.checkFileList = this.checkFileList
  393. if (this.BaseTool.String.isBlank(values.id)) {
  394. addRepairApplicationForm(values)
  395. .then(() => {
  396. this.handleCancel(values)
  397. }).catch(() => {
  398. this.confirmLoading = false
  399. })
  400. } else {
  401. updateRepairApplicationForm(values)
  402. .then(() => {
  403. this.handleCancel(values)
  404. }).catch(() => {
  405. this.confirmLoading = false
  406. })
  407. }
  408. })
  409. },
  410. changePlanFlag (value) {
  411. this.category = value
  412. const { form: { setFieldsValue } } = this
  413. if (this.category === 1) {
  414. this.$nextTick(() => {
  415. setFieldsValue({ needStop: 1 })
  416. })
  417. } else {
  418. this.$nextTick(() => {
  419. setFieldsValue({ needStop: 0 })
  420. })
  421. }
  422. },
  423. handleCancel (values) {
  424. this.visible = false
  425. this.confirmLoading = false
  426. this.form.resetFields()
  427. if (this.BaseTool.Object.isNotBlank(values)) {
  428. this.$emit('ok', values)
  429. }
  430. },
  431. handleSbSelect () {
  432. this.$refs.sbInfoSelectModal.base({}, {})
  433. },
  434. handleSbSelectd (keys, rows) {
  435. const [ key ] = keys
  436. const [ row ] = rows
  437. const { form: { setFieldsValue } } = this
  438. // 日期处理
  439. this.$nextTick(() => {
  440. setFieldsValue(Object.assign({
  441. 'sbId': key,
  442. 'sbName': row.name,
  443. 'sbCph': row.cph
  444. }))
  445. })
  446. },
  447. handlePartSelect () {
  448. const sbId = this.form.getFieldValue('sbId')
  449. this.$refs.partInfoSelectModal.base({ sbId })
  450. },
  451. handlePartSelected (keys, rows) {
  452. const [ key ] = keys
  453. const [ row ] = rows
  454. const { form: { setFieldsValue } } = this
  455. this.$nextTick(() => {
  456. setFieldsValue(Object.assign({
  457. 'partId': key,
  458. 'partName': row.name
  459. }))
  460. })
  461. },
  462. handleApplicationFileChange (info) {
  463. this.defaultApplicationFileList = info.fileList
  464. this.applicationFileList = this.setFileList(info, 11)
  465. },
  466. setFileList (info, type) {
  467. const file = info.file
  468. const fileList = info.fileList
  469. if (file.status === 'done') {
  470. return this.BaseTool.UPLOAD.getUploadFileDTO(fileList, type)
  471. } else if (file.status === 'removed') {
  472. return this.BaseTool.UPLOAD.getUploadFileDTO(fileList, type)
  473. } else if (file.status === 'error') {
  474. this.$message.error('上传失败')
  475. return []
  476. }
  477. }
  478. }
  479. }
  480. </script>