From fe2d6627b8f1002af7a31b08f6f43bec034d04ee Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期三, 21 十月 2026 18:29:07 +0800
Subject: [PATCH] feat: 完善课题、会员、财务、企微页面并新增资产/用车/采购

---
 src/views/research/application/modules/form.vue |   38 ++++++++++++++++++++++++++++++++++----
 1 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/src/views/research/application/modules/form.vue b/src/views/research/application/modules/form.vue
index a7e2a95..5b02f26 100644
--- a/src/views/research/application/modules/form.vue
+++ b/src/views/research/application/modules/form.vue
@@ -21,7 +21,8 @@
   getPublishedGuidelineList,
 } from '#/api/research/guideline';
 
-import { useFormSchema } from '../data';
+import { toSubmitMembers, useFormSchema } from '../data';
+import MemberTable from './member-table.vue';
 
 defineOptions({ name: 'ResearchApplicationForm' });
 
@@ -30,6 +31,9 @@
 const formType = ref<FormType>('create');
 /** 渚涖�屾墍灞炶棰樻寚鍗椼�嶄笅鎷変笌绫诲埆甯﹀嚭浣跨敤 */
 const guidelines = ref<ResearchGuidelineApi.Guideline[]>([]);
+/** 鎴愬憳琛ㄦ牸鍥炴樉鏁版嵁婧愶細鍙湪鎵撳紑寮圭獥鏃惰祴鍊硷紝澧炲垹鏀瑰彧閫氳繃 emit 鍗曞悜娴佸埌琛ㄥ崟鍊� */
+const initialMembers = ref<ResearchApplicationApi.ApplicationMember[]>([]);
+const memberTableRef = ref<InstanceType<typeof MemberTable>>();
 
 const getTitle = computed(() => {
   if (formType.value === 'create') {
@@ -67,7 +71,7 @@
     jobTitle: values.jobTitle,
     contactPhone: values.contactPhone,
     contactEmail: values.contactEmail,
-    teamMembers: values.teamMembers,
+    members: toSubmitMembers(values.members),
     budgetAmount: values.budgetAmount,
     planContent: values.planContent,
     remark: values.remark,
@@ -81,6 +85,12 @@
   async onConfirm() {
     const { valid } = await formApi.validate();
     if (!valid) {
+      return;
+    }
+    try {
+      memberTableRef.value?.validate();
+    } catch (error) {
+      message.error((error as Error).message || '璇鹃缁勬垚鍛樻牎楠屽け璐�');
       return;
     }
     modalApi.lock();
@@ -112,6 +122,8 @@
           schema: useFormSchema(formType.value, formApi, guidelines.value),
         });
         formApi.setDisabled(formType.value === 'detail');
+        // 鎴愬憳瀛愯〃鍥炴樉锛氫繚鐣欏師 id 渚涜〃鏍艰 key 浣跨敤锛屾彁浜ゆ椂鍐嶅墺绂�
+        initialMembers.value = application.members ?? [];
         // 宸叉湁闄勪欢杞垚涓婁紶缁勪欢鍙瘑鍒殑鏂囦欢瀵硅薄锛屾彁浜ゆ椂鎸� valueKey=id 鎻愬彇涓� blobId
         const blobIds = (application.attachmentList ?? []).map((item) => ({
           uid: String(item.id),
@@ -120,13 +132,21 @@
           status: 'done',
           id: item.id,
         }));
-        await formApi.setValues({ ...application, blobIds }, false);
+        await formApi.setValues(
+          {
+            ...application,
+            members: toSubmitMembers(application.members),
+            blobIds,
+          },
+          false,
+        );
       } else {
         guidelines.value = await getPublishedGuidelineList();
         formApi.setState({
           schema: useFormSchema(formType.value, formApi, guidelines.value),
         });
         formApi.setDisabled(false);
+        initialMembers.value = [];
         await formApi.resetForm();
       }
     } finally {
@@ -159,6 +179,16 @@
     :close-on-click-modal="false"
     :show-confirm-button="formType !== 'detail'"
   >
-    <Form class="mx-3" />
+    <Form class="mx-3">
+      <template #members>
+        <MemberTable
+          ref="memberTableRef"
+          :members="initialMembers"
+          :disabled="formType === 'detail'"
+          class="w-full"
+          @update:members="(members) => formApi.setValues({ members }, false)"
+        />
+      </template>
+    </Form>
   </Modal>
 </template>

--
Gitblit v1.9.3