BaseForm.vue 15 KB

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