Files
klp-mono/apps/hand-factory/components/scan-result-card/scan-result-card.vue
2025-10-27 13:21:43 +08:00

135 lines
4.4 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>
<view class="result-card" v-if="scanResult && codeStatus !== undefined">
<!-- 头部标题+时间 -->
<view class="result-header">
<text class="result-title">扫码信息</text>
<text class="result-time">{{ currentTime }}</text>
</view>
<!-- 主体根据配置循环渲染字段无v-if -->
<view class="result-body">
<view
class="info-item"
v-for="(column, index) in displayColumns"
:key="index"
v-if="column.showCondition(codeStatus, scanResult)"
>
<text class="info-label">{{ column.label }}</text>
<text class="info-value">
{{ column.formatter ? column.formatter(scanResult[column.key], codeStatus) : scanResult[column.key] || '无' }}
</text>
</view>
</view>
</view>
</template>
<script>
import { formatIoType, formatItemType } from '@/utils/wms';
import { CODE_STATUS } from '@/constants/wms';
export default {
name: 'ScanResultCard',
props: {
scanResult: {
type: Object,
default: () => null,
required: true
},
currentTime: {
type: String,
default: '',
required: true
},
codeStatus: {
type: Number,
default: CODE_STATUS.UNUSED, // 默认未使用
required: true
}
},
computed: {
// 字段显示配置:集中定义“显示哪些字段、怎么显示”
displayColumns() {
return [
// 操作类型仅状态0/1显示
{
label: '操作类型',
key: 'ioType', // scanResult中的键
formatter: formatIoType, // 调用工具函数格式化
showCondition: (status) => status !== CODE_STATUS.OUT_STOCK // 状态2已出库不显示
},
// 物品类型:所有状态显示
{
label: '物品类型',
key: 'itemType',
formatter: formatItemType,
showCondition: () => true // 始终显示
},
// 数量所有状态显示注意原组件用count父组件用quantity这里统一为quantity
{
label: '数量',
key: 'quantity',
formatter: (val) => val || 0,
showCondition: () => true
},
// 仓库ID仅状态0/1显示
{
label: '仓库ID',
key: 'warehouseName',
showCondition: (status) => status !== CODE_STATUS.OUT_STOCK
},
// 来源仓库仅状态0/1且有fromWarehouseId时显示
{
label: '来源仓库',
key: 'fromWarehouseName',
showCondition: (status, result) => status !== CODE_STATUS.OUT_STOCK && result.fromWarehouseId
},
// 物品名称:所有状态显示
{
label: '物品名称',
key: 'itemName',
showCondition: () => true
},
// 物品编码:所有状态显示
{
label: '物品编码',
key: 'itemCode',
showCondition: () => true
},
// 批次号:所有状态显示
{
label: '批次号',
key: 'batchNo',
showCondition: () => true
},
// 库存单ID仅状态0/1显示
{
label: '库存单ID',
key: 'stockIoId', // 状态1时也用stockIoId无需额外判断
showCondition: (status) => status !== CODE_STATUS.OUT_STOCK
}
// 新增字段:直接在这里加配置,模板无需修改
// 示例:
// {
// label: '有效期',
// key: 'expireDate',
// showCondition: () => true
// }
];
}
}
};
</script>
<style scoped>
/* 原有样式不变仅保留隔离的scoped样式 */
.result-card { width: 680rpx; background: #fff; border-radius: 20rpx; box-shadow: 0 4rpx 15rpx rgba(0,0,0,0.05); overflow: hidden; }
.result-header { padding: 30rpx; border-bottom: 1px solid #f0f0f0; display: flex; justify-content: space-between; align-items: center; }
.result-title { font-size: 34rpx; color: #333; font-weight: bold; }
.result-time { font-size: 24rpx; color: #999; }
.result-body { padding: 30rpx; }
.info-item { display: flex; padding: 15rpx 0; border-bottom: 1px dashed #f0f0f0; align-items: flex-start; }
.info-item:last-child { border-bottom: none; }
.info-label { font-size: 28rpx; color: #666; width: 200rpx; font-weight: 500; flex-shrink: 0; }
.info-value { font-size: 28rpx; color: #333; flex: 1; word-break: break-all; }
</style>