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/wxcp/activity/modules/form.vue |  101 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 90 insertions(+), 11 deletions(-)

diff --git a/src/views/wxcp/activity/modules/form.vue b/src/views/wxcp/activity/modules/form.vue
index 0407446..299f5df 100644
--- a/src/views/wxcp/activity/modules/form.vue
+++ b/src/views/wxcp/activity/modules/form.vue
@@ -11,12 +11,14 @@
 import { useVbenForm } from '#/adapter/form';
 import { toAccessibleFileUrl } from '#/utils';
 import {
+  ACTIVITY_TYPE,
   createActivity,
   getActivity,
   updateActivity,
 } from '#/api/wxcp/activity';
 
-import { useActivityFormSchema } from '../data';
+import { FIELD_TYPE_OPTIONS, useActivityFormSchema } from '../data';
+import FieldEditor from './field-editor.vue';
 
 defineOptions({ name: 'WxCpActivityForm' });
 
@@ -25,6 +27,23 @@
 const formType = ref<ActivityFormType>('create');
 const id = ref<number>();
 const submitting = ref(false);
+
+/** 褰撳墠娲诲姩妯℃澘绫诲瀷锛岀敤浜庢帶鍒堕噰闆嗗瓧娈电紪杈戝櫒鐨勬樉闅� */
+const activityType = ref<number>(ACTIVITY_TYPE.FORM);
+/** 鏁版嵁閲囬泦妯℃澘鐨勮嚜瀹氫箟瀛楁锛堣〃鍗曢」涔嬪鍗曠嫭缁存姢锛� */
+const fields = ref<WxCpActivityApi.Field[]>([]);
+
+const showFieldEditor = computed(
+  () => activityType.value === ACTIVITY_TYPE.FORM && formType.value !== 'detail',
+);
+
+function fieldTypeLabel(type?: string) {
+  return (
+    FIELD_TYPE_OPTIONS.find((item) => item.value === type)?.label ??
+    type ??
+    '-'
+  );
+}
 
 const isEdit = computed(() => formType.value !== 'detail');
 const title = computed(() => {
@@ -43,19 +62,22 @@
   schema: [],
   showDefaultActions: false,
   wrapperClass: 'grid-cols-2',
+  handleValuesChange: (values) => {
+    activityType.value =
+      (values.activityType as number) ?? ACTIVITY_TYPE.FORM;
+  },
 });
 
 /**
- * 鎶婃椿鍔ㄨ鎯呮槧灏勬垚琛ㄥ崟鍊�
+ * 鎶婇檮浠跺垪琛ㄨ浆鎴愪笂浼犵粍浠惰兘璇嗗埆鐨勬枃浠跺璞�
  *
- * 灏侀潰鍦ㄥ悗绔笉钀戒笟鍔¤〃瀛楁锛岃�屾槸瀛樺湪闄勪欢涓棿琛ㄩ噷锛�
- * 鍥炴樉鏃惰鎶� attachmentList 杞垚涓婁紶缁勪欢鑳借瘑鍒殑鏂囦欢瀵硅薄銆�
+ * 鍥炴樉瀵硅薄蹇呴』甯� response锛氱粍浠惰浜� resultField 鍚庡彧璁� item.response锛�
+ * 涓嶅甫鐨勮瘽銆岃繘缂栬緫椤典笉鍔ㄥ浘鐩存帴淇濆瓨銆嶄細璧� URL 鍒嗘敮 鈫� NaN 鈫� [] 鈫� 鍥捐娓呯┖
  */
-function activityToForm(
-  activity: WxCpActivityApi.Activity,
-): Record<string, unknown> {
-  const form: Record<string, unknown> = { ...activity };
-  form.blobIds = (activity.attachmentList ?? []).map((item) => {
+function attachmentsToUploadFiles(
+  list: WxCpActivityApi.SignupAttachment[] | undefined,
+) {
+  return (list ?? []).map((item) => {
     const name = item.name || item.originalFilename || '';
     const url = toAccessibleFileUrl(item.url || item.previewURL);
     return {
@@ -64,11 +86,26 @@
       url,
       status: 'done',
       id: item.id,
-      // 鍥炴樉瀵硅薄涔熷繀椤诲甫 response锛氱粍浠惰浜� resultField 鍚庡彧璁� item.response锛�
-      // 涓嶅甫鐨勮瘽銆岃繘缂栬緫椤典笉鍔ㄥ浘鐩存帴淇濆瓨銆嶄細璧� URL 鍒嗘敮 鈫� NaN 鈫� [] 鈫� 灏侀潰琚竻绌�
       response: { id: item.id, name, url },
     };
   });
+}
+
+/**
+ * 鎶婃椿鍔ㄨ鎯呮槧灏勬垚琛ㄥ崟鍊�
+ *
+ * 灏侀潰涓庤鎯呭浘鐗囧湪鍚庣閮戒笉钀戒笟鍔¤〃瀛楁锛岃�屾槸瀛樺湪闄勪欢涓棿琛ㄩ噷锛堜袱濂� recordType锛夛紝
+ * 鍥炴樉鏃跺垎鍒妸 attachmentList / detailAttachmentList 杞垚涓婁紶缁勪欢鐨勬枃浠跺璞°��
+ */
+function activityToForm(
+  activity: WxCpActivityApi.Activity,
+): Record<string, unknown> {
+  const form: Record<string, unknown> = { ...activity };
+  form.blobIds = attachmentsToUploadFiles(activity.attachmentList);
+  form.detailBlobIds = attachmentsToUploadFiles(activity.detailAttachmentList);
+  // 鍥剧墖閫氱煡 / 闄勪欢閫氱煡鐨勭礌鏉愯蛋鍚勮嚜鐨勯檮浠跺叧绯伙紝鍥炴樉鏃跺悓鏍疯浆鎴愪笂浼犵粍浠跺璞�
+  form.imageBlobIds = attachmentsToUploadFiles(activity.imageAttachmentList);
+  form.fileBlobIds = attachmentsToUploadFiles(activity.fileAttachmentList);
   return form;
 }
 
@@ -108,12 +145,26 @@
       modalApi.lock();
       try {
         const detail = await getActivity(data.id);
+        activityType.value = detail.activityType ?? ACTIVITY_TYPE.FORM;
+        fields.value = (detail.fieldList ?? []).map((item) => ({ ...item }));
         await formApi.setValues(activityToForm(detail));
       } finally {
         modalApi.unlock();
       }
     } else {
       await formApi.resetForm();
+      activityType.value = ACTIVITY_TYPE.FORM;
+      fields.value = [];
+      // 榛樿缁欍�屾暟鎹噰闆�/璇勪环銆嶏紝涓庢敼閫犲墠鐨勬姤鍚嶆椿鍔ㄤ竴鑷�
+      await formApi.setValues(
+        {
+          activityType: ACTIVITY_TYPE.FORM,
+          ratingEnabled: false,
+          ratingMax: 5,
+          signupLimit: 0,
+        },
+        false,
+      );
     }
   },
 });
@@ -126,9 +177,15 @@
   submitting.value = true;
   try {
     const data = (await formApi.getValues()) as Record<string, unknown>;
+    const type = data.activityType ?? ACTIVITY_TYPE.FORM;
     const payload = {
       ...data,
       blobIds: normalizeBlobIds(data.blobIds),
+      detailBlobIds: normalizeBlobIds(data.detailBlobIds),
+      imageBlobIds: normalizeBlobIds(data.imageBlobIds),
+      fileBlobIds: normalizeBlobIds(data.fileBlobIds),
+      // 鍙湁鏁版嵁閲囬泦妯℃澘鎻愪氦瀛楁瀹氫箟锛涘叾瀹冩ā鏉夸笉浼狅紝閬垮厤璇竻绌�
+      fieldList: type === ACTIVITY_TYPE.FORM ? fields.value : undefined,
     } as WxCpActivityApi.Activity;
     if (id.value) {
       await updateActivity({ ...payload, id: id.value });
@@ -151,6 +208,28 @@
   <Modal :title="title" class="w-3/5">
     <Form class="mx-4" />
 
+    <div v-if="showFieldEditor" class="mx-4 mt-2">
+      <FieldEditor v-model="fields" />
+    </div>
+    <div
+      v-else-if="
+        formType === 'detail' &&
+        activityType === ACTIVITY_TYPE.FORM &&
+        fields.length
+      "
+      class="mx-4 mt-2"
+    >
+      <div class="mb-2 text-sm font-medium">閲囬泦瀛楁</div>
+      <div
+        v-for="(item, index) in fields"
+        :key="index"
+        class="text-sm text-gray-600 dark:text-gray-400"
+      >
+        路 {{ item.fieldLabel }}锛坽{ fieldTypeLabel(item.fieldType) }}锛�
+        <span v-if="item.required" class="text-red-500">*</span>
+      </div>
+    </div>
+
     <template #footer>
       <div class="flex justify-end gap-2">
         <Button @click="modalApi.close()">鍙栨秷</Button>

--
Gitblit v1.9.3