BaseForm.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. <template>
  2. <a-modal
  3. :title="modalTitle"
  4. :width="1200"
  5. :visible="visible"
  6. :confirmLoading="confirmLoading"
  7. @cancel="handleCancel"
  8. >
  9. <a-form :form="form">
  10. <a-form-item v-show="false">
  11. <a-input v-decorator="['id']" type="hidden"/>
  12. <a-input v-decorator="['sbId']" type="hidden"/>
  13. <a-input v-decorator="['part']" 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. disabled
  24. v-decorator="['no', {rules: [{required: false, message: '编码不能为空'}]}]"/>
  25. </a-form-item>
  26. </row-item>-->
  27. <row-item>
  28. <a-form-item
  29. label="设备编号"
  30. :labelCol="BaseTool.Constant.labelCol"
  31. :wrapperCol="BaseTool.Constant.wrapperCol"
  32. >
  33. <a-input
  34. disabled
  35. style="width: 80%"
  36. v-decorator="['sbNo', {rules: [{required: false, message: '请选择设备'}]}]"/>
  37. <a-button type="primary" style="width: 20%" @click="handleSbSelect">选择</a-button>
  38. </a-form-item>
  39. </row-item>
  40. <row-item>
  41. <a-form-item
  42. label="标准名称"
  43. :labelCol="BaseTool.Constant.labelCol"
  44. :wrapperCol="BaseTool.Constant.wrapperCol"
  45. >
  46. <a-input
  47. v-decorator="['name', {rules: [{required: true, message: '标准名称不能为空'}]}]"/>
  48. </a-form-item>
  49. </row-item>
  50. <row-item>
  51. <a-form-item
  52. label="检查部位"
  53. :labelCol="BaseTool.Constant.labelCol"
  54. :wrapperCol="BaseTool.Constant.wrapperCol"
  55. >
  56. <a-input
  57. disabled
  58. style="width: 80%"
  59. v-decorator="['partName']"/>
  60. <a-button type="primary" style="width: 20%" @click="handlePartSelect">选择</a-button>
  61. </a-form-item>
  62. </row-item>
  63. <row-item>
  64. <a-form-item
  65. label="执行人"
  66. :labelCol="BaseTool.Constant.labelCol"
  67. :wrapperCol="BaseTool.Constant.wrapperCol"
  68. >
  69. <a-select v-decorator="['checkUserId']" placeholder="请选择">
  70. <a-select-option
  71. v-for="({userId, realName}) in userList"
  72. :key="userId"
  73. :label="realName"
  74. :value="userId">{{ realName }}
  75. </a-select-option>
  76. </a-select>
  77. </a-form-item>
  78. </row-item>
  79. <row-item>
  80. <a-form-item
  81. label="计划周期"
  82. :labelCol="BaseTool.Constant.labelCol"
  83. :wrapperCol="BaseTool.Constant.wrapperCol"
  84. style="margin-bottom:0;"
  85. >
  86. <a-form-item :style="{ display: 'inline-block', width: '70%' }">
  87. <a-input-number
  88. style="width: 100%"
  89. :min="1"
  90. v-decorator="['period', {initialValue: 1,rules: [{required: true, message: '计划周期不能为空'}]}]"/>
  91. </a-form-item>
  92. <a-form-item
  93. :style="{ display: 'inline-block', width: '30%' }"
  94. >
  95. <a-select
  96. v-decorator="['periodType', {initialValue: 1,rules: [{required: true, message: '周期类型不能为空'}]}]"
  97. placeholder="请选择">
  98. <a-select-option
  99. v-for="(label,value) in periodTypeMap"
  100. :key="value"
  101. :label="label"
  102. :value="parseInt(value)">{{ label }}
  103. </a-select-option>
  104. </a-select>
  105. </a-form-item>
  106. </a-form-item>
  107. </row-item>
  108. <row-item>
  109. <a-form-item
  110. label="标准工时"
  111. :labelCol="BaseTool.Constant.labelCol"
  112. :wrapperCol="BaseTool.Constant.wrapperCol"
  113. >
  114. <a-input
  115. v-decorator="['standardHours']"
  116. suffix="分钟"/>
  117. </a-form-item>
  118. </row-item>
  119. <row-item>
  120. <a-form-item
  121. label="排序"
  122. :labelCol="BaseTool.Constant.labelCol"
  123. :wrapperCol="BaseTool.Constant.wrapperCol"
  124. >
  125. <a-input-number
  126. :step="1"
  127. v-decorator="['sort', {initialValue: 1,rules: [{required: true, message: '排序不能为空'}]}]"/>
  128. </a-form-item>
  129. </row-item>
  130. <!-- <row-item>
  131. <a-form-item
  132. label="动作类型"
  133. :labelCol="BaseTool.Constant.labelCol"
  134. :wrapperCol="BaseTool.Constant.wrapperCol"
  135. >
  136. <a-select
  137. v-decorator="['actionType', {initialValue: 1,rules: [{required: true, message: '是否启用不能为空'}]}]"
  138. placeholder="请选择">
  139. <a-select-option
  140. v-for="(label,value) in actionTypeMap"
  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-select
  155. disabled
  156. v-show="false"
  157. v-decorator="['type', {initialValue:checkType,rules: [{required: true, message: '检查类型不能为空'}]}]"
  158. placeholder="请选择">
  159. <a-select-option
  160. v-for="(label,value) in typeMap"
  161. :key="value"
  162. :label="label"
  163. :value="parseInt(value)">{{ label }}
  164. </a-select-option>
  165. </a-select>
  166. </a-form-item>
  167. </row-item>
  168. <row-item>
  169. <a-form-item
  170. v-show="false"
  171. label="是否启用"
  172. :labelCol="BaseTool.Constant.labelCol"
  173. :wrapperCol="BaseTool.Constant.wrapperCol"
  174. >
  175. <a-select
  176. v-show="false"
  177. v-decorator="['enable', {initialValue:1,rules: [{required: true, message: '是否启用不能为空'}]}]"
  178. placeholder="请选择">
  179. <a-select-option
  180. v-for="(label,value) in enableMap"
  181. :key="value"
  182. :label="label"
  183. :value="parseInt(value)">{{ label }}
  184. </a-select-option>
  185. </a-select>
  186. </a-form-item>
  187. </row-item>-->
  188. </row-list>
  189. <row-list :col="1">
  190. <row-item>
  191. <a-form-item
  192. label="检查项目"
  193. :labelCol="BaseTool.Constant.labelCol2"
  194. :wrapperCol="BaseTool.Constant.wrapperCol2"
  195. >
  196. <a-textarea
  197. :rows="4"
  198. v-decorator="['requirement', {rules: [{required: true, message: '检查项目不能为空'}]}]"/>
  199. </a-form-item>
  200. </row-item>
  201. <row-item>
  202. <a-form-item
  203. label="操作说明及标准"
  204. :labelCol="BaseTool.Constant.labelCol2"
  205. :wrapperCol="BaseTool.Constant.wrapperCol2"
  206. >
  207. <a-textarea
  208. :rows="4"
  209. v-decorator="['remark', {rules: [{required: false, message: '操作说明及标准不能为空'}]}]"/>
  210. </a-form-item>
  211. </row-item>
  212. </row-list>
  213. <row-list :col="2">
  214. <row-item>
  215. <a-form-item
  216. label="图片"
  217. :labelCol="BaseTool.Constant.labelCol"
  218. :wrapperCol="BaseTool.Constant.wrapperCol"
  219. >
  220. <a-upload
  221. :action="uploadUrl"
  222. :multiple="true"
  223. list-type="picture"
  224. accept="image/*"
  225. :file-list="this.defaultCheckImgList"
  226. @change="handleCheckImgChange"
  227. :headers="headers"
  228. >
  229. <a-button> <a-icon type="upload" /> 选择上传图片 </a-button>
  230. </a-upload>
  231. </a-form-item>
  232. </row-item>
  233. <row-item>
  234. <a-form-item
  235. label="文件"
  236. :labelCol="BaseTool.Constant.labelCol"
  237. :wrapperCol="BaseTool.Constant.wrapperCol"
  238. >
  239. <a-upload
  240. :action="uploadUrl"
  241. :multiple="true"
  242. :file-list="this.defaultCheckFileList"
  243. @change="handleCheckFileChange"
  244. :headers="headers"
  245. >
  246. <a-button> <a-icon type="upload" /> 选择上传文件 </a-button>
  247. </a-upload>
  248. </a-form-item>
  249. </row-item>
  250. </row-list>
  251. </a-form>
  252. <title-divider title="关联备件" width="100px"></title-divider>
  253. <div class="table-operator">
  254. <a-button style="margin-left:8px;" type="primary" @click="handleSpareSelect">
  255. <a-icon type="plus"/>
  256. 添加
  257. </a-button>
  258. <a-button class="margin-left8" size="small" type="danger" @click="handleDel">
  259. <a-icon type="delete"/>
  260. 删除
  261. </a-button>
  262. </div>
  263. <a-table
  264. :data-source="data"
  265. :columns="columns"
  266. bordered
  267. ref="table"
  268. tableLayout="auto"
  269. :row-selection="rowSelection"
  270. rowKey="bomId">
  271. <template slot="num" slot-scope="text, record">
  272. <div class="editable-cell-input-wrapper">
  273. <a-input :value="text" :id="record.spareId + ',num'" @change="$event => onQuantityChange($event, record.id, 'num')" />
  274. </div>
  275. </template>
  276. <span slot="action" slot-scope="record">
  277. <template>
  278. <!-- <a @click="handleDetailSelect(record)">修改</a>
  279. <a-divider type="vertical" />-->
  280. <a-popconfirm title="是否要删除该条数据?" @confirm="handleDelOne(record)">
  281. <a>删除</a>
  282. </a-popconfirm>
  283. </template>
  284. </span>
  285. </a-table>
  286. <template slot="footer">
  287. <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
  288. </template>
  289. <part-info-select-modal ref="partInfoSelectModal" @selected="handlePartSelected"/>
  290. <sb-info-select-modal ref="sbInfoSelectModal" @selected="handleSbSelectd"/>
  291. <spare-part-info-select-modal-sb-info :type="'checkbox'" ref="spareSelectModal" @selected="handleSpareSelected"/>
  292. </a-modal>
  293. </template>
  294. <script>
  295. import pick from 'lodash.pick'
  296. import { STable, Ellipsis } from '@/components'
  297. import { addCheckStandard, fetchCheckStandard, updateCheckStandard } from '@/api/check/checkstandard'
  298. import { queryUser } from '@/api/upms/user'
  299. import { uploadUrl } from '@/api/upms/file'
  300. import PartInfoSelectModal from '@/views/part/info/modules/PartInfoSelectModal'
  301. import Vue from 'vue'
  302. import { ACCESS_TOKEN } from '@/store/mutation-types'
  303. import SparePartInfoSelectModalSbInfo from '@/views/sqarepartmanage/sparepartinfo/modules/SparePartInfoSelectModalSbInfo'
  304. import SbInfoSelectModal from '@/views/sb/info/modules/SbInfoSelectModal'
  305. export default {
  306. name: 'BaseCheckStandard',
  307. components: {
  308. STable,
  309. Ellipsis,
  310. SbInfoSelectModal,
  311. PartInfoSelectModal,
  312. SparePartInfoSelectModalSbInfo
  313. },
  314. data () {
  315. return {
  316. confirmLoading: false,
  317. modalTitle: null,
  318. form: this.$form.createForm(this),
  319. visible: false,
  320. sbId: null,
  321. // 下拉框map
  322. typeMap: {},
  323. actionTypeMap: {},
  324. paramTypeMap: {},
  325. enableMap: {},
  326. periodTypeMap: {},
  327. checkImgList: [], // 图片
  328. checkFileList: [], // 文档
  329. defaultCheckImgList: [],
  330. defaultCheckFileList: [],
  331. userList: {},
  332. editingKey: '',
  333. uploadUrl: uploadUrl,
  334. headers: {
  335. Authorization: 'Bearer ' + Vue.ls.get(ACCESS_TOKEN)
  336. },
  337. rowSelection: {
  338. onChange: (selectedRowKeys, selectedRows) => {
  339. this.selectedRowKeys = selectedRowKeys
  340. this.selectedRows = selectedRows
  341. }
  342. },
  343. // 表头
  344. columns: [
  345. {
  346. title: '名称',
  347. dataIndex: 'spareName'
  348. },
  349. {
  350. title: '规格型号',
  351. dataIndex: 'ggxh'
  352. },
  353. {
  354. title: '数量',
  355. dataIndex: 'num',
  356. width: 150,
  357. scopedSlots: { customRender: 'num' }
  358. },
  359. {
  360. title: '操作',
  361. key: 'action',
  362. checked: true,
  363. align: 'center',
  364. // fixed: 'right',
  365. scopedSlots: { customRender: 'action' }
  366. }
  367. ],
  368. data: [],
  369. cacheData: [],
  370. selectedRowKeys: [],
  371. selectedRows: [],
  372. options: {
  373. rowSelection: {
  374. selectedRowKeys: this.selectedRowKeys
  375. }
  376. }
  377. }
  378. },
  379. props: {
  380. /**
  381. * 检查类型: 1-点检 2-巡检
  382. */
  383. checkType: {
  384. type: Number,
  385. default: 1
  386. }
  387. },
  388. created () {
  389. // 下拉框map
  390. this.paramTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_STANDARD_PARAM_TYPE)
  391. this.typeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_STANDARD_TYPE)
  392. this.periodTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_PERIOD_TYPE)
  393. this.actionTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_ACTION_TYPE)
  394. this.enableMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
  395. },
  396. methods: {
  397. base (record, sbId) {
  398. this.visible = true
  399. this.selectedRowKeys = []
  400. this.selectedRows = []
  401. this.form.resetFields()
  402. queryUser({}).then(res => {
  403. this.userList = res.data
  404. })
  405. // 如果是空标识添加
  406. if (this.BaseTool.Object.isBlank(record)) {
  407. this.modalTitle = '添加'
  408. this.data = []
  409. this.cacheData = []
  410. if (sbId != null) {
  411. this.sbId = sbId
  412. const { form: { setFieldsValue } } = this
  413. // 日期处理
  414. this.$nextTick(() => {
  415. setFieldsValue({ sbId: sbId })
  416. })
  417. }
  418. return
  419. }
  420. this.modalTitle = '编辑'
  421. if (this.BaseTool.Object.isBlank(record.id)) {
  422. this.modalTitle = '复制'
  423. }
  424. this.sbId = record.sbId
  425. // 查询列表
  426. fetchCheckStandard({ id: record.id }).then(res => {
  427. this.data = res.data.detailList
  428. })
  429. this.checkImgList = record.checkImgList
  430. this.checkFileList = record.checkFileList
  431. if (this.checkImgList == null) {
  432. this.defaultCheckImgList = this.BaseTool.UPLOAD.transImg(this.checkImgList)
  433. }
  434. if (this.checkImgList == null) {
  435. this.defaultCheckFileList = this.BaseTool.UPLOAD.transImg(this.checkFileList)
  436. }
  437. const { form: { setFieldsValue } } = this
  438. // 日期处理
  439. this.$nextTick(() => {
  440. setFieldsValue(Object.assign(pick(record, [
  441. 'id',
  442. 'sbId',
  443. 'sbNo',
  444. 'name',
  445. // 'no',
  446. // 'type',
  447. 'period',
  448. 'part',
  449. 'partName',
  450. 'checkUserId',
  451. 'periodType',
  452. // 'actionType',
  453. // 'enable',
  454. 'requirement',
  455. 'remark'
  456. ])))
  457. })
  458. },
  459. save () {
  460. const { form: { validateFieldsAndScroll } } = this
  461. this.confirmLoading = true
  462. validateFieldsAndScroll((errors, values) => {
  463. if (errors) {
  464. this.confirmLoading = false
  465. return
  466. }
  467. // 上传文件
  468. values.checkImgList = this.checkImgList
  469. values.checkFileList = this.checkFileList
  470. // 备件列表
  471. values.detailList = this.data
  472. if (this.BaseTool.String.isBlank(values.id)) {
  473. addCheckStandard(values)
  474. .then(() => {
  475. this.handleCancel(values)
  476. }).catch(() => {
  477. this.confirmLoading = false
  478. })
  479. } else {
  480. updateCheckStandard(values)
  481. .then(() => {
  482. this.handleCancel(values)
  483. }).catch(() => {
  484. this.confirmLoading = false
  485. })
  486. }
  487. })
  488. },
  489. handleCancel (values) {
  490. this.visible = false
  491. this.data = []
  492. this.confirmLoading = false
  493. this.selectedRowKeys = []
  494. this.selectedRows = []
  495. this.form.resetFields()
  496. if (this.BaseTool.Object.isNotBlank(values)) {
  497. this.$emit('ok', values)
  498. }
  499. },
  500. handleSbSelect () {
  501. this.$refs.sbInfoSelectModal.base()
  502. },
  503. handleSbSelectd (keys, rows) {
  504. const [ key ] = keys
  505. const [ row ] = rows
  506. const { form: { setFieldsValue } } = this
  507. this.sbId = key
  508. // 日期处理
  509. this.$nextTick(() => {
  510. setFieldsValue(Object.assign({
  511. 'sbId': key,
  512. 'sbNo': row.no
  513. }))
  514. })
  515. },
  516. handlePartSelect () {
  517. const sbId = this.form.getFieldValue('sbId')
  518. if (this.BaseTool.Object.isBlank(sbId)) {
  519. this.$message.error('请先选择设备')
  520. }
  521. this.$refs.partInfoSelectModal.base({ sbId })
  522. },
  523. handlePartSelected (keys, rows) {
  524. const [ key ] = keys
  525. const [ row ] = rows
  526. const { form: { setFieldsValue } } = this
  527. this.$nextTick(() => {
  528. setFieldsValue(Object.assign({
  529. 'part': key,
  530. 'partName': row.name
  531. }))
  532. })
  533. },
  534. handleCheckImgChange (info) {
  535. this.defaultCheckImgList = info.fileList
  536. this.checkImgList = this.setFileList(info, 1)
  537. },
  538. handleCheckFileChange (info) {
  539. this.defaultCheckFileList = info.fileList
  540. this.checkFileList = this.setFileList(info, 2)
  541. },
  542. setFileList (info, type) {
  543. const file = info.file
  544. const fileList = info.fileList
  545. if (file.status === 'done') {
  546. return this.BaseTool.UPLOAD.getUploadFileDTO(fileList, type)
  547. } else if (file.status === 'removed') {
  548. return this.BaseTool.UPLOAD.getUploadFileDTO(fileList, type)
  549. } else if (file.status === 'error') {
  550. this.$message.error('上传失败')
  551. return null
  552. }
  553. },
  554. handleSpareSelect () {
  555. this.$refs.spareSelectModal.base(null, { sbId: this.sbId })
  556. },
  557. handleSpareSelected (record, keys, rows) {
  558. const addData = []
  559. for (let i = 0; i < rows.length; i++) {
  560. addData.push({ sbId: this.sbId, spareId: rows[i].id, spareName: rows[i].name, num: 1 })
  561. }
  562. const { data } = this
  563. for (let i = 0; i < rows.length; i++) {
  564. let find = false
  565. for (let j = 0; j < data.length; j++) {
  566. if (rows[i].spareId === data[j].spareId) {
  567. find = true
  568. break
  569. }
  570. }
  571. if (!find) {
  572. const selectData = {}
  573. selectData.spareId = rows[i].spareId
  574. selectData.spareName = rows[i].name
  575. selectData.ggxh = rows[i].ggxh
  576. selectData.sbId = this.sbId
  577. selectData.bomId = rows[i].id
  578. selectData.num = 1
  579. data.push(selectData)
  580. }
  581. }
  582. },
  583. handleDel () {
  584. const data = [...this.data]
  585. if (this.selectedRowKeys.length === 0) {
  586. this.$message.error('请至少选择一条数据')
  587. return
  588. }
  589. this.data = data.filter(item => !this.selectedRowKeys.includes(item.bomId))
  590. },
  591. handleDelOne (record) {
  592. const data = [...this.data]
  593. this.data = data.filter(item => record.bomId !== item.bomId)
  594. },
  595. onQuantityChange (e, id, attr) {
  596. const value = e.target.value
  597. console.log(value)
  598. if (value !== 0 && !value) {
  599. return
  600. }
  601. const data = [...this.data]
  602. const target = data.find(item => item.id === id)
  603. if (target) {
  604. target[attr] = value
  605. this.data = data
  606. }
  607. }
  608. }
  609. }
  610. </script>