You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
650 lines
18 KiB
650 lines
18 KiB
<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;
|
|
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"
|
|
:isShowStatus='true' :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>
|
|
<comMessage ref="comMessage"></comMessage>
|
|
<balance-qty-edit ref="balanceQtyEdit" @confirm="confirm" :isShowStatus="true"></balance-qty-edit>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
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,
|
|
getBalanceByFilter,
|
|
getBalanceByParams
|
|
} from '@/api/request2.js';
|
|
|
|
import {
|
|
calc
|
|
} from '@/common/calc.js';
|
|
|
|
import {
|
|
uniqueArray
|
|
} from '@/common/basic.js';
|
|
|
|
import {
|
|
getBalanceByManagementPrecision
|
|
} from '@/common/balance.js';
|
|
import {
|
|
getDirectoryItemArray
|
|
} from '../../../common/directory.js';
|
|
|
|
|
|
import {
|
|
getLabelInfo
|
|
} from '@/common/label.js';
|
|
|
|
export default {
|
|
name: 'winScanPack',
|
|
components: {
|
|
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: {},
|
|
positionList: [],
|
|
defaultValueList: [],
|
|
label: {},
|
|
fromInventoryStatuses: "",
|
|
packageInfo: {}
|
|
}
|
|
},
|
|
created() {
|
|
|
|
},
|
|
watch: {},
|
|
mounted() {
|
|
this.detailOptions = getDetailOption();
|
|
this.scanOptions = getDetailEditRemoveOption();
|
|
},
|
|
methods: {
|
|
openScanPopup(content, jobcontent) {
|
|
this.issueRecord = [];
|
|
this.dataContent = content;
|
|
this.jobContent = jobcontent;
|
|
this.initData();
|
|
setTimeout(res => {
|
|
this.$refs.popup.open('bottom')
|
|
}, 500)
|
|
},
|
|
|
|
openScanPopupForJobSimulate(content, jobcontent, scanMessage) {
|
|
this.issueRecord = [];
|
|
this.dataContent = content;
|
|
this.jobContent = jobcontent;
|
|
this.initData();
|
|
getLabelInfo(scanMessage, this.headerType, callback => {
|
|
if (callback.success) {
|
|
this.onScan(callback);
|
|
} else {
|
|
this.showErrorMessage(callback.message)
|
|
}
|
|
|
|
})
|
|
},
|
|
|
|
closeScanPopup() {
|
|
this.losefocus()
|
|
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 = [];
|
|
// let location = this.dataContent.find(r => r.toLocationCode == this.toLocationCode);
|
|
// if (location != undefined) {
|
|
// location.Items.forEach(item => {
|
|
// item.Locations.forEach(f => {
|
|
// list.push(f.fromLocationCode)
|
|
// })
|
|
// })
|
|
// //去掉重复库位
|
|
// list = uniqueArray(list);
|
|
// this.fromLocationCode = list[0];
|
|
|
|
// return list;
|
|
// } else {
|
|
// this.$refs.comMessage.showErrorMessages('需求库位【' + this.toLocationCode + '】不存在', res => {
|
|
// this.toLocationCode = '';
|
|
// });
|
|
// }
|
|
// },
|
|
|
|
fromLocationUpdate(fromlocation) {
|
|
let location = this.fromLocationList.find(r => r == fromlocation)
|
|
if (location == undefined) {
|
|
this.fromLocationCode = ''
|
|
this.showErrorMessage('发料库位【' + fromlocation + '】不存在')
|
|
}
|
|
},
|
|
|
|
onScan(result) {
|
|
if (!result.package) {
|
|
this.showErrorMessage('扫描数据错误[' + result.label.code + "]",
|
|
res => {
|
|
this.getfocus();
|
|
}
|
|
)
|
|
return;
|
|
}
|
|
if (this.toLocation && result.package.packUnit) {
|
|
let item = this.toLocation.Items.find(r => r.itemCode == result.package.itemCode);
|
|
if (!item) {
|
|
this.showErrorMessage('扫描物料代码不属于该任务');
|
|
return
|
|
}
|
|
if (result.package.packUnit !== item.packUnit) {
|
|
this.$refs.comMessage.showQuestionMessage(
|
|
`扫描物料包装【${result.package.packUnit}】与任务推荐包装规格【${item.packUnit}】不一致.是否要继续发料?`, res => {
|
|
if (res) {
|
|
this.onScanResult(result)
|
|
}
|
|
});
|
|
} else {
|
|
this.onScanResult(result)
|
|
}
|
|
}
|
|
},
|
|
|
|
onScanResult(result) {
|
|
try {
|
|
let that = this;
|
|
// if (that.fromLocationCode == '') {
|
|
// that.showErrorMessage('请选择来源库位', res => {
|
|
// that.$refs.toLocationCombox.onFocus();
|
|
// });
|
|
// return;
|
|
// }
|
|
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 {
|
|
|
|
var params = {
|
|
itemCode: result.package.itemCode,
|
|
batch: result.label.batch,
|
|
packingNumber: result.label.packingNumber,
|
|
parentPackingNumber: result.package.parentNumber,
|
|
inventoryStatus: this.jobContent.outInventoryStatuses.split(','),
|
|
areaType: this.jobContent.fromAreaTypes.split(','),
|
|
bussinessCode: this.jobContent.businessType
|
|
}
|
|
uni.showLoading({
|
|
title: '查询中',
|
|
mask: true
|
|
})
|
|
getBalanceByParams(params).then(res => {
|
|
if (res.data.length == 0) {
|
|
var status = getInventoryStatusDesc(params.inventoryStatus)
|
|
var areaType = getListLocationAreaTypeDesc(params.areaType)
|
|
var hint =
|
|
"按物料号 [" + params.itemCode + "] <br>" +
|
|
"包装号 [" + params.packingNumber + "] <br>" +
|
|
"批次 [" + params.batch + "] <br>" +
|
|
"状态 [" + status + "] <br>" +
|
|
"库区 [" + areaType + "] <br>" +
|
|
"未查找到库存余额"
|
|
this.showErrorMessage(hint)
|
|
} else if (res.data.length == 1) {
|
|
result.balance = res.data[0]
|
|
|
|
if (result.label.packingNumber != result.balance.packingNumber) {
|
|
result.balance.qty = Number(result.label.qty)
|
|
} else {
|
|
result.balance.qty = Number(result.balance.qty)
|
|
}
|
|
this.afterGetBalance(result.label, result.balance, result.package);
|
|
} else {
|
|
//多条记录
|
|
this.$refs.balanceSelect.openPopup(res.data);
|
|
}
|
|
uni.hideLoading()
|
|
}).catch(error => {
|
|
uni.hideLoading()
|
|
this.showErrorMessage(error)
|
|
})
|
|
}
|
|
} catch (e) {
|
|
this.showErrorMessage(e.stack)
|
|
uni.hideLoading();
|
|
}
|
|
},
|
|
|
|
selectBalanceItem(balance) {
|
|
this.afterGetBalance(this.label, balance, this.packageInfo);
|
|
},
|
|
|
|
afterGetBalance(label, balance, packageInfo) {
|
|
try {
|
|
let that = this;
|
|
let itemCode = label.itemCode;
|
|
let packingCode = label.packingNumber;
|
|
let lot = label.batch;
|
|
let item = that.toLocation.Items.find(r => r.itemCode == itemCode);
|
|
|
|
that.fromLocationCode = balance.locationCode;
|
|
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 != undefined && 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 == "TRUE") {
|
|
this.showQuestionMessage('在【' + that.fromLocationCode + '】库位下,批次【' + lot +
|
|
'】不是推荐批次,是否要继续发料?', res => {
|
|
if (res) {
|
|
let batch = that.createBatchInfo(label, balance, packageInfo);
|
|
if (fromLocation.Batchs.length > 0) {
|
|
batch.detail = fromLocation.Batchs[0].detail;
|
|
}
|
|
fromLocation.Batchs.unshift(batch);
|
|
}
|
|
})
|
|
} else {
|
|
that.showErrorMessage('未查找到批次【' + lot + '】的发料明细',
|
|
res => {
|
|
that.getfocus();
|
|
});
|
|
}
|
|
}
|
|
} else {
|
|
let locaion = that.createLocationInfo(label, balance, packageInfo);
|
|
item.Locations.push(locaion);
|
|
}
|
|
} catch (e) {
|
|
this.showErrorMessage(e.stack,
|
|
res => {
|
|
this.getfocus();
|
|
}
|
|
)
|
|
}
|
|
},
|
|
|
|
//增加实际扫描的明细
|
|
createLocationInfo(label, balance, packageInfo) {
|
|
let location = {
|
|
fromLocationCode: balance.locationCode,
|
|
qty: balance.qty,
|
|
uom: balance.uom,
|
|
handleQty: 0,
|
|
Batchs: []
|
|
}
|
|
let batch = this.createBatchInfo(label, balance, packageInfo);
|
|
batch.detail = balance;
|
|
batch.detail.fromLocationCode = balance.locationCode;
|
|
location.Batchs.push(batch);
|
|
return location;
|
|
},
|
|
|
|
createBatchInfo(label, balance, packageInfo) {
|
|
let batch = {
|
|
batch: label.batch,
|
|
qty: 0,
|
|
uom: label.uom,
|
|
Records: []
|
|
}
|
|
let record = {}
|
|
if (balance != null) {
|
|
record = this.creatRecordByBalance(balance, packageInfo);
|
|
batch.handleQty = Number(label.qty)
|
|
} else {
|
|
record = this.creatRecordByLabel(label, packageInfo);
|
|
batch.handleQty = Number(balance.qty)
|
|
}
|
|
|
|
batch.Records.push(record);
|
|
this.issueRecord.unshift(record)
|
|
return batch;
|
|
},
|
|
|
|
creatRecordByLabel(label, packageInfo) {
|
|
let record = {
|
|
scaned: true,
|
|
itemCode: label.itemCode,
|
|
packingNumber: label.packingNumber,
|
|
parentPackingNumber: packageInfo.parentNumber,
|
|
batch: label.batch,
|
|
qty: Number(label.qty),
|
|
// qty: Number(label.qty)>Number(balance.qty)?Number(balance.qty):Number(label.qty),
|
|
uom: label.uom,
|
|
inventoryStatus: "OK",
|
|
balance: null,
|
|
toLocationCode: this.toLocationCode,
|
|
supplierCode: label.supplierCode,
|
|
packUnit: packageInfo.packUnit,
|
|
packQty: packageInfo.packQty,
|
|
}
|
|
return record;
|
|
},
|
|
|
|
creatRecordByBalance(balance, packageInfo) {
|
|
balance.packQty = packageInfo.packQty
|
|
balance.packUnit = packageInfo.packUnit
|
|
let record = {
|
|
scaned: true,
|
|
itemCode: balance.itemCode,
|
|
packingNumber: packageInfo.number,
|
|
parentPackingNumber: packageInfo.parentNumber,
|
|
batch: packageInfo.batch,
|
|
qty: Number(balance.qty),
|
|
// 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: balance.supplierCode
|
|
}
|
|
return record;
|
|
},
|
|
|
|
calcBatchHandleQty(batch) {
|
|
let handleQty = 0;
|
|
batch.Records.forEach(res => {
|
|
handleQty = calc.add(handleQty, res.qty)
|
|
})
|
|
batch.handleQty = handleQty;
|
|
|
|
this.dataContent.forEach(toLocationCode => {
|
|
toLocationCode.Items.forEach(item => {
|
|
var itemCodeHandleQty = 0;
|
|
item.Locations.forEach(batch => {
|
|
batch.Batchs.forEach(batchHandleQty => {
|
|
itemCodeHandleQty = calc.add(itemCodeHandleQty,
|
|
batchHandleQty.handleQty)
|
|
})
|
|
})
|
|
item.handleQty = itemCodeHandleQty;
|
|
})
|
|
|
|
})
|
|
},
|
|
|
|
addRecord(batch, label, balance, packageInfo) {
|
|
let record = {};
|
|
if (balance == null) {
|
|
record = this.creatRecordByLabel(label, packageInfo);
|
|
} else {
|
|
record = this.creatRecordByBalance(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
|
|
.packingNumber == null || b.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', record);
|
|
}
|
|
});
|
|
},
|
|
|
|
packGetFocus() {
|
|
if (this.$refs.comscan) {
|
|
this.$refs.comscan.getfocus();
|
|
}
|
|
|
|
},
|
|
packLoseFocus() {
|
|
if (this.$refs.comscan) {
|
|
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>
|