feat(r2): 阶段3 页面数据源切换到服务端 API(失败降级本地缓存)

- designList:列表/批量删除走 API,新增生产中(processing)徽标与筛选 tab
- address:增删改查走 API,默认唯一性由服务端事务保证
- product:加入清单走 createDesign(服务端 DRAFT)
- diy:进入即创建清单条目;保存时 category 裁剪 {id,mask,tone}、
  designData 与服务端数据合并(保护 wordcloud 分组,WCD 红线)、
  贴纸经 persistDesignMedia 持久化后整包提交(状态→designing)
- stickerEdit:贴纸编辑合并后整包提交
- types:DesignDataV1.category 收窄为契约 §2 冻结形状 {id, mask, tone}
- 全部写入点:API 成功回写本地缓存(checkout 等未迁移页面不受影响)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-09-12 03:51:46 +08:00
co-authored by Claude
parent fa434f765f
commit e557dbcb89
6 changed files with 155 additions and 57 deletions
+15 -2
View File
@@ -4,7 +4,7 @@ import { useState, useEffect, useRef, useCallback } from 'react'
import './index.scss'
import { getProductById } from '../../../utils/productConfig'
import { getDesignList, setDesignList, updateDesign, type DesignItem, type StickerItem } from '../../../utils/store'
import { sketchImage } from '../../../utils/api'
import { sketchImage, updateDesign as updateDesignApi } from '../../../utils/api'
import { useThemeContext } from '../../../context/ThemeContext'
import { useSafeArea } from '../../../hooks/useSafeArea'
import { useStatusBar } from '../../../hooks/useStatusBar'
@@ -232,7 +232,20 @@ export default function StickerEditPage() {
src: newSrc,
edits: { brightness, hue, contrast }
}
updateDesign(designId, { designData: { ...dList[dIdx].designData, stickers } })
const d = dList[dIdx]
// WCD 红线:基于服务端已有 designData 合并(保留 wordcloud 分组),只覆盖 stickers
const designData = { ...d.designData, stickers }
updateDesign(designId, { designData }) // 本地缓存同步
// 服务端保存(items 全量替换,必须带全 4 个基本字段);失败暂存本地
updateDesignApi(designId, {
item: {
productId: d.productId,
productName: d.productName,
unitPrice: d.unitPrice,
count: d.count,
designData
}
}).catch(() => Taro.showToast({ title: '网络不可用,已暂存到本地', icon: 'none' }))
Taro.showToast({ title: '保存成功', icon: 'success' })
Taro.navigateBack()
},