<template> <view> <uni-popup ref="popup" :maskClick='false'> <view class=""> <view class="popup_box"> <view class="pop_title"> 扫描箱码 <text class="fr" @click="closeScanPopup()">关闭</text> </view> <!-- <view class="uni-flex uni-row" style="align-items: center; background-color: #fff; margin-left: 20rpx; margin-right: 20rpx; padding:20rpx; border-radius: 8rpx;"> <view class="uni-center"> 位置 : </view> <view class="" style="width: 75%;padding: 0rpx"> <view class="uni-flex u-col-center uni-row" @click="showSelect"> <view class="" style="margin-left: 15rpx;font-size: 30rpx;"> {{positionInfo}} </view> <u-select v-model="show" mode="mutil-column-auto" :list="positionList" :defaultValue="defaultValueList" @confirm="confirmSelect"></u-select> </view> </view> </view> --> <!-- <u-line class='line_color'></u-line> --> <view class="uni-flex uni-row" style="align-items: center; background-color: #fff; margin-left: 20rpx; margin-right: 20rpx; margin-top: 8rpx; border-radius: 8rpx;"> <view class="uni-center" style="width: 25%; "> 来源库位 </view> <view class="" style="width: 75%; padding: 8rpx;"> <uni-combox :candidates="fromLocationList" v-model="fromLocationCode" placeholder="请选择库位" @confirm="fromLocationUpdate"></uni-combox> </view> </view> <view class=""> <view class=""> <win-com-scan ref="comscan" placeholder="箱标签" @getResult="onScan" :clearResult="true" :isShowHistory="false"> </win-com-scan> <view style="width: 100%;"> <view style="width: 100%;" v-if="issueRecord.length>0"> <view class="uni-flex uni-row space-between u-col-center"> <view class="" style="padding: 10rpx;"> 历史记录 </view> <view class="" style="padding-right: 10rpx;"> <u-icon :name="expendIcon" size="35rpx" @click="expands()"></u-icon> </view> </view> <u-line class='line_color' style='padding-top: 10rpx;padding-bottom: 20rpx;'> </u-line> <scroll-view scroll-y="true" class="scroll-view" v-if="expand&&issueRecord.length>0"> <view class="uni-flex u-col" v-for="(record,index) in issueRecord"> <view style="width: 100%;"> <uni-swipe-action ref="swipeAction"> <uni-swipe-action-item @click="swipeClick($event,record,index)" :right-options="scanOptions"> <view style="padding: 0px 10px"> <balance :dataContent="record" :isShowFromLocation="false" :isShowStdPack="false"></balance> </view> </uni-swipe-action-item> </uni-swipe-action> <u-line class='line_color'></u-line> </view> </view> </scroll-view> </view> </view> </view> </view> </view> </view> </uni-popup> <balance-select ref="balanceSelect" @onSelectItem='selectBalanceItem'></balance-select> <com-message ref="comMessage"></com-message> <balance-qty-edit ref="balanceQtyEdit" @confirm="confirm" :isShowStatus="true"></balance-qty-edit> </view> </template> <script> import comMessage from '@/mycomponents/common/comMessage.vue' import winComScan from '@/mycomponents/scan/winComScan.vue' import balance from '@/mycomponents/balance/balance.vue' import balanceQtyEdit from '@/mycomponents/qty/balanceQtyEdit.vue' import balanceSelect from '@/mycomponents/balance/balanceSelect.vue' import { getDetailOption, getDetailEditRemoveOption } from '@/common/array.js'; import { getWorkShopLineStation } from '@/api/request2.js'; import { getBalanceByManagementPrecision } from '@/common/balance.js'; export default { name: 'winScanPack', components: { comMessage, winComScan, balance, balanceQtyEdit, balanceSelect }, props: { title: { type: String, default: '' }, }, data() { return { dataContent: {}, jobContent: {}, expendIcon: 'arrow-down', show: false, scanList: [], toLocation: null, toLocationCode: '', fromLocationList: [], fromLocationCode: '', fromLocation: null, issueRecord: [], //发料历史 expand: true, scanOptions: {}, editItem: {}, positionInfo: "请选择位置", positionList: [], defaultValueList: [], fromInventoryStatuses: "", packageInfo: {}, label: {} } }, created() { }, watch: {}, mounted() { this.detailOptions = getDetailOption(); this.scanOptions = getDetailEditRemoveOption(); }, methods: { openScanPopup(content, jobcontent) { this.issueRecord = []; this.dataContent = content; this.jobContent = jobcontent; this.initData(); // this.positionInfo = this.jobContent.workShopCode + "-" + this.jobContent.subList[0].productionLineCode + // "-" + this.jobContent.subList[0].workStationCode this.$refs.popup.open('bottom'); }, closeScanPopup() { this.$refs.popup.close(); this.$emit("closeScan") //清除数据,恢复默认值 // Object.assign(this.$data, this.$options.data()); }, initData() { let that = this; that.fromLocationList = []; if (that.dataContent != null) { that.fromInventoryStatuses = this.jobContent.outInventoryStatuses that.toLocation = that.dataContent[0]; that.toLocationCode = that.dataContent[0].toLocationCode; that.fromLocationList = that.getFromLocationList(); } }, showBalanceSelect(items) { this.$refs.balanceSelect.openPopup(items); }, getFromLocationList() { let list = []; this.dataContent.forEach(location => { location.Items.forEach(item => { item.Locations.forEach(f => { let item = list.find(l => l == f.fromLocationCode); if (item == undefined) { list.push(f.fromLocationCode) } }) }) }); this.fromLocationCode = list[0]; return list; }, fromLocationUpdate(fromlocation) { let location = this.fromLocationList.find(r => r == fromlocation) if (location == undefined) { this.fromLocationCode = '' this.showErrorMessage('发料库位【' + fromlocation + '】不存在') } }, onScan(result) { try { let that = this; if (that.fromLocationCode == '') { that.showErrorMessage('请选择来源库位', res => { that.$refs.toLocationCombox.onFocus(); }); return; } that.label = result.label; that.packageInfo = result.package; // let packageInfo = result.package; let itemCode = result.label.itemCode; let packingCode = result.label.packingNumber; let lot = result.label.batch; let item = that.toLocation.Items.find(r => r.itemCode == itemCode); if (item == undefined) { that.showErrorMessage('未查找到零件【' + itemCode + '】的发料明细', res => { that.getfocus(); } ) return; } else { //查找库存信息 uni.showLoading({ title: '加载中', mask: true }) getBalanceByManagementPrecision(result.label, that.fromLocationCode, that.fromInventoryStatuses, balanceRes => { if (balanceRes.success) { if (balanceRes.data.list.length == 0) { this.showErrorMessage('在来源库位[' + this.fromLocationCode + '],未查找到该包装的库存记录', res => { this.packGetFocus(); }) } else if (balanceRes.data.list.length == 1) { let balance = balanceRes.data.list[0]; this.afterGetBalance(result.label, balance, that.packageInfo); } else { this.showBalanceSelect(balanceRes.data.list); } } else { this.showErrorMessage(balanceRes.message.message); } uni.hideLoading(); }); } } catch (e) { this.showErrorMessage(e.stack) uni.hideLoading(); } }, selectBalanceItem(balance) { this.afterGetBalance(this.label, balance, this.packageInfo); }, afterGetBalance(label, balance, packageInfo) { let that = this; try { let itemCode = label.itemCode; let packingCode = label.packingNumber; let lot = label.batch; let item = that.toLocation.Items.find(r => r.itemCode == itemCode); let fromLocation = item.Locations.find(l => l.fromLocationCode == that.fromLocationCode); if (fromLocation != undefined) { let batch = fromLocation.Batchs.find(r => r.batch == lot); if (batch != undefined) { if (batch.Records == undefined) { batch.Records = []; } let record = batch.Records.find(r => r.packingNumber == packingCode); if (record == undefined) { //如果有推荐箱码 if (batch.Recommends.length > 0) { let recommend = batch.Recommends.find(r => r.packingNumber == packingCode); if (recommend != undefined) { that.addRecord(batch, label, balance, packageInfo) } else { //允许修改箱码 if (this.jobContent.allowModifyPackingNumber == 'TRUE') { that.addRecord(batch, label, balance, packageInfo); } else { that.showErrorMessage('未查找到该箱码【' + packingCode + '】的明细', res => { that.getfocus(); } ) } } } else { that.addRecord(batch, label, balance, packageInfo) } } else { that.showErrorMessage('箱码【' + packingCode + '】已经扫描,请继续扫描下一箱', res => { that.getfocus(); } ) } } else { if (this.jobContent.AllowModifyBatch == null) { this.showQuestionMessage('在【' + that.fromLocationCode + '】库位下,未查找到批次【' + lot + '】的发料明细,是否要继续发料?', res => { if (res) { let batch = that.createBatchInfo(label, balance,packageInfo); fromLocation.Batchs.unshift(batch); } }) } else { that.showErrorMessage('未查找到批次【' + lot + '】的发料明细', res => { that.getfocus(); }); } } } else { that.showErrorMessage('未查找到推荐库位【' + that.fromLocationCode + '】的发料明细', res => { that.getfocus(); } ) } } catch (e) { that.showErrorMessage(e.stack, res => { that.getfocus(); } ) } }, createBatchInfo(data, balance,packageInfo) { let batch = { batch: data.batch, qty: 0, uom: data.uom, handleQty: Number(data.qty), Records: [] } let record = this.creatRecord(data, balance,packageInfo); batch.Records.push(record); this.issueRecord.unshift(record) return batch; }, creatRecord(label, balance, packageInfo) { balance.stdPackQty = packageInfo.stdPackQty balance.stdPackUnit = packageInfo.stdPackUnit let record = { scaned:true, itemCode: label.itemCode, packingNumber: label.packingNumber, batch: label.batch, qty: Number(label.qty) > Number(balance.qty) ? Number(balance.qty) : Number(label.qty), uom: balance.uom, inventoryStatus: balance.inventoryStatus, balance: balance, toLocationCode: this.toLocationCode, supplierCode: label.supplierCode } return record; }, calcBatchHandleQty(batch) { let handleQty = 0; batch.Records.forEach(res => { handleQty += Number(res.qty) }) batch.handleQty = handleQty; }, addRecord(batch, label, balance, packageInfo) { let record = this.creatRecord(label, balance, packageInfo); batch.Records.push(record); this.issueRecord.unshift(record) this.calcBatchHandleQty(batch); this.getfocus(); }, getfocus() { if (this.$refs.comscan != undefined) { this.$refs.comscan.getfocus(); } }, losefocus() { if (this.$refs.comscan != undefined) { this.$refs.comscan.losefocus(); } }, expands() { this.expand = !this.expand; this.expendIcon = this.expand == true ? "arrow-down" : "arrow-up" }, swipeClick(e, item, index) { if (e.content.text == "详情") { this.detail(item) } else if (e.content.text == "编辑") { this.edit(item) } else if (e.content.text == "移除") { this.remove(item, index) } }, edit(item) { this.editItem = item; // item.balance.balanceQty = item.balance.qty; item.balance.balanceQty = item.balance.qty; this.$refs.balanceQtyEdit.openEditPopup(item.balance, item.qty); }, detail(item) { this.showItem = item; this.$refs.receiptHint.openScanPopup() }, remove(record, index) { this.showQuestionMessage("确定移除扫描信息?", res => { if (res) { record.qty = 0; this.issueRecord.splice(index, 1) let item = this.toLocation.Items.find(r => r.itemCode == record.itemCode); if (item != undefined) { item.Locations.forEach(l => { let batch = l.Batchs.find(b => b.packingNumber == record.packingNumber && b .batch == record.batch); let rIndex = batch.Records.findIndex(r => r.packingNumber == record .packingNumber && r .batch == record.batch); batch.Records.splice(rIndex, 1); }) } this.$emit('updateData', item); } }); }, packGetFocus() { this.$refs.comscan.getfocus(); }, packLoseFocus() { this.$refs.comscan.losefocus(); }, showMessage(message, callback) { setTimeout(r => { this.packLoseFocus(); this.$refs.comMessage.showMessage(message, callback); }) }, showErrorMessage(message, callback) { setTimeout(r => { this.packLoseFocus(); this.$refs.comMessage.showErrorMessage(message, callback); }) }, showQuestionMessage(message, callback) { setTimeout(r => { this.packLoseFocus(); this.$refs.comMessage.showQuestionMessage(message, callback); }) }, confirm(val) { this.editItem.qty = Number(val); this.$emit('updateData', this.editItem) }, cancle() { this.closeScanPopup() } } } </script> <style lang="scss"> button { border: none; } button::after { border: none } .scroll-view { overflow-y: scroll; height: auto; max-height: 300rpx; padding: 10rpx; } </style>