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