diff --git a/backend/modules/product/virtual/service/ProductServices.php b/backend/modules/product/virtual/service/ProductServices.php index 34d9220f2..9d9da690d 100644 --- a/backend/modules/product/virtual/service/ProductServices.php +++ b/backend/modules/product/virtual/service/ProductServices.php @@ -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) : []; diff --git a/frontend/admin/src/pages/plugin/virtual/product/Add.vue b/frontend/admin/src/pages/plugin/virtual/product/Add.vue index aacf3454d..d5f2c14fc 100644 --- a/frontend/admin/src/pages/plugin/virtual/product/Add.vue +++ b/frontend/admin/src/pages/plugin/virtual/product/Add.vue @@ -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;