Android 优惠券功能开发

需求及场景:商品层级结构是四级,对应优惠券有三种:A:不限品类的”通用券”,B:特定品类的“特定品类通用券”,C:特定商品的“特定商品券”;举个栗子:

app内商品大品类有:冻品肉类,果蔬类,火锅调理类。。。

冻品肉类里细分为:冻品猪肉类,冻品鸡肉类,冻品羊肉类。。。。

冻品猪肉类里含有具体商品:6厂后筒骨,19078颈骨。。。

优惠券如图:

Android 优惠券功能开发_第1张图片Android 优惠券功能开发_第2张图片Android 优惠券功能开发_第3张图片Android 优惠券功能开发_第4张图片

后端接口要求,优惠券匹配要前端自己搞,就是要自己匹配,然后写到list里面,作为下单接口的一个优惠券入参字段。下图是下单接口的优惠券list。举一个特定的例子:现在我要购买火锅调理品类下的:特价商品*2,冻品肉类下的:19078颈骨*3,6厂后筒骨*4,此时我有上图中的优惠券个五张,

假想选择的优惠券可能情况:选了冻品肉类通用券(8元)2张,6厂后筒骨(5元)3张,全品类通用券(10元)4张,那么list应该是:

 "ItemCouponList": [
        {
            "CouponType": 1,
            "FirstCateId": 75,
            "ItemCouponId": 204,
            "ItemId": 9
        },
        {
            "CouponType": 1,
            "FirstCateId": 75,
            "ItemCouponId": 205,
            "ItemId": 9
        },
        {
            "CouponType": 1,
            "FirstCateId": 75,
            "ItemCouponId": 206,
            "ItemId": 9
        },
        {
            "CouponType": 1,
            "FirstCateId": 75,
            "ItemCouponId": 221,
            "ItemId": 20
        },
        {
            "CouponType": 1,
            "FirstCateId": 75,
            "ItemCouponId": 222,
            "ItemId": 20
        },
        {
            "CouponType": 1,
            "FirstCateId": -1,
            "ItemCouponId": 218,
            "ItemId": 20
        },
        {
            "CouponType": 1,
            "FirstCateId": -1,
            "ItemCouponId": 217,
            "ItemId": 9
        },
        {
            "CouponType": 1,
            "FirstCateId": -1,
            "ItemCouponId": 216,
            "ItemId": 1383
        },
        {
            "CouponType": 1,
            "FirstCateId": -1,
            "ItemCouponId": 215,
            "ItemId": 1383
        }
    ]

Android 优惠券功能开发_第5张图片

获取当前购物单中可用优惠券接口:

Android 优惠券功能开发_第6张图片

里面的重点是:6厂后筒骨买了4件,但是选了6厂后筒骨券3张,意味着,另一个要么是由冻品全品类券补填,要么是由全品类通用券补填一张,然后18079颈骨买了3件,但是选了冻品全品类券2张,那么这样一来,6厂后筒骨只能由全品类券去匹配一张,然后18079颈骨也由全品类去匹配一张,特价测试商品买了2件,那么由全品类再去匹配俩张,所以生成了上面的list。(⊙o⊙)…好吧,逻辑有点饶.....

下面是匹配的代码:(选择优惠券的代码就不贴了,啊哈哈哈哈)

由于开发匆忙,没来得及注释,稍后有时间注释会更一下,,,,其实代码没啥,重要的是匹配逻辑,等我画一下逻辑,把逻辑图贴上来,读代码有点费劲,对象属性有点多,可读性不高, ̄□ ̄||....

   /**
     * 给选中优惠券分配适用商品的itemId并拿到匹配数据返回下单
     * lcb 24/07/2019
     */
    public void getCheckedPosition() {

        Collections.sort(dateBeanList, new Comparator() {
            @Override
            public int compare(CreateOrderParameters.ItemCouponListBean o1, CreateOrderParameters.ItemCouponListBean o2) {
                  return o2.getFirstCateId() - o1.getFirstCateId();
            }
        });

        for (int i = 0; i < dateBeanList.size(); i++) {

            if (dateBeanList.get(i).getFirstCateId() != -1 && dateBeanList.get(i).getItemId() == -1) {
                for (int j = 0; j < listBeans.size(); j++) {
                    int item = 0;
                    for (int k = 0; k < couponItemMap.size(); k++) {
                        if (listBeans.get(j).getItemId() == couponItemMap.get(k)) {
                            item += 1;
                        }
                    }
                    if (item >= listBeans.get(j).getBuyCount()) {
                        continue;
                    } else {
                        dateBeanList.get(i).setItemId(listBeans.get(j).getItemId());
                        dateBeanList.get(i).setItemCouponId(dateBeanList.get(i).getItemCouponId());

                        couponItemMap.put(i, listBeans.get(j).getItemId());

                        break;
                    }
                }

            } else if (dateBeanList.get(i).getFirstCateId() == -1) {

                for (int j = 0; j < listBeans.size(); j++) {
                    int item = 0;
                    for (int k = 0; k < couponItemMap.size(); k++) {
                        if (listBeans.get(j).getItemId() == couponItemMap.get(k)) {
                            item += 1;
                        }
                    }
                    if (item >= listBeans.get(j).getBuyCount()) {
                        continue;
                    } else {
                        dateBeanList.get(i).setItemId(listBeans.get(j).getItemId());
                        dateBeanList.get(i).setItemCouponId(dateBeanList.get(i).getItemCouponId());
                        couponItemMap.put(i, listBeans.get(j).getItemId());
                        break;
                    }
                }

            } else {
                couponItemMap.put(i, dateBeanList.get(i).getItemId());

            }
        }
        if (itemListener != null)

        {
            itemListener.selectCouponWithPosition(dateBeanList, mOrderCouponPrice);
        }

    }

 

 

你可能感兴趣的:(安卓,优惠券)