From f10cf167372f2d8c4c0e14f42f361d7ab96d8347 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 03 七月 2026 13:59:00 +0800
Subject: [PATCH] Merge branch 'dev_pro2.0' of http://114.132.189.42:9002/r/mom-pro2-before into dev_pro2.0

---
 src/views/mes/pd/project/modules/workflow-action-form.vue |  126 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 126 insertions(+), 0 deletions(-)

diff --git a/src/views/mes/pd/project/modules/workflow-action-form.vue b/src/views/mes/pd/project/modules/workflow-action-form.vue
new file mode 100644
index 0000000..1a62efa
--- /dev/null
+++ b/src/views/mes/pd/project/modules/workflow-action-form.vue
@@ -0,0 +1,126 @@
+<script lang="ts" setup>
+import type { WorkflowActionType } from '../data';
+import type { MesPdProjectApi } from '#/api/mes/pd/project';
+
+import { computed, ref } from 'vue';
+
+import { useVbenModal } from '#/packages/effects/common-ui/src';
+import { formatDate } from '#/packages/utils/src';
+
+import { Alert, Descriptions, message } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import {
+  approvePdProject,
+  archivePdProject,
+  getPdProject,
+  submitPdProjectReview,
+  updatePdProject,
+} from '#/api/mes/pd/project';
+
+import { useWorkflowActionFormSchema, WORKFLOW_ACTION_CONFIG } from '../data';
+
+const emit = defineEmits(['success']);
+
+const project = ref<MesPdProjectApi.Project>();
+const actionType = ref<WorkflowActionType>('submit-review');
+
+const actionConfig = computed(() => WORKFLOW_ACTION_CONFIG[actionType.value]);
+
+const [Form, formApi] = useVbenForm({
+  commonConfig: {
+    componentProps: { class: 'w-full' },
+    labelWidth: 100,
+  },
+  layout: 'horizontal',
+  schema: [],
+  showDefaultActions: false,
+});
+
+const [Modal, modalApi] = useVbenModal({
+  async onConfirm() {
+    if (!project.value?.id) {
+      return;
+    }
+    modalApi.lock();
+    try {
+      const { actionRemark } = await formApi.getValues();
+      const config = actionConfig.value;
+      if (actionRemark) {
+        const mergedRemark = [project.value.remark, `${config.remarkTag}${actionRemark}`]
+          .filter(Boolean)
+          .join('\n');
+        await updatePdProject({ ...project.value, remark: mergedRemark });
+      }
+      const projectId = project.value.id;
+      switch (actionType.value) {
+        case 'approve': {
+          await approvePdProject(projectId);
+          break;
+        }
+        case 'archive': {
+          await archivePdProject(projectId);
+          break;
+        }
+        case 'submit-review': {
+          await submitPdProjectReview(projectId);
+          break;
+        }
+      }
+      emit('success');
+      message.success(config.successMessage);
+      await modalApi.close();
+    } finally {
+      modalApi.unlock();
+    }
+  },
+  async onOpenChange(isOpen: boolean) {
+    if (!isOpen) {
+      project.value = undefined;
+      await formApi.resetForm();
+      return;
+    }
+    const data = modalApi.getData<{ action: WorkflowActionType; id: number }>();
+    actionType.value = data.action;
+    formApi.setState({ schema: useWorkflowActionFormSchema(data.action) });
+    modalApi.setState({ title: WORKFLOW_ACTION_CONFIG[data.action].title });
+    modalApi.lock();
+    try {
+      project.value = await getPdProject(data.id);
+    } finally {
+      modalApi.unlock();
+    }
+  },
+});
+</script>
+
+<template>
+  <Modal class="w-[640px]">
+    <Alert
+      class="mx-4 mb-4"
+      :message="actionConfig.alertMessage"
+      :description="actionConfig.alertDescription"
+      show-icon
+      :type="actionConfig.alertType"
+    />
+    <Descriptions
+      v-if="project"
+      bordered
+      class="mx-4 mb-4"
+      :column="2"
+      size="small"
+    >
+      <Descriptions.Item label="浠诲姟缂栫爜">{{ project.code }}</Descriptions.Item>
+      <Descriptions.Item label="浠诲姟鍚嶇О">{{ project.name }}</Descriptions.Item>
+      <Descriptions.Item label="浜у搧缂栫爜">{{ project.productCode }}</Descriptions.Item>
+      <Descriptions.Item label="浜у搧鍚嶇О">{{ project.productName }}</Descriptions.Item>
+      <Descriptions.Item label="璁捐鐗堟湰">{{ project.version }}</Descriptions.Item>
+      <Descriptions.Item label="涓昏璁″笀">{{ project.designerName || '-' }}</Descriptions.Item>
+      <Descriptions.Item label="瀹℃牳浜�">{{ project.reviewerName || '-' }}</Descriptions.Item>
+      <Descriptions.Item label="璁″垝瀹屾垚">
+        {{ project.planEndDate ? formatDate(project.planEndDate) : '-' }}
+      </Descriptions.Item>
+    </Descriptions>
+    <Form class="mx-4" />
+  </Modal>
+</template>

--
Gitblit v1.9.3