liu
3 天以前 91eff4781fa4142d1f62d30a0fa1de5cae424eaf
src/views/mes/pd/archive/modules/detail.vue
@@ -9,11 +9,12 @@
import { FilePreviewModal, useFilePreview } from '#/components/file-preview';
interface Props {
  visible: boolean;
  visible?: boolean;
  productCode?: string;
}
const props = withDefaults(defineProps<Props>(), {
  visible: false,
  productCode: '',
});
@@ -27,6 +28,8 @@
const loading = ref(false);
const detailList = ref<MesPdArchiveApi.DetailItem[]>([]);
const activeProject = ref('0');
/** 当前查看的产品编码(命令式 open(code) 传入或取自 prop) */
const currentCode = ref('');
const { openPreview, previewState } = useFilePreview();
@@ -52,28 +55,50 @@
  },
];
watch(() => props.visible, async (newVal) => {
  if (newVal && props.productCode) {
    open.value = true;
    loading.value = true;
    detailList.value = [];
    activeProject.value = '0';
    try {
      detailList.value = await getPdArchiveDetailByProduct(props.productCode);
    } catch {
      message.error('获取归档详情失败');
    } finally {
      loading.value = false;
    }
  } else if (!newVal) {
    open.value = false;
    detailList.value = [];
/** 打开弹窗并加载指定产品编码的归档详情;编码为空时直接展示空态 */
async function showDetail(code: string) {
  currentCode.value = code || '';
  open.value = true;
  detailList.value = [];
  activeProject.value = '0';
  if (!currentCode.value) {
    return;
  }
});
  loading.value = true;
  try {
    detailList.value = await getPdArchiveDetailByProduct(currentCode.value);
  } catch {
    message.error('获取归档详情失败');
  } finally {
    loading.value = false;
  }
}
watch(
  () => props.visible,
  (newVal) => {
    if (newVal) {
      // 即使产品编码为空也打开弹窗(展示空态),避免父组件 visible 卡在 true 后再也无法触发
      showDetail(props.productCode || '');
    } else {
      open.value = false;
      detailList.value = [];
    }
  },
);
function handleClose() {
  open.value = false;
  detailList.value = [];
  emit('update:visible', false);
}
/** 兼容命令式调用:archiveDetailRef.value?.open(productCode) */
function handleOpen(code?: string) {
  showDetail(code ?? props.productCode ?? '');
}
defineExpose({ open: handleOpen });
</script>
<template>
@@ -143,7 +168,7 @@
        </Tabs.TabPane>
      </Tabs>
      <div v-else class="py-8 text-center text-gray-400">
        暂无归档记录
        {{ currentCode ? '暂无归档记录' : '该工单未设置产品编码,暂无归档记录' }}
      </div>
    </template>
  </Modal>