From e29578e1a7e851ad90e7db9858ba753c969269c3 Mon Sep 17 00:00:00 2001 From: yvan.ni Date: Wed, 26 Apr 2023 10:28:22 +0800 Subject: [PATCH] 多促销活动的优化 --- packageE/pages/cart/cart2/cart2.js | 412 +++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pages/cart/cart/cart.js | 381 +++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pages/cart/cart/cart.wxml | 4 ++-- pages/cart/cart/zh_calculate.js | 4 +++- utils/more_cx.js | 664 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 701 insertions(+), 764 deletions(-) create mode 100644 utils/more_cx.js diff --git a/packageE/pages/cart/cart2/cart2.js b/packageE/pages/cart/cart2/cart2.js index 2269f8f..be73a30 100644 --- a/packageE/pages/cart/cart2/cart2.js +++ b/packageE/pages/cart/cart2/cart2.js @@ -5,6 +5,9 @@ var regeneratorRuntime = require('../../../../utils/runtime.js'); var util_pay = require("../../../../utils/pay.js"); var zh_calc = require("zh_calculate.js"); var ladder_calc = require("ladder_calculate.js"); +//公共的函数合并在一起 +const m_cx = require("../../../../utils/more_cx.js"); + // 防抖函数用定时器 let timer; Page({ @@ -749,6 +752,8 @@ Page({ th.data.cartlist_y = carr; //存储原始购物车列表 + wx.showLoading(); + th.get_cart_next(carr); } @@ -1014,7 +1019,10 @@ Page({ } - item.original_img = oo.imghost + item.original_img; + + //商品的图片不能重复的赋值 + if(item.original_img.indexOf(oo.imghost)==-1) + item.original_img = oo.imghost + item.original_img; var car_item = item; /*----接口要弄出来的,先顶着-----*/ @@ -1164,7 +1172,7 @@ Page({ var c_item = arr[k]; if(!is_change){ //-- 要进行归类一下活动 -- - await th.cart_cx_group(arr[k].goods,c_item,(show_can_cx)=>{ + await m_cx.cart_cx_group(th,arr[k].goods,c_item,1,1,(show_can_cx)=>{ arr[k].show_can_cx=show_can_cx; }) }else{ @@ -7120,403 +7128,6 @@ Page({ }, - //-- 判读一下促销分组的问题 -- - async cart_cx_group(goods,car_item,func){ - //更改活动的时候,就不能再重新计算活动,只有再加减数量和选择商品的时候,就要重新计算活动 - if(this.data.change_act){ - var show_can_cx=car_item.show_can_cx; - for(var k in show_can_cx){ - var k_item=show_can_cx[k]; - var ck_prom_type=null; - //-- 如果是多活动,先把活动按照后台的顺序排序一下, - //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 -- - if(k_item.act_arr.length>1){ - var json_d =this.data.json_d; - var auto_promote_sale=json_d.auto_promote_sale; - var sort_type=''; - - if(!auto_promote_sale){ - sort_type='prom_type'; - }else{ - var auto_promote_sale=auto_promote_sale.split(','); - //-- 循环处理 -- - k_item.act_arr.map(function (e){ - var fd=auto_promote_sale.indexOf(e.prom_type+''); - e.sort=fd; - }) - sort_type='sort'; - } - //-- 排序一下,进行升序 -- - function comp(a, b) { - return a[sort_type]-b[sort_type]; //升序 - } - //活动要排序一下 - k_item.act_arr.sort(comp); - - //确定一下活动,先看一下有没有选择的活动 - ck_prom_type=k_item.act_arr.find(function (el){ - return el.sele; - }) - - } - //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 -- - if(!ck_prom_type) ck_prom_type=k_item.act_arr[0]; - - k_item.sele_prom_type=ck_prom_type.prom_type; - - //-- 如果是要控制数量的时候,也就是全选的时候,或者加减号的时候 -- - if(is_need_ck_num){ - var t_pid=ck_prom_type.prom_id; - switch (ck_prom_type.prom_type){ - case 3: - if(!th.data.in_yhact_new[t_pid]) th.data.in_yhact_new[t_pid]=0; - th.data.in_yhact_new[t_pid]++; - break; - case 7: - if(!th.data.in_zhact_new[t_pid]) th.data.in_zhact_new[t_pid]=0; - th.data.in_zhact_new[t_pid]+=ck_prom_type.act_num; - //-- 数组的优化 -- - var nei_gd_map=ck_prom_type.in_zhact_gdmap; - if(nei_gd_map){ - for (var vg in nei_gd_map) { - if (!th.data.in_zhact_gdmap_new[vg]) th.data.in_zhact_gdmap_new[vg] = 0; - th.datain_zhact_gdmap_new[vg] += nei_gd_map[vg]; - } - } - break; - } - } - - - //-- 此时要把购物车中的商品确定活动 -- - for (var b=0; b-1; - }) - if(fg>-1){ - goods[fg].prom_type=ck_prom_type.prom_type; - goods[fg].prom_id=ck_prom_type.prom_id; - } - } - - } - func(show_can_cx); - return false; - } - - var th=this; - //-- 促销活动对象表,最初的map表,包含活动类型,活动id,goods商品 --- - var cx_act_map=[]; - for(var i=0; i-1) continue; - - //-- 把活动进行规整 -- - var more_cx=c_item.more_cx; - for (var j=0;j1){ - //门店分类要排序下 - function compare(a, b) { - var value1 = a.goods.length; - var value2 = b.goods.length; - return value2 - value1; - } - cx_act_map.sort(compare); - } - - //-- 在确认订单的页面强行要用数量的控制 - var is_need_ck_num=1; - //-- 能够进行最后计算的活动(包含切换) -- - var can_calc_cx=[]; - //-- 此时对数组的活动进行判断,看能不能达到购买数量的条件 -- - for(var ii=0;ii 0){ - //-- 获取已经购买了多少件 -- - var url = "/api/weshop/ordergoods/getUserBuyPromNum?store_id="+os.stoid+"&user_id=" - +getApp().globalData.user_id+"&prom_type=3&prom_id="+zh_pro0.id; - await getApp().request.promiseGet(url, {}).then(rh => { - if(rh.data.code==0){ - item_act_map.buyed=rh.data.data.userbuynum; - } - }) - if(item_act_map.buyed+need_num>=fd['limit_num']){ - continue; //-- 进行下一个循环 -- - } - } - - var fir_act=item_act_map.act.fir_act; - var t_goods=item_act_map.goods; - var all_num=0; - var all_pri=0; - for(var f=0;f { - if(rh.data.code==0){ - item_act_map.buyed=rh.data.data.userbuynum; - } - }) - - //当满足组合的要求:总数要满足,起购数要满足 - if(zh_calc.ch_zh_ok(zh_pro0,zhact_gdlist,zh_goods,th,item_act_map,is_need_ck_num)){ - can_calc_cx.push(item_act_map) - } - break; - default: - can_calc_cx.push(item_act_map); - } - - } - - //-- 此时来给满足条件的活动进行分组~~相同参与商品和数量的归纳再一起, -- - //-- 同时相同商品数量的活动,还要看取那一个来进行计算金额。 默认的时候是按照后台的顺序。-- - //-- 有选择的时候,就按照切换选择了什么就按照什么来计算 -- - var show_can_cx={}; - - if(can_calc_cx.length){ - for(var p=0;p1){ - e.is_duo_gd=1; - } - e.act_arr.push(can_calc_cx[p]); - show_can_cx[ch_map.join()]=e; - } - } - } - - for(var k in show_can_cx){ - var k_item=show_can_cx[k]; - var ck_prom_type=null; - //-- 如果是多活动,先把活动按照后台的顺序排序一下, - //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 -- - if(k_item.act_arr.length>1){ - var json_d =this.data.json_d; - var auto_promote_sale=json_d.auto_promote_sale; - var sort_type=''; - - if(!auto_promote_sale){ - sort_type='prom_type'; - }else{ - var auto_promote_sale=auto_promote_sale.split(','); - //-- 循环处理 -- - k_item.act_arr.map(function (e){ - var fd=auto_promote_sale.indexOf(e.prom_type+''); - e.sort=fd; - }) - sort_type='sort'; - } - //-- 排序一下,进行升序 -- - function comp(a, b) { - return a[sort_type]-b[sort_type]; //升序 - } - //活动要排序一下 - k_item.act_arr.sort(comp); - - //确定一下活动,先看一下有没有选择的活动 - ck_prom_type=k_item.act_arr.find(function (el){ - return el.sele; - }) - - } - //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 -- - if(!ck_prom_type) ck_prom_type=k_item.act_arr[0]; - - k_item.sele_prom_type=ck_prom_type.prom_type; - - //-- 如果是要控制数量的时候,也就是全选的时候,或者加减号的时候 -- - if(is_need_ck_num){ - var t_pid=ck_prom_type.prom_id; - switch (ck_prom_type.prom_type){ - case 3: - if(!th.data.in_yhact_new[t_pid]) th.data.in_yhact_new[t_pid]=0; - th.data.in_yhact_new[t_pid]++; - break; - case 7: - if(!th.data.in_zhact_new[t_pid]) th.data.in_zhact_new[t_pid]=0; - th.data.in_zhact_new[t_pid]+=ck_prom_type.act_num; - //-- 数组的优化 -- - var nei_gd_map=ck_prom_type.in_zhact_gdmap; - if(nei_gd_map){ - for (var vg in nei_gd_map) { - if (!th.data.in_zhact_gdmap_new[vg]) th.data.in_zhact_gdmap_new[vg] = 0; - th.data.in_zhact_gdmap_new[vg] += nei_gd_map[vg]; - } - } - break; - } - } - - - //-- 此时要把购物车中的商品确定活动 -- - for (var b=0; b-1; - }) - if(fg>-1){ - goods[fg].prom_type=ck_prom_type.prom_type; - goods[fg].prom_id=ck_prom_type.prom_id; - } - } - } - - //-- 显示到前端,并切换 -- - //th.setData({show_can_cx}) - //--- 调用回调函数 --- - func(show_can_cx); - }, - //-- 查看活动参与的商品是不是有重复交集的地方,是不是一样的商品数量,can_calc_cx这个数组也是按照商品的数量降序排列的-- - check_ok_cx_pro(item_act_map,can_calc_cx){ - //-- 加入第一个,返回真 -- - if(!can_calc_cx.length) return true; - var th_goods=item_act_map.goods; - for(var i=0;ith_goods.length){ - return false; - } - } - return true; - }, - //-- 判断是不是有交集,返回交集的数量 -- - hasJiao(arr1, arr2){ - var num=0; - arr1.map(function (e){ - var idx=arr2.findIndex(function (g){ - return g.goods_id==e.goods_id; - }) - if(idx>-1) num++; - }) - return num; - }, - //-- 开始显示活动的弹出 -- switch_cx_group:function (e){ var idx=e.currentTarget.dataset.index; @@ -7582,6 +7193,9 @@ Page({ if(fg>-1){ goods[fg].prom_type=ck_prom_type.prom_type; goods[fg].prom_id=ck_prom_type.prom_id; + th.data.cartlist_y[idx].goods[fg].prom_type= goods[fg].prom_type; + th.data.cartlist_y[idx].goods[fg].prom_id= goods[fg].prom_id; + } } diff --git a/pages/cart/cart/cart.js b/pages/cart/cart/cart.js index 0fd9620..e1813d1 100644 --- a/pages/cart/cart/cart.js +++ b/pages/cart/cart/cart.js @@ -9,7 +9,8 @@ var t = getApp(), ladder_calc = require("ladder_calculate.js"); var regeneratorRuntime = require('../../../utils/runtime.js'); const e = require("../../../utils/common.js"); - +//公共的函数合并在一起 +const m_cx = require("../../../utils/more_cx.js"); Page({ data: { @@ -1894,9 +1895,12 @@ Page({ th.data.in_zhact_gdmap = {}; for (var a = 0; a < car.length; a++) { + car[a].zh_map=null; + car[a].ladder_map=null; + var item = car[a].goods, is_s_sele = 1; //-- 先批量判断一下活动的类型,同时要同步跟新 -- - await th.cart_cx_group(item,car[a],1,(show_can_cx)=>{ + await m_cx.cart_cx_group(th,item,car[a],1,0,(show_can_cx)=>{ var offline_price = 0; var offline_num = 0; for (var c = 0; c < item.length; c++) { @@ -1922,6 +1926,7 @@ Page({ obj.goods_num = 0; zh_calc.add_zhprom(car, a, obj); } + if (item[c].prom_type == 10) { obj.goods_num = 0; ladder_calc.add_ladder_prom(car, a, obj); @@ -1929,6 +1934,8 @@ Page({ } else { + + if (item[c].prom_type == 7) { //先把商品放入组合计算的专用的区域 console.log('是组合商品---') @@ -4204,363 +4211,7 @@ Page({ }); }, - //-- 判读一下促销分组的问题 -- - async cart_cx_group(goods,car_item,is_need_ck_num,func){ - //更改活动的时候,就不能再重新计算活动,只有再加减数量和选择商品的时候,就要重新计算活动 - if(this.data.change_act || (car_item.show_can_cx && Object.keys(car_item.show_can_cx).length>0)){ - var show_can_cx=car_item.show_can_cx; - for(var k in show_can_cx){ - var k_item=show_can_cx[k]; - var ck_prom_type=null; - //-- 如果是多活动,先把活动按照后台的顺序排序一下, - //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 -- - if(k_item.act_arr.length>1){ - var json_d =this.data.json_d; - var auto_promote_sale=json_d.auto_promote_sale; - var sort_type=''; - - if(!auto_promote_sale){ - sort_type='prom_type'; - }else{ - var auto_promote_sale=auto_promote_sale.split(','); - //-- 循环处理 -- - k_item.act_arr.map(function (e){ - var fd=auto_promote_sale.indexOf(e.prom_type+''); - e.sort=fd; - }) - sort_type='sort'; - } - //-- 排序一下,进行升序 -- - function comp(a, b) { - return a[sort_type]-b[sort_type]; //升序 - } - //活动要排序一下 - k_item.act_arr.sort(comp); - - //确定一下活动,先看一下有没有选择的活动 - ck_prom_type=k_item.act_arr.find(function (el){ - return el.sele; - }) - - } - //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 -- - if(!ck_prom_type) ck_prom_type=k_item.act_arr[0]; - - //-- 此时要把购物车中的商品确定活动 -- - for (var b=0; b-1; - }) - if(fg>-1){ - goods[fg].prom_type=ck_prom_type.prom_type; - goods[fg].prom_id=ck_prom_type.prom_id; - } - } - - } - func(show_can_cx); - return false; - } - - var th=this; - //-- 促销活动对象表,最初的map表,包含活动类型,活动id,goods商品 --- - var cx_act_map=[]; - for(var i=0; i-1) continue; - - //-- 把活动进行规整 -- - var more_cx=c_item.more_cx; - for (var j=0;j1){ - //门店分类要排序下 - function compare(a, b) { - var value1 = a.goods.length; - var value2 = b.goods.length; - return value2 - value1; - } - cx_act_map.sort(compare); - } - //-- 能够进行最后计算的活动(包含切换) -- - var can_calc_cx=[]; - //-- 此时对数组的活动进行判断,看能不能达到购买数量的条件 -- - for(var ii=0;ii 0){ - //-- 获取已经购买了多少件 -- - var url = "/api/weshop/ordergoods/getUserBuyPromNum?store_id="+os.stoid+"&user_id=" - +getApp().globalData.user_id+"&prom_type=3&prom_id="+zh_pro0.id; - await getApp().request.promiseGet(url, {}).then(rh => { - if(rh.data.code==0){ - item_act_map.buyed=rh.data.data.userbuynum; - } - }) - if(item_act_map.buyed+need_num>=fd['limit_num']){ - continue; //-- 进行下一个循环 -- - } - } - - var fir_act=item_act_map.act.fir_act; - var t_goods=item_act_map.goods; - var all_num=0; - var all_pri=0; - for(var f=0;f { - if(rh.data.code==0){ - item_act_map.buyed=rh.data.data.userbuynum; - } - }) - //当满足组合的要求:总数要满足,起购数要满足 - if(zh_calc.ch_zh_ok(zh_pro0,zhact_gdlist,zh_goods,th,item_act_map,is_need_ck_num)){ - can_calc_cx.push(item_act_map) - } - break; - default: - can_calc_cx.push(item_act_map); - } - - } - //-- 此时来给满足条件的活动进行分组~~相同参与商品和数量的归纳再一起, -- - //-- 同时相同商品数量的活动,还要看取那一个来进行计算金额。 默认的时候是按照后台的顺序。-- - //-- 有选择的时候,就按照切换选择了什么就按照什么来计算 -- - //-- can_calc_cx的元素(item_act_map)最后是放到act_arr里面去了 -- - var show_can_cx={}; - if(can_calc_cx.length){ - for(var p=0;p1){ - e.is_duo_gd=1; - } - e.act_arr.push(can_calc_cx[p]); - show_can_cx[ch_map.join()]=e; - } - } - } - - for(var k in show_can_cx){ - var k_item=show_can_cx[k]; - var ck_prom_type=null; - //-- 如果是多活动,先把活动按照后台的顺序排序一下, - //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 -- - if(k_item.act_arr.length>1){ - var json_d =this.data.json_d; - var auto_promote_sale=json_d.auto_promote_sale; - var sort_type=''; - - if(!auto_promote_sale){ - sort_type='prom_type'; - }else{ - var auto_promote_sale=auto_promote_sale.split(','); - //-- 循环处理 -- - k_item.act_arr.map(function (e){ - var fd=auto_promote_sale.indexOf(e.prom_type+''); - e.sort=fd; - }) - sort_type='sort'; - } - //-- 排序一下,进行升序 -- - function comp(a, b) { - return a[sort_type]-b[sort_type]; //升序 - } - //活动要排序一下 - k_item.act_arr.sort(comp); - - //确定一下活动,先看一下有没有选择的活动 - ck_prom_type=k_item.act_arr.find(function (el){ - return el.sele; - }) - - } - //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 -- - if(!ck_prom_type){ - ck_prom_type=k_item.act_arr[0]; - k_item.act_arr[0].sele=1; - } - - //-- 如果是要控制数量的时候,也就是全选的时候,或者加减号的时候 -- - if(is_need_ck_num){ - var t_pid=ck_prom_type.prom_id; - switch (ck_prom_type.prom_type){ - case 3: - if(!th.data.in_yhact_new[t_pid]) th.data.in_yhact_new[t_pid]=0; - th.data.in_yhact_new[t_pid]++; - break; - case 7: - if(!th.data.in_zhact_new[t_pid]) th.data.in_zhact_new[t_pid]=0; - th.data.in_zhact_new[t_pid]+=ck_prom_type.act_num; - //-- 数组的优化 -- - var nei_gd_map=ck_prom_type.in_zhact_gdmap; - if(nei_gd_map){ - for (var vg in nei_gd_map) { - if (!th.data.in_zhact_gdmap_new[vg]) th.data.in_zhact_gdmap_new[vg] = 0; - th.data.in_zhact_gdmap_new[vg] += nei_gd_map[vg]; - } - } - break; - } - } - //-- 此时要把购物车中的商品确定活动 -- - for (var b=0; b-1; - }) - if(fg>-1){ - goods[fg].prom_type=ck_prom_type.prom_type; - goods[fg].prom_id=ck_prom_type.prom_id; - } - } - } - //-- 显示到前端,并切换 -- - //th.setData({show_can_cx}) - //--- 调用回调函数 --- - func(show_can_cx); - - }, - //-- 查看活动参与的商品是不是有重复交集的地方,是不是一样的商品数量,can_calc_cx这个数组也是按照商品的数量降序排列的-- - check_ok_cx_pro(item_act_map,can_calc_cx){ - //-- 加入第一个,返回真 -- - if(!can_calc_cx.length) return true; - var th_goods=item_act_map.goods; - for(var i=0;ith_goods.length){ - return false; - } - } - return true; - }, - //-- 判断是不是有交集,返回交集的数量 -- - hasJiao(arr1, arr2){ - var num=0; - arr1.map(function (e){ - var idx=arr2.findIndex(function (g){ - return g.goods_id==e.goods_id; - }) - if(idx>-1) num++; - }) - return num; - }, //-- 开始显示活动的弹出 -- switch_cx_group:function (e){ @@ -4607,10 +4258,17 @@ Page({ else cx_prom_group[dx].sele=1; } - this.cx_check_ok2(function (the_rs){ + this.cx_check_ok2(async function (the_rs){ if(the_rs.code==0){ th.data.change_act=1; - th.doCheckAll(); + + + th.doCheckAll(async function (){ + for (var i in th.data.requestData) { + await th.check_prom_activity(i) + } + }); + }else{ wx.showToast({ title: the_rs.msg, @@ -4655,12 +4313,11 @@ Page({ } } //-- 先批量判断一下活动的类型,同时要同步跟新 -- - this.cart_cx_group(item,car[c_idx],0,(show_can_cx)=>{ + m_cx.cart_cx_group(this,item,car[c_idx],0,0,(show_can_cx)=>{ car[c_idx].show_can_cx=show_can_cx; th.cx_check_ok2(func,car); }); - }, //--- 在点击商品和或者门店的时候调用,这个可以在活动切换的时候调用,也可以被单个选择调用--- diff --git a/pages/cart/cart/cart.wxml b/pages/cart/cart/cart.wxml index 703eb28..ea2e2a5 100644 --- a/pages/cart/cart/cart.wxml +++ b/pages/cart/cart/cart.wxml @@ -137,7 +137,7 @@ data-index="{{pidx}}" data-gd_key="{{items.goods_id}}" class="cx-frame flex" style="position: relative"> - 促销 + 可参促销 优惠促销 @@ -166,7 +166,7 @@ data-index="{{pidx}}" data-gd_key="{{index}}" class="cx-frame flex" style="position: relative"> - 促销 + 可参促销 优惠促销 diff --git a/pages/cart/cart/zh_calculate.js b/pages/cart/cart/zh_calculate.js index fd92716..c9eff0c 100644 --- a/pages/cart/cart/zh_calculate.js +++ b/pages/cart/cart/zh_calculate.js @@ -787,7 +787,9 @@ module.exports = { item_act_map.in_zhact_gdmap=in_zhact_gdmap; return true; } - return false; + + item_act_map.act_num=0; + return true; } diff --git a/utils/more_cx.js b/utils/more_cx.js new file mode 100644 index 0000000..fd456b6 --- /dev/null +++ b/utils/more_cx.js @@ -0,0 +1,664 @@ +var regeneratorRuntime = require('runtime.js'); +module.exports = { + zhqty_bz_fun(zhqty_bz,be,zhqty_bz_arr){ + let zhqty_bz_flag =true; + for(let i=0;i num) { + zhqty_bz_flag=false; + + var be=0; + if (num % vv.zhqty == 0) { + be = num / vv.zhqty; + } else { + be = Math.floor(num / vv.zhqty) + } + item.be=item; + + zhqty_bz_arr.push(item); + // zhqty_bz.splice(i,1) + } + } + return zhqty_bz_flag; + }, + //-- 判断组合购有没有满足,只有在检查的时候,要用新的 --- + ch_zh_ok(act,gdlist,c_goods,th,item_act_map,is_need_ck_num,need_ok){ + + //-- 寻找一下 -- + function get_num(ite) { + for (let v1 in c_goods) { + var vh = c_goods[v1]; + if (vh.goods_id == ite.goods_id) { + return vh; + } + } + return 0; + } + var goods =gdlist; + var all_num=0; + var need_to_buy=0; + var all_zhqty=0; + //-- 是综合考虑到组合购的总数量和限购数量 -- + var min_can_buy=-1; + var aid=act.id; + + let no_in_arr = []; //剩余的未加入组合购 + let out_arr = []; //超出活动限购的商品放入 + + //-- 判断组合购的总数量是不是到了 -- + if(act.zh_num>0){ + //如果是在全选的情况下,那么就需要in_zhact_new来控制数量 + var need_ck=0; + if(is_need_ck_num){ + need_ck=th.data.in_zhact_new[aid]?th.data.in_zhact_new[aid]:0; + } + if(need_ck+act.zh_buy_num>=act.zh_num ){ + return false; + }else{ + min_can_buy= act.zh_num-act.zh_buy_num-need_ck; + } + } + //-- 判断组合购的限购是不是到了 -- + if(act.buy_limit>0){ + var need_ck0=0; + if(is_need_ck_num){ + need_ck0=th.data.in_zhact_new[aid]?th.data.in_zhact_new[aid]:0; + } + var min_can_buy0=0; + if(need_ck+item_act_map.buyed>=act.buy_limit ){ + return false; + }else{ + min_can_buy0=act.buy_limit-item_act_map.buyed-need_ck; + } + if(min_can_buy>0){ + if(min_can_buy0 0) { + var cbuy = item.buyqty - zh_b_num; + var key = item.goods_id + "." + act.id; + if (is_need_ck_num && th.data.in_zhact_gdmap_new[key]) { + var cbuy = item.buyqty - zh_b_num - th.data.in_zhact_gdmap_new[key]; + } + //当可买的数量为0 + if (cbuy <= 0) { + item.num = 0; + out_arr.push({ + goods_id: item.goods_id, + num: cart_num + }) + } else { + if (cbuy >= cart_num) item.num = cart_num; + else { + item.num = cbuy; + out_arr.push({ + goods_id: item.goods_id, + num: cart_num - cbuy + }) + } + } + } else { + item.num = cart_num; + } + + if (item.num) { + all_num += item.num; + //当有起购数的控制的时候 + if (item.zhqty) { + all_zhqty += item.zhqty; + if (item.num < item.zhqty) { + need_to_buy += item.zhqty - item.num; + } + if (item.num > item.zhqty) { + for (let i = 0; i < item.num - item.zhqty; i++) { + no_in_arr.push({ + goods_id: item.goods_id, + }) + } + } + } + else { + for (let j = 0; j < item.num; j++) { + no_in_arr.push({ + goods_id: item.goods_id, + }) + } + } + } else { + if (item.zhqty) { + need_to_buy += item.zhqty; + } + } + } + //当满足组合的要求:总数要满足,起购数要满足 + if (all_num >= act.zhbuyqty && !need_to_buy) { + //默认数量是1 + var act_num=1; + function sortData(a, b) { + return a.price - b.price + } + if (no_in_arr.length > 0) no_in_arr.sort(sortData); + if (act.zhbuyqty > all_zhqty) { + for (let n = 0; n < act.zhbuyqty - all_zhqty; n++) { + no_in_arr.pop(); + } + } + + //看一下剩下的数量有没有满足组合购的要求,以及要不要倍增 + if (act.is_bz && no_in_arr.length >= act.zhbuyqty) { + + var bz_num_ok = 0; //超量倍增是否满足 + var zhqty_len = 0; //几个超量倍增 + var delete_num = 0; + //看一下是几倍 + let be = parseInt(no_in_arr.length / act.zhbuyqty); + //如果有总数控制的时候 + if (min_can_buy>0) { + var be1 = min_can_buy - 1; + if (be1 < be) be = be1; + } + if(be) { + if (act.is_bzyh && zhqty_bz.length > 0) { + + let zhqty_bz_arr = []; + let zhqty_bz_flag = this.zhqty_bz_fun(zhqty_bz, be, zhqty_bz_arr); + if (zhqty_bz_flag) { + for (let i = 0; i < zhqty_bz.length; i++) { + var vv = zhqty_bz[i]; + for (let j = 0; j < be * vv['zhqty']; j++) { + let index = no_in_arr.findIndex(i => { + return vv.goods_id === i.goods_id + }) + if (index > -1) { + delete_num++ + no_in_arr.splice(index, 1) + } + } + } + } else { + zhqty_len = 1; + let min_bz_num = Math.min.apply(Math, zhqty_bz_arr.map(function (o) { + return o['be']; + })); + let new_arr = zhqty_bz_arr.filter(ii => { + return ii['be'] == min_bz_num; + }) + //-- 要看一下倍数还有没有 --- + be = new_arr[0].be; + //如果有总数控制的时候 + if (min_can_buy>0) { + var be1 = min_can_buy - 1; + if (be1 < be) be = be1; + } + if(be){ + for (let i = 0; i < zhqty_bz.length; i++) { + let item1 = zhqty_bz[i]; + for (let j = 0; j < be * item1['zhqty']; j++) { + let index = no_in_arr.findIndex(i => { + return item1.goods_id === i.goods_id + }) + if (index > -1) { + no_in_arr.splice(index, 1) + } + } + } + act_num+=be; + } + } + } + if (!zhqty_len) { + let pop_num = be * act.zhbuyqty - delete_num; + for (var m = 0; m < pop_num; m++) { + no_in_arr.pop(); + } + act_num+=be; + } + } + } + + //-- 参与活动的金额要返回回去 -- + item_act_map.act_num=act_num; + let goods_map = {}; + //算一下剩余的商品 + if (no_in_arr.length) { + for (let ii in no_in_arr) { + let item = no_in_arr[ii]; + if (goods_map[item.goods_id]) { + var num = goods_map[item.goods_id]; + goods_map[item.goods_id] = ++num; + } else { + goods_map[item.goods_id] = 1; + } + } + } + //超量的部分也要计算一下 + if (out_arr.length) { + for (var m in out_arr) { + if (goods_map[item.goods_id]) { + var num = goods_map[item.goods_id]; + num += item.num + goods_map[item.goods_id] = num; + } else { + goods_map[item.goods_id] = item.num; + } + } + } + + //-- 组合购的商品限购的数组控制 -- + var in_zhact_gdmap={}; + //商品的列表 + for (var u in goods) { + var ite = goods[u]; + var cart_num = get_num(ite).goods_num; + + if (ite.buyqty > 0 && cart_num > 0) { + var key = ite.goods_id + "." + act.id; + if(goods_map[ite.goods_id]){ + cart_num-=goods_map[ite.goods_id]; + } + if(cart_num>0){ + if (in_zhact_gdmap[key]) { + in_zhact_gdmap[key] += ite.num; + } else { + in_zhact_gdmap[key] = ite.num; + } + } + + } + } + item_act_map.in_zhact_gdmap=in_zhact_gdmap; + return true; + } + return false; + }, + //-- 判读一下促销分组的问题 -- + //-- is_need_ck_num 是多门店计算的时候,数量是不是要累家计算 -- + //-- need_ok是判断要不要满足条件 -- + async cart_cx_group(th,goods,car_item,is_need_ck_num,need_ok,func){ + + var os= getApp().globalData.setting; + //更改活动的时候,就不能再重新计算活动,只有再加减数量和选择商品的时候,就要重新计算活动 + if(th.data.change_act || (car_item.show_can_cx && Object.keys(car_item.show_can_cx).length>0)){ + var show_can_cx=car_item.show_can_cx; + for(var k in show_can_cx){ + var k_item=show_can_cx[k]; + var ck_prom_type=null; + //-- 如果是多活动,先把活动按照后台的顺序排序一下, + //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 -- + if(k_item.act_arr.length>1){ + var json_d =th.data.json_d; + var auto_promote_sale=json_d.auto_promote_sale; + var sort_type=''; + + if(!auto_promote_sale){ + sort_type='prom_type'; + }else{ + var auto_promote_sale=auto_promote_sale.split(','); + //-- 循环处理 -- + k_item.act_arr.map(function (e){ + var fd=auto_promote_sale.indexOf(e.prom_type+''); + e.sort=fd; + }) + sort_type='sort'; + } + //-- 排序一下,进行升序 -- + function comp(a, b) { + return a[sort_type]-b[sort_type]; //升序 + } + //活动要排序一下 + k_item.act_arr.sort(comp); + + //确定一下活动,先看一下有没有选择的活动 + ck_prom_type=k_item.act_arr.find(function (el){ + return el.sele; + }) + + } + //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 -- + if(!ck_prom_type) ck_prom_type=k_item.act_arr[0]; + + //-- 此时要把购物车中的商品确定活动 -- + for (var b=0; b-1; + }) + if(fg>-1){ + goods[fg].prom_type=ck_prom_type.prom_type; + goods[fg].prom_id=ck_prom_type.prom_id; + } + } + + } + func(show_can_cx); + return false; + } + + //-- 促销活动对象表,最初的map表,包含活动类型,活动id,goods商品 --- + var cx_act_map=[]; + for(var i=0; i-1) continue; + + //-- 把活动进行规整 -- + var more_cx=c_item.more_cx; + for (var j=0;j1){ + //门店分类要排序下 + function compare(a, b) { + var value1 = a.goods.length; + var value2 = b.goods.length; + return value2 - value1; + } + cx_act_map.sort(compare); + } + //-- 能够进行最后计算的活动(包含切换) -- + var can_calc_cx=[]; + //-- 此时对数组的活动进行判断,看能不能达到购买数量的条件 -- + for(var ii=0;ii 0){ + //-- 获取已经购买了多少件 -- + var url = "/api/weshop/ordergoods/getUserBuyPromNum?store_id="+os.stoid+"&user_id=" + +getApp().globalData.user_id+"&prom_type=3&prom_id="+zh_pro0.id; + await getApp().request.promiseGet(url, {}).then(rh => { + if(rh.data.code==0){ + item_act_map.buyed=rh.data.data.userbuynum; + } + }) + if(item_act_map.buyed+need_num>=fd['limit_num']){ + continue; //-- 进行下一个循环 -- + } + } + + if(!need_ok){ + can_calc_cx.push(item_act_map); + continue; + } + + var fir_act=item_act_map.act.fir_act; + var t_goods=item_act_map.goods; + var all_num=0; + var all_pri=0; + for(var f=0;f { + if(rh.data.code==0){ + item_act_map.buyed=rh.data.data.userbuynum; + } + }) + //当满足组合的要求:总数要满足,起购数要满足 + if(this.ch_zh_ok(zh_pro0,zhact_gdlist,zh_goods,th,item_act_map,is_need_ck_num,need_ok)){ + can_calc_cx.push(item_act_map) + } + break; + default: + can_calc_cx.push(item_act_map); + } + + } + + //-- 此时来给满足条件的活动进行分组~~相同参与商品和数量的归纳再一起, -- + //-- 同时相同商品数量的活动,还要看取那一个来进行计算金额。 默认的时候是按照后台的顺序。-- + //-- 有选择的时候,就按照切换选择了什么就按照什么来计算 -- + //-- can_calc_cx的元素(item_act_map)最后是放到act_arr里面去了 -- + var show_can_cx={}; + if(can_calc_cx.length){ + for(var p=0;p1){ + e.is_duo_gd=1; + } + e.act_arr.push(can_calc_cx[p]); + show_can_cx[ch_map.join()]=e; + } + } + } + + for(var k in show_can_cx){ + var k_item=show_can_cx[k]; + var ck_prom_type=null; + //-- 如果是多活动,先把活动按照后台的顺序排序一下, + //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 -- + if(k_item.act_arr.length>1){ + var json_d =th.data.json_d; + var auto_promote_sale=json_d.auto_promote_sale; + var sort_type=''; + + if(!auto_promote_sale){ + sort_type='prom_type'; + }else{ + var auto_promote_sale=auto_promote_sale.split(','); + //-- 循环处理 -- + k_item.act_arr.map(function (e){ + var fd=auto_promote_sale.indexOf(e.prom_type+''); + e.sort=fd; + }) + sort_type='sort'; + } + //-- 排序一下,进行升序 -- + function comp(a, b) { + return a[sort_type]-b[sort_type]; //升序 + } + //活动要排序一下 + k_item.act_arr.sort(comp); + + //确定一下活动,先看一下有没有选择的活动 + ck_prom_type=k_item.act_arr.find(function (el){ + return el.sele; + }) + + } + //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 -- + if(!ck_prom_type){ + ck_prom_type=k_item.act_arr[0]; + k_item.act_arr[0].sele=1; + } + + //-- 如果是要控制数量的时候,也就是全选的时候,或者加减号的时候 -- + if(is_need_ck_num){ + var t_pid=ck_prom_type.prom_id; + switch (ck_prom_type.prom_type){ + case 3: + if(!th.data.in_yhact_new[t_pid]) th.data.in_yhact_new[t_pid]=0; + th.data.in_yhact_new[t_pid]++; + break; + case 7: + if(!th.data.in_zhact_new[t_pid]) th.data.in_zhact_new[t_pid]=0; + th.data.in_zhact_new[t_pid]+=ck_prom_type.act_num; + //-- 数组的优化 -- + var nei_gd_map=ck_prom_type.in_zhact_gdmap; + if(nei_gd_map){ + for (var vg in nei_gd_map) { + if (!th.data.in_zhact_gdmap_new[vg]) th.data.in_zhact_gdmap_new[vg] = 0; + th.data.in_zhact_gdmap_new[vg] += nei_gd_map[vg]; + } + } + break; + } + } + //-- 此时要把购物车中的商品确定活动 -- + for (var b=0; b-1; + }) + if(fg>-1){ + goods[fg].prom_type=ck_prom_type.prom_type; + goods[fg].prom_id=ck_prom_type.prom_id; + } + } + } + //-- 显示到前端,并切换 -- + //th.setData({show_can_cx}) + //--- 调用回调函数 --- + func(show_can_cx); + + }, + //-- 查看活动参与的商品是不是有重复交集的地方,是不是一样的商品数量,can_calc_cx这个数组也是按照商品的数量降序排列的-- + check_ok_cx_pro(item_act_map,can_calc_cx){ + //-- 加入第一个,返回真 -- + if(!can_calc_cx.length) return true; + var th_goods=item_act_map.goods; + for(var i=0;ith_goods.length){ + return false; + } + } + return true; + }, + //-- 判断是不是有交集,返回交集的数量 -- + hasJiao(arr1, arr2){ + var num=0; + arr1.map(function (e){ + var idx=arr2.findIndex(function (g){ + return g.goods_id==e.goods_id; + }) + if(idx>-1) num++; + }) + return num; + }, + + +} \ No newline at end of file -- libgit2 0.21.4