需求及场景:商品层级结构是四级,对应优惠券有三种: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() {
@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);
}
}