fix(虚拟商品): 分类与标签 ID 统一转 int,修复后台编辑页无法回显

- 商品详情接口的 cate_id / label_id 由 explode 后仍为字符串数组,
  而后台分类级联选择的 value 是数字,导致编辑页分类、标签回显为空。
  统一 array_map('intval') 处理,与 label_list / protection_list 口径一致。
- 后台网盘商品编辑页兼容后端返回数组或逗号字符串两种格式,
  并过滤非正数与 NaN 值,避免提交空节点。
This commit is contained in:
吴昊天 2026-10-23 14:09:28 +08:00
parent e712f5554c
commit 05d46ed2f1
2 changed files with 7 additions and 4 deletions

View File

@ -131,8 +131,9 @@ class ProductServices
// ============ 列表/JSON字段 ============
$product['logistics'] = !empty($product['logistics']) ? explode(',', $product['logistics']) : [];
$product['recommend_list'] = !empty($product['recommend_list']) ? explode(',', (string)$product['recommend_list']) : [];
$product['cate_id'] = !empty($product['cate_id']) ? explode(',', (string)$product['cate_id']) : [];
$product['label_id'] = !empty($product['label_id']) ? explode(',', (string)$product['label_id']) : [];
// 分类/标签 ID 统一转 int:分类级联选项的 value 是数字,返回字符串会导致编辑页无法回显
$product['cate_id'] = !empty($product['cate_id']) ? array_map('intval', explode(',', (string)$product['cate_id'])) : [];
$product['label_id'] = !empty($product['label_id']) ? array_map('intval', explode(',', (string)$product['label_id'])) : [];
$product['label_list'] = !empty($product['label_list']) ? array_map('intval', explode(',', (string)$product['label_list'])) : [];
$product['protection_list'] = !empty($product['protection_list']) ? array_map('intval', explode(',', (string)$product['protection_list'])) : [];
$product['params_list'] = !empty($product['params_list']) ? json_decode($product['params_list'], true) : [];

View File

@ -511,8 +511,10 @@ async function loadProduct() {
formValidate.value.slider_image = images;
formValidate.value.image = images[0] || '';
}
const cate = data.cate_id || [];
formValidate.value.cate_id = Array.isArray(cate) ? cate : [cate];
// 分类回显:级联选项的 value 是数字,字符串 ID 无法命中节点,这里统一转成数字
const cate = data.cate_id;
const cateArr = Array.isArray(cate) ? cate : cate ? String(cate).split(',') : [];
formValidate.value.cate_id = cateArr.map((v) => Number(v)).filter((v) => !Number.isNaN(v) && v > 0);
// 规格回显(优先使用 attr/attrs 中的数据)
if (data.attr && typeof data.attr === 'object') {
oneFormValidate.value[0].price = parseFloat(data.attr.price) || 0;