文档章节

类属性的继承/接口的继承/抽象方法的重写复用

R
 Refresh-LV
发布于 2017/07/29 18:29
字数 1449
阅读 6
收藏 0

----------------DiscountPromotion 继承BaseHomePromotion ---------------------------------

public class DiscountPromotion extends BaseHomePromotion {

    private static final long serialVersionUID = 5238792060734503506L;
    private Boolean isCumulative;
    private List<DiscountPromotionProduct> productList;
    private DiscountPromotionTemplateType discountPromotionTemplateType;
    private List<DiscountPromotionTemplateItem> templateItemList;
    public List<DiscountPromotionProduct> getProductList() {

        return productList;
    }
    public void setProductList(List<DiscountPromotionProduct> productList) {

        this.productList = productList;
    }
    public DiscountPromotionTemplateType getDiscountPromotionTemplateType() {

        return discountPromotionTemplateType;
    }
    public void setDiscountPromotionTemplateType(DiscountPromotionTemplateType discountPromotionTemplateType) {

        this.discountPromotionTemplateType = discountPromotionTemplateType;
    }
    public List<DiscountPromotionTemplateItem> getTemplateItemList() {

        return templateItemList;
    }
    public void setTemplateItemList(List<DiscountPromotionTemplateItem> templateItemList) {

        this.templateItemList = templateItemList;
    }
    public Boolean getIsCumulative() {
        return isCumulative;
    }
    public void setIsCumulative(Boolean isCumulative) {
        this.isCumulative = isCumulative;
    }
}

---------------BaseHomePromotion 继承BasePromotion -----------------------

public abstract class BaseHomePromotion extends BasePromotion {
    
    
    /**
     * @Fields serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    //region 定义属性
    /**
     * 是否首页展示
     */
    private Boolean showInHomePage;
    /**
     * 在首页显示时的排序号
     */
    private Integer showIndex;
    /**
     * 商城开始显示时间
     */
    private Date mallBeginShowTime;
    /**
     * 获取是否首页展示
     */
    public Boolean getShowInHomePage() {
        return showInHomePage;
    }
    /**
     * 设置是否首页展示
     */
    public void setShowInHomePage(Boolean showInHomePage) {
        this.showInHomePage = showInHomePage;
    }
    /**
     * 获取在首页显示时的排序号
     */
    public Integer getShowIndex() {
        return showIndex;
    }
    /**
     * 设置在首页显示时的排序号
     */
    public void setShowIndex(Integer showIndex) {
        this.showIndex = showIndex;
    }
    public Date getMallBeginShowTime() {
        return mallBeginShowTime;
    }
    public void setMallBeginShowTime(Date mallBeginShowTime) {
        this.mallBeginShowTime = mallBeginShowTime;
    }
}
---------ValidatePromotionProductPriceBO是一个校验类对象,用来存储不同BasePromotion 的子类集合--------------------------------------------------------------------------------------------------------

/**
 * 验证促销活动产品价格 业务中间对象
 */

public class ValidatePromotionProductPriceBO<P extends BasePromotion> implements Serializable {
    
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    /**
     * 活动产品集合
     */
    private List<PromotionProductBO> itemList;
    
    /**
     * 促销活动
     */
    private P promotion;
    
    public ValidatePromotionProductPriceBO(){}
    
    public ValidatePromotionProductPriceBO(P promotion,List<PromotionProductBO> itemList){
        this.itemList = itemList;
        this.promotion = promotion;
    }
    


    public List<PromotionProductBO> getItemList() {
        return itemList;
    }

    public void setItemList(List<PromotionProductBO> itemList) {
        this.itemList = itemList;
    }

    public static long getSerialversionuid() {
        return serialVersionUID;
    }

    public P getPromotion() {
        return promotion;
    }

    public void setPromotion(P promotion) {
        this.promotion = promotion;
    }
    
}

-----------PromotionItemPriceVerifyService 是用于做校验的抽象接口----------------------------------

@FunctionalInterface
public interface PromotionItemPriceVerifyService {
    /**
     * @Description: 校验促销活动中产品的活动价:活动价大于销售价的产品展示到页面
     * @param basePromotions 促销活动集合
     * @return void
     */
    void validatePromotionItemPrice(Set<? extends BasePromotion> basePromotions);
}

-------BasePromotion的子类discountPromotion的重写校验方法,具体给discountPromotion做产品校验-----------------------------------------------------------------------------------------------------------

@Service
public class ValidateDiscountItemPriceImpl implements PromotionItemPriceVerifyService{
    
    @Autowired
    private ValidatePromotionProduct validatePromotionProduct;
    
    @Override
    public void validatePromotionItemPrice(Set<? extends BasePromotion> basePromotions) {
        basePromotions.forEach(p -> {
            validateDiscountPromotionPrice((DiscountPromotion) p);
        });
    }
    
    /**
     * 校验打折产品活动价是否大于等于产品销售价
     * @param   discountPromotion   打折活动产品
     * @return  void
     */
    private void validateDiscountPromotionPrice(DiscountPromotion discountPromotion) {
        List<DiscountPromotionProduct> itemList = discountPromotion.getProductList();
        if (CollectionUtils.isEmpty(itemList)) {
            return;
        }
        
        // 得到业务对象
        List<PromotionProductBO> promotionProductBOList = itemList.stream().map(p -> {
            return new PromotionProductBO(p.getProductSKU_Id(), null, p.getPromotionPrice());
        }).collect(Collectors.toList());

        // 验证活动产品价格
        ValidatePromotionProductPriceBO<DiscountPromotion> validatePromotionProductPriceBO = new ValidatePromotionProductPriceBO<DiscountPromotion>(
                discountPromotion, promotionProductBOList);
        validatePromotionProduct.validatePromotionProductPrice(validatePromotionProductPriceBO);
    }
    
}

-------------------------------------validatePromotionProductPrice用来做价格校验的应用方法,

入参是ValidatePromotionProductPriceBO它是存储多个校验对象的集合------------------------------

/**
     * 校验活动产品价格(大小单位换算)
     *
     * @param   ValidatePromotionProductPriceBO
     *            校验活动产品价格对象
     * @return  void
     */
    public void validatePromotionProductPrice(ValidatePromotionProductPriceBO<? extends BasePromotion> validatePromotionProductPriceBO) {

        List<PromotionProductBO> itemList = validatePromotionProductPriceBO.getItemList();
        BasePromotion promotion = validatePromotionProductPriceBO.getPromotion();
        String bizUserClassId = promotion.getBizUserClassId();
        List<ProductPriceCheckPO> poList = new ArrayList<>();

        // 产品SKUId集合
        List<Long> productSkuIdList = itemList.stream().map(p -> p.getProductSkuId()).collect(Collectors.toList());
        List<ProductSkuByUserClass> productSkuByUserClassList = productQueryOPService.findList(productSkuIdList,
                bizUserClassId);
        Map<Long, ProductSkuByUserClass> productSkuByUserClassMap = productSkuByUserClassList.stream()
                .collect(Collectors.toMap(k -> k.getId(), v -> v, (k1, k2) -> k2));

        // 产品信息规格Id集合
        List<Integer> productInfoSpecificationIdList = productSkuByUserClassList.stream()
                .map(p -> p.getProductInfoSpecificationId()).collect(Collectors.toList());
        // 产品销售策略Map
        Map<Long, ProductSalePolicy> productSalePolicyMap = iProductSalePolicyQueryService
                .getListMapBySkuIdListAndUserClassId(productSkuIdList, bizUserClassId);
        // 产品信息规格Map
        Map<Integer, ProductInfoSpecification> productInfoSpecMap = iProductInfoService
                .findProductInfoSpecificationByIds(productInfoSpecificationIdList);

        // 遍历活动产品,得到不合条件的产品
        for(PromotionProductBO promotionProductBO : itemList){
            Long productSkuId = promotionProductBO.getProductSkuId();
            ProductSkuByUserClass productSkuByUserClass = productSkuByUserClassMap.get(productSkuId);
            ProductInfoSpecification productInfoSpecification = productInfoSpecMap
                    .get(productSkuByUserClass.getProductInfoSpecificationId());
            ProductSalePolicy productSalePolicy = productSalePolicyMap.get(productSkuId);

            List<SaleSpecification> saleSpecificationList = productSkuByUserClass.getSaleSpecificationList();
            saleSpecificationList = saleSpecificationList.stream()
                    .filter(v -> ENABLESALESPECIFICATION.equals(v.getState())).collect(Collectors.toList());
            String saleSpecification = saleSpecificationList.get(0).getName();

            // 包装规格系数 和 小单位
            Integer specQuantity = productSkuByUserClass.getSpecQuantity();
            BigDecimal quantity = new BigDecimal(specQuantity.toString());
            String minUnit = productSkuByUserClass.getMinUnit();

            // 原销售价 和 销售价单位
            BigDecimal sellingPrice = productSalePolicy.getSellingPrice();
            String sellingPriceUnit = productSalePolicy.getSellingPriceUnit();
            // 活动价 和 活动价单位 (活动价单位为空,按原销售单位换算)
            BigDecimal promotionPrice = promotionProductBO.getPromotionPrice();
            String promotionPriceUnit = ObjectUtils.defaultIfNull(promotionProductBO.getPriceUnit(), sellingPriceUnit);

            // 把产品活动价和原销售价都转换成大单位价格
            BigDecimal maxUnitSellingPrice = sellingPrice;
            BigDecimal maxUnitPromotionPrice = promotionPrice;
            if (minUnit.equals(promotionPriceUnit)) {
                maxUnitPromotionPrice = promotionPrice.multiply(quantity).setScale(2, BigDecimal.ROUND_HALF_DOWN);
            }
            if (minUnit.equals(sellingPriceUnit)) {
                maxUnitSellingPrice = sellingPrice.multiply(quantity).setScale(2, BigDecimal.ROUND_HALF_DOWN);
            }

            // 比较活动价 和 原销售价
            if (maxUnitPromotionPrice.compareTo(maxUnitSellingPrice) >= 0) {
                ProductPriceCheckPO productPriceCheckPO = new ProductPriceCheckPO();
                productPriceCheckPO.setCityId(promotion.getCityId()); // 活动中得到
                productPriceCheckPO.setProductSkuId(productSkuByUserClass.getId());
                productPriceCheckPO.setProductBrand(productSkuByUserClass.getBrandName());
                productPriceCheckPO.setProductName(productSkuByUserClass.getName());
                productPriceCheckPO.setSpecification(productInfoSpecification.getName()); // 包装规格
                productPriceCheckPO.setSaleSpecification(saleSpecification); // 销售规格
                productPriceCheckPO.setBizUserClassId(promotion.getBizUserClassId());
                productPriceCheckPO.setSellingPrice(sellingPrice + "元/" + sellingPriceUnit);
                productPriceCheckPO.setPromotionPrice(promotionPrice + "元/" + promotionPriceUnit);
                productPriceCheckPO.setPromotionType(promotion.getPromotionType().value);  // 活动中得到
                productPriceCheckPO.setPromotionName(promotion.getName());   // 活动中得到
                productPriceCheckPO.setBeginDate(promotion.getBeginDate());    // 活动中得到
                productPriceCheckPO.setEndDate(promotion.getEndDate());   // 活动中得到
                productPriceCheckPO.setPromotionId(promotion.getId());    // 活动中得到
                productPriceCheckPO.setState(promotion.getState().value); // 活动中得到
                poList.add(productPriceCheckPO);
            }
        }
        productPromotionPriceCheckBL.addProductPriceCheckList(poList);
    }

-------------------------定时触发执行业务流程------------------------------------------


/**  
 * Description:产品活动价格检查定时任务
 * @author guowei
 * @date 2017年7月24日 下午10:26:21  
 */
@Component("ProductPromotionPriceCheckScheduled")
@EnableScheduling  
public class ProductPromotionPriceCheckScheduled {

@Reference
    private ITimelimitPromotionService iTimelimitPromotionService;
@Reference
    private IGatherOrderService iGatherOrderService;
@Reference
    private IDiscountPromotionService iDiscountPromotionService;
@Reference
    private ICompositeProductService iCompositeProductService;
   

    private static final Logger LOG = LoggerFactory.getLogger(ProductPromotionPriceCheckScheduled.class);


    /**
     * 每天凌晨0点检查产品价格并持久化
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void persistenceProductPriceCheckRecord(){
            LOG.info 

         ("持久化产品活动价格检查");
            BasePromotionProductDTO dto = new BasePromotionProductDTO();
            iTimelimitPromotionService.validateNotDiscardPromotionItemPrice(dto);
            iGatherOrderService.validateNotDiscardPromotionItemPrice(dto);
            iDiscountPromotionService.validateNotDiscardPromotionItemPrice(dto);
            iCompositeProductService.validateNotDiscardPromotionItemPrice(dto);
            
            
    }

}

----------------------定时触发接口的抽象校验方法和一个活动的抽象方法的重写---------------------

@FunctionalInterface
public interface BasePromotionService {
    /**
     * @Description: 校验促销活动中产品的活动价:活动价大于销售价的产品展示到页面
     * @param basePromotionProductDTO
     * @return void
     */
    void validateNotDiscardPromotionItemPrice(BasePromotionProductDTO basePromotionProductDTO);
}

 

@Override
    public void validateNotDiscardPromotionItemPrice(BasePromotionProductDTO basePromotionProductDTO) {
        AssertUtils.notNull(basePromotionProductDTO,"基础活动产品DTO不能为空");
        List<CompositeProduct> compositeList = compositeProductDSO.findCompositePromotionByCityId(basePromotionProductDTO);
        Set<CompositeProduct> compositeSet = compositeList.stream()
                .filter(p ->CollectionUtils.isNotEmpty(p.getItems()))
                .collect(Collectors.toSet());
        validateCompositeItemPriceImpl.validatePromotionItemPrice(compositeSet);
    }

-------------------------------------应用场景介绍---------------------------------------

1产品价格校验,活动价大于产品平时价,即认为这个产品的这条活动记录是有误的,取出所有的这种记录存库。

2这样的活动有4种,他们有相同的属性,当然也有不同的属性。

3每种活动产品都需要做校验,那么就需要繁琐的写多种校验方法。

4将校验方法共有化,入参用泛型可传入多种产品对象的集合即可。

5定义一个校验活动产品价格 业务中间对象,这个对象是用泛型指向多种活动类型

6定义一个产品校验的接口,泛型指向多种活动类去继承重写。

7各个活动的类继承接口,重写产品校验接口,在重写的方法体中去调用产品价格检查,数据存库

8这些操作都是在12点定时触发,查询数据取操作执行的。

---------------------------------------------------------------------------------------------------

额,有点混乱,还在总结修改中

© 著作权归作者所有

R
粉丝 1
博文 23
码字总数 7973
作品 0
仙桃
私信 提问
接口/抽象类/方法实现与重写/静态延迟绑定的一些知识点的梳理(PHP实例)

最容易混淆的知识点: 接口中的方法只能为 public 抽象方法可以为 public 和 protected,但不能为 private 如何理解:接口和抽象方法皆为方法的声明,需要让子类去实现方法体,这就要求子类必...

big_cat
2016/09/01
114
0
复习PHP-语言参考-类与对象

1.简介 没啥说的。 2.基本概念 类有自己的属性和方法,内部使用可用伪变量$this(是该类的一个引用)访问属性或方法 类通过new被实例化(如果该类属于某个命名空间,则需要写全) 可以通过c...

qzd1989
2014/04/30
0
0
typeScript面对对象篇一

面向对象是typescript的核心部分,这里先介绍下面向对象的七大原则: 单一原则:一个类子负责一个职责。 里氏替换原则:子类可以在任何地方替换它的父类。 依赖倒置原则:代码要依赖于抽象的...

核桃大号
2018/08/16
0
0
Python系列(四)之Python面向对象编程

1. 类和实例 在Python中所有的数据类型都可以视为对象,也可以自定义对象。自定义的对象数据类型即面向对象中的类(Class)概念。类是抽象的模板,实例是具体的对象。 类的定义 Python使用关...

huwh_
2017/12/31
0
0
JavaSE学习笔记系列:面向对象(3)

1.toString方法 object中定义有toString()方法,其返回值是string类型,它描述的是当前对象的有关信息。 在进行string与其他类型数据的连接操作时(如system.out.println(“info”+person))...

landy8530
2017/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
3
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
5
0
Python机器学习之数据探索可视化库yellowbrick

背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维。陆续使用过plotly、seaborn,...

yeayee
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部