liu
2026-10-24 9dd570ebd3d98517be59307995cbff09a93ae7c3
feat(mes): 接入条码全链路追溯
已修改2个文件
100 ■■■■■ 文件已修改
src/views/wls/barcode/components/scan-modal.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/barcode/index.vue 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/barcode/components/scan-modal.vue
@@ -1,7 +1,7 @@
<script lang="ts" setup>
import { computed, ref } from 'vue';
import { DICT_TYPE } from '@vben/constants';
import { BarcodeBizTypeEnum, DICT_TYPE } from '@vben/constants';
import {
  Button,
@@ -22,6 +22,10 @@
import { DictTag } from '#/components/dict-tag';
defineOptions({ name: 'WlsBarcodeScanModal' });
const emit = defineEmits<{
  trace: [data: Record<string, any>];
}>();
const open = ref(false);
const content = ref('');
@@ -91,6 +95,21 @@
  }
  return 'orange';
});
const canTrace = computed(() =>
  [BarcodeBizTypeEnum.BATCH, BarcodeBizTypeEnum.SN].includes(
    parseResult.value?.bizType,
  ),
);
/** 打开采购、生产、质量、销售全链路追溯 */
function handleTrace() {
  if (!parseResult.value || !canTrace.value) {
    return;
  }
  emit('trace', parseResult.value);
  open.value = false;
}
defineExpose({ open: openModal });
</script>
@@ -172,7 +191,10 @@
      </div>
    </div>
    <template #footer>
      <Button v-if="canTrace" type="primary" @click="handleTrace">
        全链路追溯
      </Button>
      <Button @click="open = false">关闭</Button>
    </template>
  </Modal>
</template>
</template>
src/views/wls/barcode/index.vue
@@ -1,11 +1,13 @@
<script lang="ts" setup>
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MesWmBarcodeApi } from '#/api/mes/wm/barcode';
import type { MesWmBatchApi } from '#/api/mes/wm/batch';
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import { Page, useVbenModal } from '@vben/common-ui';
import { BarcodeBizTypeEnum } from '@vben/constants';
import { downloadFileFromBlobPart } from '@vben/utils';
import { message } from 'ant-design-vue';
@@ -16,7 +18,9 @@
  exportBarcode,
  getBarcodePage,
} from '#/api/mes/wm/barcode';
import { getBatchBySn, getBatchPage } from '#/api/mes/wm/batch';
import { $t } from '#/locales';
import TraceDetail from '#/views/mes/qc/batchtrace/modules/trace-detail.vue';
import { Barcode, BarcodeDetail, ScanModal } from './components';
import { useGridColumns, useGridFormSchema } from './data';
@@ -29,12 +33,54 @@
  destroyOnClose: true,
});
const [TraceModal, traceModalApi] = useVbenModal({
  connectedComponent: TraceDetail,
  destroyOnClose: true,
});
const barcodeDetailRef = ref<InstanceType<typeof BarcodeDetail>>();
const scanModalRef = ref<InstanceType<typeof ScanModal>>();
/** 扫码解析 / 成图预览 */
function handleScan() {
  scanModalRef.value?.open();
}
/** 条码对应的批次/SN是否支持全链路追溯 */
function isTraceable(row: Partial<MesWmBarcodeApi.Barcode>) {
  return [BarcodeBizTypeEnum.BATCH, BarcodeBizTypeEnum.SN].includes(
    row.bizType as BarcodeBizTypeEnum,
  );
}
/** 从批次码或 SN 码进入采购、生产、质量、销售全链路追溯 */
async function handleTrace(row: Partial<MesWmBarcodeApi.Barcode>) {
  if (!isTraceable(row)) {
    message.warning('当前仅支持批次码和 SN 码进行全链路追溯');
    return;
  }
  let batch: MesWmBatchApi.Batch | null | undefined;
  if (row.bizType === BarcodeBizTypeEnum.SN) {
    const sn = row.bizCode || row.content;
    batch = sn ? await getBatchBySn(sn) : undefined;
  } else {
    const batchCode = row.bizCode || row.content;
    if (batchCode) {
      const page = await getBatchPage({
        code: batchCode,
        pageNo: 1,
        pageSize: 20,
      });
      batch = page.list.find((item) => item.code === batchCode);
    }
  }
  if (!batch) {
    message.warning('未找到该条码对应的批次数据');
    return;
  }
  traceModalApi.setData(batch).open();
}
const checkedIds = ref<number[]>([]);
@@ -103,7 +149,12 @@
/** 跳转条码配置 */
function handleConfig() {
  router.push({ path: '/wls/barcode/config' });
  router.push({ path: '/mes/wm/barcode/config' });
}
/** 打开完整批次追溯清单 */
function handleTraceCenter() {
  router.push({ path: '/mes/qc/batch-trace' });
}
/** 导出表格 */
@@ -149,9 +200,11 @@
</script>
<template>
  <Page auto-content-height><FormModal @success="handleRefresh" />
  <Page auto-content-height>
    <FormModal @success="handleRefresh" />
    <TraceModal />
    <BarcodeDetail ref="barcodeDetailRef" />
    <ScanModal ref="scanModalRef" />
    <ScanModal ref="scanModalRef" @trace="handleTrace" />
    <Grid table-title="条码列表">
      <template #toolbar-tools>
@@ -192,6 +245,13 @@
              onClick: handleConfig,
            },
            {
              label: '全链路追溯',
              type: 'primary',
              icon: ACTION_ICON.VIEW,
              auth: ['mes:wm-batch:query'],
              onClick: handleTraceCenter,
            },
            {
              label: $t('ui.actionTitle.export'),
              type: 'primary',
              icon: ACTION_ICON.DOWNLOAD,
@@ -221,6 +281,14 @@
              onClick: handleView.bind(null, row),
            },
            {
              label: '追溯',
              type: 'link',
              icon: ACTION_ICON.VIEW,
              auth: ['mes:wm-batch:query'],
              ifShow: isTraceable(row),
              onClick: handleTrace.bind(null, row),
            },
            {
              label: $t('common.edit'),
              type: 'link',
              icon: ACTION_ICON.EDIT,