云
8 天以前 a241b66efcc41e973290a6722fb7a4d79b833ea1
src/views/mes/pd/project/detail/index.vue
@@ -1,4 +1,6 @@
<script lang="ts" setup>
import { automaticApproval } from '#/store/audit-policy';
import { submitPdProjectApproval } from '#/api/mes/pd/project';
import type { FormType } from '../data';
import type { MesPdProjectApi } from '#/api/mes/pd/project';
@@ -13,8 +15,8 @@
import {
  archivePdProject,
  auditPdProject,
  getPdProject,
  getPdProjectApproveProcessList,
  publishPdProject,
  uploadPdProject,
} from '#/api/mes/pd/project';
@@ -25,6 +27,7 @@
import Form from '../modules/form.vue';
import DocumentAuditList from '../modules/document-audit-list.vue';
import DocumentList from '../modules/document-list.vue';
import ProcessSelectModal from '../modules/process-select-modal.vue';
import WorkflowTimeline from '../modules/workflow-timeline.vue';
import TaskDraftBanner from '../modules/task-draft-banner.vue';
import { useDetailSchema } from './data';
@@ -50,6 +53,9 @@
const isPendingArchive = computed(
  () => project.value.status === MesPdProjectStatusEnum.PENDING_ARCHIVE,
);
const isApproving = computed(
  () => project.value.status === MesPdProjectStatusEnum.APPROVING,
);
const isArchived = computed(
  () => project.value.status === MesPdProjectStatusEnum.ARCHIVED,
);
@@ -59,7 +65,7 @@
);
const materialFormType = computed<FormType>(() =>
  isPendingPublish.value || isPendingUpload.value || isPendingAudit.value ? 'update' : 'detail',
  isPendingPublish.value || isPendingUpload.value ? 'update' : 'detail',
);
const [Descriptions] = useDescription({
@@ -73,14 +79,26 @@
  destroyOnClose: true,
});
const [ProcessModal, processModalApi] = useVbenModal({
  connectedComponent: ProcessSelectModal,
  destroyOnClose: true,
});
async function loadProjectDetail() {
  loading.value = true;
  try {
    project.value = await getPdProject(projectId.value);
    if (isPendingUpload.value) {
    if (route.query.tab === 'audit' && isPendingAudit.value) {
      // 从列表页「审核文件」按钮进入,且当前确实处于待审核状态时,才定位到资料审核 Tab
      activeTab.value = 'audit';
    } else if (isPendingUpload.value) {
      activeTab.value = 'material';
    } else if (isPendingAudit.value) {
      activeTab.value = 'audit';
    } else {
      // 审批中/待归档/已归档等状态:重置到「设计资料」页签,
      // 避免 activeTab 仍指向随状态变化而移除的「资料审核」页签,导致下方内容空白
      activeTab.value = 'material';
    }
  } finally {
    loading.value = false;
@@ -89,7 +107,7 @@
function handleBack() {
  tabs.closeCurrentTab();
  router.push({ path: '/mes/pd/project' });
  router.back();
}
function handleEdit() {
@@ -119,16 +137,46 @@
  }
}
async function handleAudit() {
  const hideLoading = message.loading({ content: '审核中…', duration: 0 });
/** 提交审批 - 先获取流程列表 */
async function handleSubmit() {
  const hideLoading = message.loading({ content: automaticApproval.value ? '正在提交生效...' : '获取审批流程...', duration: 0 });
  try {
    await auditPdProject(projectId.value);
    message.success('审核通过,进入待归档状态');
    tabs.closeCurrentTab();
    router.back();
  } finally {
    if (automaticApproval.value) {
      await submitPdProjectApproval(projectId.value, 'pd_project_approve');
      hideLoading();
      message.success('已提交生效');
      await loadProjectDetail();
      return;
    }
    const processList = await getPdProjectApproveProcessList();
    hideLoading();
    if (!processList || processList.length === 0) {
      message.warning('暂无可用审批流程,请先配置 BPM 流程');
      return;
    }
    // 打开流程选择弹窗
    processModalApi.setData({ id: projectId.value, processList }).open();
  } catch {
    hideLoading();
  }
}
/** 查看审批详情 */
function handleProcessDetail() {
  if (!project.value.processInstanceId) {
    message.warning('该项目尚未提交审批');
    return;
  }
  router.push({
    name: 'BpmProcessInstanceDetail',
    query: { id: project.value.processInstanceId },
  });
}
/** 提交审批成功后刷新详情 */
function handleSubmitSuccess() {
  loadProjectDetail();
}
async function handleArchive() {
@@ -155,6 +203,7 @@
    :title="project.taskName || '设计任务详情'"
  >
    <FormModal @success="loadProjectDetail" />
    <ProcessModal @success="handleSubmitSuccess" />
    <template #extra>
      <TableAction
@@ -169,35 +218,36 @@
            label: $t('common.edit'),
            type: 'primary',
            icon: ACTION_ICON.EDIT,
            auth: ['mes:pd-project:update'],
            ifShow: isFormEditable,
            onClick: handleEdit,
          },
          {
            label: '发布',
            type: 'primary',
            auth: ['mes:pd-project:update'],
            ifShow: isPendingPublish,
            onClick: handlePublish,
          },
          {
            label: '确认上传',
            type: 'primary',
            auth: ['mes:pd-project:update'],
            ifShow: isPendingUpload,
            onClick: handleUpload,
          },
          {
            label: '审核通过',
            label: '提交审批',
            type: 'primary',
            auth: ['mes:pd-project:audit'],
            ifShow: isPendingAudit,
            onClick: handleAudit,
            onClick: handleSubmit,
          },
          {
            label: '查看审批',
            type: 'primary',
            ifShow: isApproving,
            onClick: handleProcessDetail,
          },
          {
            label: '归档',
            type: 'default',
            auth: ['mes:pd-project:archive'],
            ifShow: isPendingArchive,
            onClick: handleArchive,
          },
@@ -223,7 +273,7 @@
        <Tabs.TabPane key="workflow" tab="流程进度" :force-render="true">
          <WorkflowTimeline :status="project.status ?? 0" />
        </Tabs.TabPane>
        <Tabs.TabPane v-if="!isPendingAudit" key="material" tab="设计资料" :force-render="true">
        <Tabs.TabPane v-if="!isPendingAudit" key="material" tab="设计资料">
          <p v-if="isPendingPublish" class="mb-3 text-sm text-amber-600">
            请先发布任务后再上传设计资料
          </p>
@@ -233,7 +283,7 @@
            :project-status="project.status"
          />
        </Tabs.TabPane>
        <Tabs.TabPane v-if="isPendingAudit" key="audit" tab="资料审核" :force-render="true">
        <Tabs.TabPane v-if="isPendingAudit" key="audit" tab="资料审核">
          <DocumentAuditList :project-id="projectId" @success="loadProjectDetail" />
        </Tabs.TabPane>
      </Tabs>