BaseForm.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  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="parseInt(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-select v-decorator="['projectId']" placeholder="请选择">
  174. <a-select-option
  175. v-for="{name,id} in treeData"
  176. :key="id"
  177. :label="name"
  178. :value="id">{{ name }}
  179. </a-select-option>
  180. </a-select>
  181. </a-form-item>
  182. </row-item>
  183. </row-list>
  184. </a-form>
  185. </a-card>
  186. <a-card>
  187. <div class="table-operator" style="margin-bottom: 8px;">
  188. <a-button size="small" :disabled="!oldOrNew" type="primary" @click="handleSpareStoreSelect">
  189. <a-icon type="plus"/>
  190. 物料库添加
  191. </a-button>
  192. <!-- <a-button size="small" :disabled="!(oldOrNew&&sbId)" style="margin-left:20px;" type="primary" @click="handleBomSpareStoreSelect">
  193. <a-icon type="plus"/>
  194. BOM添加
  195. </a-button> -->
  196. </div>
  197. <a-table
  198. bordered
  199. :data-source="data"
  200. :columns="columns"
  201. tableLayout="auto"
  202. rowKey="id"
  203. >
  204. <template slot="num" slot-scope="text, record">
  205. <a-input v-model="record.num" />
  206. </template>
  207. <span slot="action" slot-scope="record">
  208. <template>
  209. <a-popconfirm title="是否要删除该条数据?" @confirm="handleDelOne(record)">
  210. <a>删除</a>
  211. </a-popconfirm>
  212. </template>
  213. </span>
  214. </a-table>
  215. </a-card>
  216. <template slot="footer">
  217. <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
  218. </template>
  219. <sb-info-select-modal ref="sbInfoSelectModal" @selected="handleSbSelectd"/>
  220. <spare-store-select-modal ref="spareStoreSelectModal" @selected="handleSpareStoreSelected"/>
  221. <BomSpareStoreSelectModal ref="bomSpareStoreSelectModal" @selected="handleSpareStoreSelected"/>
  222. </a-modal>
  223. </template>
  224. <script>
  225. import pick from 'lodash.pick'
  226. import moment from 'moment'
  227. import { addPurchaseOrder2, updatePurchaseOrder2 } from '@/api/purchase/purchase-order'
  228. import SbInfoSelectModal from './SbInfoSelectModal'
  229. import SpareStoreSelectModal from '@/views/store/sparestore/modules/SpareStoreSelectModalYY3.vue'
  230. import BomSpareStoreSelectModal from './SpareStoreSelectModalYY.vue'
  231. import { fetchSbTypeTree } from '@/api/project/project'
  232. export default {
  233. name: 'BaseFillGather',
  234. components: {
  235. SpareStoreSelectModal,
  236. SbInfoSelectModal,
  237. BomSpareStoreSelectModal
  238. },
  239. data () {
  240. return {
  241. form: this.$form.createForm(this),
  242. visible: false,
  243. title: '新增',
  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: 'storeName'
  269. },
  270. {
  271. title: '货架号',
  272. dataIndex: 'storePosition'
  273. },
  274. {
  275. title: '申请数量',
  276. dataIndex: 'num',
  277. width: 150,
  278. scopedSlots: { customRender: 'num' }
  279. },
  280. {
  281. title: '操作',
  282. key: 'action',
  283. align: 'center',
  284. scopedSlots: { customRender: 'action' }
  285. }
  286. ],
  287. typeMap: {},
  288. ipqcMap: [],
  289. flagMap: {},
  290. tokenType: 1,
  291. model: {},
  292. sbId: null,
  293. rows: [],
  294. sortNums: [],
  295. params: {},
  296. directorMap: [],
  297. infoNum: 0,
  298. cptcodeMap: {},
  299. deptMap: {},
  300. soMap: {},
  301. date: false,
  302. cbustypeMap: {},
  303. confirmLoading: false,
  304. oldOrNew: null
  305. }
  306. },
  307. created () {
  308. this.flagMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.PROJECT_NEW_AND_OLD)
  309. this.typeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.LONG_YAN_PURCHASE_TYPE)
  310. this.cptcodeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.LONG_YAN_PURCHASE_ORDER_PLAN_TYPE)
  311. this.deptMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YONG_YOU_DEPT)
  312. this.cbustypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.LONG_YAN_PURCHASE_BUSINESS_TYPE)
  313. this.soMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SO_TYPE)
  314. this.setTree(1)
  315. },
  316. methods: {
  317. disabledDate (current) {
  318. // Can not select days before today and today
  319. return current && current < moment().endOf('day')
  320. },
  321. disabledDate2 (current) {
  322. // Can not select days before today and today
  323. return current && current <= this.date
  324. },
  325. dateChange (data) {
  326. console.log(data)
  327. this.date = data
  328. },
  329. base (record) {
  330. this.visible = true
  331. if (this.BaseTool.Object.isBlank(record)) {
  332. this.title = '新增'
  333. return
  334. }
  335. this.title = '编辑'
  336. this.data = record.detailVOS
  337. const { form: { setFieldsValue } } = this
  338. this.$nextTick(() => {
  339. setFieldsValue(Object.assign(pick(record, [
  340. 'id',
  341. 'sbId',
  342. 'type',
  343. 'oldOrNew',
  344. 'projectId',
  345. 'positionNo',
  346. 'cptcode',
  347. 'remark',
  348. 'cdepcode',
  349. 'cbustype',
  350. 'planGetDate',
  351. 'needDate'
  352. ])))
  353. })
  354. },
  355. // 获取巡检人与巡检主管信息
  356. handleSbSelect () {
  357. this.$refs.sbInfoSelectModal.base({})
  358. },
  359. handleSbSelectd (keys, rows) {
  360. const [ key ] = keys
  361. const [ row ] = rows
  362. const { form: { setFieldsValue } } = this
  363. this.sbId = key
  364. // 日期处理
  365. this.$nextTick(() => {
  366. setFieldsValue(Object.assign({
  367. 'sbId': key,
  368. 'positionNo': row.positionNo
  369. }))
  370. })
  371. },
  372. setTree (val) {
  373. console.log(val)
  374. this.oldOrNew = val
  375. fetchSbTypeTree({
  376. flag: val,
  377. type: 2
  378. }).then((res) => {
  379. this.treeData = res.data
  380. })
  381. },
  382. save () {
  383. const { form: { validateFieldsAndScroll } } = this
  384. // this.confirmLoading = true
  385. validateFieldsAndScroll((errors, values) => {
  386. if (errors) {
  387. Object.values(errors).map(item => {
  388. this.$message.error(item.errors[0].message)
  389. })
  390. this.confirmLoading = false
  391. return
  392. }
  393. values.needDate = values.needDate ? this.BaseTool.Date.formatter(values.needDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN) : null
  394. values.planGetDate = values.planGetDate ? this.BaseTool.Date.formatter(values.planGetDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN) : null
  395. values.detailDTOS = this.data
  396. if (values.id) {
  397. updatePurchaseOrder2(values).then(res => {
  398. this.$message.success('修改成功!')
  399. this.handleCancel()
  400. })
  401. } else {
  402. addPurchaseOrder2(values).then(res => {
  403. this.$message.success('创建成功!')
  404. this.handleCancel()
  405. })
  406. }
  407. })
  408. },
  409. handleSpareStoreSelect () {
  410. this.$refs.spareStoreSelectModal.base({ tokenType: this.params.oldOrNew })
  411. },
  412. handleBomSpareStoreSelect () {
  413. this.$refs.bomSpareStoreSelectModal.base({ tokenType: this.params.oldOrNew, sbId: this.sbId })
  414. },
  415. handleSpareStoreSelected (record, keys, rows) {
  416. console.log(rows)
  417. const { data } = this
  418. for (let i = 0; i < rows.length; i++) {
  419. let find = false
  420. for (let j = 0; j < data.length; j++) {
  421. if (rows[i].spareId === data[j].spareId) {
  422. find = true
  423. break
  424. }
  425. }
  426. if (!find) {
  427. const selectData = rows[i]
  428. selectData.storeNum = selectData.num
  429. selectData.num = 1
  430. data.push(selectData)
  431. }
  432. }
  433. },
  434. handleDelOne (record) {
  435. const data = [...this.data]
  436. this.data = data.filter(item => record.spareId !== item.spareId)
  437. },
  438. handleCancel (values) {
  439. this.visible = false
  440. this.data = []
  441. this.date = null
  442. this.params = {}
  443. this.form.resetFields()
  444. this.sbId = null
  445. this.$emit('ok', values)
  446. }
  447. }
  448. }
  449. </script>
  450. <style lang="less" scoped>
  451. .tooltip{
  452. font-size:20px;
  453. color:#ccc;
  454. &:hover {
  455. color:#2f54eb;
  456. }
  457. }
  458. </style>