| | |
| | | |
| | | import { |
| | | archivePdProject, |
| | | auditPdProject, |
| | | getPdProject, |
| | | getPdProjectApproveProcessList, |
| | | publishPdProject, |
| | | uploadPdProject, |
| | | } from '#/api/mes/pd/project'; |
| | |
| | | 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'; |
| | |
| | | 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, |
| | | ); |
| | |
| | | ); |
| | | |
| | | const materialFormType = computed<FormType>(() => |
| | | isPendingPublish.value || isPendingUpload.value || isPendingAudit.value ? 'update' : 'detail', |
| | | isPendingPublish.value || isPendingUpload.value ? 'update' : 'detail', |
| | | ); |
| | | |
| | | const [Descriptions] = useDescription({ |
| | |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | 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() { |
| | |
| | | :title="project.taskName || '设计任务详情'" |
| | | > |
| | | <FormModal @success="loadProjectDetail" /> |
| | | <ProcessModal @success="handleSubmitSuccess" /> |
| | | |
| | | <template #extra> |
| | | <TableAction |
| | |
| | | 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, |
| | | }, |
| | |
| | | <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> |
| | |
| | | :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> |