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 | 142 +++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 137 insertions(+), 5 deletions(-)
diff --git a/src/views/wxcp/activity/modules/form.vue b/src/views/wxcp/activity/modules/form.vue
index 05d379b..299f5df 100644
--- a/src/views/wxcp/activity/modules/form.vue
+++ b/src/views/wxcp/activity/modules/form.vue
@@ -9,13 +9,16 @@
import { Button, message } from 'ant-design-vue';
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' });
@@ -24,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(() => {
@@ -42,7 +62,73 @@
schema: [],
showDefaultActions: false,
wrapperClass: 'grid-cols-2',
+ handleValuesChange: (values) => {
+ activityType.value =
+ (values.activityType as number) ?? ACTIVITY_TYPE.FORM;
+ },
});
+
+/**
+ * 鎶婇檮浠跺垪琛ㄨ浆鎴愪笂浼犵粍浠惰兘璇嗗埆鐨勬枃浠跺璞�
+ *
+ * 鍥炴樉瀵硅薄蹇呴』甯� response锛氱粍浠惰浜� resultField 鍚庡彧璁� item.response锛�
+ * 涓嶅甫鐨勮瘽銆岃繘缂栬緫椤典笉鍔ㄥ浘鐩存帴淇濆瓨銆嶄細璧� URL 鍒嗘敮 鈫� NaN 鈫� [] 鈫� 鍥捐娓呯┖
+ */
+function attachmentsToUploadFiles(
+ list: WxCpActivityApi.SignupAttachment[] | undefined,
+) {
+ return (list ?? []).map((item) => {
+ const name = item.name || item.originalFilename || '';
+ const url = toAccessibleFileUrl(item.url || item.previewURL);
+ return {
+ uid: String(item.id),
+ name,
+ url,
+ status: 'done',
+ id: item.id,
+ 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;
+}
+
+/**
+ * 鎶婁笂浼犵粍浠剁殑鍊艰鏁存垚 blobId 鏁扮粍
+ *
+ * ImageUpload 鍦� maxNumber=1 鏃惰繑鍥炵殑鏄崟涓�硷紙鑰屼笉鏄暟缁勶級锛�
+ * 鍚庣绛惧悕鏄� List<Long>锛岃繖閲岀粺涓�鍖呮垚鏁扮粍鍐嶆彁浜ゃ��
+ */
+function normalizeBlobIds(value: unknown): number[] {
+ const list = Array.isArray(value)
+ ? value
+ : value === '' || value === null || value === undefined
+ ? []
+ : [value];
+ return list
+ .map((item) =>
+ item && typeof item === 'object' && 'id' in item
+ ? Number((item as { id: unknown }).id)
+ : Number(item),
+ )
+ .filter((blobId) => Number.isFinite(blobId));
+}
const [Modal, modalApi] = useVbenModal({
async onOpenChange(isOpen: boolean) {
@@ -59,12 +145,26 @@
modalApi.lock();
try {
const detail = await getActivity(data.id);
- await formApi.setValues(detail as unknown as Record<string, unknown>);
+ 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,
+ );
}
},
});
@@ -76,12 +176,22 @@
}
submitting.value = true;
try {
- const data = (await formApi.getValues()) as WxCpActivityApi.Activity;
+ 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({ ...data, id: id.value });
+ await updateActivity({ ...payload, id: id.value });
message.success('淇敼鎴愬姛');
} else {
- await createActivity(data);
+ await createActivity(payload);
message.success('鍒涘缓鎴愬姛锛岃鍦ㄥ垪琛ㄤ腑鍙戝竷鍚庡啀鎺ㄩ��');
}
await modalApi.close();
@@ -98,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