liu
2026-09-30 71beff1699701e18c2503791c7ba1437c89966aa
src/views/wxcp/activity/modules/form.vue
@@ -9,6 +9,7 @@
import { Button, message } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import { toAccessibleFileUrl } from '#/utils';
import {
  createActivity,
  getActivity,
@@ -44,6 +45,47 @@
  wrapperClass: 'grid-cols-2',
});
/**
 * 把活动详情映射成表单值
 *
 * 封面在后端不落业务表字段,而是存在附件中间表里,
 * 回显时要把 attachmentList 转成上传组件能识别的文件对象。
 */
function activityToForm(
  activity: WxCpActivityApi.Activity,
): Record<string, unknown> {
  const form: Record<string, unknown> = { ...activity };
  form.blobIds = (activity.attachmentList ?? []).map((item) => ({
    uid: String(item.id),
    name: item.name || item.originalFilename || '',
    url: toAccessibleFileUrl(item.url || item.previewURL),
    status: 'done',
    id: item.id,
  }));
  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) {
    if (!isOpen) {
@@ -59,7 +101,7 @@
      modalApi.lock();
      try {
        const detail = await getActivity(data.id);
        await formApi.setValues(detail as unknown as Record<string, unknown>);
        await formApi.setValues(activityToForm(detail));
      } finally {
        modalApi.unlock();
      }
@@ -76,12 +118,16 @@
  }
  submitting.value = true;
  try {
    const data = (await formApi.getValues()) as WxCpActivityApi.Activity;
    const data = (await formApi.getValues()) as Record<string, unknown>;
    const payload = {
      ...data,
      blobIds: normalizeBlobIds(data.blobIds),
    } 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();