From 2540d86f0dbd77f654f558c3bf9d5ddbe7422f16 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 03 七月 2026 17:22:09 +0800
Subject: [PATCH] fix: 完成设计项目和归档台账接口对接,功能联调

---
 src/views/mes/pd/project/detail/index.vue |  158 +++++++++++++++++++++++++++++-----------------------
 1 files changed, 88 insertions(+), 70 deletions(-)

diff --git a/src/views/mes/pd/project/detail/index.vue b/src/views/mes/pd/project/detail/index.vue
index ea6bf27..be5f1f1 100644
--- a/src/views/mes/pd/project/detail/index.vue
+++ b/src/views/mes/pd/project/detail/index.vue
@@ -9,22 +9,24 @@
 import { useTabs } from '#/packages/effects/hooks/src';
 import { MesPdProjectStatusEnum } from '#/packages/constants/src';
 
-import { Card, Tabs } from 'ant-design-vue';
+import { Card, message, Tabs } from 'ant-design-vue';
 
 import {
+  archivePdProject,
+  auditPdProject,
   getPdProject,
+  publishPdProject,
+  uploadPdProject,
 } from '#/api/mes/pd/project';
 import { useDescription } from '#/components/description';
 import { ACTION_ICON, TableAction } from '#/adapter/vxe-table';
 import { $t } from '#/locales';
 
 import Form from '../modules/form.vue';
-import PublishForm from '../modules/publish-form.vue';
-import WorkflowActionForm from '../modules/workflow-action-form.vue';
-import ReviewList from '../modules/drawing-review/review-list.vue';
-import MaterialPanel from '../modules/material-panel.vue';
-import TaskDraftBanner from '../modules/task-draft-banner.vue';
+import DocumentAuditList from '../modules/document-audit-list.vue';
+import DocumentList from '../modules/document-list.vue';
 import WorkflowTimeline from '../modules/workflow-timeline.vue';
+import TaskDraftBanner from '../modules/task-draft-banner.vue';
 import { useDetailSchema } from './data';
 
 const route = useRoute();
@@ -35,37 +37,29 @@
 const projectId = ref(0);
 const project = ref<MesPdProjectApi.Project>({});
 const activeTab = ref('workflow');
-const workflowKey = ref(0);
 
-const isDraft = computed(
-  () => project.value.status === MesPdProjectStatusEnum.DRAFT,
+const isPendingPublish = computed(
+  () => project.value.status === MesPdProjectStatusEnum.PENDING_PUBLISH,
 );
-const isDesigning = computed(
-  () => project.value.status === MesPdProjectStatusEnum.DESIGNING,
+const isPendingUpload = computed(
+  () => project.value.status === MesPdProjectStatusEnum.PENDING_UPLOAD,
 );
-const isReviewing = computed(
-  () => project.value.status === MesPdProjectStatusEnum.REVIEWING,
+const isPendingAudit = computed(
+  () => project.value.status === MesPdProjectStatusEnum.PENDING_AUDIT,
 );
-const isApproved = computed(
-  () => project.value.status === MesPdProjectStatusEnum.APPROVED,
+const isPendingArchive = computed(
+  () => project.value.status === MesPdProjectStatusEnum.PENDING_ARCHIVE,
 );
 const isArchived = computed(
   () => project.value.status === MesPdProjectStatusEnum.ARCHIVED,
 );
 
 const isFormEditable = computed(
-  () =>
-    !isArchived.value &&
-    project.value.status !== MesPdProjectStatusEnum.CANCELLED &&
-    (isDraft.value || isDesigning.value),
+  () => isPendingPublish.value,
 );
 
 const materialFormType = computed<FormType>(() =>
-  isDesigning.value ? 'update' : 'detail',
-);
-
-const showReviewTab = computed(
-  () => isReviewing.value || isApproved.value || isArchived.value,
+  isPendingPublish.value || isPendingUpload.value || isPendingAudit.value ? 'update' : 'detail',
 );
 
 const [Descriptions] = useDescription({
@@ -79,25 +73,14 @@
   destroyOnClose: true,
 });
 
-const [PublishModal, publishModalApi] = useVbenModal({
-  connectedComponent: PublishForm,
-  destroyOnClose: true,
-});
-
-const [WorkflowActionModal, workflowActionModalApi] = useVbenModal({
-  connectedComponent: WorkflowActionForm,
-  destroyOnClose: true,
-});
-
 async function loadProjectDetail() {
   loading.value = true;
   try {
     project.value = await getPdProject(projectId.value);
-    workflowKey.value += 1;
-    if (isDesigning.value) {
+    if (isPendingUpload.value) {
       activeTab.value = 'material';
-    } else if (isReviewing.value) {
-      activeTab.value = 'review';
+    } else if (isPendingAudit.value) {
+      activeTab.value = 'audit';
     }
   } finally {
     loading.value = false;
@@ -113,12 +96,50 @@
   formModalApi.setData({ formType: 'update', id: projectId.value }).open();
 }
 
-function handlePublish() {
-  publishModalApi.setData({ id: projectId.value }).open();
+async function handlePublish() {
+  const hideLoading = message.loading({ content: '鍙戝竷涓��', duration: 0 });
+  try {
+    await publishPdProject(projectId.value);
+    message.success('浠诲姟宸插彂甯冿紝杩涘叆寰呬笂浼犵姸鎬�');
+    loadProjectDetail();
+  } finally {
+    hideLoading();
+  }
 }
 
-function handleWorkflowAction(action: 'approve' | 'archive' | 'submit-review') {
-  workflowActionModalApi.setData({ id: projectId.value, action }).open();
+async function handleUpload() {
+  const hideLoading = message.loading({ content: '鎻愪氦瀹℃牳涓��', duration: 0 });
+  try {
+    await uploadPdProject(projectId.value);
+    message.success('宸叉彁浜よ祫鏂欏鏍�');
+    tabs.closeCurrentTab();
+    router.back();
+  } finally {
+    hideLoading();
+  }
+}
+
+async function handleAudit() {
+  const hideLoading = message.loading({ content: '瀹℃牳涓��', duration: 0 });
+  try {
+    await auditPdProject(projectId.value);
+    message.success('瀹℃牳閫氳繃锛岃繘鍏ュ緟褰掓。鐘舵��');
+    tabs.closeCurrentTab();
+    router.back();
+  } finally {
+    hideLoading();
+  }
+}
+
+async function handleArchive() {
+  const hideLoading = message.loading({ content: '褰掓。涓��', duration: 0 });
+  try {
+    await archivePdProject(projectId.value);
+    message.success('宸插綊妗�');
+    loadProjectDetail();
+  } finally {
+    hideLoading();
+  }
 }
 
 onMounted(() => {
@@ -131,11 +152,9 @@
   <Page
     auto-content-height
     :loading="loading"
-    :title="project.name || '璁捐浠诲姟璇︽儏'"
+    :title="project.taskName || '璁捐浠诲姟璇︽儏'"
   >
     <FormModal @success="loadProjectDetail" />
-    <PublishModal @success="loadProjectDetail" />
-    <WorkflowActionModal @success="loadProjectDetail" />
 
     <template #extra>
       <TableAction
@@ -155,40 +174,40 @@
             onClick: handleEdit,
           },
           {
-            label: '鍙戝竷浠诲姟',
+            label: '鍙戝竷',
             type: 'primary',
             auth: ['mes:pd-project:update'],
-            ifShow: isDraft,
+            ifShow: isPendingPublish,
             onClick: handlePublish,
           },
           {
-            label: '鎻愪氦瀹℃牳',
-            type: 'default',
-            auth: ['mes:pd-project:submit-review'],
-            ifShow: isDesigning,
-            onClick: () => handleWorkflowAction('submit-review'),
+            label: '纭涓婁紶',
+            type: 'primary',
+            auth: ['mes:pd-project:update'],
+            ifShow: isPendingUpload,
+            onClick: handleUpload,
           },
           {
             label: '瀹℃牳閫氳繃',
             type: 'primary',
-            auth: ['mes:pd-drawing-review:review'],
-            ifShow: isReviewing,
-            onClick: () => handleWorkflowAction('approve'),
+            auth: ['mes:pd-project:audit'],
+            ifShow: isPendingAudit,
+            onClick: handleAudit,
           },
           {
             label: '褰掓。',
             type: 'default',
             auth: ['mes:pd-project:archive'],
-            ifShow: isApproved,
-            onClick: () => handleWorkflowAction('archive'),
+            ifShow: isPendingArchive,
+            onClick: handleArchive,
           },
         ]"
       />
     </template>
 
     <TaskDraftBanner
-      v-if="isDraft"
-      :designer-name="project.designerName"
+      v-if="isPendingPublish"
+      :designer-name="project.chiefDesignerNickname"
       :product-name="project.productName"
       :version="project.version"
       @edit="handleEdit"
@@ -202,21 +221,20 @@
     <Card class="mt-4 min-h-[60%]">
       <Tabs v-model:active-key="activeTab">
         <Tabs.TabPane key="workflow" tab="娴佺▼杩涘害" :force-render="true">
-          <WorkflowTimeline :key="workflowKey" :project-id="projectId" />
+          <WorkflowTimeline :status="project.status ?? 0" />
         </Tabs.TabPane>
-        <Tabs.TabPane key="material" tab="璁捐璧勬枡" :force-render="true">
-          <p v-if="isDraft" class="mb-3 text-sm text-amber-600">
+        <Tabs.TabPane v-if="!isPendingAudit" key="material" tab="璁捐璧勬枡" :force-render="true">
+          <p v-if="isPendingPublish" class="mb-3 text-sm text-amber-600">
             璇峰厛鍙戝竷浠诲姟鍚庡啀涓婁紶璁捐璧勬枡
           </p>
-          <MaterialPanel :form-type="materialFormType" :project-id="projectId" />
+          <DocumentList
+            :form-type="materialFormType"
+            :project-id="projectId"
+            :project-status="project.status"
+          />
         </Tabs.TabPane>
-        <Tabs.TabPane
-          v-if="showReviewTab"
-          key="review"
-          tab="璧勬枡瀹℃牳"
-          :force-render="true"
-        >
-          <ReviewList form-type="detail" :project-id="projectId" />
+        <Tabs.TabPane v-if="isPendingAudit" key="audit" tab="璧勬枡瀹℃牳" :force-render="true">
+          <DocumentAuditList :project-id="projectId" @success="loadProjectDetail" />
         </Tabs.TabPane>
       </Tabs>
     </Card>

--
Gitblit v1.9.3