From addad72e2e80bdb6b8073b06d366fda570c77aba Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Sun, 22 Feb 2026 19:03:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E6=9B=B4=E6=96=B0=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/vo/DeviceProductSkuSaveReqVO.java | 3 ++ .../admin/spu/vo/ProductSkuSaveReqVO.java | 3 ++ .../service/sku/ProductSkuServiceImpl.java | 32 +++++++++++-------- .../service/spu/ProductSpuServiceImpl.java | 1 + 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/device/vo/DeviceProductSkuSaveReqVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/device/vo/DeviceProductSkuSaveReqVO.java index 708dc2b..6285691 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/device/vo/DeviceProductSkuSaveReqVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/device/vo/DeviceProductSkuSaveReqVO.java @@ -15,6 +15,9 @@ import javax.validation.constraints.NotNull; @Data public class DeviceProductSkuSaveReqVO { + @Schema(description = "SKU 编号(编辑时传;新增可不传)", example = "261") + private Long id; + @Schema(description = "商品 SKU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试商品") @NotEmpty(message = "商品 SKU 名字不能为空") private String name; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java index 78cfcd7..b9bce1e 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java @@ -13,6 +13,9 @@ import java.util.List; @Data public class ProductSkuSaveReqVO { + @Schema(description = "商品 SKU 编号(编辑时传;新增可不传)", example = "261") + private Long id; + @Schema(description = "商品 SKU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") @NotEmpty(message = "商品 SKU 名字不能为空") private String name; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java index 0f5257f..c6b7db1 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java @@ -242,24 +242,27 @@ public class ProductSkuServiceImpl implements ProductSkuService { @Override @Transactional(rollbackFor = Exception.class) public void updateSkuList(Long spuId, List skus) { - // 构建属性与 SKU 的映射关系; - Map existsSkuMap = convertMap(productSkuMapper.selectListBySpuId(spuId), - ProductSkuConvert.INSTANCE::buildPropertyKey, ProductSkuDO::getId); - - // 拆分三个集合,新插入的、需要更新的、需要删除的 + // 规则(按 id 语义): + // 1) id != null:更新 + // 2) id == null:新增 + // 3) 库里存在但本次请求没带到的 id:删除 + List existsSkus = productSkuMapper.selectListBySpuId(spuId); + Set existsIds = convertSet(existsSkus, ProductSkuDO::getId); List insertSkus = new ArrayList<>(); List updateSkus = new ArrayList<>(); + Set requestIds = new HashSet<>(); + List allUpdateSkus = BeanUtils.toBean(skus, ProductSkuDO.class, sku -> sku.setSpuId(spuId)); allUpdateSkus.forEach(sku -> { - String propertiesKey = ProductSkuConvert.INSTANCE.buildPropertyKey(sku); - // 1、找得到的,进行更新 - Long existsSkuId = existsSkuMap.remove(propertiesKey); - if (existsSkuId != null) { - sku.setId(existsSkuId); + Long id = sku.getId(); + if (id != null && existsIds.contains(id)) { + // 更新已有 updateSkus.add(sku); + requestIds.add(id); return; } - // 2、找不到,进行插入 + // 新增(id 为空或不存在于当前 spu) + sku.setId(null); sku.setSpuId(spuId); insertSkus.add(sku); }); @@ -271,8 +274,11 @@ public class ProductSkuServiceImpl implements ProductSkuService { if (CollUtil.isNotEmpty(updateSkus)) { updateSkus.forEach(sku -> productSkuMapper.updateById(sku)); } - if (CollUtil.isNotEmpty(existsSkuMap)) { - productSkuMapper.deleteBatchIds(existsSkuMap.values()); + // 删除:库里有、请求没带的 + Set deleteIds = new HashSet<>(existsIds); + deleteIds.removeAll(requestIds); + if (CollUtil.isNotEmpty(deleteIds)) { + productSkuMapper.deleteBatchIds(deleteIds); } } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java index 44d171b..09b89e8 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java @@ -276,6 +276,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { List skus = new ArrayList<>(); for (DeviceProductSkuSaveReqVO deviceSku : deviceSkus) { ProductSkuSaveReqVO sku = new ProductSkuSaveReqVO(); + sku.setId(deviceSku.getId()); sku.setName(deviceSku.getName()); sku.setPrice(deviceSku.getPrice()); sku.setMarketPrice(deviceSku.getMarketPrice());