spring
2026-07-03 2540d86f0dbd77f654f558c3bf9d5ddbe7422f16
src/views/mes/pd/project/index.vue
@@ -2,6 +2,7 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MesPdProjectApi } from '#/api/mes/pd/project';
import { onActivated } from 'vue';
import { useRouter } from 'vue-router';
import { Page, useVbenModal } from '#/packages/effects/common-ui/src';
@@ -12,17 +13,19 @@
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {
  archivePdProject,
  deletePdProject,
  exportPdProject,
  getPdProjectPage,
  publishPdProject,
} from '#/api/mes/pd/project';
import { $t } from '#/locales';
import { useGridColumns, useGridFormSchema } from './data';
import CreateForm from './modules/create-form.vue';
import Form from './modules/form.vue';
import PublishForm from './modules/publish-form.vue';
import WorkflowActionForm from './modules/workflow-action-form.vue';
const router = useRouter();
@@ -36,23 +39,12 @@
  destroyOnClose: true,
});
const [PublishModal, publishModalApi] = useVbenModal({
  connectedComponent: PublishForm,
  destroyOnClose: true,
});
const [WorkflowActionModal, workflowActionModalApi] = useVbenModal({
  connectedComponent: WorkflowActionForm,
  destroyOnClose: true,
});
function handleRefresh() {
  gridApi.query();
}
function handleCreateSuccess(projectId: number) {
function handleCreateSuccess() {
  handleRefresh();
  router.push({ name: 'MesPdProjectDetail', params: { id: projectId } });
}
function handleCreate() {
@@ -67,25 +59,42 @@
  formModalApi.setData({ formType: 'update', id: row.id }).open();
}
function handlePublish(row: MesPdProjectApi.Project) {
  publishModalApi.setData({ id: row.id }).open();
async function handlePublish(row: MesPdProjectApi.Project) {
  const hideLoading = message.loading({
    content: '发布中…',
    duration: 0,
  });
  try {
    await publishPdProject(row.id!);
    message.success('任务已发布,进入待上传状态');
    handleRefresh();
  } finally {
    hideLoading();
  }
}
function handleWorkflowAction(
  row: MesPdProjectApi.Project,
  action: 'approve' | 'archive' | 'submit-review',
) {
  workflowActionModalApi.setData({ id: row.id, action }).open();
async function handleArchive(row: MesPdProjectApi.Project) {
  const hideLoading = message.loading({
    content: '归档中…',
    duration: 0,
  });
  try {
    await archivePdProject(row.id!);
    message.success('已归档');
    handleRefresh();
  } finally {
    hideLoading();
  }
}
async function handleDelete(row: MesPdProjectApi.Project) {
  const hideLoading = message.loading({
    content: $t('ui.actionMessage.deleting', [row.name]),
    content: $t('ui.actionMessage.deleting', [row.taskName]),
    duration: 0,
  });
  try {
    await deletePdProject(row.id!);
    message.success($t('ui.actionMessage.deleteSuccess', [row.name]));
    message.success($t('ui.actionMessage.deleteSuccess', [row.taskName]));
    handleRefresh();
  } finally {
    hideLoading();
@@ -118,21 +127,23 @@
    toolbarConfig: { refresh: true, search: true },
  } as VxeTableGridOptions<MesPdProjectApi.Project>,
});
onActivated(() => {
  handleRefresh();
});
</script>
<template>
  <Page auto-content-height>
    <CreateFormModal @success="handleCreateSuccess" />
    <FormModal @success="handleRefresh" />
    <PublishModal @success="handleRefresh" />
    <WorkflowActionModal @success="handleRefresh" />
    <Grid table-title="设计任务">
      <template #toolbar-tools>
        <TableAction
          :actions="[
            {
              label: '发起设计任务',
              label: '创建设计任务',
              type: 'primary',
              icon: ACTION_ICON.ADD,
              auth: ['mes:pd-project:create'],
@@ -148,49 +159,53 @@
          ]"
        />
      </template>
      <template #code="{ row }">
        <Button type="link" @click="handleDetail(row)">{{ row.code }}</Button>
      <template #taskCode="{ row }">
        <Button type="link" @click="handleDetail(row)">{{ row.taskCode }}</Button>
      </template>
      <template #actions="{ row }">
        <TableAction
          :actions="[
            {
              label: '发布任务',
              label: '发布',
              type: 'link',
              auth: ['mes:pd-project:update'],
              ifShow: row.status === MesPdProjectStatusEnum.DRAFT,
              onClick: handlePublish.bind(null, row),
              ifShow: row.status === MesPdProjectStatusEnum.PENDING_PUBLISH,
              popConfirm: {
                title: '确认发布该任务?发布后进入待上传状态。',
                confirm: handlePublish.bind(null, row),
              },
            },
            {
              label: '上传资料',
              type: 'link',
              auth: ['mes:pd-project:update'],
              ifShow: row.status === MesPdProjectStatusEnum.PENDING_UPLOAD,
              onClick: () => handleDetail(row),
            },
            {
              label: '审核',
              type: 'link',
              auth: ['mes:pd-project:audit'],
              ifShow: row.status === MesPdProjectStatusEnum.PENDING_AUDIT,
              onClick: () => handleDetail(row),
            },
            {
              label: '归档',
              type: 'link',
              auth: ['mes:pd-project:archive'],
              ifShow: row.status === MesPdProjectStatusEnum.PENDING_ARCHIVE,
              popConfirm: {
                title: '确认归档?归档后将生成台账记录,任务不可再修改。',
                confirm: handleArchive.bind(null, row),
              },
            },
            {
              label: $t('common.edit'),
              type: 'link',
              icon: ACTION_ICON.EDIT,
              auth: ['mes:pd-project:update'],
              ifShow:
                row.status === MesPdProjectStatusEnum.DRAFT ||
                row.status === MesPdProjectStatusEnum.DESIGNING,
              ifShow: row.status === MesPdProjectStatusEnum.PENDING_PUBLISH,
              onClick: handleEdit.bind(null, row),
            },
            {
              label: '提交审核',
              type: 'link',
              auth: ['mes:pd-project:submit-review'],
              ifShow: row.status === MesPdProjectStatusEnum.DESIGNING,
              onClick: () => handleWorkflowAction(row, 'submit-review'),
            },
            {
              label: '审核通过',
              type: 'link',
              auth: ['mes:pd-drawing-review:review'],
              ifShow: row.status === MesPdProjectStatusEnum.REVIEWING,
              onClick: () => handleWorkflowAction(row, 'approve'),
            },
            {
              label: '归档',
              type: 'link',
              auth: ['mes:pd-project:archive'],
              ifShow: row.status === MesPdProjectStatusEnum.APPROVED,
              onClick: () => handleWorkflowAction(row, 'archive'),
            },
            {
              label: $t('common.delete'),
@@ -198,9 +213,9 @@
              danger: true,
              icon: ACTION_ICON.DELETE,
              auth: ['mes:pd-project:delete'],
              ifShow: row.status === MesPdProjectStatusEnum.DRAFT,
              ifShow: row.status === MesPdProjectStatusEnum.PENDING_PUBLISH,
              popConfirm: {
                title: $t('ui.actionMessage.deleteConfirm', [row.name]),
                title: $t('ui.actionMessage.deleteConfirm', [row.taskName]),
                confirm: handleDelete.bind(null, row),
              },
            },