<template> <view class=""> <com-empty-view v-if="jobList.length==0"></com-empty-view> <view v-if="jobList.length>0" style="padding-bottom: 110rpx;"> <uni-swipe-action ref="swipeAction"> <view v-for="(item, index) in jobList" :key="index"> <uni-swipe-action-item :right-options="detailOptions" @click="swipeClick($event,item)"> <com-receipt-job-card :dataContent="item" @click='openJobDetail(item)' :isShowSupplierQty='true' :isShowBatch='false' :isShowBatchDeliNo='true'></com-receipt-job-card> </uni-swipe-action-item> </view> </uni-swipe-action> </view> <view class="page-footer" v-if="jobList.length>0"> <button class="btn_single_clear" hover-class="btn_commit_after" @click="clearAll">清空</button> <button class="btn_single_commit" hover-class="btn_commit_after" @click="commit">提交</button> </view> <receipt-info-popup ref='jobInfoPopup'></receipt-info-popup> <receipt-job-list-popup ref="jobListPopup" @selectedItem="selectedItem"></receipt-job-list-popup> <win-scan-button @goScan='openScanPopup'></win-scan-button> <winScanPackJob :title="scanHintTitle" ref="scanPopup" @getResult='getScanResult'></winScanPackJob> <comMessage ref="comMessage"></comMessage> </view> </template> <script> import { getPurchaseReceiptASNJobList, takePurchaseReceiptJob, cancleTakePurchaseReceiptJob, purchaseReceiptJobSubmitASN } from '@/api/request2.js'; import { Decimal } from 'decimal.js'; //引入 import { getDetailOption, getDetailRemoveOption } from '@/common/array.js'; import { calc } from '@/common/calc' import winScanButton from '@/mycomponents/scan/winScanButton.vue' import winScanPackJob from "@/mycomponents/scan/winScanPackJob.vue" import comReceiptJobCard from '@/pages/purchaseReceipt/coms/comReceiptJobCard.vue' import receiptJobListPopup from '@/pages/purchaseReceipt/coms/receiptJobListPopup.vue' import receiptInfoPopup from '@/pages/purchaseReceipt/coms/receiptInfoPopup.vue' import comEmptyView from '@/mycomponents/common/comEmptyView.vue' export default { name: 'purchaseReceiptAsn', components: { winScanButton, winScanPackJob, comReceiptJobCard, receiptJobListPopup, receiptInfoPopup, comEmptyView }, data() { return { title: '', scanHintTitle: "箱标签/ASN单号", jobList: [], detailOptions: [], detailRemoveOption: [], }; }, onShow() {}, onLoad(option) { this.title = option.title uni.setNavigationBarTitle({ title: this.title }) this.detailOptions = getDetailOption(); this.detailRemoveOption = getDetailRemoveOption(); }, onNavigationBarButtonTap(e) { if (e.index === 0) { this.$refs.receiptjob.goHome(); // this.$refs.receiptjob.refresh(); } else if (e.index == 1) { this.$refs.receiptjob.openFilter(); } }, onShow() { uni.$on('updateData', (data) => { this.jobList.forEach(item => { if (item.asnNumber == data.asnNumber && item.itemCode == data.itemCode && item.batch == data.batch) { if (data.handleQty) { item.scaned = true } else { item.scaned = false } item.packingNumber = data.packingNumber item.packQty = data.packQty item.packUnit = data.packUnit item.toLocationCode = data.toLocationCode item.labelQty = data.labelQty item.handleQty = data.handleQty item.convertRate = data.convertRate item.supplierQty = data.supplierQty item.supplierUom = data.supplierUom item.packageDOS = data.packList } }) }) }, methods: { openScanPopup() { this.$refs.scanPopup.openScanPopup(); }, getScanResult(result) { uni.showLoading({ title: "加载中....", mask: true }); const asnNumber = result.label.asn || result.label.code const isAsn = result.label.code ? true : false try { if (!asnNumber) { this.showMessage("标签格式异常,请重新补打标签") uni.hideLoading(); return; } this.scanMessage = "" let filters = [] // ASN单号 filters = [{ column: "asn_number", action: "==", value: asnNumber }, { column: "status", action: "in", value: '1,2', }, { column: "accept_user_id", action: "==", value: this.$store.state.user.id }] getPurchaseReceiptASNJobList({ filters: filters, pageNo: 1, pageSize: 100, }).then(async res => { this.scanMessage = result.scanMessage let resultList = res.data.list; uni.hideLoading() if (resultList.length > 0) { // 判断目前是否有已扫描的asn单号 const asnObj = this.jobList.find(item => item.asnNumber == asnNumber) // 如果扫描箱标签 if (!isAsn) { result.label.lookNumber = result.package.number.substring(result.package.number .length - 5); // 扫描的箱标签asn单号不在列表中给个提示 if (!asnObj) { this.$refs.comMessage.showQuestionMessage(`ASN单号【${asnNumber}】不在列表中,是否要按此ASN收货?`, async res => { if (res) { // 承接任务 // 如果任务状态是待处理的情况需要承接 if (resultList[0].status == '1') { await this.handleTakePurchaseReceiptJob(resultList[0].masterId, () => { resultList.forEach(item => { item.status = '2' item.acceptUserId = 4 }) }) } else if (resultList[0].status == '2') { // 如果任务状态是进行中的时候需要判断承接人和登录人是否一致 if (resultList[0].acceptUserId != this.$store.state.user.id) { this.showMessage(`ASN单号【${asnNumber}】已经被${resultList[0].acceptUserName}承接`) return } } this.jobList = [...this.jobList, ...resultList] const itemObj = this.jobList.find(item => item.asnNumber == asnNumber && item .itemCode == result.label.itemCode) const packObj = itemObj.packageDOS.find(cur => cur.number == result.label .packingNumber) if (packObj.requestNumber) { this.showMessage(`看板编号【${ result.label.lookNumber}】已经收货`) return } if (packObj.scaned) { this.showMessage(`看板编号【${ result.label.lookNumber}】已经扫描`) return } itemObj.scaned = true packObj.scaned = true packObj.handleQty = result.label.qty packObj.packingNumber = result.package.number packObj.packQty = Number(result.package.packQty); packObj.packUnit = result.package.packUnit packObj.labelQty = Number(result.label.qty); packObj.convertRate = result.label.convertRate packObj.supplierQty = parseFloat(calc.div(parseFloat(packObj.handleQty), parseFloat(packObj.convertRate)).toFixed(5)) packObj.supplierUom = result.label.purchaseUom this.calcHandleQty(this.jobList); this.scanPopupGetFocus() }else{ this.scanPopupGetFocus() } }); } else { // 扫描的箱标签asn单号已经在列表中 const itemObj = this.jobList.find(item => item.asnNumber == asnNumber && item.itemCode == result .label.itemCode) if (!itemObj) { this.showMessage(`ASN单号【${asnNumber}】物料代码【${result.label.itemCode}】不在列表中 `) return } const packObj = itemObj.packageDOS.find(cur => cur.number == result.label.packingNumber) if (!packObj) { this.showMessage( `ASN单号【${asnNumber}】物料代码【${result.label.itemCode}】不存在看板编号【${ result.label.lookNumber}】`) return } if (packObj.requestNumber) { this.showMessage(`看板编号【${ result.label.lookNumber}】已经收货`) return } if (packObj.scaned) { this.showMessage(`看板编号【${ result.label.lookNumber}】已扫描`) return } itemObj.scaned = true packObj.scaned = true packObj.handleQty = result.label.qty this.calcHandleQty(this.jobList); this.scanPopupGetFocus() } } else { // if (asnObj) { // this.showMessage("此ASN关联的采购收货任务已扫描") // return; // } // 承接任务 // 如果任务状态是待处理的情况需要承接 if (resultList[0].status == '1') { await this.handleTakePurchaseReceiptJob(resultList[0].masterId, () => { resultList.forEach(item => { item.status = '2' item.acceptUserId = this.$store.state.user.id }) }) } else if (resultList[0].status == '2') { // 如果任务状态是进行中的时候需要判断承接人和登录人是否一致 if (resultList[0].acceptUserId != this.$store.state.user.id) { this.showMessage(`ASN单号【${asnNumber}】已经被${resultList[0].acceptUserName}承接`) return } } this.jobList = [...this.jobList, ...resultList] this.scanPopupGetFocus() } } else { this.showMessage("未查询到此ASN关联的采购收货任务") } }).catch(error => { this.showMessage(error + "\n扫描[" + result.scanMessage + "]") this.scanPopupGetFocus() }) } catch (e) { this.showMessage(e.message) this.scanPopupGetFocus() } }, calcHandleQty(detailSource) { for (let item of detailSource) { item.handleQty = new Decimal(0).toNumber(); // item.qty = new Decimal(0).toNumber(); for (let detail of item.packageDOS) { if (detail != undefined) { if (detail.scaned) { item.handleQty = calc.add(item.handleQty, detail.handleQty); } // item.qty = calc.add(item.qty, detail.qty); } } } }, async handleTakePurchaseReceiptJob(id, callback) { await takePurchaseReceiptJob(id).then(res => { uni.hideLoading(); callback() }).catch(error => { uni.hideLoading(); this.showErrorMessage(error) }) }, showMessage(message) { if (this.$refs.scanPopup) { this.$refs.scanPopup.packLoseFocus() } this.$refs.comMessage.showErrorMessage(message, res => { if (res) { if (this.$refs.scanPopup) { this.$refs.scanPopup.packGetFocus() } } }); }, swipeClick(e, dataContent) { if (e.content.text == "详情") { this.openjobInfoPopup(dataContent); } else if (e.content.text == "移除") { this.$refs.comMessage.showQuestionMessage("是否要移除当前收货明细?", res => { if (res) { this.jobList = this.jobList.filter(item => item.asnNumber != dataContent.asnNumber || item.itemCode != dataContent.itemCode) const isHave = this.jobList.some(item => item.asnNumber == dataContent.asnNumber) if (!isHave) { //取消承接任务 cancleTakePurchaseReceiptJob(dataContent.masterId).then(res => { }).catch(error => {}) } } }); } }, openjobInfoPopup(item) { this.$refs.jobInfoPopup.openPopup(item) }, showErrorMessage(message) { if (this.$refs.scanPopup) { this.$refs.scanPopup.losefocus(); } setTimeout(r => { this.$refs.comMessage.showErrorMessage(message, res => { if (res) { this.scanPopupGetFocus() } }); }) }, openJobDetail(item) { uni.navigateTo({ url: './purchaseReceiptAsnDetail?data=' + encodeURIComponent(JSON.stringify(item)) }); }, clearAll() { this.$refs.comMessage.showQuestionMessage("是否确认要清空ASN收货列表?", async res => { if (res) { let masterIds = Array.from(new Set(this.jobList.map(item => item.masterId))) let index = 0 //取消承接任务 await this.handleCancleTakePurchaseReceiptJob(index, masterIds) } }); }, async handleCancleTakePurchaseReceiptJob(index, masterIds) { if (index <= masterIds.length - 1) { await cancleTakePurchaseReceiptJob(masterIds[index]).then(res => { this.jobList = [] index++ this.handleCancleTakePurchaseReceiptJob(index, masterIds) }).catch(error => {}) } else { uni.navigateBack({ delta: 2 }); } }, commit(){ let str ='' let str1 ='' this.params = [] let obj = {} let obj1 = {} this.jobList.forEach(item=>{ if(item.scaned){ obj = {...item} obj.id = item.masterId if(this.params.some(i => i.asnNumber == item.asnNumber)){ item.packageDOS.forEach(cur=>{ if(cur.scaned){ obj1 = { ...cur, ...item, packingNumber:cur.number, number:'', deliNo:item.deliNo, itemCode:item.itemCode, itemDesc:item.itemDesc, itemDesc1:item.itemDesc1, itemDesc2:item.itemDesc2, itemName:item.itemName, backNumber:item.backNumber, packQty:cur.packQty, packUnit:cur.packUnit, purchaseQty:cur.purchaseQty, purchaseStdQty:cur.purchaseStdQty, purchaseUom:cur.purchaseUom, qty:item.qty, remark:cur.remark, supplierBatch:cur.supplierBatch, supplierCode:cur.supplierCode, toLocationCode:item.toLocationCode, uom:item.uom, handleQty:cur.handleQty, qty:item.qty, } obj.subList.push(obj1) } }) }else{ obj.subList=[] item.packageDOS.forEach(cur=>{ if(cur.scaned){ obj1 = { ...cur, ...item, packingNumber:cur.number, number:'', deliNo:item.deliNo, itemCode:item.itemCode, itemDesc:item.itemDesc, itemDesc1:item.itemDesc1, itemDesc2:item.itemDesc2, itemName:item.itemName, backNumber:item.backNumber, packQty:cur.packQty, packUnit:cur.packUnit, purchaseQty:cur.purchaseQty, purchaseStdQty:cur.purchaseStdQty, purchaseUom:cur.purchaseUom, qty:item.qty, remark:cur.remark, supplierBatch:cur.supplierBatch, supplierCode:cur.supplierCode, toLocationCode:item.toLocationCode, uom:item.uom, handleQty:cur.handleQty, qty:item.qty, } obj.subList.push(obj1) } }) this.params.push(obj) } } if(item.handleQty>0 && item.handleQty < item.qty){ str += `ASN单号${item.asnNumber}】物料代码【${item.itemCode}】实际收货数量【${item.handleQty}】小于任务数量【${item.qty}】,\n` } if(!item.handleQty){ str1 += `ASN单号${item.asnNumber}】物料代码【${item.itemCode}】实际收货数量为0,\n` } }) this.params.forEach(item=>{ delete item.packageDOS item.subList.forEach(cur=>{ delete cur.packageDOS, delete item.masterId }) }) //提交 if(str || str1){ this.$refs.comMessage.showQuestionMessage1(str + '对于未收货部分将创建一个新的收货任务\n'+ str1 +'是否确认提交', 'red', res => { if (res) { this.submitJob() } }); }else{ this.submitJob() } }, submitJob(){ purchaseReceiptJobSubmitASN(this.params).then(res => { if (res.data) { // this.showCommitSuccessMessage("提交成功\n生成采购上架记录\n" + res.data) let str ='' let str1 ='' res.data.forEach(item=>{ if(item.isSuccess === 0 || item.isSuccess === '0'){ str+= `ASN单号【${item.asnNumber}】提交成功,生成采购收货记录,${item.recordNumber}\n` }else{ str1+= `ASN单号【${item.asnNumber}】提交失败,失败原因:${item.message}\n` } }) if(str){ this.showCommitSuccessMessage(str+str1) }else{ this.$refs.comMessage.showErrorMessage(str1); } } else { // this.showErrorMessage("提交失败[" + res.msg + "]") this.$refs.comMessage.showErrorMessage("提交失败[" + res.msg + "]"); } }).catch(error => { uni.hideLoading() this.$refs.comMessage.showErrorMessage(error); }) }, showCommitSuccessMessage(hint) { this.$refs.comMessage.showSuccessMessage(hint, res => { uni.navigateBack({ delta:1 }) }) }, scanPopupGetFocus() { if (this.$refs.scanPopup != undefined) { this.$refs.scanPopup.packGetFocus(); } }, }, onBackPress(options) { if (options.from === 'navigateBack') { return false; } if (this.jobList.length > 0) { this.$refs.comMessage.showQuestionMessage("是否要放弃当前的扫描信息?", async res => { if (res) { let masterIds = Array.from(new Set(this.jobList.map(item => item.masterId))) let index = 0 //取消承接任务 await this.handleCancleTakePurchaseReceiptJob(index, masterIds) } }); return true } }, } </script> <style scoped lang="scss"> .page-footer { display: flex; justify-content: flex-end; background: white; padding: 10rpx 20rpx; position: fixed; width: 100%; bottom: 0px; } .btn_single_commit, .btn_single_clear { margin: 0px; } .btn_single_clear { margin-right: 20rpx; } </style>