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

This commit is contained in:
puhui999 2023-07-28 16:30:38 +08:00
parent 6a38738760
commit 446951bd11
6 changed files with 96 additions and 51 deletions

View File

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

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.common.util.collection;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.map.MapUtil;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import java.util.*; import java.util.*;
@ -149,6 +150,41 @@ public class CollectionUtils {
return builder.build(); 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) { public static boolean containsAny(Collection<?> source, Collection<?> candidates) {
return org.springframework.util.CollectionUtils.containsAny(source, candidates); return org.springframework.util.CollectionUtils.containsAny(source, candidates);
} }

View File

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

View File

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

View File

@ -31,8 +31,14 @@ public class PromotionUtils {
return LocalDateTimeUtils.beforeNow(endTime) ? CommonStatusEnum.DISABLE.getStatus() : CommonStatusEnum.ENABLE.getStatus(); 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 个数是否一致 // 校验 sku 个数是否一致
Set<Long> skuIdsSet = CollectionUtils.convertSet(products, func); Set<Long> skuIdsSet = CollectionUtils.convertSet(products, func);
Set<Long> skuIdsSet1 = CollectionUtils.convertSet(skus, ProductSkuRespDTO::getId); Set<Long> skuIdsSet1 = CollectionUtils.convertSet(skus, ProductSkuRespDTO::getId);

View File

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