<template> <view> <uni-popup ref="popup" @change="change" @maskClick="closeScanPopup()"> <view class="popup_box"> <view class="pop_title uni-flex space-between"> <view class="" style="font-size: 35rpx;"> 扫描{{title}} </view> <view class=""> <image class="fr icons_scan_close" src="/static/icons/icons_scan_close.svg" @click="closeScanPopup()"></image> </view> </view> <view class="uni-flex uni-row" style="align-items: center; background-color: #fff; margin-left: 20rpx; margin-right: 20rpx; border-radius: 8rpx; height: 30px;"> <view class="uni-center" style="width: 25%; "> 来源库位 </view> <!-- style="width: 75%;padding: 8rpx" --> <view class=""> <!-- <input v-model="fromLocationCode" placeholder="请扫描来源库位" :focus="locationOnFocus" placeholder-style="font-size:12px" style="padding: 5px;" @confirm="scanLocation" /> --> <view v-if='allowModifyLocation'> <uni-combox :candidates="fromLocationList" v-model="fromLocationCode" placeholder="请扫描来源库位" @confirm="scanLocation" style='height: 30px;border:1px solid #fff ;'></uni-combox> </view> <view v-else> <text style="padding: 5px"> {{fromLocationCode}} </text> </view> </view> </view> <view class=""> <view class=""> <win-com-scan ref="comscan" :placeholder="title" @getResult="getScanResult" :isShowHistory="isShowHistory" :clearResult="true" :headerType ="headerType"></win-com-scan> </view> </view> </view> </uni-popup> <balance-select ref="balanceSelect" @onSelectItem='selectBalanceItem'></balance-select> </view> <com-message ref="comMessage"></com-message> </template> <script> import winComScan from '@/mycomponents/scan/winComScan.vue' import comMessage from '@/mycomponents/common/comMessage.vue' import balanceSelect from '@/mycomponents/balance/balanceSelect.vue' import { getBalanceByManagementPrecision, } from '@/common/balance.js'; import { getBasicLocationByCode, } from '@/api/request2.js'; import { getListLocationTypeDesc, checkDirectoryItemExist, getDirectoryItemArray, getLocationTypeName, getInventoryStatusDesc } from '@/common/directory.js'; export default { name: 'winScanPack', emits: ["getResult", "close"], components: { winComScan, comMessage, balanceSelect }, props: { title: { type: String, default: '箱标签' }, isShowHistory: { type: Boolean, default: true }, allowNullBalance: { type: Boolean, default: false }, //是否允许修改库位 allowModifyLocation: { type: Boolean, default: true }, headerType: { type: String, default: "HPQ,HMQ" }, }, data() { return { scanResult: {}, show: false, scanList: [], expand: false, showScanResult: {}, expendIcon: 'arrow-down', fromLocationCode: '', fromLocation: '', fromLocationList: [], fromLocationTypeArray: [], locationOnFocus: false, businessType: {}, inventoryStatus: [], managementPrecision: '', fromInventoryStatuses: "" } }, created() { }, methods: { //直接扫描 openScanPopupForType(fromLocationCode, businessType) { this.businessType = businessType; this.fromLocationCode = fromLocationCode; if (fromLocationCode != '') { this.packGetFocus(); } else { this.locationGetFocus(); } this.fromInventoryStatuses = this.businessType.outInventoryStatuses this.inventoryStatus = getDirectoryItemArray(this.businessType.outInventoryStatuses); //出库库存状态 this.fromLocationTypeArray = getDirectoryItemArray(this.businessType.outLocationTypes); //出库库存状态 this.$refs.popup.open('bottom'); }, //在任务中扫描 openScanPopupForJob(fromLocationCode, fromLocationList, jobContent) { this.fromLocationCode = fromLocationCode; this.fromLocationList = fromLocationList; if (fromLocationCode != '') { this.packGetFocus(); } else { if (this.fromLocationList.length == 0) { this.locationGetFocus(); } else { this.fromLocationCode = this.fromLocationList[0]; } } this.$refs.popup.open('bottom'); this.fromInventoryStatuses = jobContent.outInventoryStatuses this.inventoryStatus = getDirectoryItemArray(jobContent.outInventoryStatuses); //出库库存状态; //出库库存状态 this.fromLocationTypeArray = getDirectoryItemArray(jobContent.fromLocationTypes); //出库库存状态 }, closeScanPopup(content) { this.$refs.popup.close(); this.$emit("close", ''); }, scanLocation() { if (this.fromLocationCode == '') { this.showMessage('来源库位不能为空', callback => { this.locationGetFocus(); }) return; } uni.showLoading({ title: '扫描中...', mask: true }); getBasicLocationByCode(this.fromLocationCode).then(res => { uni.hideLoading(); if (res.data.total > 0) { let result = res.data.list[0]; var type = result.type; var available = result.available; if (available == "TRUE") { if (checkDirectoryItemExist(this.fromLocationTypeArray, type)) { this.location = result; this.packGetFocus(); } else { var hint = getListLocationTypeDesc(this.fromLocationTypeArray); this.showErrorMessage("库位[" + this.fromLocationCode + "]是" + getLocationTypeName(type) + ",<br>需要的库位类型是[" + hint + "]", callback => { this.locationGetFocus(); }) } } else { this.showErrorMessage("扫描库位[" + this.fromLocationCode + "]不可用", res => { this.locationGetFocus(); }) } } else { this.showErrorMessage('未查询到库位[' + this.fromLocationCode + ']', res => { this.locationGetFocus(); }) } }).catch(error => { uni.hideLoading(); this.showErrorMessage(error, res => { this.locationGetFocus(); }) }) }, getScanResult(result) { console.log("扫描", result) if (this.fromLocationCode == '' || this.fromLocationCode == null) { this.showMessage('请先扫描来源库位', callback => { this.locationGetFocus(); }) return; } else { if (result.label != null) { this.scanResult = result; getBalanceByManagementPrecision(result.label, this.fromLocationCode, this.fromInventoryStatuses, res => { if (res.success) { this.managementPrecision = res.managementPrecision this.afterQueryBalance(res.data.list); } else { this.showErrorMessage(res.message, res => { this.packGetFocus(); }) } }); } } }, afterQueryBalance(datas) { if (this.allowNullBalance) { this.allowNoneBalance(datas); } else { this.mustHavaBalance(datas); } uni.hideLoading(); }, //允许无库存 allowNoneBalance(datas) { if (datas.length == 0) { this.packCallBack(null); } else { this.showErrorMessage('在来源库位[' + this.fromLocationCode + '],已经查找到该包装的库存记录,请重新扫描', res => { this.packGetFocus(); }) } }, //必须有库存 mustHavaBalance(datas) { if (datas.length == 0) { this.showErrorMessage(this.getQueryCondition() + '<br>未查找到库存记录', res => { this.packGetFocus(); }) } else if (datas.length == 1) { let balance = datas[0]; if (balance.qty > 0) { this.packCallBack(balance); } else { this.showErrorMessage(this.getQueryCondition() + '<br>查找到库存记录数量为[' + balance.qty + "],<br>不可以进行操作", res => { this.packGetFocus(); }) } } else { this.showBalanceSelect(datas); } }, showBalanceSelect(items) { this.$refs.balanceSelect.openPopup(items); }, selectBalanceItem(balance) { if (balance.qty > 0) { this.packCallBack(balance); } else { this.showErrorMessage(this.getQueryCondition() + '<br>查找到库存记录数量为[' + balance.qty + "],不可以进行操作", res => { this.packGetFocus(); }) } }, packCallBack(item) { this.$refs.comscan.clear(); //返回标签信息、库存信息和管理模式 let data = { label: this.scanResult.label, package: this.scanResult.package, balance: item } this.packGetFocus(); this.$emit("getResult", data); }, packGetFocus() { if (this.$refs.comscan != undefined) { this.$refs.comscan.getfocus(); } }, packLoseFocus() { if (this.$refs.comscan != undefined) { this.$refs.comscan.losefocus(); } }, locationGetFocus() { this.fromLocationCode = ''; this.locationOnFocus = true; }, getQueryCondition() { let condition = '按照以下条件:<br>'; let label = this.scanResult.label; let status = getInventoryStatusDesc(this.inventoryStatus); switch (this.managementPrecision) { case 'BY_PACKAGING': condition = condition + '零件号=[' + label.itemCode + ']<br>箱码=[' + label.packingNumber + ']<br>批次=[' + label.batch + ']<br>库位=[' + this.fromLocationCode + ']' break; case 'BY_BATCH': condition = condition + '零件号=[' + label.itemCode + ']<br>批次=[' + label.batch + ']<br>库位=[' + this.fromLocationCode + ']' break; case 'BY_QUANTITY': condition = condition + '零件号=[' + label.itemCode + ']<br>库位=[' + this.fromLocationCode + ']' break; case 'BY_UNIQUEID': condition = condition + '零件号=[' + label.itemCode + ']' break; } if (this.inventoryStatus.length > 0) { condition = condition + '<br>库存状态=[' + status + ']' } return condition; }, 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) }) }, change(e) { this.show = e.show }, } } </script> <style lang="scss"> .scroll-view { overflow-y: scroll; height: auto; max-height: 300rpx; } </style>