2025-03-11 09:45:29 +08:00

563 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<u-navbar back-text="返回" title="物料拣配/出库" :background="background"></u-navbar>
<view v-show="loadding"
style="width: 100%; height: 900rpx; display: flex; justify-content: center; align-items: center;">
<u-loading mode="circle" :size="70" color="#00aaff"></u-loading>
</view>
<view class='content' v-show="!loadding">
<u-select v-model="show" mode="single-column" :list="dlist" @confirm="confirm" confirm-text='确认选择' />
<view style="display: flex; justify-content: space-between; margin-top: 10rpx;">
<u-input v-model="form.plan" :border="true" style="background: #FFFFFF; margin-right: 10rpx;"></u-input>
<u-button @click="handleSelectFormId" style="width: 26%;">选单号</u-button>
</view>
<view v-if="exportViewFlag" @click="exportTimeView" style="background-color: #b3c1ff;width: 520rpx;height: 40rpx;margin-top: 10rpx;font-size: 30rpx;
padding-left: 22rpx;">
{{exportTime}}</view>
<!-- <view v-if="exportTagFlag" style="margin-top: 10rpx;margin-bottom: 5rpx;">
<ir-date-time-picker type="border-bottom" start="2021-1-1" end="2050-12-31" :value="exportTime"
placeholder="请选择出库单时间" :showIcon="true" :showArrow="true" :showClear="true"
@change="exportChange" />
</view> -->
<u-picker mode="time" v-model="exportFlag" :params="params" :value="exportTime" @confirm="exportChange"
@cancle="exportTimeCancle"></u-picker>
<!-- <view style="height: 30rpx;" /> -->
<u-select v-show="mVisibleFlag" v-model="mshow" mode="single-column" :list="mlist"
@confirm="materialConfirm" confirm-text='确认选择' />
<view v-show="mVisibleFlag" style="display: flex; justify-content: space-between; margin-top: 10rpx;">
<u-input v-model="form.material" :border="true" style="background: #FFFFFF; margin-right: 10rpx;">
</u-input>
<u-button @click="handleSelectMaterial" style="width: 26%;">选物料</u-button>
</view>
<u-select v-show="additionalFlag" mode="single-column" v-model="additionalShow" :list="additionalList"
@confirm="additionalSelectConfirm" comfirm-text="确认选择"></u-select>
<view v-if="additionalFlag" style="display: flex; justify-content: space-between; margin-top: 10rpx;">
<u-input v-model="form.additionalId" :border="true" style="background: #FFFFFF; margin-right: 10rpx;">
</u-input>
<u-button @click="handleSelectAdditional" style="width: 26%;">选超领单</u-button>
</view>
<!-- <view v-if="exportAdditonFlag" style="margin-top: 10rpx;margin-bottom: 5rpx;">
<ir-date-time-picker type="border-bottom" start="2021-1-1" end="2050-12-31" :value="exportAdditonTime"
placeholder="请选择超领单时间" :showIcon="true" :showArrow="true" :showClear="true"
@change="exportAdditionChange" />
</view> -->
<view v-if="exportAddViewFlag" @click="exportAddTimeView" style="background-color: #b3c1ff;width: 520rpx;height: 40rpx;margin-top: 10rpx;font-size: 30rpx;
padding-left: 22rpx;">
{{exportAdditonTime}}</view>
<u-picker mode="time" v-model="exportAdditonFlag" :params="params" :value="exportAdditonTime" @confirm="exportAdditionChange"
@cancle="exportAdditionCancle"></u-picker>
<u-line-progress style="margin-top: 30rpx;" active-color="#32CD32" :percent="progress"></u-line-progress>
<u-card style="border: 1rpx solid #0081FF;" :show-head="false" :full="true"
:body-style="{height: '100rpx'}">
<view class="card-body" slot="body">
<u-row justify="between">
<u-col :span="isAdditional ? 4 : 6">
<view class="info-label">需拣数量</view>
<view>{{ cntInfo.materialrequstcnt }}</view>
</u-col>
<u-col :span="isAdditional ? 4 : 6">
<view class="info-label">已拣数量</view>
<view>{{ cntInfo.materialoutcnt }}</view>
</u-col>
<u-col v-if="isAdditional" :span="isAdditional ? 4 : 0">
<view class="info-label">超领单数量</view>
<view>{{ cntInfo.materialAdditionalCnt }}</view>
</u-col>
</u-row>
</view>
</u-card>
<view style="display: flex; justify-content: space-between; align-items: center;">
<view style="width: 90rpx;">BOX ID</view>
<u-input v-model="form.currentBox" :focus="focus" :border="true"
style="background: #FFFFFF; margin: 10rpx 10rpx 0 10rpx;" @input='handlePalletInput'></u-input>
</view>
<u-card style="border: 1rpx solid #0081FF;" :show-head="false" :full="true"
:body-style="{height: '150rpx'}">
<view class="card-body" slot="body">
<u-row gutter="8" justify="between">
<u-col span="12">
<view class="info-label">BOX ID</view>
<view>{{ lastBox['box_id'] || "--" }}</view>
</u-col>
<u-col span="12">
<view class="info-label">数量</view>
<view>{{ lastBox['cnt'] || "0" }}</view>
</u-col>
</u-row>
</view>
</u-card>
<u-table class="main-table">
<u-tr class="u-tr">
<u-th class="u-th">BOX ID</u-th>
<u-th class="u-th">领料单号</u-th>
<u-th class="u-th" width="140rpx">物料号</u-th>
<u-th class="u-th" width="140rpx">数量</u-th>
</u-tr>
<u-tr class="u-tr" v-for="(item,index) in tableDisplaySource" :key="index">
<u-td class="u-td">{{ item.box_id }}</u-td>
<u-td class="u-td">{{ item.export_no }}</u-td>
<u-td class="u-td" width="140rpx">{{ item.material_code }}</u-td>
<u-td class="u-td" width="140rpx">{{ item.cnt }}</u-td>
</u-tr>
</u-table>
<!-- <view style="position: fixed; bottom: 0; width: 100%; margin-left: -18rpx; padding: 10rpx;">
<u-button type="primary" @click="handleMaterialPick">出库</u-button>
</view> -->
</view>
<u-toast ref="uBankOutToast" />
<u-modal v-model="showModal" :content="modalContent" @confirm="modalConfirm" :show-cancel-button="true"
@cancel="modalCancel"></u-modal>
<u-modal v-model="additionalModal" :content="additionalContent" @confirm="additionalModalConfirm"
@cancel="additionalModalCancel" :show-cancel-button="true"></u-modal>
<u-modal v-model="exportModal" :content="exportContent" @confirm="exportConfirm" :show-cancel-button="true"
@cancel="exportCancel"></u-modal>
<u-modal v-model="exportAdditionalModal" :content="exportAdditionalContent" @confirm="exportAdditionalConfirm"
@cancel="exportAdditionalCancel" :show-cancel-button="true"></u-modal>
</view>
</template>
<script>
import {
MaterialExportNoListData,
MaterialExportCntData,
QueryMaterialData,
MaterialPick,
MaterialPickCnt,
MaterialListByExportNo,
MaterialAdditionalExportNoListData,
MaterialAdditionalExportCntData
} from '../../../common/api.js'
let timer = null;
export default {
data() {
return {
params: {
year: true,
month: true,
day: true,
hour: true,
minute: true,
},
exportViewFlag: false,
exportTime: '',
exportFlag: false,
exportModal: false,
exportContent: '',
exportAdditonTime: '',
exportAdditonFlag: false,
exportAdditionalModal: false,
exportAdditionalContent: '',
exportAddViewFlag: false,
form: {
plan: '',
material: '',
currentBox: '',
//超领单号
additionalId: '',
},
list: [{
name: '出库时间'
},
{
name: '隐藏'
}
],
background: {
backgroundImage: 'linear-gradient(45deg, rgb(28, 187, 180), rgb(141, 198, 63))'
},
loadding: true,
show: false,
mshow: false,
datasource: [],
tableDisplaySource: [],
sourceList: [],
dlist: [],
mlist: [],
mVisibleFlag: false,
lastBox: {},
progress: 0,
cntInfo: {
materialrequstcnt: 0,
materialoutcnt: 0,
materialAdditionalCnt: 0
},
exeFlag: false,
showModal: false,
modalContent: '',
resReply: {},
focus: false,
additionalFlag: false,
additionalShow: false,
additionalList: [],
additionalModal: false,
additionalContent: '',
isAdditional: false,
username: ''
}
},
mounted() {
this.$nextTick(function() {
this.loadding = false
// timer = setInterval(() => {
// uni.hideKeyboard()
// }, 10)
})
this.username = uni.getStorageSync('username')
},
destroyed() {
if (timer) {
clearInterval(timer)
}
},
watch: {
additionalName(newVal) {
if (newVal === '') {
this.cntInfo.materialAdditionalCnt = 0
}
},
planName() {
this.additionalFlag = false
this.isAdditional = false
this.exportAddViewFlag = false
}
},
computed: {
additionalName() {
return this.form.additionalId
},
planName() {
return this.form.plan
}
},
methods: {
tagClick() {
this.exportFlag = true
},
exportTimeView(){
this.exportFlag = true
},
exportChange(e) {
this.exportTime = e['year'] + '-' + e['month'] + '-' + e['day'] + ' ' + e['hour'] + ':' + e['minute']
this.exportViewFlag = true
//console.log(e)
//console.log('出库单时间' + this.exportTime)
},
exportTimeCancle() {
//this.exportTime = ''
},
exportAdditionChange(e) {
this.exportAdditonTime = e['year'] + '-' + e['month'] + '-' + e['day'] + ' ' + e['hour'] + ':' + e['minute']
this.exportAddViewFlag = true
//console.log('超领单时间' + this.exportAdditonTime)
},
exportAdditionCancle(){
//this.exportAdditonTime = ''
},
exportConfirm() {
this.exportFlag = true
},
exportCancel() {
this.focus = true
},
exportAdditionalConfirm() {
this.exportAdditonFlag = true
},
exportAdditionalCancel() {
this.focus = true
},
exportAddTimeView(){
this.exportAdditonFlag = true
},
confirm(data) {
this.clearAdditionalInfo()
if (this.datasource.length === 0 || this.datasource[0]['export_no'] === data[0]['value']) {
this.form.plan = data[0]['value']
this.form.material = ''
this.cntInfo.materialoutcnt = 0
this.mVisibleFlag = true
MaterialListByExportNo({
export_no: this.form.plan
}).then(res => {
if (res && res['mesg'] === 'success') {
this.mlist = res['res']
if (res['isholdno'] === 'true') {
this.exportModal = true
this.exportContent = '当前工单为跨月工单,是否要人工选择出库时间?'
}
} else {
this.showToast("获取数据失败" + res['reason'], 'error')
}
})
// MaterialExportCntData({export_no: data[0]['value'], material_code: data[1]['value']}).then(res => {
// if(res && res['mesg'] === 'success') {
// const result = res['res']
// this.cntInfo.materialrequstcnt = result['fgcodecnt']
// this.datasource.forEach(d => {
// if(d['export_no'] === data[0]['value'] && d['material_code'] === data[1]['value']){
// this.cntInfo.materialoutcnt += parseInt(d['cnt'])
// }
// })
// }else{
// this.showToast("获取数据失败"+res['mesg'], 'error')
// }
// })
} else {
this.showToast("领料单:" + this.datasource[0]['export_no'] + '未检完', 'error')
}
},
materialConfirm(data) {
this.form.material = data[0]['value']
this.cntInfo.materialoutcnt = 0
MaterialExportCntData({
export_no: this.form.plan,
material_code: this.form.material
}).then(res => {
if (res && res['mesg'] === 'success') {
const result = res['res']
this.cntInfo.materialrequstcnt = result['materialrequstcnt'] === '' ? 0 : parseInt(result[
'materialrequstcnt'])
this.cntInfo.materialoutcnt = result['materialoutcnt'] === '' ? 0 : parseInt(result[
'materialoutcnt'])
this.progress = parseFloat(((this.cntInfo.materialoutcnt / this.cntInfo
.materialrequstcnt) * 100).toFixed(2))
this.focus = true
} else {
this.showToast("获取数据失败" + res['reason'], 'error')
}
})
},
showToast(text, type) {
this.$refs.uBankOutToast.show({
title: text,
type: type,
duration: 5000,
position: "center"
})
},
handlePalletInput(value) {
if (this.form.plan === '') {
this.showToast("未选择领料单号", 'error')
} else {
if (this.exportFlag) {
if (this.exportTime === '') {
this.showToast("当前工单为跨月工单,出库时间不可为空", 'error')
return
}
}
if (this.exportAdditonFlag) {
if (this.exportAdditonTime === '') {
this.showToast("当前超选单为跨月工单,出库时间不可为空", 'error')
return
}
}
if (value.length > 6 && !this.exeFlag) {
this.exeFlag = true
MaterialPickCnt({
box_id: value,
material_code: this.form.material
}).then(res => {
if (res && res['mesg'] === 'success') {
this.resReply = res['res']
if (res['code'] === '400') {
this.showModal = true
this.focus = false
this.modalContent = res['reason']
} else if (res['code'] === '200') {
this.handlePick()
}
} else {
this.showToast("获取数据失败: " + res['reason'], 'error')
}
setTimeout(() => {
this.form.currentBox = ''
this.exeFlag = false
}, 500)
})
}
}
setTimeout(() => {
this.form.currentBox = ''
}, 500)
},
handlePick() {
const result = this.resReply
const p_c = parseInt(result['cnt'])
let totalNumber = this.cntInfo.materialrequstcnt + this.cntInfo.materialAdditionalCnt
if ((this.cntInfo.materialoutcnt + p_c) <= totalNumber) {
result['export_no'] = this.form.plan
result['material_code'] = this.form.material
//result['username'] = this.username
if (this.cntInfo.materialAdditionalCnt != 0) {
result['additional_export_no'] = this.form.additionalId
}
this.lastBox = result
this.datasource.push(result)
this.showToast("BOX符合出库中...", 'success')
MaterialPick({
box_list: JSON.stringify(this.datasource),
username: this.username,
export_time: this.exportTime,
export_addtion_time: this.exportAdditonTime
}).then(res => {
if (res && res['mesg'] === 'success') {
this.showToast("出库成功", 'success')
this.cntInfo.materialoutcnt += p_c
this.progress = parseFloat(((this.cntInfo.materialoutcnt / this.cntInfo
.materialrequstcnt) * 100).toFixed(2))
this.tableDisplaySource.push(this.lastBox)
this.datasource = []
// this.cntInfo.materialrequstcnt = 0
// this.cntInfo.materialoutcnt = 0
// this.form.plan = ''
// this.form.material = ''
this.form.currentBox = ''
// this.lastBox = {}
// this.progress = 0
} else {
this.showToast("出库失败: " + res['reason'] || JSON.stringify(res), 'error')
this.datasource = []
}
this.focus = true
})
} else {
//this.showToast("超出所需数量,无法添加: " + p_c, 'error')
//用户自行决定是否进行超领单操作
this.additionalModal = true
this.additionalContent = "超出所需数量,无法添加: " + p_c + "!是否需要物料超领拣配?"
this.focus = false
}
},
handleSelectFormId() {
if (this.form.plan === '') {
this.showToast("为保证数据量可控,请输入单号前缀", 'warning')
} else {
MaterialExportNoListData({
export_no: this.form.plan
}).then(res => {
if (res && res['mesg'] === 'success') {
this.dlist = res['res']
//console.log(this.dlist)
// this.dlist = this.sourceList.filter(sl => {return sl['value'].toLowerCase().indexOf(this.form.plan.toLowerCase()) >= 0})
if (this.dlist.length > 0) {
this.show = true
} else {
this.showToast("未查找到此前缀单号", 'warning')
}
} else {
this.showToast("获取数据失败: " + res['reason'], 'error')
}
})
}
},
handleSelectMaterial() {
this.mshow = true
},
modalConfirm() {
this.handlePick()
},
modalCancel() {
this.focus = true
},
additionalModalConfirm() {
this.clearAdditionalInfo()
this.additionalFlag = true
},
additionalModalCancel() {
this.clearAdditionalInfo()
this.focus = true
},
additionalSelectConfirm(data) {
this.form.additionalId = data[0]['value']
this.cntInfo.materialAdditionalCnt = 0
MaterialAdditionalExportCntData({
additional_export_no: this.form.additionalId,
material_code: this.form.material
}).then(res => {
if (res && res['mesg'] === 'success') {
this.cntInfo.materialAdditionalCnt = result['additionalrequstcnt'] === '' ? 0 : parseInt(
result['additionalrequstcnt'])
this.isAdditional = true
this.focus = true
if (res['isholdno'] === 'true') {
this.exportAdditionalModal = true
this.exportAdditionalContent = '当前超领单为跨月工单,是否要人工选择出库时间?'
}
} else {
this.showToast('获取数据失败' + res['reason'], 'error')
}
})
},
handleSelectAdditional() {
if (this.form.additionalId === '') {
this.showToast('为保证数据量可控,请输入单号前缀', 'warning')
} else {
MaterialAdditionalExportNoListData({
additional_export_no: this.form.additionalId
}).then(res => {
if (res && res['mesg'] === 'success') {
this.additionalList = res['res']
//console.log(this.additionalList)
if (this.additionalList.length > 0) {
this.additionalShow = true
} else {
this.showToast('未查找到此前缀单号', 'warning')
}
} else {
this.showToast('获取数据失败: ' + res['reason'], 'error')
}
})
}
},
//清空上一个超拣单信息
clearAdditionalInfo() {
this.form.additionalId = ''
this.cntInfo.materialAdditionalCnt = 0
}
}
}
</script>
<style lang="scss" scoped>
.content {
margin: 5rpx 18rpx;
}
.card-body {
::v-deep .u-col {
margin-bottom: 16rpx;
view {
display: inline-block;
}
view+view {
margin-left: 20rpx;
color: #068bff;
}
}
}
.main-table {
::v-deep .u-th {
background: #0081FF !important;
color: #ffffff;
}
::v-deep .u-td {
overflow: hidden;
}
}
.info-label {
width: 140rpx;
}
</style>