| | |
| | | <script lang="ts" setup> |
| | | import { computed } from 'vue'; |
| | | import type { MesTraceBatchApi } from '#/api/mes/trace/batch'; |
| | | import SalesTraceDetails from './SalesTraceDetails.vue'; |
| | | |
| | | const props = defineProps<{ detail: MesTraceBatchApi.Detail }>(); |
| | | |
| | | const formatTime = (value?: string) => value ? new Date(value).toLocaleString() : '未记录'; |
| | | |
| | | const timeline = computed(() => { |
| | | if (props.detail.timeline?.length) return props.detail.timeline; |
| | | const timeline = computed<(MesTraceBatchApi.Timeline & { sales?: MesTraceBatchApi.SalesTarget })[]>(() => { |
| | | if (props.detail.timeline?.length) { |
| | | const events: (MesTraceBatchApi.Timeline & { sales?: MesTraceBatchApi.SalesTarget })[] = props.detail.timeline.filter(item => item.eventType !== 'OUTBOUND' || item.stage !== '销售'); |
| | | if (props.detail.salesTargets?.length) { |
| | | events.push(...props.detail.salesTargets.map(sales => ({ stage: '销售', eventType: 'OUTBOUND', eventName: '销售出库', eventTime: sales.salesDate, quantity: sales.quantity, sales }))); |
| | | } else { |
| | | events.push(...props.detail.timeline.filter(item => item.eventType === 'OUTBOUND' && item.stage === '销售')); |
| | | } |
| | | return events.sort((a, b) => (a.eventTime || '\uffff').localeCompare(b.eventTime || '\uffff')); |
| | | } |
| | | return [ |
| | | ...(props.detail.purchaseSources?.length ? [{ stage: '来源', eventName: '采购来源', status: `${props.detail.purchaseSources.length} 条记录` }] : []), |
| | | { stage: '生产', eventType: 'BATCH_CREATED', eventName: '生产批次建立', eventTime: props.detail.produceDate, status: props.detail.batchStatusName }, |
| | | { stage: '包装', eventName: '包装赋码', quantity: props.detail.bagTotal }, |
| | | ...(props.detail.inbound ? [{ stage: '仓储', eventType: 'INBOUND', eventName: '仓储入库', eventTime: props.detail.inbound.eventTime, quantity: props.detail.inbound.quantity, status: props.detail.inbound.status }] : []), |
| | | ...(props.detail.salesTargets ?? []).map((item) => ({ stage: '销售', eventType: 'OUTBOUND', eventName: `销售去向 · ${item.clientName || '未记录客户'}`, eventTime: item.salesDate, quantity: item.quantity, status: item.qualityStatus == null ? undefined : String(item.qualityStatus) })), |
| | | ...(props.detail.salesTargets ?? []).map((item) => ({ stage: '销售', eventType: 'OUTBOUND', eventName: '销售出库', eventTime: item.salesDate, quantity: item.quantity, sales: item })), |
| | | ...(props.detail.antiFake?.scanCount ? [{ stage: '消费', eventType: 'CONSUMER_SCANNED', eventName: '消费者验证', eventTime: props.detail.antiFake.lastScanTime, quantity: props.detail.antiFake.scanCount, status: `累计扫码 ${props.detail.antiFake.scanCount} 次` }] : []), |
| | | ]; |
| | | }); |
| | |
| | | {{ item.stage || '未分类' }} · 数量:{{ item.quantity ?? '—' }} · {{ formatTime(item.eventTime) }} |
| | | <span v-if="item.status"> · {{ item.status }}</span> |
| | | </div> |
| | | <SalesTraceDetails v-if="item.sales" :sales="item.sales" :batch-code="detail.batchCode" /> |
| | | </a-timeline-item> |
| | | <a-empty v-if="!timeline.length" description="暂无追溯事件" /> |
| | | </a-timeline> |