From e4eeac9c41bacc284c2405130511060c50d2a1f4 Mon Sep 17 00:00:00 2001 From: DongZeLiang <2746733890@qq.com> Date: Sun, 7 Apr 2024 11:41:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B4=AD=E7=89=A9=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/muyu/common/cache/HashCache.java | 7 ++ .../cache/abs/AtomicSequenceCacheAbs.java | 8 ++- .../muyu/common/cache/abs/HashCacheAbs.java | 11 +++ .../core/constant/ServiceNameConstants.java | 5 ++ .../common/redis/service/RedisService.java | 9 +++ ...ot.autoconfigure.AutoConfiguration.imports | 3 + .../remote/RemoteProjectSkuService.java | 33 +++++++++ .../factory/RemoteProjectSkuFactory.java | 23 +++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../cache/impl/ProjectSkuStockDataImpl.java | 5 +- .../controller/ProjectSkuInfoController.java | 12 ++++ .../service/ProjectSkuInfoService.java | 7 ++ .../impl/ProjectSkuInfoServiceImpl.java | 16 +++++ .../com/muyu/shop/cart/domain/CartInfo.java | 2 - .../shop/cart/domain/req/CartInfoSaveReq.java | 17 ----- .../muyu-shop-cart-server/pom.xml | 12 ++++ .../cart/cache/impl/ProjectInfoDataImpl.java | 25 +++++++ .../cart/cache/impl/ProjectSkuDataImpl.java | 43 ++++++++++++ .../impl/ProjectSkuStockDataRemoteImpl.java | 36 ++++++++++ .../cart/controller/CartInfoController.java | 2 +- .../shop/cart/service/CartInfoService.java | 6 ++ .../service/impl/CartInfoServiceImpl.java | 67 +++++++++++++++++-- .../cart/service/sourcedata/CartDataImpl.java | 10 ++- .../src/main/resources/bootstrap.yml | 2 + 24 files changed, 330 insertions(+), 32 deletions(-) create mode 100644 muyu-modules/muyu-product/muyu-product-cache/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 muyu-modules/muyu-product/muyu-product-remote/src/main/java/com/muyu/product/remote/RemoteProjectSkuService.java create mode 100644 muyu-modules/muyu-product/muyu-product-remote/src/main/java/com/muyu/product/remote/factory/RemoteProjectSkuFactory.java create mode 100644 muyu-modules/muyu-product/muyu-product-remote/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectInfoDataImpl.java create mode 100644 muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectSkuDataImpl.java create mode 100644 muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectSkuStockDataRemoteImpl.java diff --git a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/HashCache.java b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/HashCache.java index dff5fec..19549ba 100644 --- a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/HashCache.java +++ b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/HashCache.java @@ -94,4 +94,11 @@ public interface HashCache extends DecorationKey { */ public void remove(K key, HK hashKey); + /** + * 判断redis中hashKey是否存在 + * @param key redis键 + * @param hashKey hash键 + */ + public boolean hasKey(K key, HK hashKey); + } diff --git a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/AtomicSequenceCacheAbs.java b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/AtomicSequenceCacheAbs.java index d8ea20f..54358b7 100644 --- a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/AtomicSequenceCacheAbs.java +++ b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/AtomicSequenceCacheAbs.java @@ -21,7 +21,13 @@ public abstract class AtomicSequenceCacheAbs implements AtomicSequenceCache implements HashCache { redisService.deleteCacheMapValue(encode(key), encodeHashKey(hashKey)); } + /** + * 判断redis中hashKey是否存在 + * + * @param key redis键 + * @param hashKey hash键 + */ + @Override + public boolean hasKey (K key, HK hashKey) { + return redisService.hashKey(encode(key), encodeHashKey(hashKey)); + } + /** * 原始数据转编码数据 * @param dataMap 原始数据 diff --git a/muyu-common/muyu-common-core/src/main/java/com/muyu/common/core/constant/ServiceNameConstants.java b/muyu-common/muyu-common-core/src/main/java/com/muyu/common/core/constant/ServiceNameConstants.java index 25c918e..69c62e8 100644 --- a/muyu-common/muyu-common-core/src/main/java/com/muyu/common/core/constant/ServiceNameConstants.java +++ b/muyu-common/muyu-common-core/src/main/java/com/muyu/common/core/constant/ServiceNameConstants.java @@ -20,4 +20,9 @@ public class ServiceNameConstants { * 文件服务的serviceid */ public static final String FILE_SERVICE = "muyu-file"; + + /** + * 商品服务 + */ + public static final String PRODUCT_SERVICE = "muyu-product"; } diff --git a/muyu-common/muyu-common-redis/src/main/java/com/muyu/common/redis/service/RedisService.java b/muyu-common/muyu-common-redis/src/main/java/com/muyu/common/redis/service/RedisService.java index beeefbb..b811d4e 100644 --- a/muyu-common/muyu-common-redis/src/main/java/com/muyu/common/redis/service/RedisService.java +++ b/muyu-common/muyu-common-redis/src/main/java/com/muyu/common/redis/service/RedisService.java @@ -232,6 +232,15 @@ public class RedisService { public List getMultiCacheMapValue (final String key, final Collection hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } + + /** + * 判断redis中hashKey是否存在 + * @param key redis键 + * @param hashKey hash键 + */ + public boolean hashKey(final String key, final String hashKey){ + return this.redisTemplate.opsForHash().hasKey(key, hashKey); + } /** * 删除Hash中的某条数据 diff --git a/muyu-modules/muyu-product/muyu-product-cache/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/muyu-modules/muyu-product/muyu-product-cache/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..b18f09e --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-cache/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.muyu.product.cache.ProjectInfoCache +com.muyu.product.cache.ProjectSkuCache +com.muyu.product.cache.ProjectSkuStockCache diff --git a/muyu-modules/muyu-product/muyu-product-remote/src/main/java/com/muyu/product/remote/RemoteProjectSkuService.java b/muyu-modules/muyu-product/muyu-product-remote/src/main/java/com/muyu/product/remote/RemoteProjectSkuService.java new file mode 100644 index 0000000..3b811b2 --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-remote/src/main/java/com/muyu/product/remote/RemoteProjectSkuService.java @@ -0,0 +1,33 @@ +package com.muyu.product.remote; + +import com.muyu.common.core.constant.ServiceNameConstants; +import com.muyu.common.core.domain.Result; +import com.muyu.product.domain.ProjectSkuInfo; +import com.muyu.product.remote.factory.RemoteProjectSkuFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +/** + * @author DongZl + * @description: 远程调用业务层 + * @Date 2024-4-7 上午 10:58 + */ +@FeignClient( + contextId = "remoteProjectSkuService", + value = ServiceNameConstants.PRODUCT_SERVICE, + fallbackFactory = RemoteProjectSkuFactory.class, + path = "/sku" +) +public interface RemoteProjectSkuService { + + /** + * 通过商品ID和SKU获取SKU信息 + * @param projectId 商品ID + * @param projectSku 商品SKU + * @return 商品SKU信息 + */ + @GetMapping("/info/{projectId}/{projectSku}") + public Result getInfoByProjectIdAndSku(@PathVariable("projectId") Long projectId, + @PathVariable("projectSku") String projectSku); +} diff --git a/muyu-modules/muyu-product/muyu-product-remote/src/main/java/com/muyu/product/remote/factory/RemoteProjectSkuFactory.java b/muyu-modules/muyu-product/muyu-product-remote/src/main/java/com/muyu/product/remote/factory/RemoteProjectSkuFactory.java new file mode 100644 index 0000000..e78bee4 --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-remote/src/main/java/com/muyu/product/remote/factory/RemoteProjectSkuFactory.java @@ -0,0 +1,23 @@ +package com.muyu.product.remote.factory; + +import com.muyu.common.core.domain.Result; +import com.muyu.product.domain.ProjectSkuInfo; +import com.muyu.product.remote.RemoteProjectSkuService; +import org.springframework.cloud.openfeign.FallbackFactory; + +/** + * @author DongZl + * @description: 远程调熔断器 + * @Date 2024-4-7 上午 10:59 + */ +public class RemoteProjectSkuFactory implements FallbackFactory { + @Override + public RemoteProjectSkuService create (Throwable cause) { + return new RemoteProjectSkuService() { + @Override + public Result getInfoByProjectIdAndSku (Long projectId, String projectSku) { + return Result.error(cause.getMessage()); + } + }; + } +} diff --git a/muyu-modules/muyu-product/muyu-product-remote/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/muyu-modules/muyu-product/muyu-product-remote/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..ae3543e --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-remote/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.muyu.product.remote.factory.RemoteProjectSkuFactory diff --git a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuStockDataImpl.java b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuStockDataImpl.java index 8bc86dd..dc7deb4 100644 --- a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuStockDataImpl.java +++ b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuStockDataImpl.java @@ -21,10 +21,7 @@ public class ProjectSkuStockDataImpl implements ProjectSkuStockData { @Override public Long getData (SkuStockKey key) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(ProjectSkuInfo::getProjectId, key.getProjectId()); - queryWrapper.eq(ProjectSkuInfo::getSku, key.getSku()); - ProjectSkuInfo projectSkuInfo = projectSkuInfoService.getOne(queryWrapper); + ProjectSkuInfo projectSkuInfo = projectSkuInfoService.getInfoByProjectIdAndSku(key.getProjectId(), key.getSku()); return projectSkuInfo.getStock(); } } diff --git a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/controller/ProjectSkuInfoController.java b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/controller/ProjectSkuInfoController.java index 38bc481..de4c74d 100644 --- a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/controller/ProjectSkuInfoController.java +++ b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/controller/ProjectSkuInfoController.java @@ -75,6 +75,18 @@ public class ProjectSkuInfoController extends BaseController { return Result.success(projectSkuInfoService.getById(id)); } + /** + * 通过商品ID和SKU获取SKU信息 + * @param projectId 商品ID + * @param projectSku 商品SKU + * @return 商品SKU信息 + */ + @GetMapping("/info/{projectId}/{projectSku}") + public Result getInfoByProjectIdAndSku(@PathVariable("projectId") Long projectId, + @PathVariable("projectSku") String projectSku){ + return Result.success(projectSkuInfoService.getInfoByProjectIdAndSku(projectId, projectSku)); + } + /** * 新增商品SKU */ diff --git a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/service/ProjectSkuInfoService.java b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/service/ProjectSkuInfoService.java index 3706c08..234a911 100644 --- a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/service/ProjectSkuInfoService.java +++ b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/service/ProjectSkuInfoService.java @@ -19,4 +19,11 @@ public interface ProjectSkuInfoService extends IService { */ public List list(ProjectSkuInfo projectSkuInfo); + /** + * 通过商品ID和SKU获取SKU信息 + * @param projectId 商品ID + * @param projectSku 商品SKU + * @return 商品SKU信息 + */ + ProjectSkuInfo getInfoByProjectIdAndSku (Long projectId, String projectSku); } diff --git a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/service/impl/ProjectSkuInfoServiceImpl.java b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/service/impl/ProjectSkuInfoServiceImpl.java index ed42d5c..9d457c7 100644 --- a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/service/impl/ProjectSkuInfoServiceImpl.java +++ b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/service/impl/ProjectSkuInfoServiceImpl.java @@ -58,4 +58,20 @@ public class ProjectSkuInfoServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProjectSkuInfo::getProjectId, projectId); + queryWrapper.eq(ProjectSkuInfo::getSku, projectSku); + return this.getOne(queryWrapper); + } } diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/CartInfo.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/CartInfo.java index c5f4c13..1a60726 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/CartInfo.java +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/CartInfo.java @@ -82,9 +82,7 @@ public class CartInfo extends BaseEntity { return CartInfo.builder() .projectId(cartInfoSaveReq.getProjectId()) .projectSku(cartInfoSaveReq.getProjectSku()) - .userId(cartInfoSaveReq.getUserId()) .num(cartInfoSaveReq.getNum()) - .isSelected(cartInfoSaveReq.getIsSelected()) .build(); } diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/req/CartInfoSaveReq.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/req/CartInfoSaveReq.java index 3163b83..960ed83 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/req/CartInfoSaveReq.java +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/req/CartInfoSaveReq.java @@ -23,34 +23,17 @@ public class CartInfoSaveReq extends BaseEntity { private static final long serialVersionUID = 1L; - /** 主键 */ - - @ApiModelProperty(name = "主键", value = "主键") - private Long id; /** 商品 */ - @ApiModelProperty(name = "商品", value = "商品", required = true) private Long projectId; /** SKU */ - @ApiModelProperty(name = "SKU", value = "SKU", required = true) private String projectSku; - /** 用户 */ - - @ApiModelProperty(name = "用户", value = "用户", required = true) - private Long userId; - /** 数量 */ - @ApiModelProperty(name = "数量", value = "数量", required = true) private Long num; - /** 是否选中 */ - - @ApiModelProperty(name = "是否选中", value = "是否选中", required = true) - private String isSelected; - } diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/pom.xml b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/pom.xml index 760ad7b..abe8f52 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/pom.xml +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/pom.xml @@ -92,6 +92,18 @@ muyu-shop-cart-cache + + + com.muyu + muyu-product-cache + + + + + com.muyu + muyu-product-remote + + diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectInfoDataImpl.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectInfoDataImpl.java new file mode 100644 index 0000000..033bed1 --- /dev/null +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectInfoDataImpl.java @@ -0,0 +1,25 @@ +package com.muyu.shop.cart.cache.impl; + +import com.muyu.product.cache.datasource.ProjectInfoData; +import com.muyu.product.domain.ProjectInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author DongZl + * @description: 缓存数据获取 + * @Date 2024-3-27 下午 03:37 + */ +@Service +public class ProjectInfoDataImpl implements ProjectInfoData { + + /** + * 从数据库获取数据 + * @param key ID + * @return 缓存对象 + */ + @Override + public ProjectInfo getData (Long key) { + return new ProjectInfo(); + } +} diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectSkuDataImpl.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectSkuDataImpl.java new file mode 100644 index 0000000..d03e7a6 --- /dev/null +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectSkuDataImpl.java @@ -0,0 +1,43 @@ +package com.muyu.shop.cart.cache.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.muyu.product.cache.datasource.ProjectSkuData; +import com.muyu.product.domain.ProjectSkuInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author DongZl + * @description: 商品SKU实现类 + * @Date 2024-4-1 上午 11:38 + */ +@Service +public class ProjectSkuDataImpl implements ProjectSkuData { + + + /** + * 通过键获取所有的hash数据 + * @param projectId 商品ID + * @return + */ + @Override + public Map getData (Long projectId) { + return new HashMap<>(); + } + + /** + * 通过缓存键和hash键获取hash值 + * @param projectId 商品ID + * @param projectSku 商品SKU + * @return hash值 + */ + @Override + public ProjectSkuInfo getData (Long projectId, String projectSku) { + return new ProjectSkuInfo(); + } +} diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectSkuStockDataRemoteImpl.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectSkuStockDataRemoteImpl.java new file mode 100644 index 0000000..4d8bad4 --- /dev/null +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/cache/impl/ProjectSkuStockDataRemoteImpl.java @@ -0,0 +1,36 @@ +package com.muyu.shop.cart.cache.impl; + +import com.muyu.common.core.domain.Result; +import com.muyu.product.cache.datasource.ProjectSkuStockData; +import com.muyu.product.cache.key.SkuStockKey; +import com.muyu.product.domain.ProjectSkuInfo; +import com.muyu.product.remote.RemoteProjectSkuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * @author DongZl + * @description: sku库存实现类 + * @Date 2024-4-2 上午 10:53 + */ +@Service +public class ProjectSkuStockDataRemoteImpl implements ProjectSkuStockData { + + @Autowired + private RemoteProjectSkuService remoteProjectSkuService; + + @Override + public Long getData (SkuStockKey key) { + Result result + = remoteProjectSkuService.getInfoByProjectIdAndSku(key.getProjectId(), key.getSku()); + if (Result.isSuccess(result)){ + ProjectSkuInfo projectSkuInfo = result.getData(); + if (!Objects.isNull(projectSkuInfo)){ + return projectSkuInfo.getStock(); + } + } + return 0L; + } +} diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/controller/CartInfoController.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/controller/CartInfoController.java index baaa949..9a0f9e4 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/controller/CartInfoController.java +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/controller/CartInfoController.java @@ -83,7 +83,7 @@ public class CartInfoController extends BaseController { @PostMapping @ApiOperation("新增购物车") public Result add(@RequestBody CartInfoSaveReq cartInfoSaveReq) { - return toAjax(cartInfoService.save(CartInfo.saveBuild(cartInfoSaveReq))); + return toAjax(cartInfoService.add(CartInfo.saveBuild(cartInfoSaveReq))); } /** diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/CartInfoService.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/CartInfoService.java index 381566b..624de13 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/CartInfoService.java +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/CartInfoService.java @@ -19,4 +19,10 @@ public interface CartInfoService extends IService { */ public List list(CartInfo cartInfo); + /** + * 添加购物车 + * @param cartInfo 购物车信息 + * @return 是否添加成功 + */ + boolean add (CartInfo cartInfo); } diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/impl/CartInfoServiceImpl.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/impl/CartInfoServiceImpl.java index f3d4e99..7a60747 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/impl/CartInfoServiceImpl.java +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/impl/CartInfoServiceImpl.java @@ -1,9 +1,19 @@ package com.muyu.shop.cart.service.impl; +import java.util.Date; import java.util.List; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.muyu.common.core.exception.ServiceException; +import com.muyu.common.core.text.Convert; import com.muyu.common.core.utils.ObjUtils; +import com.muyu.common.security.utils.SecurityUtils; +import com.muyu.product.cache.ProjectSkuStockCache; +import com.muyu.product.cache.key.SkuStockKey; +import com.muyu.shop.cart.cache.CartCache; +import com.muyu.shop.cart.cache.key.CartHashKey; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.muyu.shop.cart.mapper.CartInfoMapper; import com.muyu.shop.cart.domain.CartInfo; @@ -21,6 +31,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @Service public class CartInfoServiceImpl extends ServiceImpl implements CartInfoService { + @Autowired + private CartCache cartCache; + + @Autowired + private ProjectSkuStockCache projectSkuStockCache; + /** * 查询购物车列表 * @@ -52,10 +68,53 @@ public class CartInfoServiceImpl extends ServiceImpl queryWrapper.eq(CartInfo::getIsSelected, cartInfo.getIsSelected()); } - - - - return list(queryWrapper); } + + /** + * 添加购物车 + * + * @param cartInfo 购物车信息 + * + * @return 是否添加成功 + */ + @Override + public boolean add (CartInfo cartInfo) { + Long userId = SecurityUtils.getUserId(); + CartHashKey cartHashKey = CartHashKey.builder() + .projectId(cartInfo.getProjectId()) + .projectSku(cartInfo.getProjectSku()) + .build(); + SkuStockKey skuStockKey = SkuStockKey.builder() + .projectId(cartInfo.getProjectId()) + .sku(cartInfo.getProjectSku()) + .build(); + Long skuStock = Convert.toLong(projectSkuStockCache.get(skuStockKey), -1L); + if (cartCache.hasKey(userId, cartHashKey)){ + // 取出来修改 + CartInfo cartInfoCache = cartCache.get(userId, cartHashKey); + cartInfoCache.setNum( cartInfoCache.getNum() + cartInfo.getNum()); + if (skuStock < cartInfoCache.getNum()){ + throw new ServiceException("当前库存不足"); + } + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(CartInfo::getNum, cartInfoCache.getNum()); + updateWrapper.eq(CartInfo::getId, cartInfoCache.getId()); + this.update(updateWrapper); + this.cartCache.put(userId, cartHashKey, cartInfoCache); + }else { + // 存进去 + if (skuStock < cartInfo.getNum()){ + throw new ServiceException("当前库存不足"); + } + cartInfo.setIsSelected("Y"); + cartInfo.setUserId(userId); + cartInfo.setCreateBy(SecurityUtils.getUsername()); + cartInfo.setCreateTime(new Date()); + this.save(cartInfo); + this.cartCache.put(userId, cartHashKey, cartInfo); + } + return true; + } + } diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/sourcedata/CartDataImpl.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/sourcedata/CartDataImpl.java index 03df3e4..73ce51e 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/sourcedata/CartDataImpl.java +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/service/sourcedata/CartDataImpl.java @@ -42,13 +42,17 @@ public class CartDataImpl implements CartData { /** * 通过缓存键和hash键获取hash值 * - * @param key 缓存键 + * @param userId 缓存键 * @param hashKey hash键 * * @return hash值 */ @Override - public CartInfo getData (Long key, CartHashKey hashKey) { - return null; + public CartInfo getData (Long userId, CartHashKey hashKey) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(CartInfo::getUserId, userId); + queryWrapper.eq(CartInfo::getProjectId, hashKey.getProjectId()); + queryWrapper.eq(CartInfo::getProjectSku, hashKey.getProjectSku()); + return cartInfoService.getOne(queryWrapper); } } diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/resources/bootstrap.yml b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/resources/bootstrap.yml index 325eccf..8e54ec5 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/resources/bootstrap.yml +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/resources/bootstrap.yml @@ -4,6 +4,8 @@ server: # Spring spring: + main: + allow-circular-references: true application: # 应用名称 name: muyu-shop-cart