时间:2026-10-17 范围:商品新增/编辑(含多规格)、上下架、删除、按 ID 取列表、商品基础信息、规格列表、图片/视频上传
| 接口 | 方法 | 说明 |
|---|---|---|
/store/goods/listByIds |
GET | 按 ID 集取商品(field(goods_id, ids) 顺序) |
/store/goods/basic |
GET/POST | 商品基础信息(含 skuList / goods_images) |
/store/goods/add |
POST | 新增商品(单规格 / 多规格) |
/store/goods/edit |
POST | 编辑商品(sku 重建、关联差集) |
/store/goods/state |
POST | 批量上下架 |
/store/goods/delete |
POST | 批量软删除 |
/store/goods.spec/list |
GET | 商品规格属性列表(多级控制器点号) |
/store/upload/image |
POST | 图片上传(字段名 iFile) |
/store/upload/video |
POST | 视频上传 |
store 模块进度:151 个接口已实现 91 个,剩余 60 个(tools/check_progress.py 可随时盘点)。
goods_price_min = goods_price_max = goods_price,line_price 同理,stock_total = stock_num,SKU 只写一条且 goods_sku_id = "0"。stock_total = Σ stock_num;价格区间取 sku 列表 array_filter 后(过滤 0 与空值)的 min/max,全空则 [0, 0]。goods_price ?: 0.01、line_price ?: 0、stock_num ?: 0(与 PHP increasedFroMulti 一致)。对照 PHP Spec::getNewSpecList / SpecValue::getNewValueList:先按名称(含 store_id)查已有记录并复用 ID,不存在才 insert。这样同一规格名在 yoshop_spec 里不会重复堆积。
goods_sku_id 由规格值 ID 用 _ 连接生成;goods_props 存 [{group:{name,id}, value:{name,id}}]。出参时这两个字段会被反解成数组(GoodsSku 上加了 @JsonIgnore + @JsonProperty 的 JSON getter),与 PHP 的获取器行为一致。
GoodsSpecRel::updates、GoodsSku::edit)。alone_grade_equity:前端键是 grade_id:10001,落库前去掉前缀并保持为对象(PHP 非连续索引数组 json_encode 后是对象,不是数组);is_enable_grade=0 时强制 is_alone_grade=0;开启单独折扣但传空时报「请先添加会员等级后再设置会员折扣价」。delivery_type 库内是 JSON 字符串([10]),实体走 JacksonTypeHandler。is_delete=1),Goods 实体的 @TableLogic(value="0", delval="1") 与全局 10/30 配置不同,不能混用。iFile、分组走 query groupId,与 PHP Upload::FORM_NAME 一致。{storeId}/{yyyyMMdd}/{md5}.{ext},写 yoshop_upload_file(storage=local、domain 留空)。fileInfo 含 preview_url / external_url,域名取 yoshop.base-url。yoshop.upload-path(默认 runtime/uploads),并把 /uploads/** 映射为该目录的静态资源,便于本地联调;线上建议仍由 Nginx 托管。spring.servlet.multipart)。tools/test_goods_writes.py,42 项断言全通过)覆盖:新增单规格 → 库内校验(价格/库存/关联/sku)→ 读回校验 → 编辑为多规格(sku 重建、规格入库、价格区间)→ 读回校验 → 下架/上架 → 软删除 → 删除后不可见 → 数据清理。
tools/compare_live.py,7/7 PASS,0 差异)goods/basic、goods/listByIds、goods.spec/list、goods/detail(单规格 + 2 个多规格商品)全部与线上 PHP 一致。
tools/compare_batch.py 28 个既有接口 28/28 PASS(GoodsSku 的 JSON 字段改造没有破坏详情接口)。
测试中确认了一个影响后续方案的事实:
detail 报「商品信息不存在」、list?goodsName= 返回空,等待 9 秒仍如此)。也就是说 192.168.1.177/shop 与线上 PHP 的库之间是单向同步(PHP → 本地),Java 的写操作只落在本地副本。
影响:
剩余 61 个接口,按页面可用性排序:
controller/initialize。另外 checkPrivilege(按角色校验 API 权限)仍未实现,切流前必须补。