PDA操入库、出库、移库、库存查询

besure_bit
ck-chenkang 2 weeks ago
parent cb58f0e815
commit c502a85d28

@ -32,6 +32,23 @@ export function createBitWmsMove(data) {
})
}
export function getBitWmsLocationStockPage(params) {
return request({
url: '/admin-api/erp/bit-wms/location-stock/page',
method: 'get',
params
})
}
export function getBitWmsLocationStockCount(productId, locationId) {
return request({
url: '/admin-api/erp/bit-wms/location-stock/count',
method: 'get',
params: { productId, locationId },
showLoading: false
})
}
export function getBitWmsLocationLabel(locationId) {
return request({
url: '/admin-api/erp/bit-wms/location-label',

@ -12,8 +12,8 @@
<view class="scan-btn" @click="openScanner('location')"></view>
</view>
<InfoCard label="库位" :value="location.name || location.code || '未选择'" />
<InfoCard label="单位" :value="sampleUnitText" />
<FormInput v-model="form.count" label="数量" type="digit" placeholder="请输入入库数量" />
<FormInput v-model="form.supplierId" label="供应商ID" type="number" placeholder="可选" />
<FormInput v-model="form.remark" label="备注" placeholder="可选" />
</view>
<view class="submit" @click="submit"></view>
@ -21,7 +21,7 @@
</template>
<script setup>
import { reactive, ref } from 'vue'
import { computed, reactive, ref } from 'vue'
import NavBar from '@/components/common/NavBar.vue'
import { scanBitWmsCode, getBitWmsLocationLabel, createBitWmsInbound } from '@/api/erp/bitwms'
import InfoCard from './parts/InfoCard.vue'
@ -31,8 +31,22 @@ const sampleCode = ref('')
const locationCode = ref('')
const sample = reactive({})
const location = reactive({})
const form = reactive({ count: '', supplierId: '', remark: '' })
const form = reactive({ count: '', remark: '' })
const unwrap = (res) => res?.data || res
const sampleUnitText = computed(() => sample.unitName || '扫描样品后自动带出')
function clearObject(target) {
Object.keys(target).forEach((key) => delete target[key])
}
function resetForm() {
sampleCode.value = ''
locationCode.value = ''
clearObject(sample)
clearObject(location)
form.count = ''
form.remark = ''
}
function openScanner(kind) {
uni.scanCode({
@ -63,16 +77,18 @@ async function scanLocation() {
}
async function submit() {
if (!sample.id || !location.warehouseId || !form.count) return uni.showToast({ title: '请完善样品、库位和数量', icon: 'none' })
if (!sample.id || !location.id || !sample.unitId || !form.count) return uni.showToast({ title: '请完善样品、库位、单位和数量', icon: 'none' })
await createBitWmsInbound({
productId: Number(sample.id),
locationId: Number(location.id),
warehouseId: Number(location.warehouseId),
areaId: location.areaId ? Number(location.areaId) : undefined,
count: Number(form.count),
supplierId: form.supplierId ? Number(form.supplierId) : undefined,
unitId: Number(sample.unitId),
remark: form.remark
})
uni.showToast({ title: '入库成功', icon: 'success' })
resetForm()
}
</script>

@ -12,6 +12,7 @@
<view class="scan-btn" @click="openScanner('from')"></view>
</view>
<InfoCard label="调出库位" :value="fromLocation.name || fromLocation.code || '未选择'" />
<InfoCard label="调出库位库存" :value="currentStockText" />
<view class="scan-row">
<input v-model="toLocationCode" class="input" placeholder="扫描或输入调入库位码" @confirm="scanToLocation" />
<view class="scan-btn" @click="openScanner('to')"></view>
@ -25,9 +26,9 @@
</template>
<script setup>
import { reactive, ref } from 'vue'
import { computed, reactive, ref } from 'vue'
import NavBar from '@/components/common/NavBar.vue'
import { scanBitWmsCode, getBitWmsLocationLabel, createBitWmsMove } from '@/api/erp/bitwms'
import { scanBitWmsCode, getBitWmsLocationLabel, getBitWmsLocationStockCount, createBitWmsMove } from '@/api/erp/bitwms'
import InfoCard from './parts/InfoCard.vue'
import FormInput from './parts/FormInput.vue'
@ -38,7 +39,34 @@ const sample = reactive({})
const fromLocation = reactive({})
const toLocation = reactive({})
const form = reactive({ count: '', remark: '' })
const currentStock = ref()
const stockLoading = ref(false)
const unwrap = (res) => res?.data || res
const currentStockText = computed(() => {
if (stockLoading.value) return '查询中...'
return currentStock.value === undefined ? '请选择样品和调出库位' : formatStockText(currentStock.value)
})
function formatStockText(value) {
return sample.unitName ? `${value} ${sample.unitName}` : String(value)
}
function clearObject(target) {
Object.keys(target).forEach((key) => delete target[key])
}
function resetForm() {
sampleCode.value = ''
fromLocationCode.value = ''
toLocationCode.value = ''
clearObject(sample)
clearObject(fromLocation)
clearObject(toLocation)
form.count = ''
form.remark = ''
currentStock.value = undefined
stockLoading.value = false
}
function openScanner(kind) {
uni.scanCode({ scanType: ['qrCode', 'barCode'], success: (res) => {
@ -53,6 +81,7 @@ async function scanSample() {
const data = unwrap(await scanBitWmsCode(sampleCode.value.trim()))
if (data?.type !== 'SAMPLE') return uni.showToast({ title: '请扫描样品码', icon: 'none' })
Object.assign(sample, data)
await loadCurrentStock()
}
async function fillLocation(target, code) {
@ -62,21 +91,42 @@ async function fillLocation(target, code) {
Object.assign(target, data, label?.printData || {})
}
const scanFromLocation = () => fillLocation(fromLocation, fromLocationCode.value)
const scanFromLocation = async () => {
await fillLocation(fromLocation, fromLocationCode.value)
await loadCurrentStock()
}
const scanToLocation = () => fillLocation(toLocation, toLocationCode.value)
async function loadCurrentStock() {
if (!sample.id || !fromLocation.id) {
currentStock.value = undefined
return
}
stockLoading.value = true
try {
currentStock.value = unwrap(await getBitWmsLocationStockCount(Number(sample.id), Number(fromLocation.id)))
} finally {
stockLoading.value = false
}
}
async function submit() {
if (!sample.id || !fromLocation.warehouseId || !toLocation.warehouseId || !form.count) return uni.showToast({ title: '请完善样品、库位和数量', icon: 'none' })
if (!sample.id || !fromLocation.id || !toLocation.id || !form.count) return uni.showToast({ title: '请完善样品、库位和数量', icon: 'none' })
if (Number(fromLocation.id) === Number(toLocation.id)) return uni.showToast({ title: '调出库位和调入库位不能相同', icon: 'none' })
if (currentStock.value !== undefined && Number(form.count) > Number(currentStock.value)) return uni.showToast({ title: '调出库位库存不足', icon: 'none' })
await createBitWmsMove({
productId: Number(sample.id),
fromLocationId: Number(fromLocation.id),
fromWarehouseId: Number(fromLocation.warehouseId),
fromAreaId: fromLocation.areaId ? Number(fromLocation.areaId) : undefined,
toLocationId: Number(toLocation.id),
toWarehouseId: Number(toLocation.warehouseId),
toAreaId: toLocation.areaId ? Number(toLocation.areaId) : undefined,
count: Number(form.count),
remark: form.remark
})
uni.showToast({ title: '移库成功', icon: 'success' })
resetForm()
}
</script>

@ -12,6 +12,7 @@
<view class="scan-btn" @click="openScanner('location')"></view>
</view>
<InfoCard label="库位" :value="location.name || location.code || '未选择'" />
<InfoCard label="当前库位库存" :value="currentStockText" />
<FormInput v-model="form.count" label="数量" type="digit" placeholder="请输入出库数量" />
<picker :range="reasonLabels" @change="handleReasonChange">
<InfoCard label="出库原因" :value="selectedReasonLabel || '请选择出库原因'" />
@ -25,7 +26,7 @@
<script setup>
import { reactive, ref, computed } from 'vue'
import NavBar from '@/components/common/NavBar.vue'
import { scanBitWmsCode, getBitWmsLocationLabel, createBitWmsOutbound } from '@/api/erp/bitwms'
import { scanBitWmsCode, getBitWmsLocationLabel, getBitWmsLocationStockCount, createBitWmsOutbound } from '@/api/erp/bitwms'
import InfoCard from './parts/InfoCard.vue'
import FormInput from './parts/FormInput.vue'
@ -41,9 +42,35 @@ const locationCode = ref('')
const sample = reactive({})
const location = reactive({})
const form = reactive({ count: '', outReason: '', remark: '' })
const currentStock = ref()
const stockLoading = ref(false)
const unwrap = (res) => res?.data || res
const reasonLabels = computed(() => outReasons.map((item) => item.label))
const selectedReasonLabel = computed(() => outReasons.find((item) => item.value === form.outReason)?.label || '')
const currentStockText = computed(() => {
if (stockLoading.value) return '查询中...'
return currentStock.value === undefined ? '请选择样品和库位' : formatStockText(currentStock.value)
})
function formatStockText(value) {
return sample.unitName ? `${value} ${sample.unitName}` : String(value)
}
function clearObject(target) {
Object.keys(target).forEach((key) => delete target[key])
}
function resetForm() {
sampleCode.value = ''
locationCode.value = ''
clearObject(sample)
clearObject(location)
form.count = ''
form.outReason = ''
form.remark = ''
currentStock.value = undefined
stockLoading.value = false
}
function openScanner(kind) {
uni.scanCode({ scanType: ['qrCode', 'barCode'], success: (res) => {
@ -60,6 +87,7 @@ async function scanSample() {
const data = unwrap(await scanBitWmsCode(sampleCode.value.trim()))
if (data?.type !== 'SAMPLE') return uni.showToast({ title: '请扫描样品码', icon: 'none' })
Object.assign(sample, data)
await loadCurrentStock()
}
async function scanLocation() {
@ -67,12 +95,28 @@ async function scanLocation() {
if (data?.type !== 'LOCATION') return uni.showToast({ title: '请扫描库位码', icon: 'none' })
const label = unwrap(await getBitWmsLocationLabel(data.id))
Object.assign(location, data, label?.printData || {})
await loadCurrentStock()
}
async function loadCurrentStock() {
if (!sample.id || !location.id) {
currentStock.value = undefined
return
}
stockLoading.value = true
try {
currentStock.value = unwrap(await getBitWmsLocationStockCount(Number(sample.id), Number(location.id)))
} finally {
stockLoading.value = false
}
}
async function submit() {
if (!sample.id || !location.warehouseId || !form.count || !form.outReason) return uni.showToast({ title: '请完善样品、库位、数量和原因', icon: 'none' })
if (!sample.id || !location.id || !form.count || !form.outReason) return uni.showToast({ title: '请完善样品、库位、数量和原因', icon: 'none' })
if (currentStock.value !== undefined && Number(form.count) > Number(currentStock.value)) return uni.showToast({ title: '当前库位库存不足', icon: 'none' })
await createBitWmsOutbound({
productId: Number(sample.id),
locationId: Number(location.id),
warehouseId: Number(location.warehouseId),
areaId: location.areaId ? Number(location.areaId) : undefined,
count: Number(form.count),
@ -80,6 +124,7 @@ async function submit() {
remark: form.remark
})
uni.showToast({ title: '出库成功', icon: 'success' })
resetForm()
}
</script>

@ -19,10 +19,10 @@
</view>
<view class="quick-grid">
<view class="quick-item" @click="goPage('shelf')"></view>
<view class="quick-item" @click="goPage('in')"></view>
<view class="quick-item" @click="goPage('out')"></view>
<view class="quick-item" @click="goPage('move')"></view>
<view class="quick-item" @click="goPage('stock')"></view>
</view>
</view>
</template>

@ -13,23 +13,25 @@
<view class="scan-btn" @click="openScanner('from')"></view>
</view>
<InfoCard label="来源库位" :value="fromLocation.name || fromLocation.code || '无,按入库处理'" />
<InfoCard v-if="fromLocation.id" label="来源库位库存" :value="currentStockText" />
<view class="scan-row">
<input v-model="toLocationCode" class="input" placeholder="目标库位码" @confirm="scanToLocation" />
<view class="scan-btn" @click="openScanner('to')"></view>
</view>
<InfoCard label="目标库位" :value="toLocation.name || toLocation.code || '未选择'" />
<InfoCard label="单位" :value="sampleUnitText" />
<FormInput v-model="form.count" label="数量" type="digit" placeholder="请输入上架数量" />
<FormInput v-model="form.remark" label="备注" placeholder="可选" />
</view>
<view class="submit" @click="submit">{{ fromLocation.warehouseId ? '' : '' }}</view>
<view class="submit" @click="submit">{{ fromLocation.id ? '' : '' }}</view>
</view>
</template>
<script setup>
import { reactive, ref } from 'vue'
import { computed, reactive, ref } from 'vue'
import NavBar from '@/components/common/NavBar.vue'
import { scanBitWmsCode, getBitWmsLocationLabel, createBitWmsInbound, createBitWmsMove } from '@/api/erp/bitwms'
import { scanBitWmsCode, getBitWmsLocationLabel, getBitWmsLocationStockCount, createBitWmsInbound, createBitWmsMove } from '@/api/erp/bitwms'
import InfoCard from './parts/InfoCard.vue'
import FormInput from './parts/FormInput.vue'
@ -40,7 +42,18 @@ const sample = reactive({})
const fromLocation = reactive({})
const toLocation = reactive({})
const form = reactive({ count: '', remark: '' })
const currentStock = ref()
const stockLoading = ref(false)
const unwrap = (res) => res?.data || res
const sampleUnitText = computed(() => sample.unitName || '扫描样品后自动带出')
const currentStockText = computed(() => {
if (stockLoading.value) return '查询中...'
return currentStock.value === undefined ? '请选择样品和来源库位' : formatStockText(currentStock.value)
})
function formatStockText(value) {
return sample.unitName ? `${value} ${sample.unitName}` : String(value)
}
function openScanner(kind) {
uni.scanCode({
@ -58,6 +71,7 @@ async function scanSample() {
const data = unwrap(await scanBitWmsCode(sampleCode.value.trim()))
if (data?.type !== 'SAMPLE') return uni.showToast({ title: '请扫描样品码', icon: 'none' })
Object.assign(sample, data)
await loadCurrentStock()
}
async function fillLocation(target, code) {
@ -70,29 +84,53 @@ async function fillLocation(target, code) {
Object.assign(target, data, label?.printData || {})
}
const scanFromLocation = () => fillLocation(fromLocation, fromLocationCode.value)
const scanToLocation = () => fillLocation(toLocation, toLocationCode.value)
async function scanFromLocation() {
await fillLocation(fromLocation, fromLocationCode.value)
await loadCurrentStock()
}
async function loadCurrentStock() {
if (!sample.id || !fromLocation.id) {
currentStock.value = undefined
return
}
stockLoading.value = true
try {
currentStock.value = unwrap(await getBitWmsLocationStockCount(Number(sample.id), Number(fromLocation.id)))
} finally {
stockLoading.value = false
}
}
async function submit() {
if (!sample.id || !toLocation.warehouseId || !form.count) return uni.showToast({ title: '请完善样品、目标库位和数量', icon: 'none' })
if (fromLocation.warehouseId) {
if (!sample.id || !sample.unitId || !toLocation.id || !form.count) return uni.showToast({ title: '请完善样品、单位、目标库位和数量', icon: 'none' })
if (fromLocation.id) {
if (Number(fromLocation.id) === Number(toLocation.id)) return uni.showToast({ title: '来源库位和目标库位不能相同', icon: 'none' })
if (currentStock.value !== undefined && Number(form.count) > Number(currentStock.value)) return uni.showToast({ title: '来源库位库存不足', icon: 'none' })
await createBitWmsMove({
productId: Number(sample.id),
fromLocationId: Number(fromLocation.id),
fromWarehouseId: Number(fromLocation.warehouseId),
fromAreaId: fromLocation.areaId ? Number(fromLocation.areaId) : undefined,
toLocationId: Number(toLocation.id),
toWarehouseId: Number(toLocation.warehouseId),
toAreaId: toLocation.areaId ? Number(toLocation.areaId) : undefined,
count: Number(form.count),
remark: form.remark || '贴码上架'
})
await loadCurrentStock()
uni.showToast({ title: '移库上架成功', icon: 'success' })
return
}
await createBitWmsInbound({
productId: Number(sample.id),
locationId: Number(toLocation.id),
warehouseId: Number(toLocation.warehouseId),
areaId: toLocation.areaId ? Number(toLocation.areaId) : undefined,
count: Number(form.count),
unitId: Number(sample.unitId),
remark: form.remark || '贴码上架'
})
uni.showToast({ title: '入库上架成功', icon: 'success' })

@ -1,26 +1,73 @@
<template>
<view class="page">
<NavBar title="样品库存查询" />
<view class="card">
<text class="label">扫码对象</text>
<text class="value">{{ typeText }}</text>
</view>
<view class="card">
<text class="label">编码</text>
<text class="value">{{ detail.code || '-' }}</text>
<view class="search-panel">
<view class="scan-row">
<input v-model="locationSearchCode" class="input" placeholder="扫描或输入库位标签" @confirm="searchLocation" />
<view class="scan-btn" @click="openLocationScanner"></view>
</view>
<view v-if="locationFilter.id" class="filter-row">
<text class="filter-text">库位{{ locationFilter.name || locationFilter.code }}</text>
<text class="clear-text" @click="clearLocationFilter"></text>
</view>
</view>
<view class="card">
<text class="label">名称</text>
<text class="value">{{ detail.name || '-' }}</text>
<view class="summary">
<view class="summary-row">
<text class="summary-label">查询对象</text>
<text class="summary-value">{{ typeText }}</text>
</view>
<view class="summary-row">
<text class="summary-label">编码</text>
<text class="summary-value">{{ detail.code || '-' }}</text>
</view>
<view class="summary-row">
<text class="summary-label">名称</text>
<text class="summary-value">{{ detail.name || '-' }}</text>
</view>
</view>
<view class="tip">库存明细以 Web 端样品库存查询为准PDA 当前用于扫码识别和现场作业</view>
<scroll-view scroll-y class="list-scroll" @scrolltolower="loadMore" :lower-threshold="80">
<view class="list-wrap">
<view v-for="item in list" :key="item.id" class="stock-card">
<view class="card-title">{{ item.productName || item.name || '-' }}</view>
<view class="info-row">
<text class="info-label">样品码</text>
<text class="info-value">{{ item.barCode || '-' }}</text>
</view>
<view class="info-row">
<text class="info-label">仓库</text>
<text class="info-value">{{ item.warehouseName || '-' }}</text>
</view>
<view class="info-row">
<text class="info-label">库区</text>
<text class="info-value">{{ item.areaName || '-' }}</text>
</view>
<view class="info-row">
<text class="info-label">库位</text>
<text class="info-value">{{ formatLocation(item) }}</text>
</view>
<view class="info-row">
<text class="info-label">库存</text>
<text class="info-value count-value">{{ formatCount(item.count, item.unitName) }}</text>
</view>
</view>
<view v-if="loading && pageNo === 1" class="state-text">...</view>
<view v-else-if="!list.length" class="state-text">暂无库位库存</view>
<view v-else-if="loadingMore" class="state-text">加载更多...</view>
<view v-else-if="finished" class="state-text">没有更多了</view>
</view>
</scroll-view>
</view>
</template>
<script setup>
import { reactive, computed } from 'vue'
import { computed, reactive, ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import NavBar from '@/components/common/NavBar.vue'
import { getBitWmsLocationStockPage, scanBitWmsCode } from '@/api/erp/bitwms'
const detail = reactive({
productId: undefined,
@ -28,21 +75,149 @@ const detail = reactive({
code: '',
name: ''
})
const locationFilter = reactive({
id: undefined,
code: '',
name: ''
})
const locationSearchCode = ref('')
const list = ref([])
const loading = ref(false)
const loadingMore = ref(false)
const finished = ref(false)
const pageNo = ref(1)
const pageSize = ref(10)
const total = ref(0)
const typeText = computed(() => detail.productId ? '样品' : detail.locationId ? '库位' : '未识别')
const unwrap = (res) => res?.data || res
const typeText = computed(() => {
if (detail.productId && locationFilter.id) return '样品指定库位库存'
if (detail.productId) return '样品库位库存'
if (locationFilter.id) return '库位库存'
return '全部样品库位库存'
})
onLoad((options = {}) => {
detail.productId = options.productId
detail.locationId = options.locationId
onLoad(async (options = {}) => {
detail.productId = options.productId ? Number(options.productId) : undefined
detail.locationId = options.locationId ? Number(options.locationId) : undefined
detail.code = decodeURIComponent(options.code || '')
detail.name = decodeURIComponent(options.name || '')
if (detail.locationId) {
locationFilter.id = detail.locationId
locationFilter.code = detail.code
locationFilter.name = detail.name
locationSearchCode.value = detail.code
}
await fetchList(true)
})
function normalizePageData(res) {
const root = unwrap(res) || {}
return {
list: Array.isArray(root.list) ? root.list : [],
total: Number(root.total || 0)
}
}
function buildQueryParams() {
return {
pageNo: pageNo.value,
pageSize: pageSize.value,
productId: detail.productId || undefined,
locationId: locationFilter.id || undefined
}
}
function openLocationScanner() {
uni.scanCode({
scanType: ['qrCode', 'barCode'],
success: (res) => {
locationSearchCode.value = String(res.result || '').trim()
searchLocation()
}
})
}
async function searchLocation() {
const code = locationSearchCode.value.trim()
if (!code) {
clearLocationFilter()
return
}
const data = unwrap(await scanBitWmsCode(code))
if (data?.type !== 'LOCATION') return uni.showToast({ title: '请扫描库位标签', icon: 'none' })
locationFilter.id = data.id
locationFilter.code = data.code
locationFilter.name = data.name
locationSearchCode.value = data.code || code
await fetchList(true)
}
async function clearLocationFilter() {
locationFilter.id = undefined
locationFilter.code = ''
locationFilter.name = ''
locationSearchCode.value = ''
await fetchList(true)
}
async function fetchList(reset = false) {
if (reset) {
pageNo.value = 1
finished.value = false
}
if (finished.value && !reset) return
if (pageNo.value === 1) loading.value = true
else loadingMore.value = true
try {
const page = normalizePageData(await getBitWmsLocationStockPage(buildQueryParams()))
total.value = page.total
list.value = reset ? page.list : [...list.value, ...page.list]
finished.value = list.value.length >= total.value || page.list.length < pageSize.value
} finally {
loading.value = false
loadingMore.value = false
}
}
async function loadMore() {
if (loading.value || loadingMore.value || finished.value) return
pageNo.value += 1
await fetchList()
}
function formatLocation(item) {
const code = item.locationCode || '-'
const name = item.locationName || '-'
return `${code} / ${name}`
}
function formatCount(count, unitName) {
const value = count === undefined || count === null || count === '' ? '-' : count
return unitName ? `${value} ${unitName}` : String(value)
}
</script>
<style lang="scss" scoped>
.page { min-height: 100vh; background: #f5f6f8; padding: 24rpx; }
.card { background: #fff; border-radius: 16rpx; padding: 26rpx; margin-bottom: 18rpx; display: flex; justify-content: space-between; box-shadow: 0 4rpx 16rpx rgba(15,23,42,.04); }
.label { color: #64748b; font-size: 26rpx; }
.value { color: #0f172a; font-size: 30rpx; font-weight: 600; max-width: 460rpx; text-align: right; }
.tip { margin-top: 26rpx; color: #64748b; font-size: 26rpx; line-height: 1.6; }
.page { min-height: 100vh; background: #f5f6f8; padding: 24rpx; box-sizing: border-box; }
.search-panel { background: #fff; border-radius: 16rpx; padding: 22rpx; margin-bottom: 20rpx; box-shadow: 0 4rpx 16rpx rgba(15,23,42,.04); }
.scan-row { display: flex; gap: 14rpx; }
.input { flex: 1; height: 82rpx; padding: 0 22rpx; background: #f8fafc; border-radius: 12rpx; font-size: 28rpx; }
.scan-btn { width: 130rpx; height: 82rpx; line-height: 82rpx; text-align: center; border-radius: 12rpx; background: #22486e; color: #fff; font-size: 28rpx; }
.filter-row { display: flex; justify-content: space-between; align-items: center; gap: 20rpx; padding-top: 18rpx; }
.filter-text { color: #1f2937; font-size: 26rpx; }
.clear-text { color: #22486e; font-size: 26rpx; font-weight: 600; }
.summary { background: #fff; border-radius: 16rpx; padding: 22rpx; margin-bottom: 20rpx; box-shadow: 0 4rpx 16rpx rgba(15,23,42,.04); }
.summary-row { display: flex; justify-content: space-between; gap: 20rpx; min-height: 52rpx; align-items: center; }
.summary-label { color: #64748b; font-size: 26rpx; }
.summary-value { color: #0f172a; font-size: 28rpx; font-weight: 600; max-width: 470rpx; text-align: right; }
.list-scroll { height: calc(100vh - 240rpx); }
.list-wrap { padding-bottom: 30rpx; }
.stock-card { background: #fff; border-radius: 16rpx; padding: 24rpx; margin-bottom: 18rpx; box-shadow: 0 4rpx 16rpx rgba(15,23,42,.04); }
.card-title { color: #0f172a; font-size: 30rpx; font-weight: 700; margin-bottom: 18rpx; }
.info-row { display: flex; justify-content: space-between; gap: 20rpx; min-height: 46rpx; align-items: center; }
.info-label { color: #64748b; font-size: 26rpx; }
.info-value { color: #1f2937; font-size: 27rpx; max-width: 470rpx; text-align: right; }
.count-value { color: #22486e; font-weight: 700; }
.state-text { color: #64748b; font-size: 26rpx; text-align: center; padding: 26rpx 0; }
</style>

@ -19,17 +19,14 @@ const MENU_ROUTE_MAP = {
warehouse: '/pages_function/pages/warehouse/index',
'BIT样品仓': '/pages_function/pages/bitWms/scan',
bitwms: '/pages_function/pages/bitWms/scan',
'贴码上架': '/pages_function/pages/bitWms/shelf',
'样品入库': '/pages_function/pages/bitWms/in',
'样品出库': '/pages_function/pages/bitWms/out',
'样品移库': '/pages_function/pages/bitWms/move',
'样品库存查询': '/pages_function/pages/bitWms/stock',
'erp:bit-wms:shelf': '/pages_function/pages/bitWms/shelf',
'erp:bit-wms:inbound': '/pages_function/pages/bitWms/in',
'erp:bit-wms:outbound': '/pages_function/pages/bitWms/out',
'erp:bit-wms:move': '/pages_function/pages/bitWms/move',
'erp:bit-wms:stock:query': '/pages_function/pages/bitWms/stock',
erpbitwmsshelf: '/pages_function/pages/bitWms/shelf',
erpbitwmsinbound: '/pages_function/pages/bitWms/in',
erpbitwmsoutbound: '/pages_function/pages/bitWms/out',
erpbitwmsmove: '/pages_function/pages/bitWms/move',

Loading…
Cancel
Save