|
|
|
<template>
|
|
|
|
<view>
|
|
|
|
<uni-popup ref="popup" :maskClick='false'>
|
|
|
|
<view class="">
|
|
|
|
<view class="popup_box">
|
|
|
|
|
|
|
|
<view class="pop_title uni-flex space-between">
|
|
|
|
<view class="" style="font-size: 35rpx;">
|
|
|
|
扫描箱码
|
|
|
|
</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;
|
|
|
|
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"
|
|
|
|
headerType="HPQ,HMQ" :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 {
|
|
|
|
calc
|
|
|
|
} from '@/common/calc.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 == "TRUE") {
|
|
|
|
this.showQuestionMessage('在【' + that.fromLocationCode + '】库位下,未查找到批次【' + lot +
|
|
|
|
'】的发料明细,是否要继续发料?', res => {
|
|
|
|
if (res) {
|
|
|
|
let batch = that.createBatchInfo(label, balance, packageInfo);
|
|
|
|
//新增加的批次赋值details
|
|
|
|
if (fromLocation.Batchs.length > 0) {
|
|
|
|
batch.detail = fromLocation.Batchs[0].detail;
|
|
|
|
}
|
|
|
|
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(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: label.supplierCode
|
|
|
|
}
|
|
|
|
return record;
|
|
|
|
},
|
|
|
|
|
|
|
|
calcBatchHandleQty(batch) {
|
|
|
|
let handleQty = 0;
|
|
|
|
batch.Records.forEach(res => {
|
|
|
|
handleQty = calc.add(handleQty,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>
|