添加购物车 完善
parent
57bea5caea
commit
4d2c371407
|
@ -25,10 +25,10 @@
|
|||
<artifactId>muyu-common-cache</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 商品模块 common 依赖 -->
|
||||
<!-- 商品模块 远程调用 依赖 -->
|
||||
<dependency>
|
||||
<groupId>com.muyu</groupId>
|
||||
<artifactId>muyu-product-common</artifactId>
|
||||
<artifactId>muyu-product-remote</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ import com.muyu.product.cache.datasource.ProjectInfoData;
|
|||
import com.muyu.product.domain.ProjectInfo;
|
||||
import com.muyu.product.service.ProjectInfoService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
|
@ -12,6 +13,7 @@ import org.springframework.stereotype.Service;
|
|||
* @Date 2024-3-27 下午 03:37
|
||||
*/
|
||||
@Service
|
||||
@Primary
|
||||
public class ProjectInfoDataImpl implements ProjectInfoData {
|
||||
|
||||
@Autowired
|
||||
|
|
|
@ -5,6 +5,7 @@ import com.muyu.product.cache.datasource.ProjectSkuData;
|
|||
import com.muyu.product.domain.ProjectSkuInfo;
|
||||
import com.muyu.product.service.ProjectSkuInfoService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -17,6 +18,7 @@ import java.util.stream.Collectors;
|
|||
* @Date 2024-4-1 上午 11:38
|
||||
*/
|
||||
@Service
|
||||
@Primary
|
||||
public class ProjectSkuDataImpl implements ProjectSkuData {
|
||||
|
||||
@Autowired
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
package com.muyu.product.cache.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.muyu.product.cache.datasource.ProjectSkuStockData;
|
||||
import com.muyu.product.cache.key.SkuStockKey;
|
||||
import com.muyu.product.domain.ProjectSkuInfo;
|
||||
import com.muyu.product.service.ProjectSkuInfoService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
|
@ -14,6 +14,7 @@ import org.springframework.stereotype.Service;
|
|||
* @Date 2024-4-2 上午 10:53
|
||||
*/
|
||||
@Service
|
||||
@Primary
|
||||
public class ProjectSkuStockDataImpl implements ProjectSkuStockData {
|
||||
|
||||
@Autowired
|
||||
|
@ -21,7 +22,7 @@ public class ProjectSkuStockDataImpl implements ProjectSkuStockData {
|
|||
|
||||
@Override
|
||||
public Long getData (SkuStockKey key) {
|
||||
ProjectSkuInfo projectSkuInfo = projectSkuInfoService.getInfoByProjectAndSku(key.getProjectId(), key.getSku());
|
||||
ProjectSkuInfo projectSkuInfo = projectSkuInfoService.getInfoByProjectIdAndSku(key.getProjectId(), key.getSku());
|
||||
return projectSkuInfo.getStock();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,6 +52,15 @@ public class ProjectSkuInfoController extends BaseController {
|
|||
return getDataTable(list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过商品ID获取SKU集合
|
||||
* @param projectId 商品ID
|
||||
* @return 商品SKU信息
|
||||
*/
|
||||
@GetMapping("/list/{projectId}")
|
||||
public Result<List<ProjectSkuInfo>> listByProjectId(@PathVariable("projectId")Long projectId){
|
||||
return Result.success(projectSkuInfoService.listByProjectId(projectId));
|
||||
}
|
||||
/**
|
||||
* 导出商品SKU列表
|
||||
*/
|
||||
|
@ -85,7 +94,7 @@ public class ProjectSkuInfoController extends BaseController {
|
|||
@GetMapping("/info/{projectId}/{projectSku}")
|
||||
public Result<ProjectSkuInfo> getInfoByProjectIdAndSku(@PathVariable("projectId")Long projectId,
|
||||
@PathVariable("projectSku") String projectSku){
|
||||
return Result.success(projectSkuInfoService.getInfoByProjectAndSku(projectId, projectSku));
|
||||
return Result.success(projectSkuInfoService.getInfoByProjectIdAndSku(projectId, projectSku));
|
||||
};
|
||||
/**
|
||||
* 新增商品SKU
|
||||
|
|
|
@ -6,6 +6,7 @@ import javax.servlet.http.HttpServletResponse;
|
|||
import com.muyu.common.core.text.Convert;
|
||||
import com.muyu.product.domain.model.RuleInfoAddModel;
|
||||
import com.muyu.product.domain.resp.RuleInfoResp;
|
||||
import com.muyu.product.service.RuleAttrInfoService;
|
||||
import io.swagger.annotations.*;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
@ -81,6 +82,9 @@ public class RuleInfoController extends BaseController {
|
|||
return Result.success(ruleInfoService.getById(id));
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private RuleAttrInfoService ruleAttrInfoService;
|
||||
|
||||
/**
|
||||
* 新增商品规格
|
||||
*/
|
||||
|
|
|
@ -19,6 +19,13 @@ public interface ProjectSkuInfoService extends IService<ProjectSkuInfo> {
|
|||
*/
|
||||
public List<ProjectSkuInfo> list(ProjectSkuInfo projectSkuInfo);
|
||||
|
||||
ProjectSkuInfo getInfoByProjectAndSku(Long projectId,String projectSku);
|
||||
ProjectSkuInfo getInfoByProjectIdAndSku(Long projectId,String projectSku);
|
||||
|
||||
/**
|
||||
* 通过商品Id获取sku集合
|
||||
* @param projectId 商品Id
|
||||
* @return 商品SKU信息
|
||||
*/
|
||||
List<ProjectSkuInfo> listByProjectId(Long projectId);
|
||||
|
||||
}
|
||||
|
|
|
@ -19,4 +19,10 @@ public interface RuleAttrInfoService extends IService<RuleAttrInfo> {
|
|||
*/
|
||||
public List<RuleAttrInfo> list(RuleAttrInfo ruleAttrInfo);
|
||||
|
||||
/**
|
||||
* 通过ruleId获取规格详情
|
||||
* @param ruleId 规格Id
|
||||
* @return 规格详情id
|
||||
*/
|
||||
List<RuleAttrInfo> getInfoByRuleId(Long ruleId);
|
||||
}
|
||||
|
|
|
@ -3,11 +3,13 @@ package com.muyu.product.service;
|
|||
import java.util.List;
|
||||
|
||||
import com.muyu.common.core.web.page.TableDataInfo;
|
||||
import com.muyu.product.domain.RuleAttrInfo;
|
||||
import com.muyu.product.domain.RuleInfo;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.muyu.product.domain.model.RuleInfoAddModel;
|
||||
import com.muyu.product.domain.req.RuleInfoQueryReq;
|
||||
import com.muyu.product.domain.resp.RuleInfoResp;
|
||||
import org.apache.tomcat.util.digester.Rule;
|
||||
|
||||
/**
|
||||
* 商品规格Service接口
|
||||
|
@ -32,4 +34,5 @@ public interface RuleInfoService extends IService<RuleInfo> {
|
|||
public boolean save(RuleInfoAddModel ruleInfoAddModel);
|
||||
|
||||
TableDataInfo<RuleInfoResp> queryList (RuleInfoQueryReq ruleInfoQueryReq);
|
||||
|
||||
}
|
||||
|
|
|
@ -66,10 +66,17 @@ public class ProjectSkuInfoServiceImpl extends ServiceImpl<ProjectSkuInfoMapper,
|
|||
* @return 商品sku
|
||||
*/
|
||||
@Override
|
||||
public ProjectSkuInfo getInfoByProjectAndSku(Long projectId, String projectSku) {
|
||||
public ProjectSkuInfo getInfoByProjectIdAndSku(Long projectId, String projectSku) {
|
||||
LambdaQueryWrapper<ProjectSkuInfo> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(ProjectSkuInfo::getProjectId, projectId);
|
||||
queryWrapper.eq(ProjectSkuInfo::getSku, projectSku);
|
||||
return this.getOne(queryWrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ProjectSkuInfo> listByProjectId(Long projectId) {
|
||||
LambdaQueryWrapper<ProjectSkuInfo> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(ProjectSkuInfo::getProjectId, projectId);
|
||||
return this.list(queryWrapper);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,10 +44,13 @@ public class RuleAttrInfoServiceImpl extends ServiceImpl<RuleAttrInfoMapper, Rul
|
|||
queryWrapper.eq(RuleAttrInfo::getAttrValue, ruleAttrInfo.getAttrValue());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return list(queryWrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RuleAttrInfo> getInfoByRuleId(Long ruleId) {
|
||||
LambdaQueryWrapper<RuleAttrInfo> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(RuleAttrInfo::getRuleId, ruleId);
|
||||
return this.list(queryWrapper);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -102,4 +102,6 @@ public class RuleInfoServiceImpl extends ServiceImpl<RuleInfoMapper, RuleInfo>
|
|||
.total(isPage ? new PageInfo<>(list).getTotal() : 0)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
package com.muyu.shop.cart.cache.impl;
|
||||
|
||||
|
||||
import com.muyu.product.cache.datasource.ProjectInfoData;
|
||||
import com.muyu.product.domain.ProjectInfo;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author yangle
|
||||
* @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();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
package com.muyu.shop.cart.cache.impl;
|
||||
|
||||
|
||||
import com.muyu.product.cache.datasource.ProjectSkuData;
|
||||
import com.muyu.product.domain.ProjectSkuInfo;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author yangle
|
||||
* @description: 商品SKU实现类
|
||||
* @Date 2024-4-1 上午 11:38
|
||||
*/
|
||||
@Service
|
||||
public class ProjectSkuDataImpl implements ProjectSkuData {
|
||||
|
||||
/**
|
||||
* 通过键获取所有的hash数据
|
||||
* @param projectId 商品ID
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Map<String, ProjectSkuInfo> 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();
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
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 yangle
|
||||
* @description: sku库存实现类
|
||||
* @Date 2024-4-2 上午 10:53
|
||||
*/
|
||||
@Service
|
||||
public class ProjectSkuStockDataImpl implements ProjectSkuStockData {
|
||||
|
||||
@Autowired
|
||||
private RemoteProjectSkuService remoteProjectSkuService;
|
||||
@Override
|
||||
public Long getData (SkuStockKey key) {
|
||||
Result<ProjectSkuInfo> result = remoteProjectSkuService.getInfoByProjectIdAndSku(key.getProjectId(), key.getSku());
|
||||
if (Result.isSuccess(result)){
|
||||
ProjectSkuInfo projectSkuInfo = result.getData();
|
||||
if (!Objects.isNull(projectSkuInfo)){
|
||||
return projectSkuInfo.getStock();
|
||||
}
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
}
|
|
@ -3,6 +3,7 @@ package com.muyu.shop.cart.controller;
|
|||
import java.util.List;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import com.muyu.product.domain.ProjectSkuInfo;
|
||||
import com.muyu.shop.cart.domain.req.CartDetailResp;
|
||||
import io.swagger.annotations.*;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.muyu.shop.cart.service.impl;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -7,11 +9,20 @@ 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.ProjectInfoCache;
|
||||
import com.muyu.product.cache.ProjectSkuCache;
|
||||
import com.muyu.product.cache.ProjectSkuStockCache;
|
||||
import com.muyu.product.cache.RuleInfoCache;
|
||||
import com.muyu.product.cache.key.SkuStockKey;
|
||||
import com.muyu.product.cache.model.RuleAttrCacheModel;
|
||||
import com.muyu.product.cache.model.RuleCacheModel;
|
||||
import com.muyu.product.domain.ProjectInfo;
|
||||
import com.muyu.product.domain.ProjectSkuInfo;
|
||||
import com.muyu.shop.cart.cache.CartCache;
|
||||
import com.muyu.shop.cart.cache.impl.ProjectSkuStockDataImpl;
|
||||
import com.muyu.shop.cart.cache.key.CartHashKey;
|
||||
import com.muyu.shop.cart.domain.model.CartSkuModel;
|
||||
import com.muyu.shop.cart.domain.model.SkuRuleModel;
|
||||
import com.muyu.shop.cart.domain.model.StatisticsCartModel;
|
||||
import com.muyu.shop.cart.domain.req.CartDetailResp;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
|
@ -112,13 +123,82 @@ private ProjectSkuStockCache projectSkuStockCache;
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private ProjectSkuCache projectSkuCache;
|
||||
@Autowired
|
||||
private ProjectInfoCache projectInfoCache;
|
||||
@Autowired
|
||||
private RuleInfoCache ruleInfoCache;
|
||||
@Override
|
||||
public CartDetailResp detail() {
|
||||
Long userId = SecurityUtils.getUserId();
|
||||
this.cartCache.get(userId );
|
||||
List<CartInfo> cacheToList = this.cartCache.getToList(userId);
|
||||
|
||||
return null;
|
||||
List<CartSkuModel> cartSkuModelList = cacheToList.stream()
|
||||
.map(cartInfo -> {
|
||||
ProjectSkuInfo projectSkuInfo =
|
||||
projectSkuCache.get(cartInfo.getProjectId(), cartInfo.getProjectSku());
|
||||
ProjectInfo projectInfo = projectInfoCache.get(cartInfo.getProjectId());
|
||||
Long stock = projectSkuStockCache.get(
|
||||
SkuStockKey.builder()
|
||||
.projectId(cartInfo.getProjectId())
|
||||
.sku(cartInfo.getProjectSku())
|
||||
.build()
|
||||
);
|
||||
RuleCacheModel ruleInfoCacheData = ruleInfoCache.getData(projectInfo.getRuleId());
|
||||
List<RuleAttrCacheModel> ruleAttrModelList = ruleInfoCacheData.getRuleAttrModelList();
|
||||
List<SkuRuleModel> ruleModelList = new ArrayList<>();
|
||||
String projectSku = cartInfo.getProjectSku();
|
||||
String[] skuArr = projectSku.split("-");
|
||||
for (int index = 0; index < skuArr.length; index++) {
|
||||
ruleModelList.add(
|
||||
SkuRuleModel.builder().
|
||||
ruleName(ruleAttrModelList.get(index).getAttrName())
|
||||
.ruleValue(skuArr[index])
|
||||
.build()
|
||||
);
|
||||
}
|
||||
return CartSkuModel.builder()
|
||||
.projectId(cartInfo.getProjectId())
|
||||
.name(projectInfo.getName())
|
||||
.image(projectSkuInfo.getImage())
|
||||
.stock(stock)
|
||||
.subtotal(projectSkuInfo.getPrice().multiply(new BigDecimal(cartInfo.getNum())))
|
||||
.skuRuleList(ruleModelList)
|
||||
.price(projectSkuInfo.getPrice())
|
||||
.cartInfoId(cartInfo.getId())
|
||||
.num(cartInfo.getNum())
|
||||
.isSelected(cartInfo.getIsSelected())
|
||||
.build();
|
||||
}).toList();
|
||||
List<CartSkuModel> cartSkuList = new ArrayList<>();
|
||||
StatisticsCartModel statisticsCartModel = StatisticsCartModel.builder()
|
||||
.total(cartSkuModelList.stream()
|
||||
.mapToLong(CartSkuModel::getNum)
|
||||
.sum()
|
||||
)
|
||||
.selectTotal(
|
||||
cartSkuModelList.stream()
|
||||
.filter(cartSkuModel -> "Y".equals(cartSkuModel.getIsSelected()))
|
||||
.mapToLong(CartSkuModel::getNum)
|
||||
.sum()
|
||||
)
|
||||
.priceTotal(
|
||||
cartSkuModelList.stream()
|
||||
.filter(cartSkuModel -> "Y".equals(cartSkuModel.getIsSelected()))
|
||||
.map(CartSkuModel::getSubtotal)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add)
|
||||
)
|
||||
.actualTotal(
|
||||
cartSkuModelList.stream()
|
||||
.filter(cartSkuModel -> "Y".equals(cartSkuModel.getIsSelected()))
|
||||
.map(CartSkuModel::getSubtotal)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add)
|
||||
).build();
|
||||
return CartDetailResp.builder()
|
||||
.cartSkuList(cartSkuModelList)
|
||||
.statisticsCart(statisticsCartModel)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue