| | |
| | | import { Button, message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { toAccessibleFileUrl } from '#/utils'; |
| | | import { |
| | | createActivity, |
| | | getActivity, |
| | |
| | | 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) { |
| | |
| | | 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(); |
| | | } |
| | |
| | | } |
| | | 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(); |