Files
zgty-mas-m/pages/sampleWarehouse/dispatchGiveBack/index.vue
2025-11-26 18:11:13 +08:00

158 lines
4.7 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>
<navbar-back title="调拨归还"></navbar-back>
<view class="pl8 pr8 pt8">
<view class="x-f">
<text class="pl6">归还人</text>
<uni-data-select v-model="givebackUserId" :localdata="range" placeholder="请选择样品归还人"></uni-data-select>
</view>
<view class="border-b p6 x-f"
><view class="pr16">库管员</view><text>{{ userInfo.nickname }}</text></view
>
<up-input
style="padding-top: 20px"
border="bottom"
v-model="sampleCode"
placeholder="请扫描需要归还的样品编号"
prefixIcon="scan"
fontSize="16"
prefixIconStyle="font-size: 30px;"
@confirm="getSampleList"
>
</up-input>
<uni-section v-if="sampleList.length > 0" type="line" title="归还样品明细" titleFontSize="15px">
<template #right> <up-text type="error" size="18" bold :text="sampleList.length"></up-text></template>
<scroll-view style="height: 49vh" scroll-y scroll-with-animation>
<uni-card margin="5px" v-for="item in sampleList" class="sample-item">
<view class="x-bc">
<view
>样品名称<text class="black">{{ item.sampleName }}</text></view
>
<view
>调拨人<text class="black">{{ item.borrowUser }}</text></view
>
</view>
<view class="x-bc">
<view
>样品编号<text class="black">{{ item.sampleReturnCode }}</text></view
>
<view
>调拨时间<text class="black">{{ nx.$dayjs(item.borrowTime).format('YYYY-MM-DD HH:mm:ss') }}</text></view
>
</view>
<view class="mt4"
>归库编码<text class="black">{{ item.sampleReturnCode }}</text></view
>
<view class="mt4"
>样品库名称<text class="black">{{ item.warehouseName }}</text></view
>
<view class="mt4"
>库位码<text class="black">{{ item.warehouseLocationCode }}</text></view
>
</uni-card>
</scroll-view>
<up-button type="primary" :loading="btnLoading" style="width: 50%" text="提交" @click="handleSubmit"></up-button>
</uni-section>
</view>
</template>
<script setup>
import { computed, ref, toRefs, watch, onMounted } from 'vue'
import { debounce } from 'lodash'
import nx from '@/nx'
import { onLoad, onShow } from '@dcloudio/uni-app'
const btnLoading = ref(false)
let sampleCode = ref('')
let sampleList = ref([])
const range = ref([])
const userInfo = computed(() => nx.$store('user').userInfo)
const givebackUserId = ref('')
const { scanQRInfo } = toRefs(nx.$store('biz'))
watch(scanQRInfo, newVal => {
debouncedHandleScan(newVal)
})
const debouncedHandleScan = debounce(val => {
if (!val) return
scanQRInfo.value = ''
if (nx.$router.getCurrentPage().route !== 'pages/sampleWarehouse/dispatchGiveBack/index') return
try {
sampleCode.value = val
getSampleList()
} catch (error) {
uni.showToast({
title: '请扫描正确的样品编码',
icon: 'none'
})
}
}, 300)
onShow(() => {
scanQRInfo.value = ''
})
async function getSampleList() {
if (sampleCode.value === '') return
let params = {
sampleReturnCode: sampleCode.value
}
const data = await nx.$api.sampleWarehouse.searchBySampleCode(params)
const existingCodes = new Set(sampleList.value.map(item => item.id))
if (existingCodes.has(data.id)) {
return uni.showToast({ title: '该样品已存在,无需重复添加', icon: 'none' })
}
sampleList.value.push(data)
}
async function handleSubmit() {
if (givebackUserId.value === '') {
return uni.showToast({
title: '请选择样品归还人',
icon: 'none'
})
}
btnLoading.value = true
const givebackUser = range.value.find(item => item.value === givebackUserId.value)?.text
await nx.$api.sampleWarehouse
.execGiveback({
detailIds: sampleList.value.map(item => item.id).join(','),
givebackUserId: givebackUserId.value,
givebackUser,
warehouseUser: userInfo.value.nickname,
warehouseUserId: userInfo.value.id
})
.finally(() => {
btnLoading.value = false
})
uni.showToast({
title: '归还成功',
icon: 'none'
})
handleReset()
}
function handleReset() {
sampleCode.value = ''
sampleList.value = []
}
onMounted(async () => {
const data = await nx.$api.user.getAssignUserList()
range.value = data.map(item => ({ text: item.nickname, value: item.id }))
})
</script>
<style lang="scss" scoped>
.sample-item {
position: relative;
pointer-events: none;
.item-checkbox {
position: absolute;
right: 5px;
top: 5px;
}
}
:deep(.uni-select__input-placeholder) {
font-size: 16px;
}
</style>