BaseForm.vue 20 KB

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