BaseForm.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. <template>
  2. <a-modal
  3. :title="modalTitle"
  4. :width="800"
  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-form-item>
  13. <a-form-item
  14. label="退库单号"
  15. :labelCol="BaseTool.Constant.labelCol"
  16. :wrapperCol="BaseTool.Constant.wrapperCol"
  17. >
  18. <a-input
  19. disabled
  20. v-decorator="['pickNo']" />
  21. </a-form-item>
  22. <a-form-item
  23. label="仓库id"
  24. :labelCol="BaseTool.Constant.labelCol"
  25. :wrapperCol="BaseTool.Constant.wrapperCol"
  26. v-show="false"
  27. >
  28. <a-input
  29. v-decorator="['storeId', {rules: [{required: true, message: '仓库id不能为空'}]}]" />
  30. </a-form-item>
  31. <a-form-item
  32. label="仓库"
  33. :labelCol="BaseTool.Constant.labelCol"
  34. :wrapperCol="BaseTool.Constant.wrapperCol"
  35. >
  36. <a-input
  37. disabled
  38. style="width:70%;margin-right:5px"
  39. v-decorator="['storeName', {rules: [{required: true, message: '仓库名称不能为空'}]}]" />
  40. <a-button type="primary" @click="handleStoreSelect">选择仓库</a-button>
  41. </a-form-item>
  42. <a-form-item
  43. label="退库原因"
  44. :labelCol="BaseTool.Constant.labelCol"
  45. :wrapperCol="BaseTool.Constant.wrapperCol"
  46. >
  47. <a-select v-decorator="['type', {initialValue:DictCache.VALUE.SPARE_BACK_FORM_TYPE.QUESTION,rules: [{required: true, message: '退库类型不能为空'}]}]" placeholder="请选择">
  48. <a-select-option
  49. v-for="(label,value) in typeMap"
  50. :key="value"
  51. :label="label"
  52. :value="parseInt(value)">{{ label }}
  53. </a-select-option>
  54. </a-select>
  55. </a-form-item>
  56. <!--<a-form-item
  57. label="退库人"
  58. :labelCol="BaseTool.Constant.labelCol"
  59. :wrapperCol="BaseTool.Constant.wrapperCol"
  60. >
  61. <a-select v-decorator="['pickUserId', {rules: [{required: true, message: '退库人不能为空'}]}]" placeholder="请选择">
  62. <a-select-option
  63. v-for="item in userList"
  64. :key="item.userId"
  65. :label="item.realName"
  66. :value="item.userId">{{ item.realName }}
  67. </a-select-option>
  68. </a-select>
  69. </a-form-item>-->
  70. <a-form-item
  71. label="退库说明"
  72. :labelCol="BaseTool.Constant.labelCol"
  73. :wrapperCol="BaseTool.Constant.wrapperCol"
  74. >
  75. <a-input
  76. v-decorator="['reason', {rules: [{required: true, message: '退库说明不能为空'}]}]" />
  77. </a-form-item>
  78. <!--<a-form-item
  79. label="状态"
  80. :labelCol="BaseTool.Constant.labelCol"
  81. :wrapperCol="BaseTool.Constant.wrapperCol"
  82. >
  83. <a-select v-decorator="['status', {initialValue:DictCache.VALUE.SPARE_BACK_FORM_STATUS.APPROVAL_PENDING,rules: [{required: true, message: '状态不能为空'}]}]" placeholder="请选择">
  84. <a-select-option
  85. v-for="(label,value) in statusMap"
  86. :key="value"
  87. :label="label"
  88. :value="parseInt(value)">{{ label }}
  89. </a-select-option>
  90. </a-select>
  91. </a-form-item>-->
  92. <a-form-item
  93. label="备注"
  94. :labelCol="BaseTool.Constant.labelCol"
  95. :wrapperCol="BaseTool.Constant.wrapperCol"
  96. >
  97. <a-textarea
  98. :rows="4"
  99. v-decorator="['remark', {rules: [{required: false, message: '备注不能为空'}]}]"/>
  100. </a-form-item>
  101. </a-form>
  102. <a-tabs type="card" default-active-key="1">
  103. <a-tab-pane key="1" tab="退库详情">
  104. <div class="table-operator">
  105. <a-button size="small" type="primary" @click="handleSpareSelect">
  106. <a-icon type="plus"/>
  107. 添加
  108. </a-button>
  109. <a-button class="margin-left8" size="small" type="danger" @click="handleDel">
  110. <a-icon type="delete"/>
  111. 删除
  112. </a-button>
  113. </div>
  114. <a-table
  115. bordered
  116. :data-source="data"
  117. :columns="columns"
  118. tableLayout="auto"
  119. rowKey="id"
  120. :row-selection="rowSelection">
  121. <span slot="action" slot-scope="record">
  122. <template>
  123. <a @click="handleDetailSelect(record)">修改</a>
  124. </template>
  125. </span>
  126. </a-table>
  127. </a-tab-pane>
  128. </a-tabs>
  129. <detail-base-form ref="detailBaseForm" @selected="handleDetailSelected"/>
  130. <template slot="footer">
  131. <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
  132. </template>
  133. <repair-form-select-modal ref="repairSelectModal" @selected="handleRepairNoSelected"/>
  134. <store-select-modal ref="storeSelectModal" @selected="handleStoreSelected"/>
  135. <spare-store-select-modal ref="spareSelectModal" @selected="handleSpareSelected"/>
  136. </a-modal>
  137. </template>
  138. <script>
  139. import pick from 'lodash.pick'
  140. import { addSparePickForm, updateSparePickForm } from '@/api/store/sparebackform'
  141. import RepairFormSelectModal from '@/views/repair/form/modules/RepairFormSelectModal'
  142. import DetailBaseForm from './DetailBaseForm'
  143. import StoreSelectModal from '@/views/store/store/modules/StoreSelectModal'
  144. import SpareStoreSelectModal from '@/views/store/sparestore/modules/SpareStoreSelectModal'
  145. import { queryUser } from '@/api/upms/user'
  146. export default {
  147. name: 'BaseSpareBackForm',
  148. data () {
  149. return {
  150. confirmLoading: false,
  151. modalTitle: null,
  152. form: this.$form.createForm(this),
  153. visible: false,
  154. storeId: null,
  155. // 下拉框map
  156. typeMap: {},
  157. statusMap: {},
  158. userList: [],
  159. // 表头
  160. columns: [
  161. {
  162. title: '序号',
  163. dataIndex: 'index',
  164. customRender: (text, record, index) => {
  165. return index + 1
  166. }
  167. },
  168. {
  169. title: '备件名称',
  170. dataIndex: 'spareId',
  171. customRender: (text, record, index) => {
  172. return record.spareName
  173. }
  174. },
  175. {
  176. title: '退库数量',
  177. dataIndex: 'num'
  178. },
  179. {
  180. title: '库存价格',
  181. dataIndex: 'price'
  182. },
  183. {
  184. title: '总价',
  185. dataIndex: 'totalPrice'
  186. },
  187. {
  188. title: '操作',
  189. key: 'action',
  190. align: 'center',
  191. scopedSlots: { customRender: 'action' }
  192. }
  193. ],
  194. data: [],
  195. selectedRowKeys: [],
  196. selectedRows: [],
  197. options: {
  198. rowSelection: {
  199. selectedRowKeys: this.selectedRowKeys
  200. }
  201. },
  202. rowSelection: {
  203. onChange: (selectedRowKeys, selectedRows) => {
  204. this.selectedRowKeys = selectedRowKeys
  205. this.selectedRows = selectedRows
  206. }
  207. }
  208. }
  209. },
  210. components: {
  211. RepairFormSelectModal,
  212. DetailBaseForm,
  213. StoreSelectModal,
  214. SpareStoreSelectModal,
  215. },
  216. props: {
  217. },
  218. created () {
  219. // 下拉框map
  220. this.typeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SPARE_BACK_FORM_TYPE)
  221. this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SPARE_BACK_FORM_STATUS)
  222. this.getUsers()
  223. },
  224. methods: {
  225. getUsers () {
  226. queryUser({ status: 1 }).then(res => {
  227. this.userList = res.data
  228. })
  229. },
  230. base (record) {
  231. this.visible = true
  232. // 如果是空标识添加
  233. if (this.BaseTool.Object.isBlank(record)) {
  234. this.modalTitle = '添加'
  235. this.data = []
  236. return
  237. }
  238. this.modalTitle = '编辑'
  239. this.storeId = record.storeId
  240. const { form: { setFieldsValue } } = this
  241. // 日期处理
  242. this.$nextTick(() => {
  243. setFieldsValue(Object.assign(pick(record, [
  244. 'id',
  245. 'storeId',
  246. 'storeName',
  247. 'pickNo',
  248. 'type',
  249. 'reason',
  250. 'remark'
  251. ])))
  252. })
  253. this.data = record.detailList
  254. },
  255. save () {
  256. const { form: { validateFieldsAndScroll } } = this
  257. this.confirmLoading = true
  258. validateFieldsAndScroll((errors, values) => {
  259. if (errors) {
  260. this.confirmLoading = false
  261. return
  262. }
  263. if (this.data.length === 0) {
  264. this.$message.error('请添加退库详情')
  265. this.confirmLoading = false
  266. return
  267. }
  268. values.detailList = this.data
  269. // 日期处理
  270. if (this.BaseTool.String.isBlank(values.id)) {
  271. addSparePickForm(values)
  272. .then(() => {
  273. this.handleCancel(values)
  274. }).catch(() => {
  275. this.confirmLoading = false
  276. })
  277. } else {
  278. updateSparePickForm(values)
  279. .then(() => {
  280. this.handleCancel(values)
  281. }).catch(() => {
  282. this.confirmLoading = false
  283. })
  284. }
  285. })
  286. },
  287. handleCancel (values) {
  288. this.visible = false
  289. this.confirmLoading = false
  290. this.form.resetFields()
  291. if (this.BaseTool.Object.isNotBlank(values)) {
  292. this.$emit('ok', values)
  293. }
  294. },
  295. handleRepairNoSelect () {
  296. this.$refs.repairSelectModal.base()
  297. },
  298. handleRepairNoSelected (record, keys, rows) {
  299. const [ key ] = keys
  300. const [ row ] = rows
  301. const { form: { setFieldsValue } } = this
  302. this.$nextTick(() => {
  303. setFieldsValue(Object.assign({
  304. 'repairId': key,
  305. 'repaireNo': row.no
  306. }))
  307. })
  308. },
  309. handleSpareSelect () {
  310. if(this.storeId==null){
  311. this.$message.error("请先选择仓库")
  312. return
  313. }
  314. this.$refs.spareSelectModal.base({},{storeId:this.storeId})
  315. },
  316. handleSpareSelected (record, keys, rows) {
  317. const { data } = this
  318. const len = data.length
  319. for (let i = 0; i < rows.length; i++) {
  320. const row = rows[i]
  321. let flag = false
  322. for (let j = 0; j < len; j++) {
  323. if (row.spareId === data[j].spareId) {
  324. flag = true
  325. }
  326. }
  327. if (!flag) {
  328. row.totalPrice = row.price
  329. row.storeId = this.storeId
  330. row.price = row.price
  331. row.num = 1.00
  332. data.push(row)
  333. }
  334. }
  335. },
  336. handleDetailSelect (record) {
  337. this.$refs.detailBaseForm.base(record)
  338. },
  339. handleDetailSelected (record) {
  340. const { data } = this
  341. const myData = []
  342. const len = data.length
  343. for (let j = 0; j < len; j++) {
  344. if (record.spareId === data[j].spareId) {
  345. data[j].num = record.num
  346. data[j].totalPrice = record.totalPrice
  347. }
  348. myData.push(data[j])
  349. }
  350. this.data = myData
  351. },
  352. handleStoreSelect () {
  353. this.$refs.storeSelectModal.base()
  354. },
  355. handleStoreSelected (record, keys, rows) {
  356. const [ key ] = keys
  357. const [ row ] = rows
  358. const { form: { setFieldsValue } } = this
  359. this.storeId = key
  360. // 日期处理
  361. this.$nextTick(() => {
  362. setFieldsValue(Object.assign({
  363. 'storeId': key,
  364. 'storeName': row.name
  365. }))
  366. })
  367. },
  368. handleDel () {
  369. const data = [...this.data]
  370. if (this.selectedRowKeys.length === 0) {
  371. this.$message.error('请至少选择一条数据')
  372. return
  373. }
  374. this.data = data.filter(item => !this.selectedRowKeys.includes(item.id))
  375. }
  376. }
  377. }
  378. </script>