添加购物车 完善
parent
4d2c371407
commit
bef7a05ae6
|
@ -0,0 +1,58 @@
|
||||||
|
package com.muyu.product.cache;
|
||||||
|
|
||||||
|
import com.muyu.common.cache.abs.CacheAbs;
|
||||||
|
import com.muyu.common.core.text.Convert;
|
||||||
|
import com.muyu.product.cache.datasource.RuleCacheData;
|
||||||
|
import com.muyu.product.cache.model.RuleCacheModel;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格缓存 RuleInfoCache
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RuleInfoCache extends CacheAbs<Long, RuleCacheModel> {
|
||||||
|
@Autowired
|
||||||
|
private RuleCacheData ruleCacheData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从数据库获取数据
|
||||||
|
* @param key ID
|
||||||
|
* @return 缓存对象
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public RuleCacheModel getData(Long key) {
|
||||||
|
return ruleCacheData.getRulerCacheModel(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认值
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public RuleCacheModel defaultValue() {
|
||||||
|
return new RuleCacheModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 前缀
|
||||||
|
* @return key 前缀
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String keyPre() {
|
||||||
|
return "rule:info";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解码
|
||||||
|
* @param redisKey 数据库键
|
||||||
|
* @return ID
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Long decode(String redisKey) {
|
||||||
|
return Convert.toLong(redisKey.replace(keyPre(), ""));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
image:""
|
||||||
|
商品信息:{}
|
||||||
|
sku:""
|
||||||
|
价格:""
|
||||||
|
数量:""
|
||||||
|
小计:""
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.muyu.product.cache.datasource;
|
||||||
|
|
||||||
|
import com.muyu.product.cache.model.RuleCacheModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格缓存数据获取 RuleCacheData
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
|
||||||
|
public interface RuleCacheData {
|
||||||
|
|
||||||
|
public RuleCacheModel getRulerCacheModel(Long ruleId);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.muyu.product.cache.datasource.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import com.muyu.common.core.domain.Result;
|
||||||
|
|
||||||
|
import com.muyu.product.cache.datasource.ProjectInfoData;
|
||||||
|
import com.muyu.product.cache.datasource.ProjectSkuData;
|
||||||
|
import com.muyu.product.domain.ProjectInfo;
|
||||||
|
import com.muyu.product.domain.ProjectSkuInfo;
|
||||||
|
import com.muyu.product.remote.RemoteProjectInfoService;
|
||||||
|
import com.muyu.product.remote.RemoteProjectSkuService;
|
||||||
|
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 yangle
|
||||||
|
* @description: 缓存数据获取
|
||||||
|
* @Date 2024-3-27 下午 03:37
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class ProjectInfoDataRemoteImpl implements ProjectInfoData {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RemoteProjectInfoService remoteProjectInfoService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从数据库获取数据
|
||||||
|
* @param key ID
|
||||||
|
* @return 缓存对象
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public ProjectInfo getData (Long key) {
|
||||||
|
Result<ProjectInfo> projectInfoResult = remoteProjectInfoService.getInfo(key);
|
||||||
|
if (Result.isError(projectInfoResult)){
|
||||||
|
return new ProjectInfo();
|
||||||
|
}
|
||||||
|
return projectInfoResult.getData();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.muyu.product.cache.datasource.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import com.muyu.common.core.domain.Result;
|
||||||
|
import com.muyu.product.cache.datasource.ProjectInfoData;
|
||||||
|
import com.muyu.product.cache.datasource.ProjectSkuData;
|
||||||
|
import com.muyu.product.domain.ProjectInfo;
|
||||||
|
import com.muyu.product.domain.ProjectSkuInfo;
|
||||||
|
import com.muyu.product.remote.RemoteProjectInfoService;
|
||||||
|
import com.muyu.product.remote.RemoteProjectSkuService;
|
||||||
|
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 yangle
|
||||||
|
* @description: 商品SKU实现类
|
||||||
|
* @Date 2024-4-1 上午 11:38
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class ProjectSkuDataRemoteImpl implements ProjectSkuData {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RemoteProjectSkuService remoteProjectSkuService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过键获取所有的hash数据
|
||||||
|
* @param projectId 商品ID
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Map<String, ProjectSkuInfo> getData (Long projectId) {
|
||||||
|
Result<List<ProjectSkuInfo>> projectListResult
|
||||||
|
= remoteProjectSkuService.listByProjectId(projectId);
|
||||||
|
if (Result.isError(projectListResult)){
|
||||||
|
return new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ProjectSkuInfo> projectSkuInfoList = projectListResult.getData();
|
||||||
|
return projectSkuInfoList.stream()
|
||||||
|
.collect(Collectors.toMap(ProjectSkuInfo::getSku, projectSkuInfo -> projectSkuInfo));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过缓存键和hash键获取hash值
|
||||||
|
* @param projectId 商品ID
|
||||||
|
* @param projectSku 商品SKU
|
||||||
|
* @return hash值
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public ProjectSkuInfo getData (Long projectId, String projectSku) {
|
||||||
|
Result<ProjectSkuInfo> projectSkuInfoResult = remoteProjectSkuService.getInfoByProjectIdAndSku(
|
||||||
|
projectId, projectSku
|
||||||
|
);
|
||||||
|
if (Result.isError(projectSkuInfoResult)){
|
||||||
|
return new ProjectSkuInfo();
|
||||||
|
}
|
||||||
|
return projectSkuInfoResult.getData();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.muyu.product.cache.datasource.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 ProjectSkuStockDataRemoteImpl 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.muyu.product.cache.datasource.impl;
|
||||||
|
|
||||||
|
import com.muyu.common.core.domain.Result;
|
||||||
|
import com.muyu.product.cache.datasource.RuleCacheData;
|
||||||
|
import com.muyu.product.cache.model.RuleAttrCacheModel;
|
||||||
|
import com.muyu.product.cache.model.RuleCacheModel;
|
||||||
|
import com.muyu.product.domain.RuleAttrInfo;
|
||||||
|
import com.muyu.product.domain.RuleInfo;
|
||||||
|
import com.muyu.product.remote.RemoteRuleAttrService;
|
||||||
|
import com.muyu.product.remote.RemoteRuleService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格数据获取实现层 默认就读远程调用 RuleCacheDataImpl
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
public class RuleCacheDataRemoteImpl implements RuleCacheData {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RemoteRuleService remoteRuleService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RemoteRuleAttrService remoteRuleAttrService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RuleCacheModel getRulerCacheModel(Long ruleId) {
|
||||||
|
Result<RuleInfo> ruleInfoResult = remoteRuleService.getInfo(ruleId);
|
||||||
|
Result<List<RuleAttrInfo>> ruleAttrResult = remoteRuleAttrService.getInfoByRuleId(ruleId);
|
||||||
|
if (Result.isError(ruleInfoResult) || Result.isError(ruleAttrResult)) {
|
||||||
|
return new RuleCacheModel();
|
||||||
|
}
|
||||||
|
RuleInfo ruleInfo = ruleInfoResult.getData();
|
||||||
|
List<RuleAttrInfo> ruleAttrInfoList = ruleAttrResult.getData();
|
||||||
|
List<RuleAttrCacheModel> attrCacheModelList = ruleAttrInfoList.stream()
|
||||||
|
.map(RuleAttrCacheModel::ruleAttrBuild)
|
||||||
|
.toList();
|
||||||
|
return RuleCacheModel.builder()
|
||||||
|
.ruleName(ruleInfo.getName())
|
||||||
|
.ruleAttrModelList(attrCacheModelList)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.muyu.product.cache.model;
|
||||||
|
|
||||||
|
import com.muyu.product.domain.RuleAttrInfo;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格类型缓存模型
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class RuleAttrCacheModel {
|
||||||
|
/**
|
||||||
|
* 类目名称
|
||||||
|
*/
|
||||||
|
private String attrName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格值
|
||||||
|
*/
|
||||||
|
private List<String> attrValueList;
|
||||||
|
|
||||||
|
public static RuleAttrCacheModel ruleAttrBuild(RuleAttrInfo ruleAttrInfo){
|
||||||
|
return RuleAttrCacheModel.builder()
|
||||||
|
.attrName(ruleAttrInfo.getName())
|
||||||
|
.attrValueList(Arrays.stream(ruleAttrInfo.getAttrValue().split(",")).toList())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.muyu.product.cache.model;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格缓存模型 RuleCacheModel
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class RuleCacheModel {
|
||||||
|
/**
|
||||||
|
* 规格名称
|
||||||
|
*/
|
||||||
|
private String ruleName;
|
||||||
|
/**
|
||||||
|
* 规格缓存模型
|
||||||
|
*/
|
||||||
|
private List<RuleAttrCacheModel> ruleAttrModelList;
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
com.muyu.product.cache.ProjectInfoCache
|
||||||
|
com.muyu.product.cache.ProjectSkuCache
|
||||||
|
com.muyu.product.cache.ProjectSkuStockCache
|
||||||
|
com.muyu.product.cache.RuleInfoCache
|
||||||
|
com.muyu.product.cache.datasource.impl.RuleCacheDataRemoteImpl
|
||||||
|
com.muyu.product.cache.datasource.impl.ProjectInfoDataRemoteImpl
|
||||||
|
com.muyu.product.cache.datasource.impl.ProjectSkuDataRemoteImpl
|
||||||
|
com.muyu.product.cache.datasource.impl.ProjectSkuStockDataRemoteImpl
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.muyu.product.remote;
|
||||||
|
|
||||||
|
import com.muyu.common.core.constant.ServiceNameConstants;
|
||||||
|
import com.muyu.common.core.domain.Result;
|
||||||
|
import com.muyu.product.domain.ProjectInfo;
|
||||||
|
import com.muyu.product.remote.factory.RemoteProjectInfoFactory;
|
||||||
|
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 LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FeignClient(
|
||||||
|
contextId = "remoteProjectInfoService",
|
||||||
|
value = ServiceNameConstants.PRODUCT_SERVICE,
|
||||||
|
fallbackFactory = RemoteProjectInfoFactory.class,
|
||||||
|
path = "/info"
|
||||||
|
)
|
||||||
|
public interface RemoteProjectInfoService {
|
||||||
|
/**
|
||||||
|
* 获取商品信息详细信息
|
||||||
|
*/
|
||||||
|
@GetMapping(value = "/{id}")
|
||||||
|
public Result<ProjectInfo> getInfo(@PathVariable("id") Long id);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
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;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 远程调用业务层 RemoteProjectSkuService
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/7
|
||||||
|
*/
|
||||||
|
@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<ProjectSkuInfo> getInfoByProjectIdAndSku(@PathVariable("projectId") Long projectId,
|
||||||
|
@PathVariable("projectSku") String projectSku);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过商品ID获取SKU集合
|
||||||
|
* @param projectId 商品ID
|
||||||
|
* @return 商品SKU信息
|
||||||
|
*/
|
||||||
|
@GetMapping("/list/{projectId}")
|
||||||
|
public Result<List<ProjectSkuInfo>> listByProjectId(@PathVariable("projectId")Long projectId);
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.muyu.product.remote;
|
||||||
|
|
||||||
|
import com.muyu.common.core.constant.ServiceNameConstants;
|
||||||
|
import com.muyu.common.core.domain.Result;
|
||||||
|
import com.muyu.product.domain.RuleAttrInfo;
|
||||||
|
import com.muyu.product.remote.factory.RemoteRuleAttrFactory;
|
||||||
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格信息远程调用业务层
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
@FeignClient(
|
||||||
|
contextId = "remoteRuleAttrService",
|
||||||
|
value = ServiceNameConstants.PRODUCT_SERVICE,
|
||||||
|
fallbackFactory = RemoteRuleAttrFactory.class,
|
||||||
|
path = "/ruleAttr"
|
||||||
|
)
|
||||||
|
public interface RemoteRuleAttrService {
|
||||||
|
@GetMapping(value = "/list/ruleId/{ruleId}")
|
||||||
|
public Result<List<RuleAttrInfo>> getInfoByRuleId(@PathVariable("id") Long id);
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.muyu.product.remote;
|
||||||
|
|
||||||
|
import com.muyu.common.core.constant.ServiceNameConstants;
|
||||||
|
import com.muyu.common.core.domain.Result;
|
||||||
|
import com.muyu.product.domain.RuleInfo;
|
||||||
|
import com.muyu.product.remote.factory.RemoteRuleFactory;
|
||||||
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格远程调用业务层
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
@FeignClient(
|
||||||
|
contextId = "remoteRuleService",
|
||||||
|
value = ServiceNameConstants.PRODUCT_SERVICE,
|
||||||
|
fallbackFactory = RemoteRuleFactory.class,
|
||||||
|
path = "/rule"
|
||||||
|
)
|
||||||
|
public interface RemoteRuleService {
|
||||||
|
/**
|
||||||
|
* 获取商品规格详情信息
|
||||||
|
*/
|
||||||
|
@GetMapping(value = "/{id}")
|
||||||
|
public Result<RuleInfo> getInfo(@PathVariable("id") Long id );
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.muyu.product.remote.factory;
|
||||||
|
|
||||||
|
import com.muyu.common.core.domain.Result;
|
||||||
|
import com.muyu.product.domain.ProjectInfo;
|
||||||
|
import com.muyu.product.remote.RemoteProjectInfoService;
|
||||||
|
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格远程调用熔断器 RemoteProjectInfoFactory
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RemoteProjectInfoFactory implements FallbackFactory<RemoteProjectInfoService> {
|
||||||
|
@Override
|
||||||
|
public RemoteProjectInfoService create(Throwable cause) {
|
||||||
|
return new RemoteProjectInfoService() {
|
||||||
|
/**
|
||||||
|
* 获取商品详情信息
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<ProjectInfo> getInfo(Long id) {
|
||||||
|
return Result.error(cause.getMessage());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
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;
|
||||||
|
|
||||||
|
import java.rmi.Remote;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 远城调熔断器 RemoteProjectSkuFactory
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/7
|
||||||
|
*/
|
||||||
|
public class RemoteProjectSkuFactory implements FallbackFactory<RemoteProjectSkuService> {
|
||||||
|
@Override
|
||||||
|
public RemoteProjectSkuService create(Throwable cause) {
|
||||||
|
return new RemoteProjectSkuService() {
|
||||||
|
@Override
|
||||||
|
public Result<ProjectSkuInfo> getInfoByProjectIdAndSku(Long projectId, String projectSku) {
|
||||||
|
return Result.error(cause.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过商品ID和sku获取sku信息
|
||||||
|
* @param projectId 商品ID
|
||||||
|
* @return 商品sku信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<List<ProjectSkuInfo>> listByProjectId(Long projectId) {
|
||||||
|
return Result.error(cause.getMessage());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.muyu.product.remote.factory;
|
||||||
|
|
||||||
|
import com.muyu.common.core.domain.Result;
|
||||||
|
import com.muyu.product.domain.RuleAttrInfo;
|
||||||
|
import com.muyu.product.remote.RemoteRuleAttrService;
|
||||||
|
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格详情远程调用熔断器 RemoteRuleAttrFactory
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
public class RemoteRuleAttrFactory implements FallbackFactory<RemoteRuleAttrService> {
|
||||||
|
@Override
|
||||||
|
public RemoteRuleAttrService create(Throwable cause) {
|
||||||
|
return new RemoteRuleAttrService() {
|
||||||
|
/**
|
||||||
|
* 获取规格详情信息
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<List<RuleAttrInfo>> getInfoByRuleId(Long id) {
|
||||||
|
return Result.error(cause.getMessage());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.muyu.product.remote.factory;
|
||||||
|
|
||||||
|
import com.muyu.common.core.domain.Result;
|
||||||
|
import com.muyu.product.domain.RuleInfo;
|
||||||
|
import com.muyu.product.remote.RemoteRuleService;
|
||||||
|
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格远程调用熔断器
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RemoteRuleFactory implements FallbackFactory<RemoteRuleService> {
|
||||||
|
@Override
|
||||||
|
public RemoteRuleService create(Throwable cause) {
|
||||||
|
return new RemoteRuleService() {
|
||||||
|
/**
|
||||||
|
* 获取商品规格详情信息
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<RuleInfo> getInfo(Long id) {
|
||||||
|
return Result.error(cause.getMessage());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
com.muyu.product.remote.factory.RemoteRuleFactory
|
||||||
|
com.muyu.product.remote.factory.RemoteRuleAttrFactory
|
||||||
|
com.muyu.product.remote.factory.RemoteProjectInfoFactory
|
||||||
|
com.muyu.product.remote.factory.RemoteProjectSkuFactory
|
|
@ -0,0 +1,79 @@
|
||||||
|
package com.muyu.shop.cart.domain;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.muyu.common.core.web.domain.BaseEntity;
|
||||||
|
import com.muyu.shop.cart.domain.model.SkuRuleModel;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.SuperBuilder;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 练习builder Executor
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/8
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@SuperBuilder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class ExecutorBuilder extends BaseEntity {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 购物车ID
|
||||||
|
*/
|
||||||
|
private Long cartInfoId;
|
||||||
|
/**
|
||||||
|
* 图片
|
||||||
|
*/
|
||||||
|
private String image;
|
||||||
|
/**
|
||||||
|
* 商品ID
|
||||||
|
*/
|
||||||
|
private Long projectId;
|
||||||
|
/**
|
||||||
|
* 商品名称
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品sku价格
|
||||||
|
*/
|
||||||
|
private BigDecimal price;
|
||||||
|
/**
|
||||||
|
* sku规格集合
|
||||||
|
*/
|
||||||
|
private List<SkuRuleModel> skuRuleList;
|
||||||
|
/**
|
||||||
|
* 购物车数量
|
||||||
|
*/
|
||||||
|
private Long num;
|
||||||
|
/**
|
||||||
|
* 库存
|
||||||
|
*/
|
||||||
|
private Long stock;
|
||||||
|
/**
|
||||||
|
* 购物车小计
|
||||||
|
*/
|
||||||
|
private BigDecimal subtotal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否选中
|
||||||
|
*/
|
||||||
|
private String isSelected;
|
||||||
|
|
||||||
|
public static ExecutorBuilder create() {
|
||||||
|
return ExecutorBuilder.builder()
|
||||||
|
.cartInfoId(new CartInfo().getId())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
package com.muyu.shop.cart.domain.model;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 购物车品类信息 CartSkuModel
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/7
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class CartSkuModel {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 购物车ID
|
||||||
|
*/
|
||||||
|
private Long cartInfoId;
|
||||||
|
/**
|
||||||
|
* 图片
|
||||||
|
*/
|
||||||
|
private String image;
|
||||||
|
/**
|
||||||
|
* 商品ID
|
||||||
|
*/
|
||||||
|
private Long projectId;
|
||||||
|
/**
|
||||||
|
* 商品名称
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品sku价格
|
||||||
|
*/
|
||||||
|
private BigDecimal price;
|
||||||
|
/**
|
||||||
|
* sku规格集合
|
||||||
|
*/
|
||||||
|
private List<SkuRuleModel> skuRuleList;
|
||||||
|
/**
|
||||||
|
* 购物车数量
|
||||||
|
*/
|
||||||
|
private Long num;
|
||||||
|
/**
|
||||||
|
* 库存
|
||||||
|
*/
|
||||||
|
private Long stock;
|
||||||
|
/**
|
||||||
|
* 购物车小计
|
||||||
|
*/
|
||||||
|
private BigDecimal subtotal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否选中
|
||||||
|
*/
|
||||||
|
private String isSelected;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.muyu.shop.cart.domain.model;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sku规格 SkuRuleModel
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/7
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class SkuRuleModel {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格名称
|
||||||
|
*/
|
||||||
|
private String ruleName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格属性
|
||||||
|
*/
|
||||||
|
private String ruleValue;
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package com.muyu.shop.cart.domain.model;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 购物车统计 StaticsCartModel
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/7
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class StatisticsCartModel {
|
||||||
|
/**
|
||||||
|
* 商品总数
|
||||||
|
*/
|
||||||
|
private Long total;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选择总数
|
||||||
|
*/
|
||||||
|
private Long selectTotal;
|
||||||
|
/**
|
||||||
|
* 商品总价
|
||||||
|
*/
|
||||||
|
private BigDecimal priceTotal;
|
||||||
|
/**
|
||||||
|
* 实际总价
|
||||||
|
*/
|
||||||
|
private BigDecimal actualTotal;
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.muyu.shop.cart.domain.req;
|
||||||
|
|
||||||
|
import com.muyu.shop.cart.domain.model.CartSkuModel;
|
||||||
|
import com.muyu.shop.cart.domain.model.StatisticsCartModel;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品详情返回结果集 CartDetailResp
|
||||||
|
*
|
||||||
|
* @author LeYang
|
||||||
|
* on 2024/4/7
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class CartDetailResp {
|
||||||
|
/**
|
||||||
|
* 购物车商品集合
|
||||||
|
*/
|
||||||
|
private List<CartSkuModel> cartSkuList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 购物车统计
|
||||||
|
*/
|
||||||
|
private StatisticsCartModel statisticsCart;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue