From a241b66efcc41e973290a6722fb7a4d79b833ea1 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 13 十月 2026 09:54:32 +0800
Subject: [PATCH] feat(bi): 为图表配置接口添加名称字段
---
src/views/mes/pd/project/detail/index.vue | 90 +++++++++++++++++++++++++++++++++++----------
1 files changed, 70 insertions(+), 20 deletions(-)
diff --git a/src/views/mes/pd/project/detail/index.vue b/src/views/mes/pd/project/detail/index.vue
index be5f1f1..ac089ae 100644
--- a/src/views/mes/pd/project/detail/index.vue
+++ b/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 {
+ // 瀹℃壒涓�/寰呭綊妗�/宸插綊妗g瓑鐘舵�侊細閲嶇疆鍒般�岃璁¤祫鏂欍�嶉〉绛撅紝
+ // 閬垮厤 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 ? '姝e湪鎻愪氦鐢熸晥...' : '鑾峰彇瀹℃壒娴佺▼...', 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>
--
Gitblit v1.9.3