# 2026-07-06 工作日志

## 修复收藏列表页面空白问题
- **文件**: `src/api/shop/shopGoodsFavorite/index.ts`
- **问题**: `listShopGoodsFavorite` 和 `pageShopGoodsFavorite` 使用 `request.get`（默认 `returnRaw: true`），返回完整 `{ code, message, data }` 对象而非业务数据，页面拿到对象当数组用导致 `list.length` 为 `undefined`，始终显示空状态
- **修复**: 改为与同文件 `addShopGoodsFavorite` 等函数一致的模式 — 接收 `ApiResult<T>`，检查 `res.code === 0` 后返回 `res.data`
- **注意**: `src/pages/favorite-list.tsx` 是 `src/pages/user/favorite-list/index.tsx` 的重复文件，内容完全一样

## 修复领券中心页面 SQL 报错
- **错误**: `Unknown column 'venue_type' in 'field list'`
- **根因**: 后端运行中的 `ShopCoupon` 实体类包含 `venue_type`、`venue_id`、`use_count`、`use_duration` 字段，但数据库表 `shop_coupon` 缺少这 4 列
- **后端项目路径**: `/Users/gxwebsoft/JAVA/guilixu-java`（实际运行项目）
- **修复内容**:
  1. 更新后端实体类 `ShopCoupon.java`，补充 `receiveTarget`、`receiveUserIds`、`venueType`、`venueId`、`useCount`、`useDuration` 字段（源码之前缺失，与运行时版本对齐）
  2. 将 `enabled` 字段从 `Boolean` 改为 `Integer`，解决 Jackson 反序列化 `"1"` 失败
  3. 修正 `ShopCouponController.page()` 中 `expire_type` 查询条件：`0/1` 改为 `10/20`（与数据库实际枚举值一致）
  4. 生成数据库迁移 SQL：`src/main/resources/sql/shop_coupon_add_venue_fields.sql`
- **需执行**: 重新编译部署后端

## 补充商品数据解决微信审核驳回

### 背景
微信小程序审核被驳回：「积分商城」页面无具体运营内容。根本原因是 tenant_id=10611（鑫龙家电）下没有任何商品分类和商品数据。

### 数据创建
通过 Python + pymysql 直连 MySQL 数据库（47.119.165.234:13308/modules），为 tenant 10611 创建：

- **5 个一级分类**：大家电、厨房电器、生活电器、个护健康、智能设备
- **15 个二级分类**：冰箱、洗衣机、空调、电视、电饭煲、微波炉、抽油烟机、吸尘器、电风扇、加湿器、电动牙刷、理发器、智能音箱、智能门锁、智能手表
- **34 个商品**（全部 status=0 上架）：
  - 每个分类 2-3 个商品
  - 包含真实品牌名（美的、海尔、格力、小米、华为等）、型号、规格
  - 三档价格：price（到手价）、sale_price（市场价划线）、dealer_price（VIP 价）
  - 12 个商品标记为推荐（recommend=1）
  - 图片复用 oss.wsdns.cn 已有图片 URL
  - 商品详情为 HTML 格式，含商品描述和图片
  - 轮播图字段（files）为 JSON 数组格式
- 分类 count 字段已同步更新

### 注意事项
- 图片是复用其他租户的商品图片，后续可替换为真实商品图
- 商品数据为模拟数据，用于通过审核，后续可在后台管理系统中编辑替换

## 修复门店商品管理页 Tab 标签不一致
- **文件**: `src/pages/store/goods/index.tsx`
- **问题**: 商品状态 status=0 在后端定义是「已上架」，但页面 Tab 标签写的是「出售中」，与商品状态标签文字不一致
- **修复**: Tab「出售中」→「已上架」，让 Tab 标签与商品状态文字保持一致
- **附带修复**: `src/api/shop/shopGoods/model/index.ts` 中 `ShopGoodsParam.status` 注释从「0上架 1下架」改为「0上架 1待上架 2待审核 3审核不通过」

## 门店商品管理页编辑弹窗补充会员价字段
- **文件**: `src/pages/store/goods/index.tsx`
- **问题**: 编辑弹窗只有到手价和市场价，缺少会员价（dealerPrice）输入框
- **修复**: 
  1. `editForm` state 新增 `dealerPrice: ''`
  2. `openEditModal` 中填充 `dealerPrice: goods.dealerPrice || ''`
  3. 表单 UI 在市场价和库存之间新增会员价输入框
  4. `submitEdit` 提交时携带 `dealerPrice`

## 修复门店商品管理页选择分类需点击两次才生效
- **文件**: `src/pages/store/goods/index.tsx`
- **问题**: `handleSelectCategory` 中先 `setSelectedCategory` 再立即调用 `loadGoods`，但 `loadGoods` 通过闭包读取到的 `selectedCategory` 仍是旧值，导致第一次点击实际用的是上次选中的分类
- **修复**: `loadGoods` 增加可选参数 `categoryId`，`handleSelectCategory` 选择分类后直接把新的 `cat?.categoryId` 传入 `loadGoods`，避免闭包取到旧状态

## 门店商品管理页添加图片上传/更换功能
- **文件**: `src/pages/store/goods/index.tsx`
- **问题**: 编辑弹窗只能修改价格库存等字段，缺少商品图片上传和更换功能
- **修复**:
  1. 引入 `uploadFile` from `@/api/system/file`
  2. 新增 `uploadingImage` 状态追踪上传进度
  3. 新增 `handleUploadImage` 函数：调用 `uploadFile()` 上传图片，获取返回的 `path` 更新 `editGoods.image`
  4. 编辑弹窗商品信息区：图片改为可点击触发上传，蒙层显示「更换」/「上传中...」，无图时显示照相机占位符
  5. `submitEdit` 提交时携带 `editGoods.image` 保存新图片

## 门店商品管理页添加轮播图上传/删除功能
- **文件**: `src/pages/store/goods/index.tsx`
- **问题**: 编辑弹窗缺少轮播图（`files` 字段）管理能力；实际 `files` 为对象数组 `[{uid,url,status}]`，首次实现只按字符串数组解析导致图片无法显示
- **修复**:
  1. `editForm` 新增 `files` 状态，元素为 `{ uid?, url, status? }` 对象
  2. `openEditModal` 解析 `goods.files`：兼容对象数组 `[{uid,url,status}]`、字符串数组 `["url"]`、逗号分隔字符串三种格式
  3. 新增 `handleAddBanner` 上传新轮播图（生成 `{ uid: file.id, url, status: 'done' }`），`handleRemoveBanner` 删除指定位置轮播图
  4. 编辑弹窗新增轮播图区域：显示现有图片+删除按钮，底部「上传」入口
  5. `submitEdit` 提交时将 `files` 数组 `JSON.stringify` 后保存

## 新增图片压缩工具函数
- **文件**: `src/utils/image.ts`（新建）
- **函数**: `getCompressedImageUrl(url, options?)` — 给 OSS 图片 URL 拼接阿里云图片处理参数
- **默认参数**: `width=750, quality=90, enabled=true`
- **安全处理**: 空 URL 返回空串、已含 `x-oss-process` 不重复拼接、根据已有 query 参数自动选 `?`/`&` 分隔符
- **使用约定**: 列表/卡片等缩略图场景使用此函数；预览大图（`Taro.previewImage`）直接用原 URL，不调用此函数

## 全项目应用 getCompressedImageUrl
- **修改范围**: 35 个文件（4 个组件 + 31 个页面文件）
- **组件**: LazyImage、ProductCard、OrderCard、SkuSelector — 组件内部自动压缩
- **页面**: shop/cart/checkout/category/index/seckill-list/group-buy-list/group-buy-detail, order/detail/evaluate/evaluate-detail/after-sale-*, order-list, user/favorite-list/history-list/benefit-*, points/*, store/goods/orders, index/index/article-list, activity/event/*, group-buy-list/detail, seckill-list/detail, history-list, favorite-list
- **跳过（不压缩）**: 头像(user/user, user/member, user/profile, user/index, user/team, store/center)、二维码(share, user/promotion)、商品详情大图/轮播(shop/product-detail, shop/seckill-detail)、所有 Taro.previewImage 调用
