You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
7.9 KiB
312 lines
7.9 KiB
<template>
|
|
<view>
|
|
<u-popup v-model="show" mode="bottom">
|
|
<view class="popup_box">
|
|
<view class="pop_title uni-flex space-between">
|
|
<view class="" style="font-size: 35rpx;">
|
|
扫描{{title}}
|
|
</view>
|
|
|
|
<view class="">
|
|
<image class="fr icons_scan_close" src="/static/icons/icons_scan_close.svg"
|
|
@click="closeScanPopup()"></image>
|
|
</view>
|
|
</view>
|
|
<view class="">
|
|
<view class="">
|
|
<win-com-scan ref="comscan" :placeholder="title" @getResult="getScanResult"
|
|
:isShowHistory="isShowHistory" :clearResult="true" :headerType="headerType"></win-com-scan>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</u-popup>
|
|
<balance-select ref="balanceSelectRef" @onSelectItem='selectBalanceItem'></balance-select>
|
|
</view>
|
|
<comMessage ref="comMessageRef"></comMessage>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import winComScan from '@/mycomponents/scan/winComScan.vue'
|
|
import balanceSelect from '@/mycomponents/balance/balanceSelect.vue'
|
|
import {
|
|
getBalanceByManagementPrecisionByPacking,
|
|
} from '@/common/balance.js';
|
|
|
|
import {
|
|
getBalanceByParams,
|
|
getBasicItemByCode,
|
|
getBalanceByFilter
|
|
} from '@/api/request2.js';
|
|
|
|
import {
|
|
getListLocationAreaTypeDesc,
|
|
checkDirectoryItemExist,
|
|
getDirectoryItemArray,
|
|
getLocationAreaTypeName,
|
|
getInventoryStatusDesc,
|
|
getListItemTypeDesc,
|
|
getItemTypeInfo
|
|
} from '@/common/directory.js';
|
|
|
|
import { ref, onMounted, watch } from 'vue'
|
|
|
|
const props = defineProps({
|
|
title: {
|
|
type: String,
|
|
default: '箱标签'
|
|
},
|
|
isShowHistory: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
headerType: {
|
|
type: String,
|
|
default: "HPQ,HMQ"
|
|
},
|
|
balanceFromInventoryStatuses: { // 是否传 fromInventoryStatuses
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
bussinessCode: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
verifyCategory: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
isCheckLocationBalance: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
})
|
|
|
|
const scanResult = ref({})
|
|
const show = ref(false)
|
|
const scanList = ref([])
|
|
const expand = ref(false)
|
|
const expendIcon = ref('arrow-down')
|
|
const fromLocationCode = ref('')
|
|
const fromLocation = ref('')
|
|
const fromLocationList = ref([])
|
|
const fromLocationAreaTypeList = ref([])
|
|
const toLocationAreaTypeList = ref([])
|
|
const businessType = ref({})
|
|
const inventoryStatus = ref([])
|
|
const fromInventoryStatuses = ref([])
|
|
const itemTypesList = ref([])
|
|
const resultData = ref({})
|
|
|
|
const popup = ref(null)
|
|
const comMessageRef = ref(null)
|
|
const comscan = ref(null)
|
|
const balanceSelectRef = ref(null)
|
|
|
|
// 方法
|
|
const openScanPopup = (businessTypeValue) => {
|
|
businessType.value = businessTypeValue
|
|
fromInventoryStatuses.value = getDirectoryItemArray(businessTypeValue.outInventoryStatuses)
|
|
fromLocationAreaTypeList.value = getDirectoryItemArray(businessTypeValue.outAreaTypes)
|
|
toLocationAreaTypeList.value = getDirectoryItemArray(businessTypeValue.inAreaTypes)
|
|
itemTypesList.value = getDirectoryItemArray(businessTypeValue.itemTypes)
|
|
show.value = true
|
|
setTimeout(() => {
|
|
getfocus()
|
|
}, 500)
|
|
}
|
|
|
|
const getScanResult = (result) => {
|
|
resultData.value = result
|
|
if (!result.package) {
|
|
showErrorMessage(result.label.code + "包装信息为空")
|
|
return
|
|
}
|
|
getItemCodeType(result.package.itemCode, () => {
|
|
if (props.isCheckLocationBalance) {
|
|
queryBalance(resultData.value)
|
|
} else {
|
|
queryBalance(resultData.value)
|
|
}
|
|
})
|
|
}
|
|
|
|
const getToLocationBalance = (result) => {
|
|
uni.showLoading({
|
|
title: '查询中',
|
|
mask: true
|
|
})
|
|
const filters = []
|
|
if (result.package.parentNumber) {
|
|
const packingNumber = result.package.parentNumber + "," + result.package.number
|
|
filters.push({
|
|
column: "packingNumber",
|
|
action: "in",
|
|
value: packingNumber
|
|
})
|
|
} else {
|
|
filters.push({
|
|
column: "packingNumber",
|
|
action: "==",
|
|
value: result.package.number
|
|
})
|
|
}
|
|
|
|
filters.push({
|
|
column: "itemCode",
|
|
action: "==",
|
|
value: result.package.itemCode
|
|
})
|
|
filters.push({
|
|
column: "batch",
|
|
action: "==",
|
|
value: result.package.batch
|
|
})
|
|
filters.push({
|
|
column: "areaType",
|
|
action: "in",
|
|
value: toLocationAreaTypeList.value.join(',')
|
|
})
|
|
|
|
const params = {
|
|
filters: filters,
|
|
pageNo: 1,
|
|
pageSize: 100,
|
|
}
|
|
getBalanceByFilter(params).then(res => {
|
|
uni.hideLoading()
|
|
if (res.data.list.length > 0) {
|
|
showErrorMessage("包装在库位【" + res.data.list[0].locationCode + "】已有库存余额")
|
|
} else {
|
|
queryBalance(resultData.value)
|
|
}
|
|
}).catch(err => {
|
|
showErrorMessage(err.message)
|
|
})
|
|
}
|
|
|
|
const queryBalance = (result) => {
|
|
const params = {
|
|
itemCode: result.package.itemCode,
|
|
batch: result.label.batch,
|
|
packingNumber: result.label.packingNumber,
|
|
parentPackingNumber: result.package.parentNumber,
|
|
inventoryStatus: fromInventoryStatuses.value,
|
|
areaType: fromLocationAreaTypeList.value,
|
|
bussinessCode: props.bussinessCode
|
|
}
|
|
uni.showLoading({
|
|
title: '查询中',
|
|
mask: true
|
|
})
|
|
getBalanceByParams(params).then(res => {
|
|
uni.hideLoading()
|
|
if (res.data.length === 0) {
|
|
const status = getInventoryStatusDesc(params.inventoryStatus)
|
|
const areaType = getListLocationAreaTypeDesc(params.areaType)
|
|
const hint =
|
|
"按物料号 [" + params.itemCode + "] \n" +
|
|
"包装号 [" + params.packingNumber + "] \n" +
|
|
"批次 [" + params.batch + "] \n" +
|
|
"状态 [" + status + "] \n" +
|
|
"库区 [" + areaType + "] \n" +
|
|
"未查找到库存余额"
|
|
showErrorMessage(hint)
|
|
} else if (res.data.length === 1) {
|
|
result.balance = res.data[0]
|
|
if (result.label.packingNumber !== result.balance.packingNumber) {
|
|
result.balance.lableQty = result.label.qty
|
|
}
|
|
emit('getBalance', result)
|
|
} else {
|
|
balanceSelectRef.value.openPopup(res.data)
|
|
}
|
|
}).catch(error => {
|
|
uni.hideLoading()
|
|
showErrorMessage(error)
|
|
})
|
|
}
|
|
|
|
const getItemCodeType = (itemCode, callBack) => {
|
|
uni.showLoading({
|
|
title: "加载中",
|
|
mask: true
|
|
})
|
|
getBasicItemByCode(itemCode).then(res => {
|
|
if (res.data && res.data.list.length > 0) {
|
|
const result = res.data.list[0]
|
|
const status = result.available
|
|
const type = result.type
|
|
if (status === "TRUE") {
|
|
if (checkDirectoryItemExist(itemTypesList.value, type)) {
|
|
if (props.verifyCategory) {
|
|
if (result.category === 'LCJ' || result.category === 'BJ') {
|
|
callBack()
|
|
} else {
|
|
showErrorMessage("扫描物料的种类不是【量产件】或者【备件】")
|
|
}
|
|
} else {
|
|
callBack()
|
|
}
|
|
} else {
|
|
const hint = getListItemTypeDesc(itemTypesList.value)
|
|
uni.hideLoading()
|
|
showErrorMessage("扫描物料[" + itemCode + "]是[" +
|
|
getItemTypeInfo(type).label + "],需要的物料类型是[" + hint + "]")
|
|
}
|
|
} else {
|
|
uni.hideLoading()
|
|
showErrorMessage('物料【' + itemCode + '】不可用')
|
|
}
|
|
} else {
|
|
uni.hideLoading()
|
|
showErrorMessage('未查找到物料【' + itemCode + '】')
|
|
}
|
|
}).catch(error => {
|
|
uni.hideLoading()
|
|
showErrorMessage(error)
|
|
})
|
|
}
|
|
|
|
const showErrorMessage = (message) => {
|
|
losefocus()
|
|
comMessageRef.value.showErrorMessage(message, res => {
|
|
if (res) {
|
|
if (comscan.value) {
|
|
comscan.value.getfocus()
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
const selectBalanceItem = (item) => {
|
|
resultData.value.balance = item
|
|
emit('getBalance', resultData.value)
|
|
}
|
|
|
|
const closeScanPopup = () => {
|
|
losefocus()
|
|
show.value = false
|
|
}
|
|
|
|
const getfocus = () => {
|
|
if (comscan.value) {
|
|
comscan.value.getfocus()
|
|
}
|
|
}
|
|
|
|
const losefocus = () => {
|
|
if (comscan.value) {
|
|
comscan.value.losefocus()
|
|
}
|
|
}
|
|
|
|
const emit = defineEmits(['getBalance'])
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.scroll-view {
|
|
overflow-y: scroll;
|
|
height: auto;
|
|
max-height: 300rpx;
|
|
}
|
|
</style>
|