<template> <view class="page-wraper"> <view class="page-header"> <view class="header-view"> <view class="header_job_top"> <job-top :dataContent="jobContent"></job-top> </view> <view class="header_item"> 申请单号 : {{jobContent.requestNumber}} </view> </view> </view> <view class="page-main"> <scroll-view scroll-y="true" class="page-main-scroll"> <view class="detail-list" v-for="(item, index) in detailSource" :key="item.id"> <view class=""> <comJobDetailCard :dataContent="item" :index="index" :settingParam="jobContent" :isShowStatus="true" @remove="updateData" @updateData="updateData" :locationAreaTypeList='toLocationAreaTypeList' :isShowPackListStatus="false" > </comJobDetailCard> </view> </view> </scroll-view> </view> <view class="page-footer"> <view class="uni-flex u-col-center space-between padding_10" style="background-color:ghostwhite; width: 100%; "> <view class=""> <locationCompare ref='comScanLocation' title="目标库位" :recommendLocationCode="jobToLocationCode" :locationCode="toLocationCode" @getLocation='scanLocationCode' :isShowEdit="isCheckLocation" :locationAreaTypeList="toLocationAreaTypeList"></locationCompare> </view> <view class=" uni-flex uni-row"> <button class="btn_single_commit" hover-class="btn_commit_after" @click="commit">提交</button> </view> </view> </view> <win-scan-button @goScan='openScanPopup'></win-scan-button> <!-- <winScanPackAndLocationNoBalance ref="scanPopup" @getResult='getScanResult' :allowNullBalance="true"> </winScanPackAndLocationNoBalance> --> <winScanPackAndLocation :balanceFromInventoryStatuses="false" ref="scanPopup" @getResult='getScanResult' :noShowBalanceMessage="false"> </winScanPackAndLocation> <comMessage ref="comMessage"></comMessage> </view> </template> <script> import { getManagementPrecisions, } from '@/common/balance.js'; import { getPutawayJobDetail, putawayJobSubmit, takePutawayJob, cancleTakePutawayJob, getSwitchByCode } from '@/api/request2.js'; import { goHome, getCurrDateTime, getPackingNumberAndBatch, navigateBack, compareAsc, getSwitchInfoByCode } from '@/common/basic.js'; import { getDirectoryItemArray, getInventoryStatusName } from '@/common/directory.js'; import { getTreeDataSource, calcHandleQty, calcTreeHandleQty, getScanCount } from '@/common/detail.js'; import winScanButton from '@/mycomponents/scan/winScanButton.vue' import winScanPackAndLocation from "@/mycomponents/scan/winScanPackAndLocation.vue" import comJobDetailCard from "@/mycomponents/detail/comJobDetailCard.vue" import locationCompare from '@/mycomponents/location/locationCompare.vue' import jobTop from '@/mycomponents/job/jobTop.vue' export default { components: { winScanButton, winScanPackAndLocation, locationCompare, comJobDetailCard, jobTop }, data() { return { id: '', scanCount: 0, jobContent: {}, //任务内容 subList: [], //接口返回的任务subList detailSource: [], //绑定在页面上的数据源 managementList: [], fromLocationCode: "", toLocationCode: "", toLocationAreaTypeList: [], jobStatus: "", jobToLocationCode: "", isCheckLocation: false, scanMessage: "" }; }, onLoad(option) { uni.setNavigationBarTitle({ title: option.title + '详情' }) this.id = option.id; this.scanMessage = option.scanMessage if (this.id != undefined) { //新建的任务自动接收 if (option.status == "1") { this.receive((callback => { this.getDetail(); })); } else { this.getDetail(); } } }, //返回首页 onNavigationBarButtonTap(e) { if (e.index === 0) { goHome(); } }, //拦截返回按钮事件 onBackPress(e) { //已经接收但是没提交任务 if (e.from == 'backbutton') { if (this.jobStatus == "2") { //取消承接任务 cancleTakePutawayJob(this.id).then(res => { uni.navigateBack(); }).catch(error => { uni.navigateBack(); }) } else { uni.navigateBack(); } return true; } }, onPullDownRefresh() { this.getDetail(); uni.stopPullDownRefresh(); }, mounted() { }, methods: { //接收 receive(callback) { if (this.id != null) { takePutawayJob(this.id).then(res => { callback(); }).catch(error => { this.showErrorMessage(error) }) } }, getDetail() { var that = this; uni.showLoading({ title: "加载中....", mask: true }); getPutawayJobDetail(that.id).then(res => { uni.hideLoading(); if (res.data == null) { that.showMessage('未获取到详情'); } else { if (res.data.subList.length > 0) { that.jobContent = res.data; that.jobStatus = res.data.status //赋值给真实的状态 res.data.subList.forEach(item => { item.inventoryStatus = item.inspectResult }) that.subList = res.data.subList; that.detailSource = getTreeDataSource(that.subList) that.fromLocationCode = that.subList[0].fromLocationCode that.jobToLocationCode = that.subList[0].toLocationCode; that.toLocationAreaTypeList = getDirectoryItemArray(that.jobContent.toAreaTypes) that.isCheckLocation = getSwitchInfoByCode("PurchasePutawayToLocationCodeValidate") if (that.isCheckLocation) { that.toLocationCode = "" } else { that.toLocationCode = that.jobToLocationCode; } //外部进入详情,如果有扫描信息,模拟自动扫描 if (this.scanMessage) { this.openScanPopupSimulate(this.scanMessage) } } else { that.showMessage('列表数据为0'); } } }).catch(error => { uni.hideLoading() this.showErrorMessage(error) }) }, calcScanCount(closeScan) { let items = this.subList.filter(r => { if (r.scaned) { return r; } }) this.scanCount = items != null ? items.length : 0; if (this.scanCount == this.subList.length) { this.closeScanPopup(); } }, calcHandleQty() { calcTreeHandleQty(this.detailSource); this.continueScan() this.$forceUpdate(); }, //继续扫描 continueScan() { this.scanCount = getScanCount(this.subList); if (this.scanCount == this.subList.length) { this.closeScanPopup(); } else { this.scanPopupGetFocus(); } }, updateData() { console.log("updateData") // this.calcHandleQty(); calcTreeHandleQty(this.detailSource) }, //模拟扫描功能 openScanPopupSimulate(message) { let fromlocationCode = ''; let fromlocationList = []; for (var i = 0; i < this.detailSource.length; i++) { let item = this.detailSource[i]; item.subList.forEach(l => { //重复的库位不往里面插入 var location = fromlocationList.find(res => res == l.fromLocationCode) if (location == undefined) { fromlocationList.push(l.fromLocationCode); } //来源库位赋默认值 if (fromlocationCode == '') { fromlocationCode = l.fromLocationCode; } }) } this.$refs.scanPopup.openScanPopupForJobSimulate(fromlocationCode, fromlocationList, this.jobContent, message); }, openScanPopup() { let fromlocationCode = ''; let fromlocationList = []; for (var i = 0; i < this.detailSource.length; i++) { let item = this.detailSource[i]; item.subList.forEach(l => { //重复的库位不往里面插入 var location = fromlocationList.find(res => res == l.fromLocationCode) if (location == undefined) { fromlocationList.push(l.fromLocationCode); } //来源库位赋默认值 if (fromlocationCode == '') { if (!l.scaned) { fromlocationCode = l.fromLocationCode; } } }) } this.$refs.scanPopup.openScanPopupForJob(fromlocationCode, fromlocationList, this.jobContent); }, closeScanPopup() { this.$refs.scanPopup.closeScanPopup(); }, getScanResult(result) { try { var packingNumber = result.label.packingNumber; var batch = result.label.batch; var qty = result.label.qty; var itemCode = result.label.itemCode; var locationCode = result.fromLocationCode; if (!result.balance) { this.showMessage("箱码【" + packingNumber + "】没有库存余额") return; } // var inventoryStatus = "OK"; var detail = this.detailSource.find(r => r.itemCode == itemCode); if (detail == undefined) { this.showErrorMessage("物料号【" + itemCode + "】不在列表中") } else { var itemDetail = detail.subList.find(r => { return r.packingNumber == packingNumber && r.batch == batch && r.fromLocationCode == result.fromLocationCode }) if (itemDetail == undefined) { var isExit; for (let subItem of detail.subList) { var item; for (let pack of subItem.packList) { if (pack.packingNumber == packingNumber && pack.batch == batch) { item = pack; isExit = pack; break; } } if (item != undefined) { subItem.scaned = true subItem.handleQty = 0; item = undefined } } if (isExit == undefined) { this.showErrorMessage("箱码【" + packingNumber + "】,批次【" + batch + "】库位【" + result .fromLocationCode + "】不在列表中") } else { if (!isExit.cancleScanedHiht && isExit.scaned) { this.showMessage("箱码【" + packingNumber + "】已经扫描") } else { isExit.scaned = true let qty = 0; if (result.balance != null) { qty = Number(result.balance.qty); } else { qty = Number(result.label.qty); } isExit.handleQty = Number(result.label.qty); isExit.toLocationCode = this.toLocationCode; } } calcTreeHandleQty(this.detailSource); this.continueScan() this.$forceUpdate() } else { var scanedLength = 0; itemDetail.packList.forEach(res => { if (res.scaned) { scanedLength++; } }) //大哥让加的 itemDetail.fromInventoryStatus = result.balance.inventoryStatus; if (!itemDetail.cancleScanedHiht && itemDetail.scaned && scanedLength == itemDetail.packList .length) { this.showMessage("箱码【" + packingNumber + "】已经扫描") } else { itemDetail.scaned = true; this.detailSource[0].subList.sort(compareAsc('scaned')); //按扫描信息排序 itemDetail.handleQty = result.label.qty; // itemDetail.toInventoryStatus = "OK" itemDetail.packList.forEach(pac => { pac.scaned = true pac.handleQty = Number(pac.qty); pac.toLocationCode = this.toLocationCode; }) calcTreeHandleQty(this.detailSource); this.continueScan() this.$forceUpdate() } } } } catch (e) { this.showMessage(e.message) } }, scanLocationCode(location, code) { this.toLocationCode = code this.detailSource.forEach(item => { item.subList.forEach(detail => { detail.toLocationCode = code }) }) }, openDetail(item) { this.$refs.jobDetailPopup.openPopup(item) }, checkLocation() { var isPass = true; if (this.toLocationCode == "" || this.toLocationCode == null) { this.showMessageHint('请扫描收货库位', callback => { this.$refs.comScanLocation.showLocation(); }) return isPass = false; } return isPass; }, showMessageHint(hint, callback) { this.$refs.comMessage.showErrorMessage(hint, res => { if (res) { callback() } }); }, commit() { this.scanCount = getScanCount(this.subList); if (this.scanCount == 0) { this.showErrorMessage("扫描数为0,请先扫描") return; } if (!this.checkLocation()) { return } //扫描数量和任务数量相等,直接提交 if (this.scanCount == this.subList.length) { this.submitJob(); } else if (this.scanCount < this.subList.length) { //扫描数量小于任务数量,判断是否允许部分提交 if (this.jobContent.allowPartialComplete == "TRUE") { //提交 this.$refs.comMessage.showQuestionMessage1("任务明细未全部完成,是否提交?", 'red', res => { if (res) { this.submitJob() } }); } else { //不允许部分提交,提示 this.$refs.comMessage.showErrorMessage("任务明细未全部完成,不允许部分提交!", res => { if (res) { this.openScanPopup(); } }); } } }, submitJob() { uni.showLoading({ title: "提交中....", mask: true }); var itemCodes = [] this.detailSource.forEach(item => { itemCodes.push(item.itemCode) }) //获取管理模式,封装参数 getManagementPrecisions(itemCodes, this.toLocationCode, res => { if (res.success) { this.managementList = res.list; var params = this.setParams() console.log("提交参数", JSON.stringify(params)); putawayJobSubmit(params).then(res => { uni.hideLoading() if (res.data) { this.showCommitSuccessMessage("提交成功\n生成采购上架记录\n" + res.data) } else { this.showErrorMessage("提交失败[" + res.msg + "]") } }).catch(error => { uni.hideLoading() this.showErrorMessage(error) }) } else { uni.hideLoading(); this.showErrorMessage(res.message); } }); }, setParams() { var subList = [] var creator = this.$store.state.user.id this.detailSource.forEach(item => { item.subList.forEach(detail => { if (detail.scaned) { var info = getPackingNumberAndBatch(this.managementList, detail.itemCode, detail.packingNumber, detail.batch); detail.toPackingNumber = info.packingNumber; detail.toBatch = info.batch; detail.toContainerNumber = ''; detail.singlePrice = 1; detail.amount = 11; detail.arriveDate = getCurrDateTime(); detail.produceDate = getCurrDateTime(); detail.expireDate = getCurrDateTime(); let packList = detail.packList.filter(p => p.scaned == true); detail.packList = packList; // detail.singlePrice = detail.balance.singlePrice; // detail.amount = detail.balance.singlePrice * detail.handleQty; // detail.arriveDate = detail.balance.arriveDate; // detail.produceDate = detail.balance.produceDate; // detail.expireDate = detail.balance.expireDate; subList.push(detail) } }) }) this.jobContent.subList = subList this.jobContent.creator = creator; return this.jobContent; }, showMessage(message) { setTimeout(r => { this.scanPopupLoseFocus(); this.$refs.comMessage.showMessage(message, res => { if (res) { this.afterCloseMessage() } }); }) }, showErrorMessage(message) { setTimeout(r => { this.scanPopupLoseFocus(); this.$refs.comMessage.showErrorMessage(message, res => { if (res) { this.afterCloseMessage() } }); }) }, showQuestionMessage(message, callback) { setTimeout(r => { this.scanPopupLoseFocus(); this.$refs.comMessage.showQuestionMessage(message, res => { if (res) { callback(res); } }); }) }, scanPopupGetFocus() { this.$refs.scanPopup.packGetFocus(); }, scanPopupLoseFocus() { this.$refs.scanPopup.packLoseFocus(); }, afterCloseMessage() { this.scanPopupGetFocus(); }, showCommitSuccessMessage(hint) { this.$refs.comMessage.showSuccessMessage(hint, res => { navigateBack(1) }) }, } } </script> <style scoped lang="scss"> </style>