外部接口改商品后库存清零,是 OutStoreProductServices::save() 这条编辑链路造成的,分三步叠加:
第 1 步 — 入参里的库存被主动丢弃
app/services/product/product/OutStoreProductServices.php:118
foreach ($detail as &$item) {
if (isset($item['stock'])) {
unset($item['stock']); // 把每个规格传入的 stock 删掉
}
第 2 步 — 校验时以 $validate=0 调用,导致 stock 不进入待保存数据
OutStoreProductServices.php:195(编辑)和 :213(新增):
$skuList = $productServices->validateProductAttr($attr, $detail, $id, 0, 0);
// ↑ 第5个参数 validate=0
而 StoreProductServices::validateProductAttr() 里 app/services/product/product/StoreProductServices.php:961:
if ($validate) {
$skuValue['stock'] = $value['stock']; // validate=0 时,这行根本不执行
}
所以返回的 valueGroup 里完全没有 stock 字段。
第 3 步 — 保存时先删后插,新行 stock 取数据库默认值 0
app/services/product/sku/StoreProductAttrServices.php:53 和 :77:
$storeProductAttrValueServices->del($id, $type); // 删掉该商品所有旧 SKU 行(连同真实库存)
...
return $storeProductAttrValueServices->saveAll($data['valueGroup']); // 重新插入,但没带 stock
而 eb_store_product_attr_value.stock 的表定义是(public/install/crmeb.sql:28905):
`stock` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '属性对应的库存',
→ 新插入的 SKU 行库存全部落到默认值 0。

