Browse Source

fix:封装函数 convertCDUMap 作用:数据划分为需要新增的、还是删除的、还是更新的。

puhui999 1 year ago
parent
commit
446951bd11

+ 2 - 2
pom.xml

@@ -16,11 +16,11 @@
         <module>yudao-module-member</module>
         <module>yudao-module-system</module>
         <module>yudao-module-infra</module>
-<!--        <module>yudao-module-pay</module>-->
+        <module>yudao-module-pay</module>
 <!--        <module>yudao-module-bpm</module>-->
 <!--        <module>yudao-module-report</module>-->
 <!--        <module>yudao-module-mp</module>-->
-<!--        <module>yudao-module-mall</module>-->
+        <module>yudao-module-mall</module>
         <!-- 示例项目 -->
         <module>yudao-example</module>
     </modules>

+ 36 - 0
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.common.util.collection;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
 import com.google.common.collect.ImmutableMap;
 
 import java.util.*;
@@ -149,6 +150,41 @@ public class CollectionUtils {
         return builder.build();
     }
 
+    /**
+     * 数据划分为需要新增的、还是删除的、还是更新的。
+     *
+     * @param list1 需要处理的数据的相关编号列表
+     * @param list2 数据库中存在的数据的相关编号列表
+     * @param func  比较出哪些记录是新增,还是修改,还是删除
+     * @return 包含需要新增、修改、删除的数据 Map 对象
+     */
+    public static <D> Map<String, List<D>> convertCDUMap(Collection<Long> list1, Collection<Long> list2,
+                                                         Function<Map<String, List<Long>>, Map<String, List<D>>> func) {
+        HashMap<String, List<Long>> mapData = MapUtil.newHashMap(3);
+        if (CollUtil.isEmpty(list1)) {
+            return func.apply(mapData);
+        }
+        if (CollUtil.isEmpty(list2)) {
+            return func.apply(mapData);
+        }
+        // 后台存在的前端不存在的
+        List<Long> d = CollectionUtils.filterList(list2, item -> !list1.contains(item));
+        if (CollUtil.isNotEmpty(d)) {
+            mapData.put("delete", d);
+        }
+        // 前端存在的后端不存在的
+        List<Long> c = CollectionUtils.filterList(list1, item -> !list2.contains(item));
+        if (CollUtil.isNotEmpty(c)) {
+            mapData.put("create", c);
+        }
+        // 更新已存在的
+        List<Long> u = CollectionUtils.filterList(list1, list2::contains);
+        if (CollUtil.isNotEmpty(u)) {
+            mapData.put("update", u);
+        }
+        return func.apply(mapData);
+    }
+
     public static boolean containsAny(Collection<?> source, Collection<?> candidates) {
         return org.springframework.util.CollectionUtils.containsAny(source, candidates);
     }

+ 28 - 25
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java

@@ -2,10 +2,12 @@ package cn.iocoder.yudao.module.promotion.service.combination;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
@@ -31,9 +33,7 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
@@ -67,7 +67,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
         // 获取所选 spu下的所有 sku
         List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollectionUtil.newArrayList(createReqVO.getSpuId()));
         // 校验商品 sku 是否存在
-        validateProductSkuExistence(skus, createReqVO.getProducts(), CombinationProductCreateReqVO::getSkuId);
+        validateProductSkuExistence(createReqVO.getProducts(), skus, CombinationProductCreateReqVO::getSkuId);
 
         // TODO 艿艿 有个小问题:现在有活动时间和限制时长,活动时间的结束时间早于设置的限制时间怎么算状态比如:
         //  活动时间 2023-08-05 15:00:00 - 2023-08-05 15:20:00 限制时长 2小时,那么活动时间结束就结束还是加时到满两小时
@@ -119,7 +119,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
         // 获取所选 spu下的所有 sku
         List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollectionUtil.newArrayList(updateReqVO.getSpuId()));
         // 校验商品 sku 是否存在
-        validateProductSkuExistence(skus, updateReqVO.getProducts(), CombinationProductUpdateReqVO::getSkuId);
+        validateProductSkuExistence(updateReqVO.getProducts(), skus, CombinationProductUpdateReqVO::getSkuId);
 
         // 更新
         CombinationActivityDO updateObj = CombinationActivityConvert.INSTANCE.convert(updateReqVO);
@@ -130,7 +130,6 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
 
     /**
      * 更新秒杀商品
-     *  TODO 更新商品要不要封装成通用方法
      *
      * @param updateObj DO
      * @param products  商品配置
@@ -141,25 +140,28 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
         Set<Long> convertSet = CollectionUtils.convertSet(combinationProductDOs, CombinationProductDO::getSkuId);
         // 前端传过来的活动商品
         Set<Long> convertSet1 = CollectionUtils.convertSet(products, CombinationProductUpdateReqVO::getSkuId);
-        // 删除后台存在的前端不存在的商品
-        List<Long> d = CollectionUtils.filterList(convertSet, item -> !convertSet1.contains(item));
-        if (CollUtil.isNotEmpty(d)) {
-            combinationProductMapper.deleteBatchIds(d);
-        }
-        // 前端存在的后端不存在的商品
-        List<Long> c = CollectionUtils.filterList(convertSet1, item -> !convertSet.contains(item));
-        if (CollUtil.isNotEmpty(c)) {
-            List<CombinationProductUpdateReqVO> vos = CollectionUtils.filterList(products, item -> c.contains(item.getSkuId()));
-            List<CombinationProductDO> productDOs = CombinationActivityConvert.INSTANCE.convertList(updateObj, vos);
-            combinationProductMapper.insertBatch(productDOs);
-        }
-        // 更新已存在的商品
-        List<Long> u = CollectionUtils.filterList(convertSet1, convertSet::contains);
-        if (CollUtil.isNotEmpty(u)) {
-            List<CombinationProductUpdateReqVO> vos = CollectionUtils.filterList(products, item -> u.contains(item.getSkuId()));
-            List<CombinationProductDO> productDOs = CombinationActivityConvert.INSTANCE.convertList1(updateObj, vos, combinationProductDOs);
-            combinationProductMapper.updateBatch(productDOs);
-        }
+        // 分化数据
+        Map<String, List<CombinationProductDO>> data = CollectionUtils.convertCDUMap(convertSet1, convertSet, mapData -> {
+            HashMap<String, List<CombinationProductDO>> cdu = MapUtil.newHashMap(3);
+            MapUtils.findAndThen(mapData, "create", list -> {
+                cdu.put("create", CombinationActivityConvert.INSTANCE.convertList(updateObj,
+                        CollectionUtils.filterList(products, item -> list.contains(item.getSkuId()))));
+            });
+            MapUtils.findAndThen(mapData, "delete", list -> {
+                cdu.put("create", CollectionUtils.filterList(combinationProductDOs, item -> list.contains(item.getSkuId())));
+            });
+            MapUtils.findAndThen(mapData, "update", list -> {
+                cdu.put("update", CombinationActivityConvert.INSTANCE.convertList1(updateObj,
+                        CollectionUtils.filterList(products, item -> list.contains(item.getSkuId())), combinationProductDOs));
+            });
+            return cdu;
+        });
+
+        // 执行增删改
+        MapUtils.findAndThen(data, "create", item -> combinationProductMapper.insertBatch(item));
+        MapUtils.findAndThen(data, "delete", item -> combinationProductMapper.deleteBatchIds(
+                CollectionUtils.convertSet(item, CombinationProductDO::getId)));
+        MapUtils.findAndThen(data, "update", item -> combinationProductMapper.updateBatch(item));
     }
 
     @Override
@@ -274,6 +276,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
     }
 
     // TODO @puhui999:status 传入进来搞哈;
+
     /**
      * APP 端获取开团记录
      *

+ 2 - 2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityServiceImpl.java

@@ -64,7 +64,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
         List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollUtil.newArrayList(createReqVO.getSpuId()));
         // 校验商品 sku 是否存在
         // TODO @puhui999:直接校验 sku 数量,是不是就完事啦,不需要校验的特别严谨哈;
-        validateProductSkuExistence(skus, createReqVO.getProducts(), SeckillProductCreateReqVO::getSkuId);
+        validateProductSkuExistence(createReqVO.getProducts(), skus, SeckillProductCreateReqVO::getSkuId);
 
         // 插入秒杀活动
         SeckillActivityDO activity = SeckillActivityConvert.INSTANCE.convert(createReqVO)
@@ -122,7 +122,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
         // 获取所选 spu下的所有 sku
         List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollUtil.newArrayList(updateReqVO.getSpuId()));
         // 校验商品 sku 是否存在
-        validateProductSkuExistence(skus, updateReqVO.getProducts(), SeckillProductUpdateReqVO::getSkuId);
+        validateProductSkuExistence(updateReqVO.getProducts(), skus, SeckillProductUpdateReqVO::getSkuId);
 
         // 更新活动
         SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO)

+ 8 - 2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/util/PromotionUtils.java

@@ -31,8 +31,14 @@ public class PromotionUtils {
         return LocalDateTimeUtils.beforeNow(endTime) ? CommonStatusEnum.DISABLE.getStatus() : CommonStatusEnum.ENABLE.getStatus();
     }
 
-    // TODO @puhui999:写个注释哈。
-    public static <T> void validateProductSkuExistence(List<ProductSkuRespDTO> skus, List<T> products, Function<T, Long> func) {
+    /**
+     * 校验商品 sku 是否存在
+     *
+     * @param products 需要校验的商品
+     * @param skus     数据库中的商品 skus
+     * @param func     获取需要校验的商品的 skuId
+     */
+    public static <T> void validateProductSkuExistence(List<T> products, List<ProductSkuRespDTO> skus, Function<T, Long> func) {
         // 校验 sku 个数是否一致
         Set<Long> skuIdsSet = CollectionUtils.convertSet(products, func);
         Set<Long> skuIdsSet1 = CollectionUtils.convertSet(skus, ProductSkuRespDTO::getId);

+ 20 - 20
yudao-server/pom.xml

@@ -54,11 +54,11 @@
 <!--            <version>${revision}</version>-->
 <!--        </dependency>-->
         <!-- 支付服务。默认注释,保证编译速度 -->
-<!--        <dependency>-->
-<!--            <groupId>cn.iocoder.boot</groupId>-->
-<!--            <artifactId>yudao-module-pay-biz</artifactId>-->
-<!--            <version>${revision}</version>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-pay-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
 
         <!-- 微信公众号模块。默认注释,保证编译速度 -->
 <!--        <dependency>-->
@@ -68,21 +68,21 @@
 <!--        </dependency>-->
 
         <!-- 商城相关模块。默认注释,保证编译速度 -->
-<!--        <dependency>-->
-<!--            <groupId>cn.iocoder.boot</groupId>-->
-<!--            <artifactId>yudao-module-promotion-biz</artifactId>-->
-<!--            <version>${revision}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>cn.iocoder.boot</groupId>-->
-<!--            <artifactId>yudao-module-product-biz</artifactId>-->
-<!--            <version>${revision}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>cn.iocoder.boot</groupId>-->
-<!--            <artifactId>yudao-module-trade-biz</artifactId>-->
-<!--            <version>${revision}</version>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-promotion-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-product-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-trade-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
 
         <!-- spring boot 配置所需依赖 -->
         <dependency>