云
8 天以前 78caa769e452f63288743b8997f7b4c21bb06ce5
src/views/mes/qc/batchtrace/modules/TraceTimeline.vue
@@ -1,19 +1,28 @@
<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} 次` }] : []),
  ];
});
@@ -30,6 +39,7 @@
          {{ 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>