BaseForm.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  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. 'cptcode',
  375. 'remark',
  376. 'cdepcode',
  377. 'cbustype',
  378. 'planGetDate',
  379. 'needDate'
  380. ])))
  381. })
  382. },
  383. // 获取巡检人与巡检主管信息
  384. handleSbSelect () {
  385. this.$refs.sbInfoSelectModal.base({})
  386. },
  387. handleSbSelectd (keys, rows) {
  388. const [ key ] = keys
  389. const [ row ] = rows
  390. const { form: { setFieldsValue } } = this
  391. this.sbId = key
  392. // 日期处理
  393. this.$nextTick(() => {
  394. setFieldsValue(Object.assign({
  395. 'sbId': key,
  396. 'positionNo': row.positionNo
  397. }))
  398. })
  399. },
  400. setTree (val) {
  401. console.log(val)
  402. this.oldOrNew = val
  403. fetchProjectTree({
  404. flag: val
  405. }).then((res) => {
  406. this.treeData = res.data
  407. })
  408. },
  409. save () {
  410. const { form: { validateFieldsAndScroll } } = this
  411. // this.confirmLoading = true
  412. validateFieldsAndScroll((errors, values) => {
  413. if (errors) {
  414. Object.values(errors).map(item => {
  415. this.$message.error(item.errors[0].message)
  416. })
  417. this.confirmLoading = false
  418. return
  419. }
  420. values.needDate = values.needDate ? this.BaseTool.Date.formatter(values.needDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN) : null
  421. values.planGetDate = values.planGetDate ? this.BaseTool.Date.formatter(values.planGetDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN) : null
  422. values.detailDTOS = this.data
  423. if (values.id) {
  424. updatePurchaseOrder2(values).then(res => {
  425. this.$message.success('修改成功!')
  426. this.handleCancel()
  427. })
  428. } else {
  429. addPurchaseOrder2(values).then(res => {
  430. this.$message.success('创建成功!')
  431. this.handleCancel()
  432. })
  433. }
  434. })
  435. },
  436. handleSpareStoreSelect () {
  437. console.log(this.oldOrNew)
  438. this.$refs.spareStoreSelectModal.base({ tokenType: this.oldOrNew })
  439. },
  440. handleBomSpareStoreSelect () {
  441. this.$refs.bomSpareStoreSelectModal.base({ tokenType: this.oldOrNew, sbId: this.sbId })
  442. },
  443. handleSpareStoreSelected (record, keys, rows) {
  444. console.log(rows)
  445. const { data } = this
  446. for (let i = 0; i < rows.length; i++) {
  447. let find = false
  448. for (let j = 0; j < data.length; j++) {
  449. if (rows[i].spareId === data[j].spareId) {
  450. find = true
  451. break
  452. }
  453. }
  454. if (!find) {
  455. const selectData = rows[i]
  456. selectData.storeNum = selectData.num
  457. selectData.num = 1
  458. data.push(selectData)
  459. }
  460. }
  461. },
  462. handleDelOne (record) {
  463. const data = [...this.data]
  464. this.data = data.filter(item => record.spareId !== item.spareId)
  465. },
  466. handleCancel (values) {
  467. this.visible = false
  468. this.data = []
  469. this.date = null
  470. this.params = {}
  471. this.form.resetFields()
  472. this.sbId = null
  473. this.oldOrNew = null
  474. this.$emit('ok', values)
  475. }
  476. }
  477. }
  478. </script>
  479. <style lang="less" scoped>
  480. .tooltip{
  481. font-size:20px;
  482. color:#ccc;
  483. &:hover {
  484. color:#2f54eb;
  485. }
  486. }
  487. </style>