Files
rd_mes_uniapp/pages/wms/purchase/quickStorage.vue

394 lines
8.6 KiB
Vue
Raw Normal View History

2025-12-18 14:11:48 +08:00
<template>
<view id="view">
<div class="header">
<table>
<tr>
<td>物料编码:</td>
2025-12-18 14:11:48 +08:00
<td>
<uni-easyinput placeholder="请输入内容" :focus="PTfocus" v-model="PTCode" primaryColor="red" @confirm="getCode"
prefixIcon="scan" @iconClick="scanClick('primary')" />
</td>
</tr>
</table>
</div>
<div class="body">
<table>
<tr>
<td>收货单号:</td>
<td>{{form.purchaseReceiveCode}}</td>
</tr>
<tr>
<td>&numsp;&numsp;:</td>
<td>{{form.supplierCode}}{{form.supplierName}}</td>
</tr>
<tr>
<td>物料编码:</td>
<td>{{form.materialCode}}</td>
</tr>
<tr>
<td>物料名称:</td>
<td>{{form.materialName}}</td>
</tr>
<tr>
<td>规格型号:</td>
<td>{{form.specification}}</td>
</tr>
<tr>
<td>推荐库位:</td>
<td>
<uni-easyinput :key="keyBol" class="uni-mt-5" v-model="form.recommend" disabled>
<template #right>
<uni-icons custom-prefix="iconfont" type="icon-fuzhi" size="40" @click="handleCopy"></uni-icons>
2025-12-18 14:11:48 +08:00
</template>
</uni-easyinput>
</td>
</tr>
<tr>
<td>上架数量:</td>
<td>
<u-number-box inputWidth="120" button-size="36" v-model="form.number" min="0"
:max="form.secondInNumber"></u-number-box>
</td>
</tr>
<tr>
<td>&emsp;&emsp;:</td>
<td>
<uni-easyinput :key="keyBol" type="text" prefixIcon="scan" placeholder="扫描"
v-model="form.storageLocationBarcode" @iconClick="scanClick('storageLocationBarcode')" />
</td>
</tr>
</table>
</div>
<div class="footer">
<button type="primary" @click="submit">
<span>提交</span>
</button>
</div>
<uni-popup ref="message" type="message">
<uni-popup-message :type="message.msgType" :message="message.messageText" :duration="2000"></uni-popup-message>
</uni-popup>
<uni-popup ref="popup" type="center" background-color="#fff" :is-mask-click="false">
<!-- 加载动画 -->
<loding-vue />
</uni-popup>
</view>
</template>
<script>
import {
getReceiveDetailJoin,
addPurchase,
getMaterial_code
} from "@/api/wms/purchase.js";
import {
getConfigKey,
getUser
} from "@/api/system/config.js"
import lodingVue from "@/utils/loding/loding.vue";
export default {
components: {
lodingVue
},
data() {
return {
form: {},
message: {
msgType: 'warn',
messageText: '请先查询设备信息'
},
locationSize: 0,
map: null,
PTfocus: true, //物料编码输入框的是否焦点标记
PTCode: null, //物料编码框的已输入内容
keyBol: true,
user: {},
}
},
async mounted() {
const _this = this;
_this.locationSize = await _this.fnApi('getConfigKey', 'wms.location.size', 'msg')
_this.user = (await _this.fnApi('getUser', { pageNum: 1, pageSize: 1, userName: _this.$store.state.user.name },
'rows'))[0]
},
methods: {
/**
* 所有扫描点击事件
* @param {Object} key
*/
scanClick(key) {
const _this = this;
const obj = {
primary: 'getCode',
storageLocationBarcode: 'iconClick'
}
uni.scanCode({
// 是否只能从相机扫码,不允许从相册选择图片
onlyFromCamera: true,
// 扫码类型
scanType: ['barCode', 'qrCode'],
success: function(res) {
const value = res.result
_this[obj[key]](value)
}
})
},
/**
* 复制库位
2025-12-18 14:11:48 +08:00
*/
handleCopy() {
this.form.storageLocationBarcode = this.form.recommend;
this.keyBol = !this.keyBol;
2025-12-18 14:11:48 +08:00
},
/**
* 扫描收货单明细标签
* @param {Object} value id
*/
async getCode(value) {
const _self = this;
_self.PTfocus = false;
const obj = JSON.parse(value);
try {
const data = (await _self.fnApi('getReceiveDetailJoin', obj.id || value))
const res = await _self.fnApi('getMaterial_code', data.materialCode, 'data')
let code = null;
if (res && res.whCode) {
code = getCode(_self.locationSize, res).value
}
data.number = data.allowedNumber || data.number
data.recommend = code
_self.form = data
} catch (e) {
//TODO handle the exception
_self.messageType({
msgType: 'error',
messageText: '未查到信息'
})
}
/**
* 根据参数显示库位格式
* @param {Object} num
* @param {Object} i
*/
function getCode(num, i) {
const code = i.whCode + '-' + i.areaCode + '-' + i.shelvesCode + '-' + i.storageLocationCode;
let value = null;
switch (num) {
case '0':
value = code
break;
case '2':
value = i.areaCode
break;
case '4':
value = i.storageLocationCode
break;
case '5':
value = i.shelvesCode + '-' + i.storageLocationCode
break;
}
return { value }
}
},
/**
* 提交事件
*/
async submit() {
const _self = this
const form = Object.assign({}, _self.form);
if (!form.number) {
_self.messageType({
msgType: 'warn',
messageText: '上架数量不能为0'
})
return
}
if (!this.isEmpty(form.storageLocationBarcode)) {
_self.messageType({
msgType: 'warn',
messageText: '库位未填写'
})
return
}
form.purchaseReceiveDetailId = form.id
form.id = null
form.secondNumber = form.number;
const { purchaseReceiveCode, supplierCode } = _self.form
const obj = {
purchaseReceiveCode,
supplierCode,
userId: _self.user.userId,
wmsPurchaseInDetailList: [form]
}
const data = await _self.fnApi('addPurchase', obj, 'code')
if (data === 200) {
_self.messageType({
msgType: 'success',
messageText: '操作成功'
})
/* Begins 20250503-0001
新增提交成功后输入焦点自动回到顶部输入框并清空物料输入框推荐库位库位内容
修改关闭提交后2秒延时退出页面功能
For Customer:浙江日井泵业股份有限公司
*/
_self.PTfocus = true
_self.PTCode = null
_self.form = {}
_self.keyBol = !_self.keyBol;
/* Ends 20250503-0001
setTimeout(()=>{
uni.switchTab({
url:'/pages/work/index'
})
},2000)
*/
} else {
/*
TODO: If Error happens, Should notify the user what happened and how to deal with it.
*/
_self.messageType({
msgType: 'error',
messageText: '操作失败'
})
}
},
/**
* 接口访问方法
* @param {String} api 接口名称
* @param {Object} value 带入参数
* @param {String} accept 接受的数据有些的data有些的data看具体数据 默认data
*/
async fnApi(api, value, accept = 'data') {
const _self = this;
const objApi = {
getReceiveDetailJoin,
addPurchase,
getConfigKey,
getMaterial_code,
getUser
}
try {
//打开蒙层
_self.$refs.popup.open()
//查询接口
const data = (await objApi[api](value))[accept]
return data
} catch (e) {
_self.messageType({
msgType: 'error',
messageText: '接口请求出错'
})
} finally {
//关闭蒙层
_self.$refs.popup.close()
}
},
/**
* 提示信息
* @param {Object|undefined} value
* {msgType,messageText} 参数里面需要包含这两个键
*/
messageType(obj) {
const _self = this;
let message = {}
if (obj === undefined) {
message = {
msgType: 'error',
messageText: '请填写设备代码'
}
} else {
message = {
msgType: obj.msgType,
messageText: obj.messageText
}
}
_self.message = Object.assign({}, message)
return _self.$refs.message.open()
},
isEmpty(value) {
if (value === undefined || value === null || value === '') return false
return true
}
}
}
</script>
<style>
page {
background-color: #ffffff;
display: flex;
justify-content: center;
font-size: 5vw;
color: #484744;
}
</style>
<style lang="scss" scoped>
#view {
width: 97vw;
height: calc(100vh - 44px);
display: flex;
justify-content: center;
flex-wrap: wrap;
&>* {
width: 100%;
background-color: #ffffff;
}
.header,
.footer {
height: 8%;
}
.footer {
margin-top: auto;
&>* {
margin-top: 3%;
}
.icon-saomiao {
margin-right: 2%;
}
}
.body {
height: calc(100% - 2 * 8% - 4%);
table>tr {
border-bottom: 1px dashed #969696;
height: 15vw;
&>td:last-child {
display: flex;
justify-content: flex-end
}
}
}
table {
width: 100%;
tr {
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
td {
display: flex;
align-items: center;
justify-content: center;
text-overflow: ellipsis;
}
&>td:first-child {
width: 30%;
}
&>td:last-child {
width: 70%;
}
}
}
}
</style>