Price 价格服务的编写
This commit is contained in:
@@ -26,6 +26,8 @@ public interface PromotionActivityConvert {
|
||||
@Mappings({})
|
||||
List<PromotionActivityRespDTO> convertToRespDTO(List<PromotionActivityDO> activityList);
|
||||
|
||||
List<PromotionActivityRespDTO> convertList(List<PromotionActivityDO> list);
|
||||
|
||||
// @Mappings({})
|
||||
// PromotionActivityDO convert(PromotionActivityAddDTO activityAddDTO);
|
||||
//
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity;
|
||||
|
||||
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.mall.mybatis.core.dataobject.DeletableDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
@@ -11,9 +14,11 @@ import java.util.List;
|
||||
/**
|
||||
* 促销活动 DO
|
||||
*/
|
||||
@TableName(value = "promotion_activity", autoResultMap = true)
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Accessors(chain = true)
|
||||
public class PromotionActivityDO extends DeletableDO {
|
||||
public class PromotionActivityDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 活动编号
|
||||
@@ -59,10 +64,12 @@ public class PromotionActivityDO extends DeletableDO {
|
||||
/**
|
||||
* 限制折扣字符串,使用 JSON 序列化成字符串存储
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private TimeLimitedDiscount timeLimitedDiscount;
|
||||
/**
|
||||
* 满减送字符串,使用 JSON 序列化成字符串存储
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private FullPrivilege fullPrivilege;
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package cn.iocoder.mall.promotionservice.dal.mysql.mapper.activity;
|
||||
|
||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity.PromotionActivityDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@@ -8,13 +10,11 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface PromotionActivityMapper {
|
||||
public interface PromotionActivityMapper extends BaseMapper<PromotionActivityDO> {
|
||||
|
||||
PromotionActivityDO selectById(@Param("id") Integer id);
|
||||
|
||||
List<PromotionActivityDO> selectListByStatus(@Param("statuses") Collection<Integer> statuses);
|
||||
|
||||
void insert(PromotionActivityDO activity);
|
||||
default List<PromotionActivityDO> selectListByStatus(@Param("statuses") Collection<Integer> statuses) {
|
||||
return selectList(new QueryWrapper<PromotionActivityDO>().in("status", statuses));
|
||||
}
|
||||
|
||||
List<PromotionActivityDO> selectListByPage(@Param("title") String title,
|
||||
@Param("activityType") Integer activityType,
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
package cn.iocoder.mall.promotionservice.manager;
|
||||
@@ -0,0 +1,110 @@
|
||||
package cn.iocoder.mall.promotionservice.manager.price;
|
||||
|
||||
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.common.framework.util.CollectionUtils;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.productservice.rpc.sku.ProductSkuRpc;
|
||||
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO;
|
||||
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
|
||||
import cn.iocoder.mall.promotion.api.enums.PromotionActivityStatusEnum;
|
||||
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
|
||||
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.service.activity.PromotionActivityService;
|
||||
import org.apache.dubbo.config.annotation.DubboReference;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.mall.promotion.api.enums.PromotionErrorCodeConstants.PRICE_PRODUCT_SKU_NOT_EXISTS;
|
||||
|
||||
@Service
|
||||
@Validated
|
||||
public class PriceManager {
|
||||
|
||||
@DubboReference(version = "${dubbo.consumer.ProductSkuRpc.version}")
|
||||
private ProductSkuRpc productSkuRpc;
|
||||
|
||||
@Autowired
|
||||
private PromotionActivityService promotionActivityService;
|
||||
|
||||
public PriceProductCalcRespDTO calcProductPrice(PriceProductCalcReqDTO calcReqDTO) {
|
||||
// TODO 芋艿,补充一些表单校验。例如说,需要传入用户编号。
|
||||
// 校验商品都存在
|
||||
Map<Integer, PriceProductCalcReqDTO.Item> calcProductItemDTOMap = CollectionUtils.convertMap(
|
||||
calcReqDTO.getItems(), PriceProductCalcReqDTO.Item::getSkuId);
|
||||
CommonResult<List<ProductSkuRespDTO>> listProductSkusResult = productSkuRpc.listProductSkus(
|
||||
new ProductSkuListQueryReqDTO().setProductSkuIds(calcProductItemDTOMap.keySet()));
|
||||
listProductSkusResult.checkError();
|
||||
if (calcReqDTO.getItems().size() != listProductSkusResult.getData().size()) {
|
||||
throw ServiceExceptionUtil.exception(PRICE_PRODUCT_SKU_NOT_EXISTS);
|
||||
}
|
||||
// TODO 库存相关
|
||||
// 查询促销活动
|
||||
List<PromotionActivityRespDTO> activityRespDTOs = promotionActivityService.listPromotionActivitiesBySpuIds(
|
||||
calcProductItemDTOMap.keySet(), Collections.singleton(PromotionActivityStatusEnum.RUN.getValue()));
|
||||
// 拼装结果(主要是计算价格)
|
||||
PriceProductCalcRespDTO calcRespDTO = new PriceProductCalcRespDTO();
|
||||
// 1. 创建初始的每一项的数组
|
||||
List<PriceProductCalcRespDTO.Item> calcItemRespDTOs = initCalcOrderPriceItems(
|
||||
listProductSkusResult.getData(), calcProductItemDTOMap);
|
||||
// 2. 计算【限时折扣】促销
|
||||
// modifyPriceByTimeLimitDiscount(items, activityList);
|
||||
// 3. 计算【满减送】促销
|
||||
// 4. 计算优惠劵
|
||||
// 5. 计算最终的价格
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<PriceProductCalcRespDTO.Item> initCalcOrderPriceItems(List<ProductSkuRespDTO> skus,
|
||||
Map<Integer, PriceProductCalcReqDTO.Item> calcProductItemDTOMap) {
|
||||
List<PriceProductCalcRespDTO.Item> items = new ArrayList<>();
|
||||
for (ProductSkuRespDTO sku : skus) {
|
||||
PriceProductCalcRespDTO.Item item = new PriceProductCalcRespDTO.Item();
|
||||
items.add(item);
|
||||
// 将是否选中,购物数量,复制到 item 中
|
||||
PriceProductCalcReqDTO.Item calcOrderItem = calcProductItemDTOMap.get(sku.getId());
|
||||
item.setBuyQuantity(calcOrderItem.getQuantity());
|
||||
// 计算初始价格
|
||||
item.setOriginPrice(sku.getPrice());
|
||||
item.setBuyPrice(sku.getPrice());
|
||||
item.setPresentPrice(sku.getPrice());
|
||||
item.setBuyTotal(sku.getPrice() * calcOrderItem.getQuantity());
|
||||
item.setDiscountTotal(0);
|
||||
item.setPresentTotal(item.getBuyTotal());
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
// private void modifyPriceByTimeLimitDiscount(List<CalcOrderPriceBO.Item> items, List<PromotionActivityBO> activityList) {
|
||||
// for (CalcOrderPriceBO.Item item : items) {
|
||||
// // 获得符合条件的限时折扣
|
||||
// PromotionActivityBO timeLimitedDiscount = activityList.stream()
|
||||
// .filter(activity -> PromotionActivityTypeEnum.TIME_LIMITED_DISCOUNT.getValue().equals(activity.getActivityType())
|
||||
// && activity.getTimeLimitedDiscount().getItems().stream().anyMatch(item0 -> item0.getSpuId().equals(item.getSpu().getId())))
|
||||
// .findFirst().orElse(null);
|
||||
// if (timeLimitedDiscount == null) {
|
||||
// continue;
|
||||
// }
|
||||
// // 计算价格
|
||||
// ProductSkuBO sku = new ProductSkuBO().setId(item.getId()).setSpuId(item.getSpu().getId()).setPrice(item.getPrice());
|
||||
// Integer newPrice = calcSkuPriceByTimeLimitDiscount(sku, timeLimitedDiscount);
|
||||
// if (newPrice.equals(item.getPrice())) {
|
||||
// continue;
|
||||
// }
|
||||
// // 设置优惠
|
||||
// item.setActivity(timeLimitedDiscount);
|
||||
// // 设置价格
|
||||
// item.setBuyPrice(newPrice);
|
||||
// item.setBuyTotal(newPrice * item.getBuyQuantity());
|
||||
// item.setPresentTotal(item.getBuyTotal() - item.getDiscountTotal());
|
||||
// item.setPresentPrice(item.getPresentTotal() / item.getBuyQuantity());
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
package cn.iocoder.mall.promotionservice.service.activity;
|
||||
|
||||
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum;
|
||||
import cn.iocoder.mall.promotion.api.enums.RangeTypeEnum;
|
||||
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
|
||||
import cn.iocoder.mall.promotionservice.convert.activity.PromotionActivityConvert;
|
||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity.PromotionActivityDO;
|
||||
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.activity.PromotionActivityMapper;
|
||||
@@ -12,7 +12,6 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
@@ -26,11 +25,25 @@ public class PromotionActivityService {
|
||||
@Autowired
|
||||
private PromotionActivityMapper promotionActivityMapper;
|
||||
|
||||
public List<PromotionActivityDO> getPromotionActivityListBySpuId(Integer spuId, Collection<Integer> activityStatuses) {
|
||||
return this.getPromotionActivityListBySpuIds(Collections.singleton(spuId), activityStatuses);
|
||||
/**
|
||||
* 获取指定商品
|
||||
*
|
||||
* @param spuId
|
||||
* @param activityStatuses
|
||||
* @return
|
||||
*/
|
||||
public List<PromotionActivityRespDTO> listPromotionActivitiesBySpuId(Integer spuId, Collection<Integer> activityStatuses) {
|
||||
return this.listPromotionActivitiesBySpuIds(Collections.singleton(spuId), activityStatuses);
|
||||
}
|
||||
|
||||
public List<PromotionActivityDO> getPromotionActivityListBySpuIds(Collection<Integer> spuIds, Collection<Integer> activityStatuses) {
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param spuIds
|
||||
* @param activityStatuses
|
||||
* @return
|
||||
*/
|
||||
public List<PromotionActivityRespDTO> listPromotionActivitiesBySpuIds(Collection<Integer> spuIds, Collection<Integer> activityStatuses) {
|
||||
if (spuIds.isEmpty() || activityStatuses.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
@@ -64,7 +77,7 @@ public class PromotionActivityService {
|
||||
}
|
||||
}
|
||||
// 返回最终结果
|
||||
return activityList;
|
||||
return PromotionActivityConvert.INSTANCE.convertList(activityList);
|
||||
}
|
||||
|
||||
public PromotionActivityPageBO getPromotionActivityPage(Integer pageNo,Integer pageSize,String title,Integer activityType,Collection<Integer> statuses) {
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package cn.iocoder.mall.promotionservice.dal.mysql.mapper.activity;
|
||||
|
||||
import cn.iocoder.mall.promotion.api.enums.PromotionActivityStatusEnum;
|
||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity.PromotionActivityDO;
|
||||
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.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
|
||||
public class PromotionActivityMapperTest {
|
||||
|
||||
@Autowired
|
||||
private PromotionActivityMapper promotionActivityMapper;
|
||||
|
||||
@Test
|
||||
public void testSelectListByStatus() {
|
||||
List<PromotionActivityDO> result = promotionActivityMapper.selectListByStatus(
|
||||
Collections.singleton(PromotionActivityStatusEnum.RUN.getValue()));
|
||||
System.out.println(result.size());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
package cn.iocoder.mall.promotionservice;
|
||||
Reference in New Issue
Block a user