BaseForm.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. <template>
  2. <a-modal
  3. :title="title"
  4. :width="1400"
  5. :visible="visible"
  6. :confirmLoading="confirmLoading"
  7. @cancel="handleCancel"
  8. >
  9. <a-card >
  10. <a-form :form="form">
  11. <row-list :col="1" v-show="false">
  12. <row-item>
  13. <a-form-item>
  14. <a-input v-decorator="['id']" type="hidden"/>
  15. <a-input v-decorator="['sbId']" type="hidden"/>
  16. </a-form-item>
  17. </row-item>
  18. </row-list>
  19. <row-list :col="2">
  20. <row-item >
  21. <a-form-item
  22. label="计划类型"
  23. :labelCol="BaseTool.Constant.labelCol"
  24. :wrapperCol="BaseTool.Constant.wrapperCol"
  25. >
  26. <a-select v-decorator="['type', { rules: [{required: true, message: '采购计划类型不能为空'}]}]" placeholder="请选择">
  27. <a-select-option
  28. v-for="(label,value) in typeMap"
  29. :key="value"
  30. :label="label"
  31. :value="parseInt(value)">{{ label }}
  32. </a-select-option>
  33. </a-select>
  34. </a-form-item>
  35. </row-item>
  36. <row-item >
  37. <a-form-item
  38. label="请购原因"
  39. :labelCol="BaseTool.Constant.labelCol"
  40. :wrapperCol="BaseTool.Constant.wrapperCol"
  41. >
  42. <a-input
  43. v-decorator="['remark']"/>
  44. </a-form-item>
  45. </row-item>
  46. <row-item >
  47. <a-form-item
  48. label="采购类型"
  49. :labelCol="BaseTool.Constant.labelCol"
  50. :wrapperCol="BaseTool.Constant.wrapperCol"
  51. >
  52. <a-select v-decorator="['cptcode', { rules: [{required: true, message: '采购类型不能为空'}]}]" placeholder="请选择">
  53. <a-select-option
  54. v-for="(label,value) in cptcodeMap"
  55. :key="value"
  56. :label="label"
  57. :value="value">{{ label }}
  58. </a-select-option>
  59. </a-select>
  60. </a-form-item>
  61. </row-item>
  62. <row-item >
  63. <a-form-item
  64. label="业务类型"
  65. :labelCol="BaseTool.Constant.labelCol"
  66. :wrapperCol="BaseTool.Constant.wrapperCol"
  67. >
  68. <a-select v-decorator="['cbustype', {rules: [{required: true, message: '业务类型不能为空'}]}]" placeholder="请选择">
  69. <a-select-option
  70. v-for="(label,value) in cbustypeMap"
  71. :key="value"
  72. :label="label"
  73. :value="value">{{ label }}
  74. </a-select-option>
  75. </a-select>
  76. </a-form-item>
  77. </row-item>
  78. <row-item >
  79. <a-form-item
  80. label="采购厂区"
  81. :labelCol="BaseTool.Constant.labelCol"
  82. :wrapperCol="BaseTool.Constant.wrapperCol"
  83. >
  84. <a-select :disabled="title==='编辑'" v-decorator="['oldOrNew', {rules: [{required: true, message: '采购厂区不能为空'}]}]" @change="setTree">
  85. <a-select-option
  86. v-for="(label,value) in flagMap"
  87. :key="value"
  88. :label="label"
  89. :value="parseInt(value)">{{ label }}
  90. </a-select-option>
  91. </a-select>
  92. </a-form-item>
  93. </row-item>
  94. <row-item >
  95. <a-form-item
  96. label="申请部门"
  97. :labelCol="BaseTool.Constant.labelCol"
  98. :wrapperCol="BaseTool.Constant.wrapperCol"
  99. >
  100. <a-select v-decorator="['cdepcode', {rules: [{required: true, message: '申请部门不能为空'}]}]" placeholder="请选择">
  101. <a-select-option
  102. v-for="(label,value) in deptMap"
  103. :key="value"
  104. :label="label"
  105. :value="value">{{ label }}
  106. </a-select-option>
  107. </a-select>
  108. </a-form-item>
  109. </row-item>
  110. <!-- <row-item >-->
  111. <!-- <a-form-item-->
  112. <!-- label="需求跟踪方式"-->
  113. <!-- :labelCol="BaseTool.Constant.labelCol"-->
  114. <!-- :wrapperCol="BaseTool.Constant.wrapperCol"-->
  115. <!-- >-->
  116. <!-- <a-select v-decorator="['cestIrequireTrackStyle', {rules: [{required: true, message: '需求跟踪方式不能为空'}]}]" placeholder="请选择">-->
  117. <!-- <a-select-option-->
  118. <!-- v-for="(label,value) in soMap"-->
  119. <!-- :key="value"-->
  120. <!-- :label="label"-->
  121. <!-- :value="parseInt(value)">{{ label }}-->
  122. <!-- </a-select-option>-->
  123. <!-- </a-select>-->
  124. <!-- </a-form-item>-->
  125. <!-- </row-item>-->
  126. <row-item >
  127. <a-form-item
  128. label="计划到货日期"
  129. :labelCol="BaseTool.Constant.labelCol"
  130. :wrapperCol="BaseTool.Constant.wrapperCol"
  131. >
  132. <a-date-picker
  133. style="width: 100%"
  134. :disabled-date="disabledDate"
  135. @change="dateChange"
  136. :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
  137. v-decorator="['planGetDate', {rules: [{required: true, message: '计划到货日期不能为空'}]}]" />
  138. </a-form-item>
  139. </row-item>
  140. <row-item >
  141. <a-form-item
  142. label="需求日期"
  143. :labelCol="BaseTool.Constant.labelCol"
  144. :wrapperCol="BaseTool.Constant.wrapperCol"
  145. >
  146. <a-date-picker
  147. :disabled="!date"
  148. style="width: 100%"
  149. :disabled-date="disabledDate2"
  150. :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
  151. v-decorator="['needDate', {rules: [{required: true, message: '需求日期不能为空'}]}]" />
  152. </a-form-item>
  153. </row-item>
  154. <row-item >
  155. <a-form-item
  156. label="设备位号"
  157. :labelCol="BaseTool.Constant.labelCol"
  158. :wrapperCol="BaseTool.Constant.wrapperCol"
  159. >
  160. <a-input
  161. style="width: 70%"
  162. disabled
  163. v-decorator="['positionNo']" />
  164. <a-button :disabled="title==='编辑'" style="width: 30%" type="primary" @click="handleSbSelect">选择</a-button>
  165. </a-form-item>
  166. </row-item>
  167. <row-item >
  168. <a-form-item
  169. label="关联项目"
  170. :labelCol="BaseTool.Constant.labelCol"
  171. :wrapperCol="BaseTool.Constant.wrapperCol"
  172. >
  173. <a-tree-select
  174. style="width: 100%"
  175. :treeData="treeData"
  176. :showSearch="true"
  177. tree-node-filter-prop="title"
  178. :dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }"
  179. v-decorator="['projectId']"
  180. placeholder="请选择"
  181. >
  182. </a-tree-select>
  183. </a-form-item>
  184. </row-item>
  185. <row-item >
  186. <a-form-item
  187. label="物资描述"
  188. :labelCol="BaseTool.Constant.labelCol"
  189. :wrapperCol="BaseTool.Constant.wrapperCol"
  190. >
  191. <a-textarea
  192. v-decorator="['cbmemo', { rules: [{required: true, message: '物资描述不能为空'}]}]"/>
  193. </a-form-item>
  194. </row-item>
  195. </row-list>
  196. </a-form>
  197. </a-card>
  198. <a-card>
  199. <div class="table-operator" style="margin-bottom: 8px;">
  200. <a-button size="small" :disabled="!oldOrNew" type="primary" @click="handleSpareStoreSelect">
  201. <a-icon type="plus"/>
  202. 物料库添加
  203. </a-button>
  204. <!-- <a-button size="small" :disabled="!(oldOrNew&&sbId)" style="margin-left:20px;" type="primary" @click="handleBomSpareStoreSelect">
  205. <a-icon type="plus"/>
  206. BOM添加
  207. </a-button> -->
  208. </div>
  209. <a-table
  210. bordered
  211. :data-source="data"
  212. :columns="columns"
  213. tableLayout="auto"
  214. rowKey="id"
  215. >
  216. <template slot="ftaxprice" slot-scope="text, record">
  217. <a-input v-model="record.ftaxprice" />
  218. </template>
  219. <template slot="cdefine12" slot-scope="text, record">
  220. <a-input v-model="record.cdefine12" />
  221. </template>
  222. <template slot="num" slot-scope="text, record">
  223. <a-input v-model="record.num" />
  224. </template>
  225. <span slot="action" slot-scope="record">
  226. <template>
  227. <a-popconfirm title="是否要删除该条数据?" @confirm="handleDelOne(record)">
  228. <a>删除</a>
  229. </a-popconfirm>
  230. </template>
  231. </span>
  232. </a-table>
  233. </a-card>
  234. <template slot="footer">
  235. <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
  236. </template>
  237. <sb-info-select-modal ref="sbInfoSelectModal" @selected="handleSbSelectd"/>
  238. <spare-store-select-modal ref="spareStoreSelectModal" @selected="handleSpareStoreSelected"/>
  239. <BomSpareStoreSelectModal ref="bomSpareStoreSelectModal" @selected="handleSpareStoreSelected"/>
  240. </a-modal>
  241. </template>
  242. <script>
  243. import pick from 'lodash.pick'
  244. import moment from 'moment'
  245. import { addPurchaseOrder2, updatePurchaseOrder2 } from '@/api/purchase/purchase-order'
  246. import SbInfoSelectModal from './SbInfoSelectModal'
  247. import SpareStoreSelectModal from '@/views/store/sparestore/modules/SpareStoreSelectModalYY3.vue'
  248. import BomSpareStoreSelectModal from './SpareStoreSelectModalYY.vue'
  249. import { fetchProjectTree } from '@/api/project/project'
  250. export default {
  251. name: 'BaseFillGather',
  252. components: {
  253. SpareStoreSelectModal,
  254. SbInfoSelectModal,
  255. BomSpareStoreSelectModal
  256. },
  257. data () {
  258. return {
  259. form: this.$form.createForm(this),
  260. visible: false,
  261. title: '新增',
  262. data: [],
  263. treeData: [],
  264. columns: [
  265. {
  266. title: '序号',
  267. dataIndex: 'index',
  268. customRender: (text, record, index) => {
  269. return index + 1
  270. }
  271. },
  272. {
  273. title: '物料名称',
  274. dataIndex: 'spareName'
  275. },
  276. {
  277. title: '存货编码',
  278. dataIndex: 'no'
  279. },
  280. {
  281. title: '规格型号',
  282. dataIndex: 'ggxh'
  283. },
  284. {
  285. title: '仓库名称',
  286. dataIndex: 'storeName'
  287. },
  288. {
  289. title: '货架号',
  290. dataIndex: 'storePosition'
  291. },
  292. {
  293. title: '物料简述',
  294. dataIndex: 'cdefine12',
  295. width: 150,
  296. scopedSlots: { customRender: 'cdefine12' }
  297. },
  298. {
  299. title: '单价',
  300. dataIndex: 'ftaxprice',
  301. width: 150,
  302. scopedSlots: { customRender: 'ftaxprice' }
  303. },
  304. {
  305. title: '申请数量',
  306. dataIndex: 'num',
  307. width: 150,
  308. scopedSlots: { customRender: 'num' }
  309. },
  310. {
  311. title: '操作',
  312. key: 'action',
  313. align: 'center',
  314. scopedSlots: { customRender: 'action' }
  315. }
  316. ],
  317. typeMap: {},
  318. ipqcMap: [],
  319. flagMap: {},
  320. model: {},
  321. sbId: null,
  322. rows: [],
  323. sortNums: [],
  324. params: {},
  325. directorMap: [],
  326. infoNum: 0,
  327. cptcodeMap: {},
  328. deptMap: {},
  329. soMap: {},
  330. date: false,
  331. cbustypeMap: {},
  332. confirmLoading: false,
  333. oldOrNew: null
  334. }
  335. },
  336. created () {
  337. this.flagMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.PROJECT_NEW_AND_OLD)
  338. this.typeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.LONG_YAN_PURCHASE_TYPE)
  339. this.cptcodeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.LONG_YAN_PURCHASE_ORDER_PLAN_TYPE)
  340. this.deptMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YONG_YOU_DEPT)
  341. this.cbustypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.LONG_YAN_PURCHASE_BUSINESS_TYPE)
  342. this.soMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SO_TYPE)
  343. },
  344. methods: {
  345. disabledDate (current) {
  346. // Can not select days before today and today
  347. return current && current < moment().endOf('day')
  348. },
  349. disabledDate2 (current) {
  350. // Can not select days before today and today
  351. return current && current <= this.date
  352. },
  353. dateChange (data) {
  354. console.log(data)
  355. this.date = data
  356. },
  357. base (record) {
  358. this.visible = true
  359. if (this.BaseTool.Object.isBlank(record)) {
  360. this.title = '新增'
  361. return
  362. }
  363. this.title = '编辑'
  364. this.data = record.detailVOS
  365. const { form: { setFieldsValue } } = this
  366. this.$nextTick(() => {
  367. setFieldsValue(Object.assign(pick(record, [
  368. 'id',
  369. 'sbId',
  370. 'type',
  371. 'oldOrNew',
  372. 'projectId',
  373. 'positionNo',
  374. 'cbmemo',
  375. 'cptcode',
  376. 'remark',
  377. 'cdepcode',
  378. 'cbustype',
  379. 'planGetDate',
  380. 'needDate'
  381. ])))
  382. })
  383. },
  384. // 获取巡检人与巡检主管信息
  385. handleSbSelect () {
  386. this.$refs.sbInfoSelectModal.base({})
  387. },
  388. handleSbSelectd (keys, rows) {
  389. const [ key ] = keys
  390. const [ row ] = rows
  391. const { form: { setFieldsValue } } = this
  392. this.sbId = key
  393. // 日期处理
  394. this.$nextTick(() => {
  395. setFieldsValue(Object.assign({
  396. 'sbId': key,
  397. 'positionNo': row.positionNo
  398. }))
  399. })
  400. },
  401. setTree (val) {
  402. console.log(val)
  403. this.oldOrNew = val
  404. fetchProjectTree({
  405. flag: val
  406. }).then((res) => {
  407. this.treeData = res.data
  408. })
  409. },
  410. save () {
  411. const { form: { validateFieldsAndScroll } } = this
  412. // this.confirmLoading = true
  413. validateFieldsAndScroll((errors, values) => {
  414. if (errors) {
  415. Object.values(errors).map(item => {
  416. this.$message.error(item.errors[0].message)
  417. })
  418. this.confirmLoading = false
  419. return
  420. }
  421. let status = 0
  422. values.needDate = values.needDate ? this.BaseTool.Date.formatter(values.needDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN) : null
  423. values.planGetDate = values.planGetDate ? this.BaseTool.Date.formatter(values.planGetDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN) : null
  424. values.detailDTOS = this.data.map(item => {
  425. if (!item.ftaxprice) {
  426. status++
  427. this.$message.error('请填写' + item.spareName + '单价')
  428. }
  429. if (!item.cdefine12) {
  430. status++
  431. this.$message.error('请填写' + item.spareName + '物料简述')
  432. }
  433. return item
  434. })
  435. if (status !== 0) {
  436. return
  437. }
  438. if (values.id) {
  439. updatePurchaseOrder2(values).then(res => {
  440. this.$message.success('修改成功!')
  441. this.handleCancel()
  442. })
  443. } else {
  444. addPurchaseOrder2(values).then(res => {
  445. this.$message.success('创建成功!')
  446. this.handleCancel()
  447. })
  448. }
  449. })
  450. },
  451. handleSpareStoreSelect () {
  452. console.log(this.oldOrNew)
  453. this.$refs.spareStoreSelectModal.base({ tokenType: this.oldOrNew })
  454. },
  455. handleBomSpareStoreSelect () {
  456. this.$refs.bomSpareStoreSelectModal.base({ tokenType: this.oldOrNew, sbId: this.sbId })
  457. },
  458. handleSpareStoreSelected (record, keys, rows) {
  459. console.log(rows)
  460. const { data } = this
  461. for (let i = 0; i < rows.length; i++) {
  462. let find = false
  463. for (let j = 0; j < data.length; j++) {
  464. if (rows[i].spareId === data[j].spareId) {
  465. find = true
  466. break
  467. }
  468. }
  469. if (!find) {
  470. const selectData = rows[i]
  471. selectData.storeNum = selectData.num
  472. selectData.num = 1
  473. data.push(selectData)
  474. }
  475. }
  476. },
  477. handleDelOne (record) {
  478. const data = [...this.data]
  479. this.data = data.filter(item => record.spareId !== item.spareId)
  480. },
  481. handleCancel (values) {
  482. this.visible = false
  483. this.data = []
  484. this.date = null
  485. this.params = {}
  486. this.form.resetFields()
  487. this.sbId = null
  488. this.oldOrNew = null
  489. this.$emit('ok', values)
  490. }
  491. }
  492. }
  493. </script>
  494. <style lang="less" scoped>
  495. .tooltip{
  496. font-size:20px;
  497. color:#ccc;
  498. &:hover {
  499. color:#2f54eb;
  500. }
  501. }
  502. </style>