pda_uniapp/pages/work/wms/surplusOut.vue

690 lines
16 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="container">
<cu-custom :isBack="true">
<block slot="backText"></block>
<block slot="content">余料出库</block>
</cu-custom>
<view class="example">
<uni-forms ref="form" :model="formData" labelWidth="80px">
<uni-card>注意余料出库后请人工拉走系统会自动清除托盘信息</uni-card>
<uni-forms-item label="货位编号" name="locCode">
<view class="fromItem">
<uni-easyinput v-model="formData.locCode" placeholder="请扫描货位编号" @blur="trimLocInput" />
<image style="width: 28rpx;" src="/static/images/right.png" mode="widthFix"></image>
</view>
</uni-forms-item>
<uni-forms-item label="物料类型" name="skuType">
<view class="fromItem">
<uni-data-select v-model="skuType" :localdata="skuTypeList" @change="changeSkuType"
placeholder="请选择物料类型">
</uni-data-select>
<image style="width: 28rpx;" src="/static/images/right.png" mode="widthFix"></image>
</view>
</uni-forms-item>
<uni-forms-item label="物料" name="skuCode">
<view class="fromItem">
<uni-easyinput v-model="skuInput" placeholder="输入物料码" @input="onSkuInput"
@focus="showSkuDropdown = true" @blur="handleSkuBlur" />
<image style="width: 28rpx;" src="/static/images/right.png" mode="widthFix"></image>
</view>
</uni-forms-item>
<view class="sku-dropdown" v-if="showSkuDropdown && filteredSkuList.length > 0">
<view v-for="item in filteredSkuList" :key="item.value" class="dropdown-item"
@mousedown.prevent="selectSku(item)">
{{ item.text }}
</view>
</view>
<view class="textarea">
<textarea class="full-width-textarea" v-model="skuInfo">
</textarea>
</view>
<uni-forms-item label="库存数量" name="countQty">
<view class="fromItem">
<uni-easyinput v-model="countQty" disabled="true" />
<image style="width: 28rpx;" src="/static/images/right.png" mode="widthFix"></image>
</view>
</uni-forms-item>
</uni-forms>
<!-- <view class="button-group">
<button type="primary" :disabled="isButtonDisabled" style="width: 100px;" @click="callAgv">确认叫料</button>
</view> -->
</view>
<bottomBtn :isSubmit="true" :isWhite="false" position="fixed" :disable="isButtonDisabled" :texts="['确认叫料']"
@onSubmit="callAgv"></bottomBtn>
<view class="cu-modal" :class="msgModalName=='Modal'?'show':''">
<view class="cu-dialog">
<view class="cu-bar bg-white justify-end">
<view class="content">{{msgTitleName}}</view>
<view class="action" @tap="hideMsgModal">
<text class="cuIcon-close text-red"></text>
</view>
</view>
<view class="padding-xl">
{{msg}}
</view>
</view>
</view>
</view>
</template>
<script>
import {
getStation,
setStation
} from '@/utils/station'
import {
getInventoryList,
getSkuTypes
} from "@/api/wms/sku.js"
import {
createPalletBySku,
callAgvIn,
manualCall,
surplusOut
} from "@/api/wms/bill.js"
import {
getDictionary
} from "@/api/wms/dictData.js"
import {
formatDate
} from 'tough-cookie';
import {
bottomBtn
} from '@/components/bottomBtn/bottomBtn.vue'
export default {
data() {
return {
skuInput: '',
showSkuDropdown: false,
filteredSkuList: [],
originalSkuList: [],
whCode: this.$store.state.user.warehouse[0]?.warehouseCode,
userCode: this.$store.state.user.name,
isButtonDisabled: false,
autoCall: true,
skuInfo: "",
countQty: "",
callStatus: "已开启自动呼叫空容器",
//表单中的数据信息
formData: {
palletCode: "",
skuCode: "",
locCode: "",
skuQty: ""
},
stations: [],
rules: {
skuCode: {
rules: [{
required: true,
errorMessage: '请选择物料'
}]
},
palletCode: {
rules: [{
required: true,
errorMessage: '请扫码托盘号'
}]
},
locCode: {
rules: [{
required: true,
errorMessage: '请扫码货位号'
}]
},
skuQty: {
rules: [{
required: true,
errorMessage: '请输入物料数量'
}]
}
},
//查询获取的单据信息
billInfo: {
totalPlanQty: 0,
totalSurplusQty: 0,
wmsInBillSkuInfos: []
},
//table 相关
searchVal: '',
tableData: [],
// 每页数据量
pageSize: 10,
// 当前页
pageCurrent: 1,
// 数据总量
total: 0,
loading: false,
//tabe选中的数据对象
selectedIndexs: [],
// 列配置
tableClumns: [{
dataIndex: "itemCode",
key: "itemCode",
title: "明细单号"
},
{
dataIndex: "batch",
key: "batch",
title: "批次"
},
{
dataIndex: "skuCode",
key: "skuCode",
title: "物料编号"
},
{
dataIndex: "skuName",
key: "skuName",
title: "物料名称"
},
{
dataIndex: "planQty",
key: "planQty",
title: "计划数量"
},
{
dataIndex: "lockQty",
key: "lockQty",
title: "锁定数量"
},
{
dataIndex: "qty",
key: "qty",
title: "组盘数量"
},
],
warehouseList: [],
skuList: [],
skuType: '',
skuTypeList: [],
skuArray: [],
skushow: false,
invoiceCode: null,
palletCode: null,
houseCode: null,
skuCode: null,
locCode: null,
skuQty: null,
totalPlanQty: null,
totalSurplusQty: null,
msgModalName: null,
msgTitleName: null,
msg: null
};
},
component: {
bottomBtn
},
onLoad() {
//加载物料下拉值列表
this.getSkuTypes()
//加载入库单据类型下拉值列表
// this.getWarehouses()
//this.getInvoicesByBusinessType()
const saved = getStation();
this.stations = saved ? JSON.parse(saved) : [];
console.log(this.stations);
if (this.stations.length === 0) {
this.$modal.msgError("请先在空工装回库页面配置工位!")
}
var stas = [];
for (var i = 0; i < this.stations.length; i++) {
stas[i] = {
value: this.stations[i],
text: this.stations[i]
}
}
this.stations = stas;
},
onReady() {
this.$refs.form.setRules(this.rules)
},
watch: {
async skuType(newVal) {
const param = {
categoryCode: this.skuType,
station: ""
};
const data = await getInventoryList(param);
//this.skuList =data;
this.originalSkuList = data; // 存储原始数据
this.filteredSkuList = data.map(item => ({
value: item.skuCode,
text: `${item.skuCode} - ${item.skuName}`,
qtyDesc: `托数:${item.ext1} 总数量:${item.ext2}`
}));
}
},
methods: {
onSkuInput(value) {
this.skuInput = value;
this.filteredSkuList = this.originalSkuList
.filter(item => item.skuCode.includes(value))
.map(item => ({
value: item.skuCode,
text: `${item.skuCode} - ${item.skuName}`,
qtyDesc: `托数:${item.ext1} 总数量:${item.ext2}`
}));
this.showSkuDropdown = true;
},
selectSku(item) {
this.formData.skuCode = item.value;
this.skuInput = item.value; // 显示完整物料码
this.showSkuDropdown = false;
this.skuInfo = item.text;
this.countQty = item.qtyDesc;
},
handleSkuBlur() {
setTimeout(() => {
this.showSkuDropdown = false;
}, 200);
},
//去除空格
trimPalletInput(event) {
this.formData.palletCode = event.target.value.trim();
},
//去除空格
trimLocInput(event) {
this.formData.locCode = event.target.value.trim();
},
/// 数据来源 [模拟]
async fetch(param) {
var response = await queryInBillSkuInfo(param);
return {
total: response.data.total,
data: response.data.record,
};
},
switchChange(e) {
this.autoCall = e.detail.value;
if (this.autoCall) {
this.callStatus = "已开启自动呼叫空容器"
} else {
this.callStatus = "已停止自动呼叫空容器"
}
},
//获取物料类型列表
async getSkuTypes() {
this.skuTypeList = await getSkuTypes();
console.log("this.skutypeList", this.skuTypeList)
},
changeSkuType() {
this.skuInput = '';
this.skuInfo = '';
this.countQty = '';
},
//获取物料列表
// async getSkus() {
// console.log("this.skuType",this.skuType)
// if(this.skuType){
// this.skuList = await getSkuDictionary(this.skuType);
// }
// },
//获取仓库列表
async getWarehouses() {
this.warehouseList = await getDictionary('warehouseList');
console.log("this.warehouseList", this.warehouseList)
},
// 多选处理
selectedItems() {
return this.selectedIndexs.map(i => this.tableData[i])
},
// 多选
selectionChange(e) {
console.log(e.detail.index)
this.selectedIndexs = e.detail.index
//选中内容改变时获取选中数据
},
//批量删除
delTable() {
console.log(this.selectedItems())
},
// 分页触发
change(e) {
this.$refs.table.clearSelection()
this.selectedIndexs.length = 0
this.getData(e.current)
},
// 搜索
search() {
this.getData(1, this.searchVal)
},
// 获取数据
getData(pageCurrent, value = '') {
this.loading = true
this.pageCurrent = pageCurrent
this.request({
pageSize: this.pageSize,
pageCurrent: pageCurrent,
value: value,
success: res => {
// console.log('data', res);
this.tableData = res.data
this.total = res.total
this.loading = false
}
})
},
//获取选中的数据
getSelectDetail() {
if (this.selectedIndexs.length == 0) {
//提示
this.$modal.msgError("请先选择需要组盘的单据明细")
return;
}
//筛选出需要拣选的单据明细
let arr = [];
let len = this.billInfo.wmsInBillSkuInfos.length;
for (let i = 0; i < len; i++) {
if (this.selectedIndexs.indexOf(i) >= 0) {
arr.push(this.billInfo.wmsInBillSkuInfos[i]);
} else {
// console.log(this.selectArr.indexOf(i))
//this.selectArr.indexOf(i);
}
}
console.log("选中的单据明细数据为", arr.length)
return arr;
},
// 伪request请求
request(options) {
const {
pageSize,
pageCurrent,
success,
value
} = options
let total = tableData.length
let data = tableData.filter((item, index) => {
const idx = index - (pageCurrent - 1) * pageSize
return idx < pageSize && idx >= 0
})
if (value) {
data = []
tableData.forEach(item => {
if (item.name.indexOf(value) !== -1) {
data.push(item)
}
})
total = data.length
}
setTimeout(() => {
typeof success === 'function' &&
success({
data: data,
total: total
})
}, 500)
},
// submit(ref) {
// this.$refs.form.validate().then(res => {
// updateUserProfile(this.user).then(response => {
// this.$modal.msgSuccess("修改成功")
// })
// })
// }
//组盘
submitPallet: function(ref) {
this.isButtonDisabled = true;
this.$modal.loading("请等待...")
this.$refs.form.validate().then(res => {
let requestData = {
...this.formData,
userCode: this.userCode,
warehouseCode: this.whCode
}
createPalletBySku(requestData).then(response => {
console.log("response", response)
this.$modal.msgSuccess("组盘成功")
}).finally(() => {
this.isButtonDisabled = false; // 恢复按钮可用
this.$modal.closeLoading()
});
}).catch(() => {
this.isButtonDisabled = false; // 恢复按钮可用
this.$modal.closeLoading()
})
},
//去除空格
trimLocInput(event) {
this.formData.locCode = event.target.value.trim();
},
//呼叫AGV
callAgv: function() {
this.isButtonDisabled = true;
this.$modal.loading("请等待...")
if (!this.formData.locCode) {
this.$modal.closeLoading()
}
if (!this.formData.palletCode) {
this.$modal.closeLoading()
}
var data = {
locCode: this.formData.locCode,
skuCode: this.formData.skuCode,
userCode: this.userCode,
warehouseCode: this.whCode
}
surplusOut(data).then(response => {
console.log("response", response)
this.$modal.msgSuccess("呼叫成功")
}).finally(() => {
this.isButtonDisabled = false; // 恢复按钮可用
this.$modal.closeLoading()
});
},
hideMsgModal(e) {
//关闭信息模态框
this.msgModalName = null;
},
textareaAInput(e) {
this.textareaAValue = e.detail.value
},
textareaBInput(e) {
this.textareaBValue = e.detail.value
},
//根据单据号查询入库单
queryRkOrder: async function(e) {
console.log('进入查询方法', e);
console.log('this.formData', this.formData);
console.log('this.formData.invoiceCode', this.formData.invoiceCode);
var invoiceCode = this.formData.invoiceCode;
if (invoiceCode == null) {
this.$modal.msgError("单据号不能为空")
return;
}
if (invoiceCode.length < 1) {
this.$modal.msgError("单据号不能为空")
return;
}
//查询单据信息
var billInfo = await queryInBillSkuInfo({
'invoiceCode': invoiceCode
});
console.log("billInfo", billInfo)
if (billInfo) {
this.billInfo = billInfo.data;
};
}
}
}
</script>
<style lang="scss">
.sku-dropdown {
position: absolute;
z-index: 1000;
background: white;
border: 1px solid #ddd;
border-radius: 4px;
max-height: 200px;
overflow-y: auto;
width: 100%;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
}
.dropdown-item {
padding: 8px 12px;
font-size: 14px;
color: #333;
border-bottom: 1px solid #eee;
}
.dropdown-item:last-child {
border-bottom: none;
}
.dropdown-item:hover {
background-color: #f5f5f5;
}
.cu-form-group .title {
min-width: calc(4em + 15px);
}
page {
background-color: #ffffff;
}
.container {
background: rgb(242, 243, 245);
height: 100vh;
}
.uni-forms-item {
border-bottom: 1px solid #E5E6EB;
margin-bottom: 0;
padding: 24rpx 0;
}
::v-deep .uni-forms-item__label {
color: #1D2129;
font-size: 28rpx;
font-weight: 400;
}
::v-deep .uni-select {
border: 0px;
}
::v-deep.uni-select__input-placeholder {
font-size: 28rpx;
font-weight: 400;
color: #86909C;
}
.textarea {
background-color: #F2F3F5;
width: 100%;
}
::v-deep.full-width-textarea {
width: 100% !important;
border: unset !important;
}
::v-deep .is-input-border {
border: unset;
}
::v-deep .uni-easyinput__placeholder-class {
font-size: 28rpx;
color: #86909C;
}
::v-deep .uni-input-input {
font-size: 28rpx;
}
::v-deep .uni-select__input-placeholder {
font-size: 28rpx;
color: #86909C;
}
::v-deep .uniui-bottom {
display: none;
}
::v-deep .uniui-top {
display: none;
}
.fromItem {
display: flex;
align-items: center;
}
.example {
padding: 12rpx 24rpx 0;
background-color: #fff;
width: 702rpx;
border-radius: 24rpx;
margin: 24rpx auto;
}
.segmented-control {
margin-bottom: 15px;
}
.button-group {
margin-top: 15px;
display: flex;
justify-content: space-around;
}
.form-item {
display: flex;
align-items: center;
flex: 1;
}
.button {
display: flex;
align-items: center;
height: 35px;
line-height: 35px;
margin-left: 10px;
}
.switch-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px;
border-bottom: 1px solid #eee;
}
/* */
.full-width-textarea {
width: calc(100vw - 260rpx);
/* */
padding: 20rpx;
box-sizing: border-box;
border: 2rpx solid #e5e5e5;
border-radius: 8rpx;
min-height: 200rpx;
font-size: 28rpx;
line-height: 1.5;
}
</style>