<template>
|
<view class="page">
|
<view class="finishProductIn-index-bg"/>
|
<u-navbar title="成品入库" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
|
<view class="finishProductIn-index-param">
|
<view class="finishProductIn-index-param-view">
|
<view class="finishProductIn-index-param-item param-extra">
|
<view class="finishProductIn-index-param-item-left">
|
<text class="item-one">至库位号</text>
|
</view>
|
<view class="finishProductIn-index-param-item-right" @click="seachLocationNo">
|
<text class="item-one">{{tolocationNo}}</text>
|
<u-icon name="arrow-right" color="#687792" size="28"></u-icon>
|
</view>
|
</view>
|
<view class="finishProductIn-index-param-item param-extra">
|
<view class="finishProductIn-index-param-item-left">
|
<text class="item-one">自动提交</text>
|
</view>
|
<view class="finishProductIn-index-param-item-right">
|
<!--<text class="item-one">{{isAuto?'是':'否'}}</text>-->
|
<picker class="item-one" style="width: 100%;" @change="autoNumBindChange($event,isAutoList)" :value="autoNumIndex" :range="isAutoList"
|
range-key="label">
|
<view>
|
<text>{{isAutoList[autoNumIndex].label}}</text>
|
</view>
|
</picker>
|
<u-icon name="arrow-right" color="#687792" size="28"></u-icon>
|
</view>
|
</view>
|
<view class="finishProductIn-index-param-item">
|
<view class="finishProductIn-index-param-item-left">
|
<text class="item-one">是否预留</text>
|
</view>
|
<view class="finishProductIn-index-param-item-right">
|
<!--<text class="item-one">{{isAuto?'是':'否'}}</text>-->
|
<picker class="item-one" style="width: 100%;" @change="reserveNumBindChange($event,isReserveList)" :value="reserveNumIndex" :range="isReserveList"
|
range-key="label">
|
<view>
|
<text>{{isReserveList[reserveNumIndex].label}}</text>
|
</view>
|
</picker>
|
<u-icon name="arrow-right" color="#687792" size="28"></u-icon>
|
</view>
|
</view>
|
</view>
|
</view>
|
<view class="finishProductIn-index-operate-info">
|
<view class="finishProductIn-index-operate-info-view">
|
<view class="info-one">
|
<view class="t1">{{totalQty}}</view>
|
<view class="t2">总数</view>
|
</view>
|
<view class="info-two">
|
<view class="t1">{{totalPan}}</view>
|
<view class="t2">总盘数</view>
|
</view>
|
</view>
|
</view>
|
<view class="wrap">
|
<scroll-view class="finishProductIn-index-scroll-list" scroll-y="true">
|
<u-cell-group class="finishProductIn-index-scroll-list-group" :border="false">
|
<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
|
<view class="content-header">
|
<view class="header-item">
|
<view class="content-header-icon-one"></view>
|
<view class="content-header-title">{{ item.partBatchNo }}</view>
|
</view>
|
<view class="header-item">
|
<view class="content-header-icon-two"></view>
|
<view class="content-header-title-ne">{{ item.partName }}</view>
|
</view>
|
<view class="header-item-toolbar" @click="deleteHandle(item)">
|
<view class="header-item-toolbar-del-icon">
|
|
</view>
|
<view class="header-item-toolbar-del-text">
|
删除
|
</view>
|
</view>
|
</view>
|
<view class="content-body">
|
<view class="part-one">
|
<view class="part-one-left">
|
<text>订单号: {{ item.customerOrderNo }}</text>
|
</view>
|
<view class="part-one-right">
|
<text>零件号: {{ item.partNo }}</text>
|
</view>
|
</view>
|
<view class="part-two">
|
<view class="list-row">
|
<view class="list-row-left">{{' '}}erp批号: {{ item.ifsBatchNo }}</view>
|
<view class="list-row-right">从库位号: {{ item.locationNo }}</view>
|
</view>
|
<view class="list-row">
|
<view class="list-row-left">计量单位: {{ item.unit }}</view>
|
<view class="list-row-right">至库位号: {{ item.arriveLocationNo }}</view>
|
</view>
|
</view>
|
<view class="part-three">
|
<view class="part-three-left">
|
<view class="_label">
|
可用库存数量
|
</view>
|
<view class="_content">
|
{{ item.availableStockQuantity }}
|
</view>
|
</view>
|
<view class="part-three-right">
|
<view class="_label">
|
移库库存数量
|
</view>
|
<view class="_content">
|
<u-input placeholder="请输入数量" v-model="item.moveQty" type="digit"></u-input>
|
<!--<text>{{ item.moveQty }}</text>-->
|
<view class="edit_icon"></view>
|
</view>
|
</view>
|
</view>
|
</view>
|
<!--<view class="row-list">
|
<view class="_label">
|
移库库存数量:
|
</view>
|
<view class="_content">
|
<u-input placeholder="请输入移库库存数量" v-model="item.moveQty" type="digit"></u-input>
|
</view>
|
</view>-->
|
</view>
|
</u-cell-group>
|
</scroll-view>
|
<scan></scan>
|
|
<view class="finishProductIn-form-footer" v-if="list.length>0">
|
<u-button class="btn" type="primary" @click="submit">提交</u-button>
|
</view>
|
</view>
|
</view>
|
</template>
|
<script>
|
import scan from "@/components/scan/scan.vue";
|
import content_bg from '@/static/custom/finishProductIn/locNoBg.png'
|
|
export default {
|
components: {
|
scan
|
},
|
data() {
|
return {
|
background:{
|
backgroundImage: `url(${content_bg})`,
|
backgroundAttachment: 'fixed',
|
backgroundSize: '100% auto',
|
backgroundRepeat: 'no-repeat',
|
},
|
list: [],
|
tolocationNo: "CPK01",
|
isUseLotBatchNo:false,
|
isAuto:false,
|
isReserve:false,
|
index:0,
|
isAutoList:[
|
{value:false,label:'否'},
|
{value:true,label:'是'}
|
],
|
autoNumIndex:0,
|
isReserveList:[
|
{value:false,label:'否'},
|
{value:true,label:'是'}
|
],
|
reserveNumIndex:0,
|
};
|
},
|
onLoad() {
|
// this.loadList({"part_no":"88.118.1/A0048179","wdr":"221026000567N","qty_arrived":"1","wdr":"221026000567N","unit_meas":"pcs","material_code":null});
|
// this.loadList({"part_no":"88.118.1/A0187345","lot_batch_no":"230315003687N","qty_arrived":2.64,"wdr":"检5","unit_meas":"km","material_code":"25070076","sn_no":"检5"});
|
},
|
onShow() {
|
|
let that = this
|
|
uni.$off('scan') // 每次进来先 移除全局自定义事件监听器
|
uni.$on('scan', function(data) {
|
console.log('onscan');
|
//扫码成功后的回调,你可以写自己的逻辑代码在这里
|
console.log('扫码结果:', data.code);
|
|
if (data.code != "" && (that.tolocationNo == "")) {
|
uni.showToast({
|
title: '请选择至库位号',
|
icon: 'none'
|
})
|
return
|
}
|
//判断二维码中是否有sn_no,兼容老标签二维码
|
let snNoIndex=data.code.indexOf('sn_no')
|
if(snNoIndex>-1){
|
this.isUseLotBatchNo=false
|
}else{
|
this.isUseLotBatchNo=true
|
}
|
const result = JSON.parse(data.code)
|
//判断数组中是否存在 SN和partNo 是否已经存在
|
let initList = that.list.filter(item => {
|
return item.partNo === result.part_no && item.partBatchNo === (this.isUseLotBatchNo?result.lot_batch_no:result.sn_no) && that.tolocationNo === item.arriveLocationNo
|
})
|
if (initList.length > 0) {
|
uni.showToast({
|
title: "此条记录已存在。",
|
icon: "none"
|
});
|
return
|
}
|
that.loadList(result);
|
})
|
},
|
onNavigationBarButtonTap(e) {
|
uni.scanCode({
|
success: res => {
|
try {
|
const result = JSON.parse(res.result)
|
|
} catch (e) {}
|
}
|
});
|
},
|
computed: {
|
totalQty(){
|
const total=this.list.reduce((prev, curr) => {
|
return prev + (parseFloat(curr.moveQty)||0)
|
}, 0)
|
return parseFloat(total.toFixed(6))
|
},
|
totalPan(){
|
return this.list.length
|
}
|
},
|
methods: {
|
autoNumBindChange(e,storage){
|
if (storage.length <= 0) {
|
this.autoNumIndex = null
|
return
|
}
|
this.autoNumIndex = e.target.value
|
this.isAuto = storage[this.autoNumIndex].value
|
},
|
reserveNumBindChange(e,storage){
|
if (storage.length <= 0) {
|
this.reserveNumIndex = null
|
return
|
}
|
this.reserveNumIndex = e.target.value
|
this.isReserve = storage[this.reserveNumIndex].value
|
},
|
//至库位
|
seachLocationNo() {
|
uni.navigateTo({
|
url: '/pages/wareHouse/finishProductIn/locNoList'
|
})
|
},
|
loadList(result) {
|
|
uni.showLoading({
|
mask: true,
|
title: "加载中",
|
});
|
let that = this
|
if(that.list.length > 1) {
|
uni.showToast({
|
title: '成品入库不支持批量操作',
|
icon: "none"
|
});
|
return
|
}
|
if (result) {
|
let data = {
|
sn: (this.isUseLotBatchNo?result.lot_batch_no:result.sn_no),
|
partNo: result.part_no
|
}
|
// 查询库存信息
|
that.$u.api.finishProductIn.list(data).then(res => {
|
that.index++
|
let reList = res.data
|
|
if (reList.length == 0) {
|
uni.showToast({
|
title: `库位号:${that.tolocationNo},零件号:${data.partNo},SN:${data.sn},未扫到库存信息`,
|
icon: "none"
|
});
|
} else {
|
for (let i = 0; i < reList.length; i++) {
|
let item = {
|
id: reList[i].id,
|
partNo: reList[i].partNo,
|
partName: reList[i].partName,
|
partBatchNo: reList[i].partBatchNo,
|
ifsBatchNo: reList[i].ifsBatchNo,
|
unit: reList[i].unit,
|
locationNo: reList[i].locationNo,
|
availableStockQuantity: reList[i].availableStockQuantity,
|
arriveLocationNo: that.tolocationNo,
|
moveQty: reList[i].availableStockQuantity,
|
customerOrderNo: reList[i].customerOrderNo,
|
materialCode:result.material_code
|
}
|
|
that.list.push(item)
|
}
|
if(this.isAuto){
|
this.submit()
|
}
|
}
|
uni.hideLoading();
|
})
|
|
}
|
},
|
//至库位号设置
|
setNo(no) {
|
this.tolocationNo = no
|
},
|
deleteHandle(obj) {
|
let that = this
|
uni.showModal({
|
title: '提示',
|
content: '此操作将删除该入库信息, 是否继续?',
|
success: function(res) {
|
if (res.confirm) {
|
that.list.map((item, index) => {
|
if (obj.id == item.id) {
|
that.list.splice(index, 1)
|
}
|
});
|
}
|
}
|
});
|
},
|
submit() {
|
let that = this
|
that.list.map((item) => {
|
if (item.moveQty <= 0) {
|
uni.showToast({
|
title: '请入库数量必须大于0',
|
icon: "none"
|
});
|
return
|
}
|
if (item.moveQty > item.availableStockQuantity) {
|
uni.showToast({
|
title: '入库数量不能大于可用库存数量',
|
icon: "none"
|
});
|
return
|
}
|
});
|
if(that.list.length > 1) {
|
uni.showToast({
|
title: '成品入库不支持批量操作',
|
icon: "none"
|
});
|
return
|
}
|
let subList = []
|
that.list.map((item) => {
|
let sub = {
|
stockId: item.id,
|
arriveLocationNo: item.arriveLocationNo,
|
moveQty: item.moveQty,
|
materialCode:item.materialCode,
|
snNo:item.partBatchNo,
|
isReserve:that.isReserve
|
}
|
subList.push(sub)
|
});
|
|
that.$u.api.finishProductIn.addList(subList).then(res => {
|
if (res.code == 0) {
|
uni.showToast({
|
title: '提交成功',
|
duration: 2000
|
});
|
that.index = 0
|
that.list = []
|
} else {
|
uni.showModal({
|
title: '提示',
|
content: res.msg||'提交失败',
|
showCancel: false,
|
success: function() {
|
|
}
|
})
|
}
|
})
|
},
|
}
|
};
|
</script>
|
<style lang="scss" scoped>
|
.finishProductIn-index-bg{
|
background-color: #F6F9FF;
|
background-image: url('~@/static/custom/finishProductIn/locNoBg.png');
|
// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
|
padding: 0 20rpx;
|
background-attachment: fixed;
|
background-size: 100% auto;
|
background-repeat: no-repeat;
|
position: fixed;
|
top: 0;
|
bottom: 0;
|
width: 100%;
|
z-index: -1;
|
}
|
.finishProductIn-index-param{
|
padding: 50rpx 30rpx 0rpx 30rpx;
|
.finishProductIn-index-param-view{
|
height: 300rpx;
|
background: rgba(255,255,255,0.61);
|
box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110,120,135,0.09);
|
border-radius: 10rpx;
|
padding:0rpx 23rpx;
|
margin-bottom: 20rpx;
|
.finishProductIn-index-param-item{
|
height: 100rpx;
|
border: 1px solid #ADC8E4;
|
line-height: 100rpx;
|
display:flex;
|
justify-content: space-between;
|
border: none;
|
.finishProductIn-index-param-item-left{
|
.item-one{
|
font-size: 30rpx;
|
color: #4F4F4F;
|
}
|
}
|
.finishProductIn-index-param-item-right{
|
display: flex;
|
.item-one{
|
font-size: 30rpx;
|
color: #333333;
|
margin-right: 6rpx;
|
}
|
.item-two{
|
font-size: 30rpx;
|
color: #A6B4CC;
|
margin-right: 6rpx;
|
}
|
.item-three{
|
font-size: 30rpx;
|
color: #214DED;
|
margin-right: 6rpx;
|
}
|
}
|
}
|
.param-extra{
|
border-bottom: 1px solid #E8EBEE;
|
}
|
}
|
}
|
|
.finishProductIn-index-operate-info{
|
height: 144rpx;
|
width: 690rpx;
|
margin: 0 auto 20rpx;
|
.finishProductIn-index-operate-info-view{
|
background-image: url('~@/static/custom/finishProductIn/info-bg.png');
|
background-size: 100% auto;
|
background-repeat: no-repeat;
|
height: 144rpx;
|
position: relative;
|
.info-one{
|
position:absolute;
|
top:0rpx;
|
left:60rpx;
|
height:144rpx;
|
display: flex;
|
flex-direction:column;
|
justify-content: center;
|
text-align: center;
|
.t1{
|
font-size: 36rpx;
|
color: #0C72FF;
|
font-weight: bold;
|
}
|
.t2{
|
font-size: 28rpx;
|
color: #4C4E4E;
|
}
|
}
|
.info-two{
|
position:absolute;
|
top:0rpx;
|
left:270rpx;
|
height:144rpx;
|
display: flex;
|
flex-direction:column;
|
justify-content: center;
|
text-align: center;
|
.t1{
|
font-size: 36rpx;
|
color: #0C72FF;
|
font-weight: bold;
|
}
|
.t2{
|
font-size: 28rpx;
|
color: #4C4E4E;
|
}
|
}
|
}
|
}
|
|
.wrap .finishProductIn-index-scroll-list{
|
height:calc(100vh - var(--window-top) - var(--window-bottom) - 756rpx);
|
width:100%;
|
}
|
.finishProductIn-index-scroll-list-group{
|
::v-deep .u-cell-item-box {
|
background-color:rgba(250,252,255,0.36) !important;
|
padding:0rpx 30rpx ;
|
}
|
.content {
|
font-size: 12px;
|
background-color: #FFFFFF;
|
box-sizing: border-box;
|
border-radius: 10rpx;
|
margin: 0rpx 0rpx 26rpx;
|
height: 450rpx;
|
padding: 10rpx 20rpx;
|
box-shadow:0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
|
position:relative;
|
.content-header{
|
.header-item{
|
height: 50rpx;
|
display: flex;
|
align-items:center;
|
.content-header-icon-one{
|
background-image: url('~@/static/custom/finishProductIn/label-icon-1.png');
|
background-size: 100% auto;
|
background-repeat: no-repeat;
|
height:28rpx;
|
width:28rpx;
|
}
|
.content-header-icon-two{
|
background-image: url('~@/static/custom/finishProductIn/header_icon.png');
|
background-size: 100% auto;
|
background-repeat: no-repeat;
|
height:28rpx;
|
width:28rpx;
|
}
|
.content-header-title{
|
margin-left: 11rpx;
|
font-size: 26rpx;
|
font-weight: bold;
|
color: #333333;
|
}
|
.content-header-title-ne{
|
margin-left: 11rpx;
|
font-size: 26rpx;
|
color: #333333;
|
}
|
}
|
.header-item-toolbar{
|
position: absolute;
|
background-image: url('~@/static/custom/finishProductIn/del-icon.png');
|
background-size: 100% auto;
|
background-repeat: no-repeat;
|
height:60rpx;
|
width:140rpx;
|
right:0;
|
top:0;
|
display: flex;
|
justify-content: flex-end;
|
padding-top: 10rpx;
|
padding-right: 18rpx;
|
.header-item-toolbar-del-icon{
|
background-image: url('~@/static/custom/finishProductIn/icon_dele.png');
|
background-size: 100% auto;
|
background-repeat: no-repeat;
|
height:25rpx;
|
width:22rpx;
|
margin-top: 5rpx;
|
}
|
.header-item-toolbar-del-text{
|
margin-left:7rpx;
|
height: 23rpx;
|
font-size: 24rpx;
|
color: #FFFFFF;
|
}
|
}
|
}
|
|
.content-body{
|
margin-top:8rpx;
|
.part-one{
|
display: flex;
|
justify-content: space-between;
|
margin-bottom: 16rpx;
|
.part-one-left{
|
padding: 8rpx 16rpx;
|
height: 50rpx;
|
background: #EFF5FF;
|
border-radius: 20rpx;
|
font-size: 24rpx;
|
color: #2D85EC;
|
}
|
.part-one-right{
|
padding: 8rpx 16rpx;
|
height: 50rpx;
|
background: #EBFEFD;
|
border-radius: 20rpx;
|
font-size: 24rpx;
|
color: #139FAC;
|
}
|
}
|
.part-two{
|
background: #F5F9FF;
|
border-radius: 10rpx;
|
padding-left: 20rpx;
|
padding-top: 10rpx;
|
padding-bottom: 10rpx;
|
height: 130rpx;
|
margin-bottom: 16rpx;
|
.list-row{
|
display: flex;
|
justify-content: space-between;
|
height: 55rpx;
|
line-height: 55rpx;
|
font-size: 26rpx;
|
font-weight: 500;
|
color: #666666;
|
.list-row-left{
|
width: 54%;
|
}
|
.list-row-right{
|
width: 46%;
|
}
|
}
|
}
|
|
.part-three{
|
display: flex;
|
justify-content: space-between;
|
padding-left: 20rpx;
|
.part-three-left{
|
width: 54%;
|
._label{
|
font-size: 26rpx;
|
color: #444444;
|
}
|
._content{
|
margin-top: 12rpx;
|
height: 56rpx;
|
line-height: 52rpx;
|
background: #F6FAFF;
|
border: 1px solid #4FA0FF;
|
border-radius: 8rpx;
|
width:265rpx;
|
padding-left: 20rpx;
|
color: #214DED;
|
font-weight: bold;
|
}
|
}
|
.part-three-right{
|
width: 46%;
|
._label{
|
font-size: 26rpx;
|
color: #444444;
|
}
|
._content{
|
margin-top: 12rpx;
|
height: 56rpx;
|
line-height: 52rpx;
|
background: #F6FAFF;
|
border: 1px solid #4FA0FF;
|
border-radius: 8rpx;
|
width:265rpx;
|
padding-left: 20rpx;
|
padding-right: 10rpx;
|
color: #214DED;
|
font-weight: bold;
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
.edit_icon{
|
background-image: url('~@/static/custom/finishProductIn/icon_edit.png');
|
background-size: 100% auto;
|
background-repeat: no-repeat;
|
height:26rpx;
|
width:26rpx;
|
}
|
::v-deep .u-input__input{
|
font-size: 26rpx !important;
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
.finishProductIn-form-footer{
|
display: flex;
|
margin-top: 10rpx;
|
margin-bottom: 10rpx;
|
margin-left: 20rpx;
|
margin-right: 20rpx;
|
padding-bottom: 14rpx;
|
.btn {
|
flex: 1;
|
margin: 10rpx;
|
background: #214DED;
|
box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
|
font-weight: bold;
|
color: #FEFEFE;
|
font-family: PingFang SC;
|
}
|
}
|
</style>
|