6 天以前 91c82965b2d987452ca276e3a03b48c8dcda2ae9
src/views/mes/pd/project/detail/index.vue
@@ -13,8 +13,8 @@
import {
  archivePdProject,
  auditPdProject,
  getPdProject,
  getPdProjectApproveProcessList,
  publishPdProject,
  uploadPdProject,
} from '#/api/mes/pd/project';
@@ -25,6 +25,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 +51,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 +63,7 @@
);
const materialFormType = computed<FormType>(() =>
  isPendingPublish.value || isPendingUpload.value || isPendingAudit.value ? 'update' : 'detail',
  isPendingPublish.value || isPendingUpload.value ? 'update' : 'detail',
);
const [Descriptions] = useDescription({
@@ -70,6 +74,11 @@
const [FormModal, formModalApi] = useVbenModal({
  connectedComponent: Form,
  destroyOnClose: true,
});
const [ProcessModal, processModalApi] = useVbenModal({
  connectedComponent: ProcessSelectModal,
  destroyOnClose: true,
});
@@ -119,16 +128,38 @@
  }
}
async function handleAudit() {
  const hideLoading = message.loading({ content: '审核中…', duration: 0 });
/** 提交审批 - 先获取流程列表 */
async function handleSubmit() {
  const hideLoading = message.loading({ content: '获取审批流程...', duration: 0 });
  try {
    await auditPdProject(projectId.value);
    message.success('审核通过,进入待归档状态');
    tabs.closeCurrentTab();
    router.back();
  } finally {
    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 +186,7 @@
    :title="project.taskName || '设计任务详情'"
  >
    <FormModal @success="loadProjectDetail" />
    <ProcessModal @success="handleSubmitSuccess" />
    <template #extra>
      <TableAction
@@ -169,35 +201,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 +256,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 +266,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>