|
|
|
<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: 30rpx;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
|
|
|
|
},
|
|
|
|
//不提示库存
|
|
|
|
noShowBalanceMessage: {
|
|
|
|
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 if (this.noShowBalanceMessage) {
|
|
|
|
this.countCallBack(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];
|
|
|
|
this.packCallBack(balance);
|
|
|
|
|
|
|
|
//因为盘点时有负库存,暂时去掉判断 2023年12月28日
|
|
|
|
|
|
|
|
// 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) {
|
|
|
|
this.packCallBack(balance);
|
|
|
|
//因为盘点时有负库存,暂时去掉判断 2023年12月28日
|
|
|
|
// if (balance.qty > 0) {
|
|
|
|
// this.packCallBack(balance);
|
|
|
|
// } else {
|
|
|
|
// this.showErrorMessage(this.getQueryCondition() + '<br>查找到库存记录数量为[' + balance.qty + "],不可以进行操作",
|
|
|
|
// res => {
|
|
|
|
// this.packGetFocus();
|
|
|
|
// })
|
|
|
|
// }
|
|
|
|
},
|
|
|
|
|
|
|
|
//盘点回调
|
|
|
|
countCallBack(datas) {
|
|
|
|
this.$refs.comscan.clear();
|
|
|
|
//返回标签信息、库存信息和管理模式
|
|
|
|
let data = {
|
|
|
|
label: this.scanResult.label,
|
|
|
|
package: this.scanResult.package,
|
|
|
|
balance: datas,
|
|
|
|
fromLocationCode: this.fromLocationCode,
|
|
|
|
}
|
|
|
|
this.packGetFocus();
|
|
|
|
this.$emit("getCountScanResult", data);
|
|
|
|
},
|
|
|
|
|
|
|
|
packCallBack(item) {
|
|
|
|
this.$refs.comscan.clear();
|
|
|
|
//返回标签信息、库存信息和管理模式
|
|
|
|
let data = {
|
|
|
|
label: this.scanResult.label,
|
|
|
|
package: this.scanResult.package,
|
|
|
|
balance: item,
|
|
|
|
fromLocationCode: this.fromLocationCode,
|
|
|
|
}
|
|
|
|
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>
|