liu
3 天以前 91eff4781fa4142d1f62d30a0fa1de5cae424eaf
src/views/mes/pd/project/detail/index.vue
@@ -5,6 +5,8 @@
import { computed, onMounted, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useUserStore } from '@vben/stores';
import { Page, useVbenModal } from '#/packages/effects/common-ui/src';
import { useTabs } from '#/packages/effects/hooks/src';
import { MesPdProjectStatusEnum } from '#/packages/constants/src';
@@ -14,8 +16,9 @@
import {
  archivePdProject,
  getPdProject,
  getPdProjectApproveProcessList,
  getPdProjectApproverIds,
  publishPdProject,
  submitPdProjectApproval,
  uploadPdProject,
} from '#/api/mes/pd/project';
import { useDescription } from '#/components/description';
@@ -23,9 +26,9 @@
import { $t } from '#/locales';
import Form from '../modules/form.vue';
import AuditModal from '../modules/audit-modal.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';
@@ -77,10 +80,33 @@
  destroyOnClose: true,
});
const [ProcessModal, processModalApi] = useVbenModal({
  connectedComponent: ProcessSelectModal,
const [AuditModalComp, auditModalApi] = useVbenModal({
  connectedComponent: AuditModal,
  destroyOnClose: true,
});
const userStore = useUserStore();
const currentUserId = userStore.userInfo?.id; // 当前登录用户 ID,用于审核人权限判断
/** 审批配置中该业务的审核人编号集合,决定「审核 / 审核不通过」按钮是否展示 */
const approverIds = ref<number[]>([]);
/** 拉取审核人集合;失败时保持为空(按钮不展示),不阻断详情加载 */
async function loadApproverIds() {
  try {
    approverIds.value = (await getPdProjectApproverIds()) ?? [];
  } catch {
    approverIds.value = [];
  }
}
/** 当前登录用户是否为该业务的审核人,且单据处于审批中状态 */
const canAudit = computed(
  () =>
    isApproving.value &&
    !!currentUserId &&
    approverIds.value.includes(currentUserId),
);
async function loadProjectDetail() {
  loading.value = true;
@@ -128,38 +154,24 @@
  }
}
/** 提交审批 - 先获取流程列表 */
/** 提交审批 - 审核人由「系统管理 - 审批配置」统一指定,此处无需选择 */
async function handleSubmit() {
  const hideLoading = message.loading({ content: '获取审批流程...', duration: 0 });
  try {
    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 },
  const hideLoading = message.loading({
    content: '正在提交审批...',
    duration: 0,
  });
  try {
    await submitPdProjectApproval(projectId.value);
    message.success('提交审批成功');
    loadProjectDetail();
  } finally {
    hideLoading();
  }
}
/** 提交审批成功后刷新详情 */
function handleSubmitSuccess() {
  loadProjectDetail();
/** 审核 - 通过 / 不通过 */
function handleAudit(pass: boolean) {
  auditModalApi.setData({ pass, row: project.value }).open();
}
async function handleArchive() {
@@ -176,6 +188,8 @@
onMounted(() => {
  projectId.value = Number(route.params.id);
  loadProjectDetail();
  // 进入页面即拉取审核人集合,用于控制审核按钮显隐
  loadApproverIds();
});
</script>
@@ -186,7 +200,7 @@
    :title="project.taskName || '设计任务详情'"
  >
    <FormModal @success="loadProjectDetail" />
    <ProcessModal @success="handleSubmitSuccess" />
    <AuditModalComp @success="loadProjectDetail" />
    <template #extra>
      <TableAction
@@ -220,13 +234,27 @@
            label: '提交审批',
            type: 'primary',
            ifShow: isPendingAudit,
            onClick: handleSubmit,
            // 审核人由审批配置统一指定,提交前仅二次确认,不再弹选流程框
            popConfirm: {
              title: '确认提交审批?提交后由审批配置中指定的审核人处理。',
              confirm: handleSubmit,
            },
          },
          {
            label: '查看审批',
            label: '审核',
            type: 'primary',
            ifShow: isApproving,
            onClick: handleProcessDetail,
            icon: ACTION_ICON.AUDIT,
            // 仅「审批中 + 当前登录用户在审批配置的审核人名单内」才显示
            ifShow: canAudit,
            onClick: () => handleAudit(true),
          },
          {
            label: '审核不通过',
            type: 'default',
            danger: true,
            // 同上,与「审核」成对出现
            ifShow: canAudit,
            onClick: () => handleAudit(false),
          },
          {
            label: '归档',