liu
2026-09-30 40aa088ad24aa90e59dd15280a9b96e48265a09d
fix(wxcp): 修复活动封面编辑后丢失

ImageUpload 在 maxNumber=1 时 getValue() 只返回 URL 字符串,而 form-ui 的
valueKey 转换要求「值是带 status 的对象数组」,字符串会被跳过,于是 valueKey:'id'
形同虚设。normalizeBlobIds 拿到 URL 后 Number() 得到 NaN、被 filter 掉,
最终提交 blobIds: [] —— 后端把空数组理解为「明确清空封面」,所以编辑活动
选了图反而把封面清掉了。

- data.ts:schema 加 resultField(组件里它是布尔开关,真值时改返回 item.response,
即上传响应对象 {url,name,id}),这样才拿得到真正的 blobId
- form.vue:回显对象补 response:{id,name,url},否则「进编辑页不动图直接保存」
仍会走 URL 分支 → NaN → [] → 封面被清空

Co-Authored-By: Claude <noreply@anthropic.com>
已修改2个文件
27 ■■■■■ 文件已修改
src/views/wxcp/activity/data.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wxcp/activity/modules/form.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wxcp/activity/data.ts
@@ -91,6 +91,12 @@
      component: 'ImageUpload',
      componentProps: {
        valueKey: 'id',
        // 关键:ImageUpload 在 maxNumber=1 时 getValue() 只吐 URL 字符串,
        // form-ui 的 valueKey 转换又要求「值是带 status 的对象数组」,字符串会被跳过,
        // 结果 blobIds 被 normalizeBlobIds 转成 NaN → [],后端把空数组理解为「清空封面」。
        // resultField 非空时组件改返回 item.response(上传响应对象 {url,name,id}),
        // 才拿得到真正的 blobId。
        resultField: 'id',
        maxNumber: 1,
        multiple: false,
        disabled: readonly,
src/views/wxcp/activity/modules/form.vue
@@ -55,13 +55,20 @@
  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,
  }));
  form.blobIds = (activity.attachmentList ?? []).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:组件设了 resultField 后只认 item.response,
      // 不带的话「进编辑页不动图直接保存」会走 URL 分支 → NaN → [] → 封面被清空
      response: { id: item.id, name, url },
    };
  });
  return form;
}