提交 5122b68a authored 作者: YunaiV's avatar YunaiV

Price 价格服务的编写

上级 ed71f5e9
...@@ -38,10 +38,7 @@ public class UsersCartController { ...@@ -38,10 +38,7 @@ public class UsersCartController {
// } // }
// //
// @GetMapping("/list")
// public CommonResult<UsersCartDetailVO> list() { // TODO 芋艿,先暂用这个 VO 。等促销活动出来后,做调整
// return getCartDetail();
// }
// //
// private CommonResult<UsersCartDetailVO> getCartDetail() { // private CommonResult<UsersCartDetailVO> getCartDetail() {
// // 获得购物车中选中的 // // 获得购物车中选中的
......
package cn.iocoder.mall.productservice.enums.sku;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
/**
* 商品 SKU 明细的字段枚举
*
* @see ProductSkuRespDTO
*/
public enum ProductSkuDetailFieldEnum {
SPU("spu"),
ATTR("attr");
/**
* 字段
*/
private final String field;
ProductSkuDetailFieldEnum(String field) {
this.field = field;
}
public String getField() {
return field;
}
}
package cn.iocoder.mall.productservice.rpc.sku.dto; package cn.iocoder.mall.productservice.rpc.sku.dto;
import cn.iocoder.mall.productservice.enums.sku.ProductSkuDetailFieldEnum;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
/** /**
* 商品 SKU 列表查询 DTO * 商品 SKU 列表查询 DTO
...@@ -26,5 +28,11 @@ public class ProductSkuListQueryReqDTO implements Serializable { ...@@ -26,5 +28,11 @@ public class ProductSkuListQueryReqDTO implements Serializable {
*/ */
private Integer productSpuId; private Integer productSpuId;
/**
* 额外返回字段
*
* @see ProductSkuDetailFieldEnum
*/
private Collection<String> fields = Collections.emptySet();
} }
...@@ -41,7 +41,7 @@ public interface ProductSpuRpc { ...@@ -41,7 +41,7 @@ public interface ProductSpuRpc {
* @param productSpuIds 商品 SPU 编号列表 * @param productSpuIds 商品 SPU 编号列表
* @return 商品 SPU 列表 * @return 商品 SPU 列表
*/ */
CommonResult<List<ProductSpuRespDTO>> listProductSpus(List<Integer> productSpuIds); CommonResult<List<ProductSpuRespDTO>> listProductSpus(Collection<Integer> productSpuIds);
/** /**
* 获得商品 SPU 分页 * 获得商品 SPU 分页
......
package cn.iocoder.mall.productservice.manager.sku; package cn.iocoder.mall.productservice.manager.sku;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.mall.productservice.convert.sku.ProductSkuConvert; import cn.iocoder.mall.productservice.convert.sku.ProductSkuConvert;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO; import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO; import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
...@@ -8,6 +9,7 @@ import cn.iocoder.mall.productservice.service.sku.bo.ProductSkuBO; ...@@ -8,6 +9,7 @@ import cn.iocoder.mall.productservice.service.sku.bo.ProductSkuBO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
...@@ -37,8 +39,13 @@ public class ProductSkuManager { ...@@ -37,8 +39,13 @@ public class ProductSkuManager {
* @return 商品 SKU列表 * @return 商品 SKU列表
*/ */
public List<ProductSkuRespDTO> listProductSkus(ProductSkuListQueryReqDTO queryReqDTO) { public List<ProductSkuRespDTO> listProductSkus(ProductSkuListQueryReqDTO queryReqDTO) {
// 获得商品 SKU 列表
List<ProductSkuBO> productSkuBOs = productSkuService.listProductSkus( List<ProductSkuBO> productSkuBOs = productSkuService.listProductSkus(
ProductSkuConvert.INSTANCE.convert(queryReqDTO)); ProductSkuConvert.INSTANCE.convert(queryReqDTO));
if (CollectionUtils.isEmpty(productSkuBOs)) {
return Collections.emptyList();
}
//
return ProductSkuConvert.INSTANCE.convertList03(productSkuBOs); return ProductSkuConvert.INSTANCE.convertList03(productSkuBOs);
} }
......
...@@ -131,7 +131,7 @@ public class ProductSpuManager { ...@@ -131,7 +131,7 @@ public class ProductSpuManager {
* @param productSpuIds 商品 SPU编号列表 * @param productSpuIds 商品 SPU编号列表
* @return 商品 SPU列表 * @return 商品 SPU列表
*/ */
public List<ProductSpuRespDTO> listProductSpus(List<Integer> productSpuIds) { public List<ProductSpuRespDTO> listProductSpus(Collection<Integer> productSpuIds) {
List<ProductSpuBO> productSpuBOs = productSpuService.listProductSpus(productSpuIds); List<ProductSpuBO> productSpuBOs = productSpuService.listProductSpus(productSpuIds);
return ProductSpuConvert.INSTANCE.convertList02(productSpuBOs); return ProductSpuConvert.INSTANCE.convertList02(productSpuBOs);
} }
......
...@@ -38,7 +38,7 @@ public class ProductSpuRpcImpl implements ProductSpuRpc { ...@@ -38,7 +38,7 @@ public class ProductSpuRpcImpl implements ProductSpuRpc {
} }
@Override @Override
public CommonResult<List<ProductSpuRespDTO>> listProductSpus(List<Integer> productSpuIds) { public CommonResult<List<ProductSpuRespDTO>> listProductSpus(Collection<Integer> productSpuIds) {
return success(productSpuManager.listProductSpus(productSpuIds)); return success(productSpuManager.listProductSpus(productSpuIds));
} }
......
...@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; ...@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.Collection;
import java.util.List; import java.util.List;
import static cn.iocoder.mall.productservice.enums.ProductErrorCodeConstants.PRODUCT_SPU_NOT_EXISTS; import static cn.iocoder.mall.productservice.enums.ProductErrorCodeConstants.PRODUCT_SPU_NOT_EXISTS;
...@@ -76,7 +77,7 @@ public class ProductSpuService { ...@@ -76,7 +77,7 @@ public class ProductSpuService {
* @param productSpuIds 商品 SPU编号列表 * @param productSpuIds 商品 SPU编号列表
* @return 商品 SPU列表 * @return 商品 SPU列表
*/ */
public List<ProductSpuBO> listProductSpus(List<Integer> productSpuIds) { public List<ProductSpuBO> listProductSpus(Collection<Integer> productSpuIds) {
List<ProductSpuDO> productSpuDOs = productSpuMapper.selectBatchIds(productSpuIds); List<ProductSpuDO> productSpuDOs = productSpuMapper.selectBatchIds(productSpuIds);
return ProductSpuConvert.INSTANCE.convertList(productSpuDOs); return ProductSpuConvert.INSTANCE.convertList(productSpuDOs);
} }
......
package cn.iocoder.mall.promotionservice.service.coupon.bo; package cn.iocoder.mall.promotion.api.rpc.coupon.dto.card;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
...@@ -7,11 +7,11 @@ import java.io.Serializable; ...@@ -7,11 +7,11 @@ import java.io.Serializable;
import java.util.Date; import java.util.Date;
/** /**
* 优惠劵 BO * 优惠劵 Response DTO
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class CouponCardBO implements Serializable { public class CouponCardRespDTO implements Serializable {
// ========== 基本信息 BEGIN ========== // ========== 基本信息 BEGIN ==========
/** /**
...@@ -100,8 +100,6 @@ public class CouponCardBO implements Serializable { ...@@ -100,8 +100,6 @@ public class CouponCardBO implements Serializable {
*/ */
private Date usedTime; private Date usedTime;
// TODO 芋艿,后续要加优惠劵的使用日志,因为下单后,可能会取消。
// ========== 使用情况 END ========== // ========== 使用情况 END ==========
/** /**
......
package cn.iocoder.mall.promotionservice.service.coupon.bo; package cn.iocoder.mall.promotion.api.rpc.coupon.dto.template;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* 优惠劵(码)模板 BO * 优惠劵(码)模板 BO
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class CouponTemplateBO implements Serializable { public class CouponTemplateRespDTO implements Serializable {
// ========== 基本信息 BEGIN ========== // ========== 基本信息 BEGIN ==========
/** /**
...@@ -85,7 +86,7 @@ public class CouponTemplateBO implements Serializable { ...@@ -85,7 +86,7 @@ public class CouponTemplateBO implements Serializable {
/** /**
* 指定商品 / 分类列表,使用逗号分隔商品编号 * 指定商品 / 分类列表,使用逗号分隔商品编号
*/ */
private String rangeValues; private List<Integer> rangeValues;
/** /**
* 生效日期类型 * 生效日期类型
* *
......
package cn.iocoder.mall.promotion.api.rpc.price; package cn.iocoder.mall.promotion.api.rpc.price;
import lombok.Data; import cn.iocoder.common.framework.vo.CommonResult;
import lombok.experimental.Accessors; import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcReqDTO;
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcRespDTO;
import javax.validation.constraints.NotNull;
import java.util.List;
/** /**
* 价格 Rpc 接口,提供价格计算的功能 * 价格 Rpc 接口,提供价格计算的功能
*/ */
public class PriceRpc { public interface PriceRpc {
CommonResult<PriceProductCalcRespDTO> calcProductPrice(PriceProductCalcReqDTO calcReqDTO);
} }
...@@ -11,7 +11,7 @@ import java.util.List; ...@@ -11,7 +11,7 @@ import java.util.List;
* 商品价格计算 Request DTO * 商品价格计算 Request DTO
*/ */
@Data @Data
@Accessors @Accessors(chain = true)
public class PriceProductCalcReqDTO implements Serializable { public class PriceProductCalcReqDTO implements Serializable {
/** /**
......
package cn.iocoder.mall.promotion.api.rpc.price.dto; package cn.iocoder.mall.promotion.api.rpc.price.dto;
import cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum;
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
...@@ -48,11 +50,14 @@ public class PriceProductCalcRespDTO implements Serializable { ...@@ -48,11 +50,14 @@ public class PriceProductCalcRespDTO implements Serializable {
@Accessors(chain = true) @Accessors(chain = true)
public static class ItemGroup { public static class ItemGroup {
// /** /**
// * 优惠活动 * 优惠活动
// */ *
// // TODO 芋艿,目前只会有【满减送】的情况,未来有新的促销方式,可能需要改成数组 * 目前会有满减送 {@link PromotionActivityTypeEnum#FULL_PRIVILEGE} 类型的活动
// private PromotionActivityBO activity; *
* // TODO 芋艿,目前只会有【满减送】的情况,未来有新的促销方式,可能需要改成数组
*/
private PromotionActivityRespDTO activity;
/** /**
* 促销减少的金额 * 促销减少的金额
* *
...@@ -77,14 +82,28 @@ public class PriceProductCalcRespDTO implements Serializable { ...@@ -77,14 +82,28 @@ public class PriceProductCalcRespDTO implements Serializable {
@Accessors(chain = true) @Accessors(chain = true)
public static class Item { public static class Item {
/**
* 商品 SPU 编号
*/
private Integer spuId;
/**
* 商品 SKU 编号
*/
private Integer skuId;
/**
* 商品 Category 编号
*/
private Integer cid;
/** /**
* 购买数量 * 购买数量
*/ */
private Integer buyQuantity; private Integer buyQuantity;
// /** /**
// * 优惠活动 * 优惠活动
// */ *
// private PromotionActivityBO activity; * 目前会有限时折扣 {@link PromotionActivityTypeEnum#TIME_LIMITED_DISCOUNT} 类型的活动
*/
private PromotionActivityRespDTO activity;
/** /**
* 原始单价,单位:分。 * 原始单价,单位:分。
*/ */
......
...@@ -4,8 +4,6 @@ import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponCardDetailRespDTO; ...@@ -4,8 +4,6 @@ import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponCardDetailRespDTO;
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponCardReqDTO; import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponCardReqDTO;
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO; import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardAvailableBO; import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardAvailableBO;
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardBO;
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardDetailBO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mappings; import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
...@@ -19,17 +17,13 @@ public interface CouponCardConvert { ...@@ -19,17 +17,13 @@ public interface CouponCardConvert {
// @Mappings({}) // @Mappings({})
// CouponCardBO convertToBO(CouponCardDO banner); // CouponCardBO convertToBO(CouponCardDO banner);
//
@Mappings({})
List<CouponCardBO> convertToBO(List<CouponCardDO> cardList);
List<CouponCardReqDTO> convertToDTO(List<CouponCardDO> cardList); List<CouponCardReqDTO> convertToDTO(List<CouponCardDO> cardList);
CouponCardReqDTO convertToSingleDTO(CouponCardDO card); CouponCardReqDTO convertToSingleDTO(CouponCardDO card);
@Mappings({})
CouponCardBO convert(CouponCardDO card);
@Mappings({}) @Mappings({})
CouponCardDetailRespDTO convert2(CouponCardDO card); CouponCardDetailRespDTO convert2(CouponCardDO card);
......
package cn.iocoder.mall.promotionservice.convert.coupon.card;
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardRespDTO;
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface CouponCardConvert {
CouponCardConvert INSTANCE = Mappers.getMapper(CouponCardConvert.class);
CouponCardRespDTO convert(CouponCardDO bean);
}
package cn.iocoder.mall.promotionservice.convert.coupon; package cn.iocoder.mall.promotionservice.convert.coupon.card;
import cn.iocoder.common.framework.util.StringUtils;
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.*; import cn.iocoder.mall.promotion.api.rpc.coupon.dto.*;
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.template.CouponTemplateRespDTO;
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO; import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO;
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardTemplateAddBO; import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardTemplateAddBO;
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardTemplateUpdateBO; import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardTemplateUpdateBO;
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponTemplateBO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings; import org.mapstruct.Mappings;
import org.mapstruct.Named;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import java.util.List; import java.util.List;
...@@ -18,9 +21,7 @@ public interface CouponTemplateConvert { ...@@ -18,9 +21,7 @@ public interface CouponTemplateConvert {
// @Mappings({}) // @Mappings({})
// CouponTemplateBO convertToBO(CouponTemplateDO banner); // CouponTemplateBO convertToBO(CouponTemplateDO banner);
//
@Mappings({})
List<CouponTemplateBO> convertToBO(List<CouponTemplateDO> templateList);
List<CouponTemplateReqDTO> convertToDTO(List<CouponTemplateDO> templateList); List<CouponTemplateReqDTO> convertToDTO(List<CouponTemplateDO> templateList);
...@@ -42,7 +43,12 @@ public interface CouponTemplateConvert { ...@@ -42,7 +43,12 @@ public interface CouponTemplateConvert {
@Mappings({}) @Mappings({})
CouponTemplateDO convert(CouponCardTemplateUpdateBO template); CouponTemplateDO convert(CouponCardTemplateUpdateBO template);
@Mappings({}) @Mapping(source = "rangeValues", target = "rangeValues", qualifiedByName = "translateStringToIntList")
CouponTemplateBO convert(CouponTemplateDO template); CouponTemplateRespDTO convert(CouponTemplateDO bean);
@Named("translateStringToIntList")
default List<Integer> translateStringToIntList(String str) {
return StringUtils.splitToInt(str, ",");
}
} }
package cn.iocoder.mall.promotionservice.rpc.price;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.promotion.api.rpc.price.PriceRpc;
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcReqDTO;
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcRespDTO;
import cn.iocoder.mall.promotionservice.manager.price.PriceManager;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@DubboService
public class PriceRpcImpl implements PriceRpc {
@Autowired
private PriceManager priceManager;
@Override
public CommonResult<PriceProductCalcRespDTO> calcProductPrice(PriceProductCalcReqDTO calcReqDTO) {
return success(priceManager.calcProductPrice(calcReqDTO));
}
}
package cn.iocoder.mall.promotionservice.service.coupon;
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardRespDTO;
import cn.iocoder.mall.promotionservice.convert.coupon.card.CouponCardConvert;
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponCardMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.Objects;
/**
* 优惠劵 Service
*/
@Service
@Validated
public class CouponCardService {
@Autowired
private CouponCardMapper couponCardMapper;
public CouponCardRespDTO getCouponCard(Integer userId, Integer couponCardId) {
CouponCardDO card = couponCardMapper.selectById(couponCardId);
if (card == null) {
return null;
}
if (!Objects.equals(userId, card.getUserId())) {
return null;
}
return CouponCardConvert.INSTANCE.convert(card);
}
}
...@@ -5,7 +5,7 @@ import cn.iocoder.common.framework.util.DateUtil; ...@@ -5,7 +5,7 @@ import cn.iocoder.common.framework.util.DateUtil;
import cn.iocoder.mall.promotion.api.enums.*; import cn.iocoder.mall.promotion.api.enums.*;
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.*; import cn.iocoder.mall.promotion.api.rpc.coupon.dto.*;
import cn.iocoder.mall.promotionservice.convert.coupon.CouponCardConvert; import cn.iocoder.mall.promotionservice.convert.coupon.CouponCardConvert;
import cn.iocoder.mall.promotionservice.convert.coupon.CouponTemplateConvert; import cn.iocoder.mall.promotionservice.convert.coupon.card.CouponTemplateConvert;
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO; import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO; import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO;
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponCardMapper; import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponCardMapper;
...@@ -31,11 +31,6 @@ public class CouponService { ...@@ -31,11 +31,6 @@ public class CouponService {
// ========== 优惠劵(码)模板 ========== // ========== 优惠劵(码)模板 ==========
public cn.iocoder.mall.promotionservice.service.coupon.bo.CouponTemplateBO getCouponTemplate(Integer couponTemplateId) {
CouponTemplateDO template = couponTemplateMapper.selectById(couponTemplateId);
return CouponTemplateConvert.INSTANCE.convert(template);
}
public CouponTemplatePageRespDTO getCouponTemplatePage(CouponTemplatePageReqDTO couponTemplatePageDTO) { public CouponTemplatePageRespDTO getCouponTemplatePage(CouponTemplatePageReqDTO couponTemplatePageDTO) {
CouponTemplatePageRespDTO couponTemplatePageBO = new CouponTemplatePageRespDTO(); CouponTemplatePageRespDTO couponTemplatePageBO = new CouponTemplatePageRespDTO();
// 查询分页数据 // 查询分页数据
...@@ -51,7 +46,7 @@ public class CouponService { ...@@ -51,7 +46,7 @@ public class CouponService {
return couponTemplatePageBO; return couponTemplatePageBO;
} }
public cn.iocoder.mall.promotionservice.service.coupon.bo.CouponTemplateBO addCouponCardTemplate(CouponCardTemplateAddBO couponCardTemplateAddDTO) { public Integer addCouponCardTemplate(CouponCardTemplateAddBO couponCardTemplateAddDTO) {
// 校验生效日期相关 // 校验生效日期相关
checkCouponTemplateDateType(couponCardTemplateAddDTO.getDateType(), checkCouponTemplateDateType(couponCardTemplateAddDTO.getDateType(),
couponCardTemplateAddDTO.getValidStartTime(), couponCardTemplateAddDTO.getValidEndTime(), couponCardTemplateAddDTO.getValidStartTime(), couponCardTemplateAddDTO.getValidEndTime(),
...@@ -68,7 +63,7 @@ public class CouponService { ...@@ -68,7 +63,7 @@ public class CouponService {
template.setCreateTime(new Date()); template.setCreateTime(new Date());
couponTemplateMapper.insert(template); couponTemplateMapper.insert(template);
// 返回成功 // 返回成功
return CouponTemplateConvert.INSTANCE.convert(template); return template.getId();
} }
public Boolean updateCouponCodeTemplate(CouponCodeTemplateUpdateBO couponCodeTemplateUpdateDTO) { public Boolean updateCouponCodeTemplate(CouponCodeTemplateUpdateBO couponCodeTemplateUpdateDTO) {
......
package cn.iocoder.mall.promotionservice.service.coupon;
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.template.CouponTemplateRespDTO;
import cn.iocoder.mall.promotionservice.convert.coupon.card.CouponTemplateConvert;
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponTemplateMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
/**
* 优惠劵模板 Service
*/
@Service
@Validated
public class CouponTemplateService {
@Autowired
private CouponTemplateMapper couponTemplateMapper;
public CouponTemplateRespDTO getCouponTemplate(Integer couponCardId) {
return CouponTemplateConvert.INSTANCE.convert(couponTemplateMapper.selectById(couponCardId));
}
}
...@@ -41,7 +41,7 @@ dubbo: ...@@ -41,7 +41,7 @@ dubbo:
version: 1.0.0 version: 1.0.0
ProductSkuRpc: ProductSkuRpc:
version: 1.0.0 version: 1.0.0
ProductSpuService: ProductSpuRpc:
version: 1.0.0 version: 1.0.0
# RocketMQ 配置项 # RocketMQ 配置项
......
package cn.iocoder.mall.promotionservice.manager.price;
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcReqDTO;
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcRespDTO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Arrays;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class PriceManagerTest {
@Autowired
private PriceManager priceManager;
@Test
public void testCalcProductPrice() {
PriceProductCalcReqDTO calcReqDTO = new PriceProductCalcReqDTO();
PriceProductCalcReqDTO.Item item01 = new PriceProductCalcReqDTO.Item(33, 2); // 满足满减送的商品
PriceProductCalcReqDTO.Item item02 = new PriceProductCalcReqDTO.Item(34, 2); // 满足限时折扣的商品
calcReqDTO.setItems(Arrays.asList(item01, item02));
PriceProductCalcRespDTO calcRespDTO = priceManager.calcProductPrice(calcReqDTO);
System.out.println(calcRespDTO);
}
}
...@@ -72,6 +72,12 @@ ...@@ -72,6 +72,12 @@
<artifactId>order-service-api</artifactId> <artifactId>order-service-api</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<!-- 营销服务 -->
<groupId>cn.iocoder.mall</groupId>
<artifactId>promotion-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<!-- 系统服务 --> <!-- 系统服务 -->
<groupId>cn.iocoder.mall</groupId> <groupId>cn.iocoder.mall</groupId>
......
...@@ -2,6 +2,7 @@ package cn.iocoder.mall.shopweb.controller.order; ...@@ -2,6 +2,7 @@ package cn.iocoder.mall.shopweb.controller.order;
import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.security.user.core.context.UserSecurityContextHolder; import cn.iocoder.mall.security.user.core.context.UserSecurityContextHolder;
import cn.iocoder.mall.shopweb.controller.order.vo.cart.CartDetailVO;
import cn.iocoder.mall.shopweb.manager.order.cart.CartManager; import cn.iocoder.mall.shopweb.manager.order.cart.CartManager;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
...@@ -40,4 +41,10 @@ public class CartController { ...@@ -40,4 +41,10 @@ public class CartController {
return success(cartManager.sumCartItemQuantity(UserSecurityContextHolder.getUserId())); return success(cartManager.sumCartItemQuantity(UserSecurityContextHolder.getUserId()));
} }
@GetMapping("/get-detail")
@ApiOperation("查询用户的购物车的商品列表")
public CommonResult<CartDetailVO> getCartDetail() {
return success(cartManager.getCartDetail());
}
} }
package cn.iocoder.mall.shopweb.controller.order.vo.cart;
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
import cn.iocoder.mall.shopweb.controller.product.vo.attr.ProductAttrKeyValueRespVO;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@ApiModel(value = "用户的购物车明细 VO")
@Data
@Accessors(chain = true)
public class CartDetailVO {
/**
* 商品分组数组
*/
private List<ItemGroup> itemGroups;
/**
* 费用
*/
private Fee fee;
/**
* 商品分组
*
* 多个商品,参加同一个活动,从而形成分组。
*/
@Data
@Accessors(chain = true)
public static class ItemGroup {
/**
* 优惠活动
*/
private PromotionActivityRespDTO activity; // TODO 芋艿,偷懒
/**
* 促销减少的金额
*
* 1. 若未参与促销活动,或不满足促销条件,返回 null
* 2. 该金额,已经分摊到每个 Item 的 discountTotal ,需要注意。
*/
private Integer activityDiscountTotal;
/**
* 商品数组
*/
private List<Sku> items;
}
@Data
@Accessors(chain = true)
public static class Sku {
// SKU 自带信息
/**
* sku 编号
*/
private Integer id;
/**
* SPU 信息
*/
private Spu spu;
/**
* 图片地址
*/
private String picURL;
/**
* 规格值数组
*/
private List<ProductAttrKeyValueRespVO> attrs; // TODO 后面改下
/**
* 价格,单位:分
*/
private Integer price;
/**
* 库存数量
*/
private Integer quantity;
// 非 SKU 自带信息
/**
* 购买数量
*/
private Integer buyQuantity;
/**
* 是否选中
*/
private Boolean selected;
/**
* 优惠活动
*/
private PromotionActivityRespDTO activity; // TODO 芋艿,偷懒
/**
* 原始单价,单位:分。
*/
private Integer originPrice;
/**
* 购买单价,单位:分
*/
private Integer buyPrice;
/**
* 最终价格,单位:分。
*/
private Integer presentPrice;
/**
* 购买总金额,单位:分
*
* 用途类似 {@link #presentTotal}
*/
private Integer buyTotal;
/**
* 优惠总金额,单位:分。
*/
private Integer discountTotal;
/**
* 最终总金额,单位:分。
*
* 注意,presentPrice * quantity 不一定等于 presentTotal 。
* 因为,存在无法整除的情况。
* 举个例子,presentPrice = 8.33 ,quantity = 3 的情况,presentTotal 有可能是 24.99 ,也可能是 25 。
* 所以,需要存储一个该字段。
*/
private Integer presentTotal;
}
@Data
@Accessors(chain = true)
public static class Spu {
/**
* SPU 编号
*/
private Integer id;
// ========== 基本信息 =========
/**
* SPU 名字
*/
private String name;
/**
* 分类编号
*/
private Integer cid;
/**
* 商品主图地址
*
* 数组,以逗号分隔
*
* 建议尺寸:800*800像素,你可以拖拽图片调整顺序,最多上传15张
*/
private List<String> picUrls;
}
/**
* 费用(合计)
*/
@Data
@Accessors(chain = true)
public static class Fee {
/**
* 购买总价
*/
private Integer buyTotal;
/**
* 优惠总价
*
* 注意,满多少元包邮,不算在优惠中。
*/
private Integer discountTotal;
/**
* 邮费
*/
private Integer postageTotal;
/**
* 最终价格
*
* 计算公式 = 总价 - 优惠总价 + 邮费
*/
private Integer presentTotal;
public Fee() {
}
public Fee(Integer buyTotal, Integer discountTotal, Integer postageTotal, Integer presentTotal) {
this.buyTotal = buyTotal;
this.discountTotal = discountTotal;
this.postageTotal = postageTotal;
this.presentTotal = presentTotal;
}
}
/**
* 邮费信息 TODO 芋艿,未完成
*/
@Data
@Accessors(chain = true)
public static class Postage {
/**
* 需要满足多少钱,可以包邮。单位:分
*/
private Integer threshold;
}
}
package cn.iocoder.mall.shopweb.convert.order;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface CartConvert {
CartConvert INSTANCE = Mappers.getMapper(CartConvert.class);
}
package cn.iocoder.mall.shopweb.manager.order.cart; package cn.iocoder.mall.shopweb.manager.order.cart;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.orderservice.rpc.cart.CartRpc; import cn.iocoder.mall.orderservice.rpc.cart.CartRpc;
import cn.iocoder.mall.orderservice.rpc.cart.dto.CartItemAddReqDTO; import cn.iocoder.mall.orderservice.rpc.cart.dto.CartItemAddReqDTO;
import cn.iocoder.mall.orderservice.rpc.cart.dto.CartItemListReqDTO;
import cn.iocoder.mall.orderservice.rpc.cart.dto.CartItemRespDTO;
import cn.iocoder.mall.promotion.api.rpc.price.PriceRpc;
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcReqDTO;
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcRespDTO;
import cn.iocoder.mall.shopweb.controller.order.vo.cart.CartDetailVO;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* 购物车 Manager * 购物车 Manager
*/ */
...@@ -14,6 +25,8 @@ public class CartManager { ...@@ -14,6 +25,8 @@ public class CartManager {
@DubboReference(version = "${dubbo.consumer.ProductCategoryRpc.version}") @DubboReference(version = "${dubbo.consumer.ProductCategoryRpc.version}")
private CartRpc cartRpc; private CartRpc cartRpc;
@DubboReference(version = "${dubbo.consumer.PriceRpc.version}")
private PriceRpc priceRpc;
/** /**
* 添加商品到购物车 * 添加商品到购物车
...@@ -40,4 +53,33 @@ public class CartManager { ...@@ -40,4 +53,33 @@ public class CartManager {
return sumCartItemQuantityResult.getData(); return sumCartItemQuantityResult.getData();
} }
/**
* 查询用户的购物车的商品列表
*
* @return 商品列表
*/
public CartDetailVO getCartDetail(Integer userId) {
// 获得购物车中选中的
CommonResult<List<CartItemRespDTO>> listCartItemsResult = cartRpc.listCartItems(new CartItemListReqDTO().setUserId(userId));
listCartItemsResult.checkError();
// 购物车为空时,构造空的 UsersOrderConfirmCreateVO 返回
if (CollectionUtils.isEmpty(listCartItemsResult.getData())) {
CartDetailVO result = new CartDetailVO();
result.setItemGroups(Collections.emptyList());
result.setFee(new CartDetailVO.Fee(0, 0, 0, 0));
return result;
}
// 计算选中的商品价格
CommonResult<PriceProductCalcRespDTO> calcProductPriceResult = priceRpc.calcProductPrice(new PriceProductCalcReqDTO().setUserId(userId)
.setItems(listCartItemsResult.getData().stream()
.filter(CartItemRespDTO::getSelected)
.map(cartItem -> new PriceProductCalcReqDTO.Item(cartItem.getSkuId(), cartItem.getQuantity()))
.collect(Collectors.toList())));
calcProductPriceResult.checkError();
// 拼接结果
// 执行数据拼装
return null;
}
} }
...@@ -39,6 +39,8 @@ dubbo: ...@@ -39,6 +39,8 @@ dubbo:
version: 1.0.0 version: 1.0.0
SearchProductRpc: SearchProductRpc:
version: 1.0.0 version: 1.0.0
PriceRpc:
version: 1.0.0
# Swagger 配置项 # Swagger 配置项
swagger: swagger:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论