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.
693 lines
17 KiB
693 lines
17 KiB
<template>
|
|
<!-- <page-meta root-font-size="18px"></page-meta> -->
|
|
<view class="page-wraper">
|
|
<view class="page-main">
|
|
<scroll-view scroll-y="true" class="">
|
|
<view v-for="(toLocation, index) in detailSource">
|
|
<com-issue-detail-card ref='comIssueDetailCard' :dataContent="toLocation"></com-issue-detail-card>
|
|
</view>
|
|
</scroll-view>
|
|
</view>
|
|
|
|
<div class="btn_bottom">
|
|
<view class="" style="display: flex;flex-direction: row;">
|
|
<view class="">
|
|
<button class="btn_commit" hover-class="btn_commit_after" :disabled="disabledConfirm"
|
|
@click="submit()">提交</button>
|
|
<button class="btn_commit" hover-class="btn_commit_after" @click="resizeCollapse()">刷新</button>
|
|
</view>
|
|
</view>
|
|
</div>
|
|
<win-scan-button @goScan='openScanDetailPopup'></win-scan-button>
|
|
<com-scan-issue-pack ref="comScanIssuePack" @closeScan='closeScan'></com-scan-issue-pack>
|
|
<!-- <com-balance ref="balanceItems"></com-balance> -->
|
|
<comMessage ref="comMessage"></comMessage>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import {
|
|
takeIssueJob,
|
|
cancelTakeIssueJob,
|
|
getIssueJobDetail,
|
|
getBalanceByUniquecode,
|
|
issueJobSubmit
|
|
} from '@/api/request.js';
|
|
|
|
import {
|
|
showConfirmMsg,
|
|
goHome,
|
|
getRemoveOption,
|
|
getISODateTime
|
|
} from '@/common/basic.js';
|
|
|
|
import itemQty from '@/mycomponents/item/itemQty.vue'
|
|
import recommend from '@/mycomponents/recommend/recommend.vue'
|
|
import recommendQtyEdit from '@/mycomponents/qty/recommendQtyEdit.vue'
|
|
import jobDetailPopup from '@/mycomponents/job/jobDetailPopup.vue'
|
|
import requiredLocation from '@/mycomponents/location/requiredLocation.vue'
|
|
import comIssueRecommend from '@/pages/issue/coms/comIssueRecommend.vue'
|
|
import winScanButton from '@/mycomponents/scan/winScanButton.vue'
|
|
import comIssueDetailCard from '@/pages/issue/coms/comIssueDetailCard.vue'
|
|
import comScanIssuePack from '@/pages/issue/coms/comScanIssuePack.vue'
|
|
|
|
import pack from '@/mycomponents/balance/pack.vue'
|
|
import location from '@/mycomponents/balance/location.vue'
|
|
import batch from '@/mycomponents/balance/batch.vue'
|
|
import recommendQty from '@/mycomponents/qty/recommendQty.vue'
|
|
import compareQty from '@/mycomponents/qty/compareQty.vue'
|
|
import balanceQty from '@/mycomponents/qty/balanceQty.vue'
|
|
import qty from '@/mycomponents/qty/qty.vue'
|
|
|
|
export default {
|
|
name: 'issueDetail',
|
|
components: {
|
|
winScanButton,
|
|
comIssueDetailCard,
|
|
comScanIssuePack,
|
|
itemQty,
|
|
recommend,
|
|
recommendQtyEdit,
|
|
jobDetailPopup,
|
|
requiredLocation,
|
|
comIssueRecommend,
|
|
pack,
|
|
location,
|
|
batch,
|
|
recommendQty,
|
|
compareQty,
|
|
balanceQty,
|
|
qty
|
|
},
|
|
data() {
|
|
return {
|
|
itemList: [],
|
|
toLocation: null,
|
|
currentLabel: null,
|
|
reScanItem: null, //重复的箱码
|
|
isFromEdit: false,
|
|
locationDisabled: false,
|
|
disabledConfirm: true,
|
|
currentData: {},
|
|
id: '',
|
|
jobContent: {}, //任务内容
|
|
subList: [], //接口返回的任务subList
|
|
detailSource: [], //绑定在页面上的数据源
|
|
detailOptions: [],
|
|
scanOptions: []
|
|
};
|
|
},
|
|
|
|
props: {
|
|
|
|
},
|
|
|
|
onLoad(option) {
|
|
this.id = option.id;
|
|
if (this.id != undefined) {
|
|
//新建的任务自动接收
|
|
if (option.status == "JOB_PENDING") {
|
|
this.receive((callback => {
|
|
this.received = true;
|
|
this.getDetail();
|
|
}));
|
|
} else {
|
|
this.getDetail();
|
|
}
|
|
}
|
|
},
|
|
|
|
onNavigationBarButtonTap(e) {
|
|
if (e.index === 0) {
|
|
goHome();
|
|
}
|
|
},
|
|
|
|
//拦截返回按钮事件
|
|
onBackPress(e) {
|
|
//已经接收但是没提交任务
|
|
if (this.received) {
|
|
//取消承接任务
|
|
cancelTakeIssueJob(this.id).then(res => {}).catch(error => {
|
|
this.showMessage(err);
|
|
})
|
|
}
|
|
},
|
|
|
|
watch: {
|
|
locationTypes(newVal) {
|
|
let value = newVal;
|
|
},
|
|
},
|
|
mounted: function() {
|
|
|
|
},
|
|
|
|
methods: {
|
|
//接收
|
|
receive(callback) {
|
|
if (this.id != null) {
|
|
takeIssueJob(this.id).then(res => {
|
|
callback();
|
|
}).catch(error => {
|
|
this.showErrorMessage(error)
|
|
})
|
|
}
|
|
},
|
|
|
|
getDetail() {
|
|
var that = this;
|
|
uni.showLoading({
|
|
title: "加载中....",
|
|
mask: true
|
|
});
|
|
getIssueJobDetail(that.id).then(res => {
|
|
if (res.data[0].subList.length > 0) {
|
|
that.jobContent = res.data[0];
|
|
that.subList = res.data[0].subList;
|
|
that.detailSource = that.getDataSource(that.subList)
|
|
that.resizeCollapse();
|
|
uni.hideLoading();
|
|
} else {
|
|
that.showMessage('列表数据为0');
|
|
}
|
|
}).catch(error => {
|
|
uni.hideLoading()
|
|
this.showErrorMessage(error)
|
|
})
|
|
},
|
|
|
|
getDataSource(subList) {
|
|
let list = [];
|
|
let that = this;
|
|
for (var i = 0; i < subList.length; i++) {
|
|
let detail = subList[i];
|
|
var location = list.find(r =>
|
|
r.toLocationCode == detail.toLocationCode)
|
|
if (location == undefined) {
|
|
location = {
|
|
toLocationCode: detail.toLocationCode,
|
|
Items: []
|
|
}
|
|
list.push(location);
|
|
}
|
|
that.createDetailInfo(location, detail);
|
|
}
|
|
return list;
|
|
},
|
|
|
|
//树形结构:需求库位 -> 物料Items -> 库位 Locations-> 批次Batchs -> 记录Records
|
|
createDetailInfo(location, detail) {
|
|
let that = this;
|
|
var item = location.Items.find(r =>
|
|
r.itemCode == detail.itemCode)
|
|
if (item == undefined) {
|
|
item = that.createItemInfo(detail);
|
|
location.Items.push(item)
|
|
} else {
|
|
item.qty += detail.qty
|
|
//在物料下查找库位
|
|
let location = item.Locations.find(r => r.fromLocationCode == detail.fromLocationCode);
|
|
if (location == undefined) {
|
|
location = that.createLocationInfo(detail);
|
|
item.Locations.push(location);
|
|
} else {
|
|
//在库位下查找批次
|
|
let batch = location.Batchs.find(r => r.batch == detail.Bacth);
|
|
if (batch == undefined) {
|
|
let batch = that.createBatchInfo(detail);
|
|
location.Batchs.push(batch);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
createItemInfo(detail) {
|
|
let item = {
|
|
itemCode: detail.itemCode,
|
|
itemName: detail.itemName,
|
|
stdPackQty: detail.stdPackQty,
|
|
stdPackUnit: detail.stdPackUnit,
|
|
qty: detail.qty,
|
|
uom: detail.uom,
|
|
handleQty: 0,
|
|
Locations: []
|
|
}
|
|
let location = this.createLocationInfo(detail);
|
|
item.Locations.push(location);
|
|
return item;
|
|
},
|
|
|
|
createLocationInfo(detail) {
|
|
let location = {
|
|
fromLocationCode: detail.fromLocationCode,
|
|
qty: detail.qty,
|
|
uom: detail.uom,
|
|
handleQty: 0,
|
|
Batchs: []
|
|
}
|
|
let batch = this.createBatchInfo(detail);
|
|
location.Batchs.push(batch);
|
|
return location;
|
|
},
|
|
|
|
createBatchInfo(detail) {
|
|
let batch = {
|
|
batch: detail.batch,
|
|
qty: detail.qty,
|
|
uom: detail.uom,
|
|
handleQty: 0,
|
|
// Records: []
|
|
}
|
|
return batch;
|
|
},
|
|
|
|
createRecordInfo(detail) {
|
|
var record = {}
|
|
detail.scaned = true;
|
|
// let record = JSON.parse(JSON.stringify(detail));
|
|
//克隆对象,深度克隆,防止双向绑定同一个变量
|
|
Object.assign(record, detail)
|
|
record.toLocationCode = this.toLocationCode;
|
|
return record;
|
|
},
|
|
|
|
|
|
closeScan() {
|
|
this.resizeCollapse();
|
|
},
|
|
|
|
resizeCollapse() {
|
|
this.$nextTick(r => {
|
|
this.$refs.comIssueDetailCard.forEach(r => {
|
|
r.resizeCollapse();
|
|
})
|
|
|
|
// this.$refs.collapse.forEach(r => {
|
|
// r.resize();
|
|
// })
|
|
|
|
// this.$refs.subCollapse.forEach(r => {
|
|
// r.resize();
|
|
// })
|
|
|
|
|
|
// this.$refs.collapse.forEach(r => {
|
|
// r.resize();
|
|
// })
|
|
|
|
// this.$refs.subCollapse[0].resize();
|
|
// this.$refs.collapse[0].resize();
|
|
|
|
|
|
|
|
});
|
|
},
|
|
|
|
|
|
reload() {
|
|
let that = this;
|
|
this.$nextTick(r => {
|
|
that.$refs.collapse[0].resize();
|
|
});
|
|
},
|
|
|
|
swipeClick(e, item, index) {
|
|
let {
|
|
content
|
|
} = e;
|
|
if (content.text === '移除') {
|
|
uni.showModal({
|
|
title: '提示',
|
|
content: '是否移除选择的行?',
|
|
success: res => {
|
|
if (res.confirm) {
|
|
this.removeLabel(item, index)
|
|
}
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
removeLabel(item, index) {
|
|
let label = item.labelList[index];
|
|
item.scanQty = item.scanQty - label.qty;
|
|
item.labelList.splice(index, 1);
|
|
if (item.labelList.length == 0) {
|
|
let itemIndex = this.itemList.findIndex(r => {
|
|
return r.itemCode == item.itemCode
|
|
})
|
|
this.itemList.splice(itemIndex, 1)
|
|
}
|
|
},
|
|
|
|
getScanResult(result, locationCode) {
|
|
let that = this;
|
|
|
|
let location = that.dataSource.find(r => r.toLocationCode == locationCode);
|
|
|
|
if (locatio == undefined || locatio == null) {
|
|
this.showErrorMessage('需求库位不存在', callback => {
|
|
|
|
})
|
|
} else {
|
|
let item = location.Items.find(r => r.itemCode == result.label.itemCode);
|
|
if (item == undefined || item == null) {
|
|
this.showErrorMessage('未查找到物料【' + result.label.itemCode + '】的发料需求', callback => {
|
|
|
|
})
|
|
} else {
|
|
let fromLocation = item.Locations.find(r => r.fromLocationCode == locationCode);
|
|
let batch = fromLocation.Batchs.find(r => r.Bacth == result.label.batch)
|
|
if (batch == undefined || batch == null) {
|
|
if (jobContent.AllowModifyBach == 1) {
|
|
//增加批次
|
|
let bacth = this.createBatchInfo(result);
|
|
item.Batchs.push(bacth);
|
|
} else {
|
|
this.showErrorMessage('未查找到物料【' + result.label.itemCode + '】对应的批次【' + result.label.batch +
|
|
'】需求', callback => {
|
|
|
|
})
|
|
}
|
|
|
|
} else {
|
|
//在批次下增加记录
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
afterRescan(confirm) {
|
|
let that = this;
|
|
if (confirm) {
|
|
that.reScanItem.labelList.forEach((r, i) => {
|
|
if (r.packingCode == that.currentLabel.packingCode) {
|
|
that.reScanItem.labelList.splice(i, 1);
|
|
return;
|
|
}
|
|
});
|
|
that.getBalance();
|
|
} else {
|
|
this.scanPopupGetFocus();
|
|
}
|
|
},
|
|
|
|
getBalance() {
|
|
uni.showLoading({
|
|
title: '加载中',
|
|
mask: true
|
|
})
|
|
let that = this;
|
|
//按照物料号和箱码去查询库存
|
|
let params = {
|
|
pageSize: 100,
|
|
pageIndex: 1,
|
|
locationTypes: [2, 3],
|
|
itemCode: that.currentLabel.itemCode,
|
|
packingCode: that.currentLabel.packingCode,
|
|
lot: that.currentLabel.lot,
|
|
};
|
|
getBalancesExpectByFilter(params)
|
|
.then(res => {
|
|
try {
|
|
if (res.totalCount === 0) {
|
|
this.showScanMessage('箱码【' + that.currentLabel.packingCode + '】在【原料库】【半成品库】未查询到库存信息');
|
|
} else if (res.totalCount === 1) {
|
|
let balanceItem = res.items[0];
|
|
this.createItem(balanceItem);
|
|
} else {
|
|
this.$refs.balanceItems.openPopup(res.items);
|
|
}
|
|
} catch (e) {
|
|
this.showScanMessage(e.message);
|
|
}
|
|
this.scanPopupGetFocus();
|
|
uni.hideLoading();
|
|
})
|
|
.catch(err => {
|
|
this.showScanMessage(err.message);
|
|
this.scanPopupGetFocus();
|
|
uni.hideLoading();
|
|
});
|
|
},
|
|
|
|
getToLocation(code) {
|
|
if (code == '') {
|
|
this.showMessage('目标库位不能为空');
|
|
return;
|
|
}
|
|
uni.showLoading({
|
|
title: "扫描中",
|
|
mask: true
|
|
});
|
|
let that = this;
|
|
locations(code).then(res => {
|
|
if (res == null) {
|
|
that.showMessage('目标库位【' + code + '】不存在');
|
|
that.$refs.comToLocation.clearLocation();
|
|
} else {
|
|
if (res.type != 5) {
|
|
this.showMessage('目标库位必须是【线边库】')
|
|
} else {
|
|
this.toLocation = res;
|
|
}
|
|
}
|
|
uni.hideLoading();
|
|
}).catch(err => {
|
|
that.toLocationCode = ''
|
|
that.showMessage(err.message);
|
|
uni.hideLoading();
|
|
})
|
|
},
|
|
|
|
clearLocation() {
|
|
this.toLocation = null;
|
|
},
|
|
|
|
clearCustomerAddress() {
|
|
this.customerAddressArray = [];
|
|
this.toLocation = null;
|
|
this.customerAddress = null;
|
|
this.customerAddressCode = ''
|
|
},
|
|
|
|
submit() {
|
|
//3.如果是按批次先进先出发料提交时如果扫描的箱码不是先进的批次,则报错
|
|
//:请扫描XXX批次,改批次满足先进先出规则。否则可以直接提交
|
|
var isOutIn = getApp().globalData.feed_configList.filter(
|
|
res => {
|
|
if (res.name == 'feed_isOutIn') {
|
|
return res;
|
|
}
|
|
});
|
|
|
|
this.dataContent.itemCodeList.forEach(res => {
|
|
if (res.handleQty > res.recommendQty) {
|
|
this.$refs.modal.showConfirmMessageModal('实际数量大于需求数量,是否提交?', confirm => {
|
|
if (confirm) {
|
|
//提交
|
|
uni.showToast({
|
|
title: "提交"
|
|
})
|
|
}
|
|
})
|
|
} else {
|
|
uni.showToast({
|
|
title: "扫描的数量" + res.handleQty + "]小于推荐数量[" + res.recommendQty + "]"
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
updateCommitBtn() {
|
|
var isHandleQtyNoRecommedQty = getApp().globalData.feed_configList.filter(
|
|
res => {
|
|
if (res.name == 'feed_isHandleQtyNoRecommedQty') {
|
|
return res;
|
|
}
|
|
});
|
|
//实际发料数量是否允许与需求量不同
|
|
//允许
|
|
if (isHandleQtyNoRecommedQty[0].value) {
|
|
//实际发料数量与需求量允许不一致
|
|
|
|
//有扫描数量可以提交,按钮可点击
|
|
var handleQty = 0;
|
|
this.dataContent.itemCodeList.forEach(res => {
|
|
handleQty = res.handleQty + handleQty;
|
|
})
|
|
|
|
if (handleQty > 0) {
|
|
this.disabledConfirm = false;
|
|
//如果实际数量(扫描数量)大于需求数量,提示是否提交
|
|
|
|
} else {
|
|
this.disabledConfirm = true;
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
//实际发料数量与需求量不允许不一致,按钮不可用
|
|
//必须相等才可以用
|
|
|
|
this.dataContent.itemCodeList.forEach(res => {
|
|
if (res.handleQty == res.recommendQty) {
|
|
this.disabledConfirm = false;
|
|
} else {
|
|
this.disabledConfirm = true;
|
|
}
|
|
})
|
|
|
|
// if(handleQty==recommendQty){
|
|
// this.disabledConfirm =false;
|
|
// }else {
|
|
// this.disabledConfirm =true;
|
|
// }
|
|
//实际数量大于等于才可以提交,按钮可以点击
|
|
|
|
|
|
}
|
|
},
|
|
|
|
|
|
cancel() {
|
|
let that = this;
|
|
showConfirmMsg('是否要清空已扫描的物料和目标库位信息?', confirm => {
|
|
if (confirm) {
|
|
that.clearInfo();
|
|
}
|
|
})
|
|
},
|
|
|
|
clearInfo() {
|
|
this.dataContent.itemCodeList.forEach(res => {
|
|
if (res.recommendList != null) {
|
|
res.recommendList.forEach(res1 => {
|
|
if (res1.locationCodeList != null) {
|
|
res1.locationCodeList.forEach(res2 => {
|
|
if (res2.packingCodeList != null) {
|
|
res2.packingCodeList.forEach(res3 => {
|
|
res3.itemCode = "";
|
|
res3.qty = 0;
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
})
|
|
}
|
|
|
|
})
|
|
},
|
|
|
|
qtyChanged(value, item, label) {
|
|
if (value <= 0) {
|
|
// label.qty = 1;
|
|
// this.showMessage('发料数量不能小于或等于0')
|
|
// this.$forceUpdate();
|
|
}
|
|
this.calcScanCount(item);
|
|
},
|
|
openAddScanDetailPopup() {
|
|
this.isFromEdit = false;
|
|
this.locationDisabled = true;
|
|
this.openIssuePopup();
|
|
},
|
|
|
|
scanPopupGetFocus() {
|
|
if (this.$refs.scanPopup != undefined) {
|
|
this.$refs.scanPopup.getfocus();
|
|
}
|
|
},
|
|
|
|
showMessage(message) {
|
|
this.$refs.comMessage.showMessage(message, res => {
|
|
if (res) {
|
|
this.afterCloseMessage()
|
|
}
|
|
});
|
|
},
|
|
showErrorMessage(message) {
|
|
this.$refs.comMessage.showErrorMessage(message, res => {
|
|
if (res) {
|
|
this.afterCloseMessage()
|
|
}
|
|
});
|
|
},
|
|
|
|
showScanMessage(message) {
|
|
this.$refs.comMessage.showScanMessage(message);
|
|
},
|
|
|
|
showCommitSuccess() {
|
|
this.$refs.comMessage.showCommitSuccess();
|
|
},
|
|
|
|
showRescanMessage(message) {
|
|
this.$refs.comMessage.showRescanMessage(message);
|
|
},
|
|
|
|
showScanMessage(message) {
|
|
this.$refs.comMessage.showScanMessage(message);
|
|
},
|
|
|
|
closeScanMessage() {
|
|
this.scanPopupGetFocus();
|
|
},
|
|
confirm(data) {
|
|
this.dataContent = data;
|
|
},
|
|
issueDetailEdit(data) {
|
|
this.isFromEdit = true;
|
|
// this.dataContent = data;
|
|
this.$forceUpdate();
|
|
},
|
|
confirmResult(result) {
|
|
this.dataContent = result;
|
|
this.$forceUpdate();
|
|
},
|
|
closeScanPopup() {
|
|
this.updateCommitBtn();
|
|
},
|
|
openScanDetailPopup() {
|
|
var datacontent = {}
|
|
//克隆对象,深度克隆,防止双向绑定同一个变量
|
|
// Object.assign(datacontent, this.detailSource);
|
|
this.$refs.comScanIssuePack.openScanPopup(this.detailSource, this.jobContent);
|
|
},
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.uni-numbox__value {
|
|
width: 40px;
|
|
}
|
|
|
|
button[disabled] {
|
|
background-color: #3C9CFF;
|
|
color: #fff;
|
|
opacity: 0.7;
|
|
}
|
|
|
|
|
|
// /deep/ .input-value {
|
|
// font-size: 16px;
|
|
// }
|
|
|
|
// /deep/ .uni-collapse-item__title-text {
|
|
// font-size: 16px;
|
|
// }
|
|
|
|
// /deep/ .uni-collapse-item--border {
|
|
// border-bottom-width: 0px;
|
|
// border-bottom-color: #ebeef5;
|
|
// }
|
|
|
|
// /deep/ .uni-collapse-item--border {
|
|
// border-bottom-width: 1px;
|
|
// border-bottom-color: #ebeef5;
|
|
// }
|
|
</style>
|
|
|