Android 优惠券功能开发

本文详细解析了一种复杂的优惠券匹配逻辑,适用于多级商品结构的电商平台。通过实例说明了通用券、特定品类券和特定商品券如何在购物车商品中进行智能匹配,确保优惠券的合理使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

优惠券如图:

全品类特定品类通用特定商品代金券

后端接口要求,优惠券匹配要前端自己搞,就是要自己匹配,然后写到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
        }
    ]

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

里面的重点是: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<CreateOrderParameters.ItemCouponListBean>() {
            @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);
        }

    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值