PurchaseAdjustmentArea.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. <template>
  2. <el-form
  3. ref="dataForm"
  4. class="form"
  5. v-loading="loading"
  6. :model="dataForm"
  7. :rules="dataFormRules"
  8. label-position="left"
  9. label-width="130px"
  10. >
  11. <el-form-item v-if="formDisabled" label="单据编号" prop="purchaseAdjustmentId">
  12. <el-input disabled :value="dataForm.purchaseAdjustmentId" />
  13. </el-form-item>
  14. <el-row :gutter="20">
  15. <el-col :xs="24" :sm="12">
  16. <el-form-item
  17. label="网点"
  18. prop="websitId"
  19. :rules="[{ required: true, message: '请选择网点', trigger: 'change' }]"
  20. >
  21. <el-select v-model="dataForm.websitId" :disabled="formDisabled" placeholder="请选择网点" style="width: 100%">
  22. <el-option v-for="(item, index) in authShop" :key="index" :label="item.name" :value="item.websitId" />
  23. </el-select>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :xs="24" :sm="12">
  27. <el-form-item
  28. label="采购单号"
  29. prop="ref"
  30. :rules="[
  31. { required: true, message: '请输入采购单号', trigger: 'blur' },
  32. {
  33. min: 16,
  34. max: 32,
  35. message: '请输入正确采购单号',
  36. trigger: 'change'
  37. }
  38. ]"
  39. >
  40. <el-input
  41. v-model="dataForm.ref"
  42. :disabled="formDisabled"
  43. autocomplete="off"
  44. placeholder="采购单号"
  45. @keyup.enter.native.prevent="getAndSaveSheet"
  46. >
  47. <el-button
  48. v-if="dataForm.purchaseAdjustmentId === ''"
  49. slot="append"
  50. icon="el-icon-search"
  51. @click.prevent="getAndSaveSheet"
  52. />
  53. </el-input>
  54. </el-form-item>
  55. </el-col>
  56. </el-row>
  57. <el-row :gutter="20">
  58. <el-col v-if="formDisabled" :xs="24" :sm="12">
  59. <el-form-item label="采购日期" prop="purchaseTime">
  60. <el-date-picker
  61. v-model="dataForm.purchaseTime"
  62. type="date"
  63. placeholder="选择日期"
  64. :disabled="formDisabled"
  65. style="width: 100%"
  66. />
  67. </el-form-item>
  68. </el-col>
  69. <el-col v-if="formDisabled" :xs="24" :sm="12">
  70. <el-form-item label="单据状态" prop="flag">
  71. <el-select v-model="dataForm.flag" disabled placeholder="单据状态" style="width: 100%">
  72. <el-option
  73. v-for="(item, index) in sheetFlagStr('select')"
  74. :key="index"
  75. :label="item.label"
  76. :value="item.value"
  77. />
  78. </el-select>
  79. </el-form-item>
  80. </el-col>
  81. </el-row>
  82. <el-form-item label="备注" prop="notes">
  83. <el-input
  84. v-model="dataForm.notes"
  85. autocomplete="off"
  86. placeholder="备注"
  87. :disabled="dataForm.flag !== 0 || inputParam.openType === 'view'"
  88. />
  89. </el-form-item>
  90. <el-row v-show="dataForm.purchaseAdjustmentId !== ''">
  91. <el-col :span="24">
  92. <el-divider>采购明细</el-divider>
  93. </el-col>
  94. <el-col :span="24">
  95. <el-table
  96. ref="goodsTable"
  97. :data="dataForm.items"
  98. max-height="500"
  99. size="mini"
  100. border
  101. header-cell-class-name="headerRowColor"
  102. style="width: 100%"
  103. >
  104. <el-table-column prop="goodsId" label="辅材编号" />
  105. <el-table-column prop="goodsName" label="辅材名称" min-width="160" />
  106. <el-table-column prop="cost" label="采购进价" header-align="left" align="center" />
  107. <el-table-column prop="recQty" label="采购数量" header-align="left" align="center" />
  108. <el-table-column prop="recGiftQty" label="采购赠品数量" header-align="left" align="center" />
  109. <el-table-column prop="inStockQty" label="采购入库数量" header-align="left" align="center" />
  110. <el-table-column prop="inStockCost" label="采购入库进价" header-align="left" align="center" />
  111. <el-table-column prop="adjustCost" label="调整进价" header-align="left" align="center">
  112. <template slot-scope="{ $index, row }">
  113. <label v-if="inputParam.openType === 'view' || dataForm.flag !== 0">{{ row.adjustCost }}</label>
  114. <el-form-item
  115. v-else
  116. style="margin: 18px 0"
  117. label-width="0"
  118. size="mini"
  119. :prop="'items.' + $index + '.adjustCost'"
  120. :rules="dataFormRules.adjustCost"
  121. >
  122. <el-input v-model="row.adjustCost" size="mini" />
  123. </el-form-item>
  124. </template>
  125. </el-table-column>
  126. <el-table-column prop="adjustQty" label="调整数量" header-align="left" align="center">
  127. <template slot-scope="{ $index, row }">
  128. <label v-if="inputParam.openType === 'view' || dataForm.flag !== 0">{{ row.adjustQty }}</label>
  129. <el-form-item
  130. v-else
  131. style="margin: 18px 0"
  132. label-width="0"
  133. size="mini"
  134. :prop="'items.' + $index + '.adjustQty'"
  135. :rules="dataFormRules.adjustQty"
  136. >
  137. <el-input v-model="row.adjustQty" size="mini" />
  138. </el-form-item>
  139. </template>
  140. </el-table-column>
  141. <el-table-column prop="adjustGiftQty" label="调整赠品数量" header-align="left" align="center">
  142. <template slot-scope="{ $index, row }">
  143. <label v-if="inputParam.openType === 'view' || dataForm.flag !== 0">{{ row.adjustGiftQty }}</label>
  144. <el-form-item
  145. v-else
  146. style="margin: 18px 0"
  147. label-width="0"
  148. size="mini"
  149. :prop="'items.' + $index + '.adjustGiftQty'"
  150. :rules="dataFormRules.adjustGiftQty"
  151. >
  152. <el-input v-model="row.adjustGiftQty" size="mini" />
  153. </el-form-item>
  154. </template>
  155. </el-table-column>
  156. <el-table-column prop="adjustInStockQty" label="调整入库数量" header-align="left" align="center" />
  157. <el-table-column prop="adjustInStockCost" label="调整入库进价" header-align="left" align="center" />
  158. <el-table-column prop="measureUnit" label="采购单位" />
  159. <el-table-column prop="unitQty" label="转换系数" header-align="left" align="center" />
  160. <el-table-column prop="salesUnit" label="售卖单位" />
  161. <el-table-column prop="productModel" label="商品型号" />
  162. <el-table-column prop="specification" label="规格" />
  163. </el-table>
  164. <el-row>
  165. <el-col :span="24"
  166. ><div style="padding-top: 15px">共 {{ dataForm.items.length }} 条记录</div></el-col
  167. >
  168. </el-row>
  169. </el-col>
  170. </el-row>
  171. <div style="text-align: right">
  172. <el-button @click="cancelForm">取 消</el-button>
  173. <el-button
  174. v-if="$restrict('edit') && dataForm.flag === 'SAVE'"
  175. type="primary"
  176. :disabled="saveBtn"
  177. @click="submitForm('edit')"
  178. >保 存</el-button
  179. >
  180. <el-button v-if="$restrict('submit') && dataForm.flag === 'SAVE'" type="success" @click="submitForm('submit')"
  181. >提 交</el-button
  182. >
  183. <el-button v-if="$restrict('confirm') && dataForm.flag === 'SUBMIT'" type="success" @click="submitForm('confirm')"
  184. >审 核</el-button
  185. >
  186. <el-button v-if="$restrict('revoke') && dataForm.flag === 'SUBMIT'" type="danger" @click="submitForm('revoke')"
  187. >撤 消</el-button
  188. >
  189. </div>
  190. </el-form>
  191. </template>
  192. <script>
  193. import {
  194. purchaseAdjustmentSheetDetail,
  195. purchaseAdjustmentSheetAdd,
  196. purchaseAdjustmentSheetEdit,
  197. purchaseAdjustmentSheetSubmit,
  198. purchaseAdjustmentSheetRevoke,
  199. purchaseAdjustmentSheetConfirm
  200. } from '@/api/material-system/shop/purchase-adjustment-sheet'
  201. import { getWebsit } from '@/api/customerManagement.js'
  202. export default {
  203. name: 'PurchaseAdjustmentArea',
  204. props: {
  205. inputParam: {
  206. type: Object,
  207. default: function () {
  208. return {
  209. openType: 'add',
  210. purchaseAdjustmentId: ''
  211. }
  212. }
  213. }
  214. },
  215. data() {
  216. const validateCost = (rule, value, callback) => {
  217. this.saveBtn = true
  218. if (!value) {
  219. return callback(new Error('不能为空'))
  220. }
  221. if (Number.isNaN(parseFloat(value))) {
  222. return callback(new Error('请输入数字值'))
  223. }
  224. if (parseFloat(value) <= 0) {
  225. return callback(new Error('必须大于0'))
  226. }
  227. this.saveBtn = false
  228. callback()
  229. }
  230. const validateQty = (rule, value, callback) => {
  231. this.saveBtn = true
  232. if (!value) {
  233. return callback(new Error('不能为空'))
  234. }
  235. if (Number.isNaN(parseFloat(value))) {
  236. return callback(new Error('请输入数字值'))
  237. }
  238. if (parseFloat(value) <= 0) {
  239. return callback(new Error('必须大于0'))
  240. }
  241. this.saveBtn = false
  242. callback()
  243. }
  244. const validateGiftQty = (rule, value, callback) => {
  245. this.saveBtn = true
  246. if (Number.isNaN(parseFloat(value))) {
  247. return callback(new Error('请输入数字值'))
  248. }
  249. if (parseFloat(value) < 0) {
  250. return callback(new Error('不能少于0'))
  251. }
  252. this.saveBtn = false
  253. callback()
  254. }
  255. return {
  256. loading: true,
  257. dataForm: {
  258. purchaseAdjustmentId: '',
  259. websitId: '', // 网点编号
  260. websitName: '', // 网点名称
  261. ref: '', // 采购单号
  262. purchaseTime: '', // 采购日期
  263. flag: '', // 状态
  264. notes: '', // 备注
  265. items: []
  266. },
  267. dataFormRules: {
  268. adjustCost: [{ validator: validateCost, trigger: 'blur' }],
  269. adjustQty: [{ validator: validateQty, trigger: 'blur' }],
  270. adjustGiftQty: [{ validator: validateGiftQty, trigger: 'blur' }]
  271. },
  272. saveBtn: false, // 保存按钮状态
  273. authShop: []
  274. }
  275. },
  276. computed: {
  277. formDisabled() {
  278. return this.dataForm.purchaseAdjustmentId !== ''
  279. }
  280. },
  281. mounted() {
  282. this.getDetail()
  283. getWebsit({ type: 'C', status: true }).then(res => {
  284. this.authShop = res.data
  285. })
  286. },
  287. methods: {
  288. sheetFlagStr(type, val, filterArrays) {
  289. const flag = [
  290. { label: '保存', value: 'SAVE' },
  291. { label: '提交', value: 'SUBMIT' },
  292. { label: '作废', value: 'FAIL' },
  293. { label: '已审核', value: 'OK' }
  294. ].filter(obj => {
  295. if (filterArrays) {
  296. return filterArrays.indexOf(obj.value) >= 0
  297. }
  298. return true
  299. })
  300. if (type === 'select') {
  301. // 下拉选择返回数组
  302. return flag
  303. } else if (type === 'label') {
  304. // 显示代号返回字符
  305. if (val === null || val === '') return ''
  306. const obj = flag.find(o => o.value === val)
  307. return obj ? obj.label : ''
  308. }
  309. return ''
  310. },
  311. // 获取详情
  312. getDetail(id) {
  313. this.loading = true
  314. const openType = this.inputParam.openType
  315. const purchaseAdjustmentId = id || this.inputParam.purchaseAdjustmentId
  316. if (openType !== 'add') {
  317. purchaseAdjustmentSheetDetail({ purchaseAdjustmentId }).then(res => {
  318. this.setDataForm(res.data)
  319. this.loading = false
  320. })
  321. } else {
  322. this.loading = false
  323. }
  324. },
  325. getAndSaveSheet() {
  326. this.$refs['dataForm'].validate(valid => {
  327. if (valid) {
  328. if (this.dataForm.purchaseAdjustmentId === '') {
  329. const params = {
  330. websitId: this.dataForm.websitId,
  331. websitName: this.authShop.find(item => item.websitId === this.dataForm.websitId)?.name,
  332. ref: this.dataForm.ref,
  333. notes: this.dataForm.notes
  334. }
  335. purchaseAdjustmentSheetAdd(params).then(res => {
  336. this.cancelForm()
  337. })
  338. }
  339. }
  340. })
  341. },
  342. setDataForm(data) {
  343. this.dataForm = {
  344. purchaseAdjustmentId: data.purchaseAdjustmentId,
  345. websitId: data.websitId,
  346. websitName: data.websitName,
  347. ref: data.ref,
  348. purchaseTime: data.purchaseTime,
  349. flag: data.flag,
  350. notes: data.notes,
  351. items: data.items
  352. }
  353. },
  354. submitForm(type) {
  355. if (type === 'edit') {
  356. this.$refs['dataForm'].validate(valid => {
  357. if (valid) {
  358. purchaseAdjustmentSheetEdit(this.dataForm).then(() => {
  359. this.$successMsg('保存成功')
  360. this.getDetail(this.dataForm.purchaseAdjustmentId)
  361. })
  362. }
  363. })
  364. } else {
  365. this[type + 'Sheet'](this.dataForm.purchaseAdjustmentId)
  366. }
  367. },
  368. cancelForm() {
  369. this.$parent.backUpdPage()
  370. },
  371. // 提交采购调整单
  372. submitSheet(purchaseAdjustmentId) {
  373. this.$confirm(`此操作将提交 ${purchaseAdjustmentId} 单据, 是否继续?`, '提示', {
  374. confirmButtonText: '确定',
  375. cancelButtonText: '取消',
  376. type: 'warning'
  377. })
  378. .then(() => {
  379. this.listLoading = true
  380. purchaseAdjustmentSheetSubmit({ purchaseAdjustmentId: purchaseAdjustmentId }).then(
  381. () => {
  382. this.inputParam.openType = 'view'
  383. this.getDetail(purchaseAdjustmentId)
  384. this.$successMsg('提交成功')
  385. },
  386. () => {
  387. this.loading = false
  388. }
  389. )
  390. })
  391. .catch(() => console.log('取消'))
  392. },
  393. // 撤消采购调整单
  394. revokeSheet(purchaseAdjustmentId) {
  395. this.$confirm(`此操作将撤消 ${purchaseAdjustmentId} 单据, 是否继续?`, '提示', {
  396. confirmButtonText: '确定',
  397. cancelButtonText: '取消',
  398. type: 'warning'
  399. })
  400. .then(() => {
  401. this.listLoading = true
  402. purchaseAdjustmentSheetRevoke({ purchaseAdjustmentId: purchaseAdjustmentId }).then(
  403. () => {
  404. this.inputParam.openType = 'edit'
  405. this.getDetail(purchaseAdjustmentId)
  406. this.$successMsg('撤消成功')
  407. },
  408. () => {
  409. this.loading = false
  410. }
  411. )
  412. })
  413. .catch(() => console.log('取消'))
  414. },
  415. // 审核采购调整单
  416. confirmSheet(purchaseAdjustmentId) {
  417. this.$confirm(`此操作将审核 ${purchaseAdjustmentId} 单据, 是否继续?`, '提示', {
  418. confirmButtonText: '确定',
  419. cancelButtonText: '取消',
  420. type: 'warning'
  421. })
  422. .then(() => {
  423. this.listLoading = true
  424. purchaseAdjustmentSheetConfirm({ purchaseAdjustmentId: purchaseAdjustmentId }).then(
  425. () => {
  426. this.getDetail(purchaseAdjustmentId)
  427. this.$successMsg('审核成功')
  428. },
  429. () => {
  430. this.loading = false
  431. }
  432. )
  433. })
  434. .catch(() => console.log('取消'))
  435. }
  436. }
  437. }
  438. </script>
  439. <style scoped>
  440. .form {
  441. padding: 0 20px;
  442. }
  443. </style>