Commit e29578e1a7e851ad90e7db9858ba753c969269c3

Authored by yvan.ni
1 parent b9aff81c

多促销活动的优化

packageE/pages/cart/cart2/cart2.js
... ... @@ -5,6 +5,9 @@ var regeneratorRuntime = require('../../../../utils/runtime.js');
5 5 var util_pay = require("../../../../utils/pay.js");
6 6 var zh_calc = require("zh_calculate.js");
7 7 var ladder_calc = require("ladder_calculate.js");
  8 +//公共的函数合并在一起
  9 +const m_cx = require("../../../../utils/more_cx.js");
  10 +
8 11 // 防抖函数用定时器
9 12 let timer;
10 13 Page({
... ... @@ -749,6 +752,8 @@ Page({
749 752  
750 753 th.data.cartlist_y = carr; //存储原始购物车列表
751 754  
  755 + wx.showLoading();
  756 +
752 757 th.get_cart_next(carr);
753 758  
754 759 }
... ... @@ -1014,7 +1019,10 @@ Page({
1014 1019  
1015 1020 }
1016 1021  
1017   - item.original_img = oo.imghost + item.original_img;
  1022 +
  1023 + //商品的图片不能重复的赋值
  1024 + if(item.original_img.indexOf(oo.imghost)==-1)
  1025 + item.original_img = oo.imghost + item.original_img;
1018 1026  
1019 1027 var car_item = item;
1020 1028 /*----接口要弄出来的,先顶着-----*/
... ... @@ -1164,7 +1172,7 @@ Page({
1164 1172 var c_item = arr[k];
1165 1173 if(!is_change){
1166 1174 //-- 要进行归类一下活动 --
1167   - await th.cart_cx_group(arr[k].goods,c_item,(show_can_cx)=>{
  1175 + await m_cx.cart_cx_group(th,arr[k].goods,c_item,1,1,(show_can_cx)=>{
1168 1176 arr[k].show_can_cx=show_can_cx;
1169 1177 })
1170 1178 }else{
... ... @@ -7120,403 +7128,6 @@ Page({
7120 7128 },
7121 7129  
7122 7130  
7123   - //-- 判读一下促销分组的问题 --
7124   - async cart_cx_group(goods,car_item,func){
7125   - //更改活动的时候,就不能再重新计算活动,只有再加减数量和选择商品的时候,就要重新计算活动
7126   - if(this.data.change_act){
7127   - var show_can_cx=car_item.show_can_cx;
7128   - for(var k in show_can_cx){
7129   - var k_item=show_can_cx[k];
7130   - var ck_prom_type=null;
7131   - //-- 如果是多活动,先把活动按照后台的顺序排序一下,
7132   - //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 --
7133   - if(k_item.act_arr.length>1){
7134   - var json_d =this.data.json_d;
7135   - var auto_promote_sale=json_d.auto_promote_sale;
7136   - var sort_type='';
7137   -
7138   - if(!auto_promote_sale){
7139   - sort_type='prom_type';
7140   - }else{
7141   - var auto_promote_sale=auto_promote_sale.split(',');
7142   - //-- 循环处理 --
7143   - k_item.act_arr.map(function (e){
7144   - var fd=auto_promote_sale.indexOf(e.prom_type+'');
7145   - e.sort=fd;
7146   - })
7147   - sort_type='sort';
7148   - }
7149   - //-- 排序一下,进行升序 --
7150   - function comp(a, b) {
7151   - return a[sort_type]-b[sort_type]; //升序
7152   - }
7153   - //活动要排序一下
7154   - k_item.act_arr.sort(comp);
7155   -
7156   - //确定一下活动,先看一下有没有选择的活动
7157   - ck_prom_type=k_item.act_arr.find(function (el){
7158   - return el.sele;
7159   - })
7160   -
7161   - }
7162   - //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 --
7163   - if(!ck_prom_type) ck_prom_type=k_item.act_arr[0];
7164   -
7165   - k_item.sele_prom_type=ck_prom_type.prom_type;
7166   -
7167   - //-- 如果是要控制数量的时候,也就是全选的时候,或者加减号的时候 --
7168   - if(is_need_ck_num){
7169   - var t_pid=ck_prom_type.prom_id;
7170   - switch (ck_prom_type.prom_type){
7171   - case 3:
7172   - if(!th.data.in_yhact_new[t_pid]) th.data.in_yhact_new[t_pid]=0;
7173   - th.data.in_yhact_new[t_pid]++;
7174   - break;
7175   - case 7:
7176   - if(!th.data.in_zhact_new[t_pid]) th.data.in_zhact_new[t_pid]=0;
7177   - th.data.in_zhact_new[t_pid]+=ck_prom_type.act_num;
7178   - //-- 数组的优化 --
7179   - var nei_gd_map=ck_prom_type.in_zhact_gdmap;
7180   - if(nei_gd_map){
7181   - for (var vg in nei_gd_map) {
7182   - if (!th.data.in_zhact_gdmap_new[vg]) th.data.in_zhact_gdmap_new[vg] = 0;
7183   - th.datain_zhact_gdmap_new[vg] += nei_gd_map[vg];
7184   - }
7185   - }
7186   - break;
7187   - }
7188   - }
7189   -
7190   -
7191   - //-- 此时要把购物车中的商品确定活动 --
7192   - for (var b=0; b<ck_prom_type.goods.length;b++){
7193   - //-- 开始查找 --
7194   - var fg=goods.findIndex(function (g_item){
7195   - return g_item.goods_id==ck_prom_type.goods[b].goods_id && [0,3,5,7,10].indexOf(g_item.prom_type)>-1;
7196   - })
7197   - if(fg>-1){
7198   - goods[fg].prom_type=ck_prom_type.prom_type;
7199   - goods[fg].prom_id=ck_prom_type.prom_id;
7200   - }
7201   - }
7202   -
7203   - }
7204   - func(show_can_cx);
7205   - return false;
7206   - }
7207   -
7208   - var th=this;
7209   - //-- 促销活动对象表,最初的map表,包含活动类型,活动id,goods商品 ---
7210   - var cx_act_map=[];
7211   - for(var i=0; i<goods.length;i++){
7212   - var c_item=goods[i];
7213   - //没有选中
7214   - if(!c_item.selected) continue;
7215   - //如果是秒杀之类是商品
7216   - if([1,2,4,6,8,9].indexOf(c_item.prom_type)>-1) continue;
7217   -
7218   - //-- 把活动进行规整 --
7219   - var more_cx=c_item.more_cx;
7220   - for (var j=0;j<more_cx.length;j++){
7221   - var n_item=more_cx[j];
7222   - var key=n_item.prom_type+'-'+n_item.prom_id;
7223   - var fd=cx_act_map.find(function (e){
7224   - return e.key==key;
7225   - })
7226   - if(fd){
7227   - fd.goods.push(c_item);
7228   - }else{
7229   - var p_item={key:key,prom_type:n_item.prom_type,prom_id:n_item.prom_id,goods:[],act:n_item};
7230   - if(n_item.prom_type==7){
7231   - p_item.zh_pro=n_item.zh_pro;
7232   - }
7233   - p_item.goods.push(c_item);
7234   - cx_act_map.push(p_item);
7235   - }
7236   - }
7237   - //goods[i].prom_type=0;
7238   - //goods[i].prom_id=0;
7239   - }
7240   - //-- 如果活动数量大于1个,那么活动就要排序一下,有商品种类数最多排再前面,降序进行排列 --
7241   - if(cx_act_map.length>1){
7242   - //门店分类要排序下
7243   - function compare(a, b) {
7244   - var value1 = a.goods.length;
7245   - var value2 = b.goods.length;
7246   - return value2 - value1;
7247   - }
7248   - cx_act_map.sort(compare);
7249   - }
7250   -
7251   - //-- 在确认订单的页面强行要用数量的控制
7252   - var is_need_ck_num=1;
7253   - //-- 能够进行最后计算的活动(包含切换) --
7254   - var can_calc_cx=[];
7255   - //-- 此时对数组的活动进行判断,看能不能达到购买数量的条件 --
7256   - for(var ii=0;ii<cx_act_map.length;ii++){
7257   -
7258   - var item_act_map=cx_act_map[ii];
7259   - //如果活动有交集的时候,商品数量一样多(不是完全相同时,就是参与的商品有交集),就按照后台确定的活动顺序
7260   - //如果活动商品数量少的和 活动数量多的 有交集,那么数量少的不显示,也不计算
7261   - //如果活动的商品一样(那就是多活动切换),优先计算的活动按照后台确定的活动顺序
7262   - if(!th.check_ok_cx_pro(item_act_map,can_calc_cx)){
7263   - continue;
7264   - }
7265   - switch(item_act_map.prom_type){
7266   - case 3:
7267   -
7268   - //活动ID
7269   - var aid=item_act_map.prom_id;
7270   - var need_num=0;
7271   - //-- 这个时候要判断是不是要判断优惠促销多门店的时候的限购 --
7272   - if(is_need_ck_num){
7273   - need_num=th.data.in_yhact_new[aid]?th.data.in_yhact_new[aid]:0;
7274   - }
7275   - //-- 判断优惠促销要不要限购 --
7276   - var fd=null;
7277   - var fd_res = await getApp().request.promiseGet('/api/weshop/promgoods/get/'+os.stoid+'/'+ky0,{})
7278   - if(fd_res && fd_res.data.code==0 ){
7279   - fd=fd_res.data.data;
7280   - }
7281   - //如果有限购的时候,也要计算一下
7282   - if (fd && fd['limit_num'] > 0){
7283   - //-- 获取已经购买了多少件 --
7284   - var url = "/api/weshop/ordergoods/getUserBuyPromNum?store_id="+os.stoid+"&user_id="
7285   - +getApp().globalData.user_id+"&prom_type=3&prom_id="+zh_pro0.id;
7286   - await getApp().request.promiseGet(url, {}).then(rh => {
7287   - if(rh.data.code==0){
7288   - item_act_map.buyed=rh.data.data.userbuynum;
7289   - }
7290   - })
7291   - if(item_act_map.buyed+need_num>=fd['limit_num']){
7292   - continue; //-- 进行下一个循环 --
7293   - }
7294   - }
7295   -
7296   - var fir_act=item_act_map.act.fir_act;
7297   - var t_goods=item_act_map.goods;
7298   - var all_num=0;
7299   - var all_pri=0;
7300   - for(var f=0;f<t_goods.length;f++){
7301   - all_num+=t_goods[f].goods_num;
7302   - all_pri+=t_goods[f].goods_num*t_goods[f].goods_price;
7303   - }
7304   -
7305   - var yh_ok=1;
7306   - switch (fir_act.prom_type){
7307   - case 0:
7308   - if(all_pri<fir_act.condition) {
7309   - yh_ok=0;
7310   - }
7311   - break;
7312   - case 1:
7313   - if(all_num<fir_act.condition) {
7314   - yh_ok=0;
7315   - }
7316   - break;
7317   - }
7318   -
7319   - //-- 如果有满足优惠条件的时候 --
7320   - if(yh_ok){
7321   - can_calc_cx.push(item_act_map)
7322   - }
7323   - break
7324   -
7325   - case 7:
7326   - //-- 活动列表 --
7327   - var zhact_gdlist=item_act_map.act.gdlist;
7328   - var zh_goods=item_act_map.goods;
7329   -
7330   - //--- 要循环计算一下商品的已购数量 ---
7331   - for(var h=0;h<zh_goods.length;h++){
7332   - //-- 商品的限购 --
7333   - var promgoodsbuynum = 0;
7334   - var res=await getApp().request.promiseGet("/api/weshop/ordergoods/getUserBuyGoodsNum", {
7335   - data: {
7336   - store_id: os.stoid,
7337   - user_id: getApp().globalData.user_id,
7338   - goods_id: zh_goods[h].goods_id,
7339   - prom_type: 7,
7340   - prom_id: item_act_map.prom_id
7341   - },
7342   - })
7343   - if(res.data.code==0 && res.data.data && res.data.data.promgoodsbuynum){
7344   - promgoodsbuynum = res.data.data.promgoodsbuynum;
7345   - }
7346   - zh_goods[h].zh_b_num=promgoodsbuynum;
7347   - }
7348   - //-- 放到map中 --
7349   - th.data.zuhe_map_good[item_act_map.prom_id] = zhact_gdlist;
7350   - if(!car_item.zh_prom_goods) car_item.zh_prom_goods={};
7351   - car_item.zh_prom_goods[item_act_map.prom_id] = zhact_gdlist;
7352   -
7353   - var zh_pro0 = th.data.zhhe_act_map[item_act_map.prom_id];
7354   - //-- 获取活动信息 --
7355   - var url = "/api/weshop/ordergoods/getUserBuyPromNum?store_id="+os.stoid+"&user_id="
7356   - +getApp().globalData.user_id+"&prom_type=7&prom_id="+zh_pro0.id;
7357   - await getApp().request.promiseGet(url, {}).then(rh => {
7358   - if(rh.data.code==0){
7359   - item_act_map.buyed=rh.data.data.userbuynum;
7360   - }
7361   - })
7362   -
7363   - //当满足组合的要求:总数要满足,起购数要满足
7364   - if(zh_calc.ch_zh_ok(zh_pro0,zhact_gdlist,zh_goods,th,item_act_map,is_need_ck_num)){
7365   - can_calc_cx.push(item_act_map)
7366   - }
7367   - break;
7368   - default:
7369   - can_calc_cx.push(item_act_map);
7370   - }
7371   -
7372   - }
7373   -
7374   - //-- 此时来给满足条件的活动进行分组~~相同参与商品和数量的归纳再一起, --
7375   - //-- 同时相同商品数量的活动,还要看取那一个来进行计算金额。 默认的时候是按照后台的顺序。--
7376   - //-- 有选择的时候,就按照切换选择了什么就按照什么来计算 --
7377   - var show_can_cx={};
7378   -
7379   - if(can_calc_cx.length){
7380   - for(var p=0;p<can_calc_cx.length;p++){
7381   - var ch_map=[];
7382   -
7383   - //-- 立即购买的时候,选择的活动是确定的 --
7384   - if(can_calc_cx[p].prom_type==can_calc_cx[p].goods[0].prom_type){
7385   - can_calc_cx[p].sele=1;
7386   - }
7387   - can_calc_cx[p].goods.map(function (gd){
7388   - ch_map.push(gd.goods_id);
7389   - })
7390   - ch_map.sort();
7391   - //-- 先找一下,有没有参与的商品一模一样的 --
7392   - var fd=show_can_cx[ch_map.join()];
7393   - if(fd){
7394   - //-- 把数组添加进去 --ch_map
7395   - fd.act_arr.push(can_calc_cx[p])
7396   - }else{
7397   - var e={ch_map:ch_map,act_arr:[]};
7398   - if(ch_map.length>1){
7399   - e.is_duo_gd=1;
7400   - }
7401   - e.act_arr.push(can_calc_cx[p]);
7402   - show_can_cx[ch_map.join()]=e;
7403   - }
7404   - }
7405   - }
7406   -
7407   - for(var k in show_can_cx){
7408   - var k_item=show_can_cx[k];
7409   - var ck_prom_type=null;
7410   - //-- 如果是多活动,先把活动按照后台的顺序排序一下,
7411   - //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 --
7412   - if(k_item.act_arr.length>1){
7413   - var json_d =this.data.json_d;
7414   - var auto_promote_sale=json_d.auto_promote_sale;
7415   - var sort_type='';
7416   -
7417   - if(!auto_promote_sale){
7418   - sort_type='prom_type';
7419   - }else{
7420   - var auto_promote_sale=auto_promote_sale.split(',');
7421   - //-- 循环处理 --
7422   - k_item.act_arr.map(function (e){
7423   - var fd=auto_promote_sale.indexOf(e.prom_type+'');
7424   - e.sort=fd;
7425   - })
7426   - sort_type='sort';
7427   - }
7428   - //-- 排序一下,进行升序 --
7429   - function comp(a, b) {
7430   - return a[sort_type]-b[sort_type]; //升序
7431   - }
7432   - //活动要排序一下
7433   - k_item.act_arr.sort(comp);
7434   -
7435   - //确定一下活动,先看一下有没有选择的活动
7436   - ck_prom_type=k_item.act_arr.find(function (el){
7437   - return el.sele;
7438   - })
7439   -
7440   - }
7441   - //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 --
7442   - if(!ck_prom_type) ck_prom_type=k_item.act_arr[0];
7443   -
7444   - k_item.sele_prom_type=ck_prom_type.prom_type;
7445   -
7446   - //-- 如果是要控制数量的时候,也就是全选的时候,或者加减号的时候 --
7447   - if(is_need_ck_num){
7448   - var t_pid=ck_prom_type.prom_id;
7449   - switch (ck_prom_type.prom_type){
7450   - case 3:
7451   - if(!th.data.in_yhact_new[t_pid]) th.data.in_yhact_new[t_pid]=0;
7452   - th.data.in_yhact_new[t_pid]++;
7453   - break;
7454   - case 7:
7455   - if(!th.data.in_zhact_new[t_pid]) th.data.in_zhact_new[t_pid]=0;
7456   - th.data.in_zhact_new[t_pid]+=ck_prom_type.act_num;
7457   - //-- 数组的优化 --
7458   - var nei_gd_map=ck_prom_type.in_zhact_gdmap;
7459   - if(nei_gd_map){
7460   - for (var vg in nei_gd_map) {
7461   - if (!th.data.in_zhact_gdmap_new[vg]) th.data.in_zhact_gdmap_new[vg] = 0;
7462   - th.data.in_zhact_gdmap_new[vg] += nei_gd_map[vg];
7463   - }
7464   - }
7465   - break;
7466   - }
7467   - }
7468   -
7469   -
7470   - //-- 此时要把购物车中的商品确定活动 --
7471   - for (var b=0; b<ck_prom_type.goods.length;b++){
7472   - //-- 开始查找 --
7473   - var fg=goods.findIndex(function (g_item){
7474   - return g_item.goods_id==ck_prom_type.goods[b].goods_id && [0,3,5,7,10].indexOf(g_item.prom_type)>-1;
7475   - })
7476   - if(fg>-1){
7477   - goods[fg].prom_type=ck_prom_type.prom_type;
7478   - goods[fg].prom_id=ck_prom_type.prom_id;
7479   - }
7480   - }
7481   - }
7482   -
7483   - //-- 显示到前端,并切换 --
7484   - //th.setData({show_can_cx})
7485   - //--- 调用回调函数 ---
7486   - func(show_can_cx);
7487   - },
7488   - //-- 查看活动参与的商品是不是有重复交集的地方,是不是一样的商品数量,can_calc_cx这个数组也是按照商品的数量降序排列的--
7489   - check_ok_cx_pro(item_act_map,can_calc_cx){
7490   - //-- 加入第一个,返回真 --
7491   - if(!can_calc_cx.length) return true;
7492   - var th_goods=item_act_map.goods;
7493   - for(var i=0;i<can_calc_cx.length;i++){
7494   - var can_goods=can_calc_cx[i].goods;
7495   - //计算一下有交集的数量,没有交集,OK
7496   - var num=this.hasJiao(can_goods,th_goods);
7497   - if(!num) continue;
7498   - //计算一下俩个shu
7499   - if(can_goods.length==th_goods.length && can_goods.length==num){
7500   - return true;
7501   - }
7502   - if(can_goods.length>th_goods.length){
7503   - return false;
7504   - }
7505   - }
7506   - return true;
7507   - },
7508   - //-- 判断是不是有交集,返回交集的数量 --
7509   - hasJiao(arr1, arr2){
7510   - var num=0;
7511   - arr1.map(function (e){
7512   - var idx=arr2.findIndex(function (g){
7513   - return g.goods_id==e.goods_id;
7514   - })
7515   - if(idx>-1) num++;
7516   - })
7517   - return num;
7518   - },
7519   -
7520 7131 //-- 开始显示活动的弹出 --
7521 7132 switch_cx_group:function (e){
7522 7133 var idx=e.currentTarget.dataset.index;
... ... @@ -7582,6 +7193,9 @@ Page({
7582 7193 if(fg>-1){
7583 7194 goods[fg].prom_type=ck_prom_type.prom_type;
7584 7195 goods[fg].prom_id=ck_prom_type.prom_id;
  7196 + th.data.cartlist_y[idx].goods[fg].prom_type= goods[fg].prom_type;
  7197 + th.data.cartlist_y[idx].goods[fg].prom_id= goods[fg].prom_id;
  7198 +
7585 7199 }
7586 7200 }
7587 7201  
... ...
pages/cart/cart/cart.js
... ... @@ -9,7 +9,8 @@ var t = getApp(),
9 9 ladder_calc = require("ladder_calculate.js");
10 10 var regeneratorRuntime = require('../../../utils/runtime.js');
11 11 const e = require("../../../utils/common.js");
12   -
  12 +//公共的函数合并在一起
  13 +const m_cx = require("../../../utils/more_cx.js");
13 14  
14 15 Page({
15 16 data: {
... ... @@ -1894,9 +1895,12 @@ Page({
1894 1895 th.data.in_zhact_gdmap = {};
1895 1896 for (var a = 0; a < car.length; a++) {
1896 1897  
  1898 + car[a].zh_map=null;
  1899 + car[a].ladder_map=null;
  1900 +
1897 1901 var item = car[a].goods, is_s_sele = 1;
1898 1902 //-- 先批量判断一下活动的类型,同时要同步跟新 --
1899   - await th.cart_cx_group(item,car[a],1,(show_can_cx)=>{
  1903 + await m_cx.cart_cx_group(th,item,car[a],1,0,(show_can_cx)=>{
1900 1904 var offline_price = 0;
1901 1905 var offline_num = 0;
1902 1906 for (var c = 0; c < item.length; c++) {
... ... @@ -1922,6 +1926,7 @@ Page({
1922 1926 obj.goods_num = 0;
1923 1927 zh_calc.add_zhprom(car, a, obj);
1924 1928 }
  1929 +
1925 1930 if (item[c].prom_type == 10) {
1926 1931 obj.goods_num = 0;
1927 1932 ladder_calc.add_ladder_prom(car, a, obj);
... ... @@ -1929,6 +1934,8 @@ Page({
1929 1934  
1930 1935  
1931 1936 } else {
  1937 +
  1938 +
1932 1939 if (item[c].prom_type == 7) {
1933 1940 //先把商品放入组合计算的专用的区域
1934 1941 console.log('是组合商品---')
... ... @@ -4204,363 +4211,7 @@ Page({
4204 4211 });
4205 4212 },
4206 4213  
4207   - //-- 判读一下促销分组的问题 --
4208   - async cart_cx_group(goods,car_item,is_need_ck_num,func){
4209   - //更改活动的时候,就不能再重新计算活动,只有再加减数量和选择商品的时候,就要重新计算活动
4210   - if(this.data.change_act || (car_item.show_can_cx && Object.keys(car_item.show_can_cx).length>0)){
4211   - var show_can_cx=car_item.show_can_cx;
4212   - for(var k in show_can_cx){
4213   - var k_item=show_can_cx[k];
4214   - var ck_prom_type=null;
4215   - //-- 如果是多活动,先把活动按照后台的顺序排序一下,
4216   - //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 --
4217   - if(k_item.act_arr.length>1){
4218   - var json_d =this.data.json_d;
4219   - var auto_promote_sale=json_d.auto_promote_sale;
4220   - var sort_type='';
4221   -
4222   - if(!auto_promote_sale){
4223   - sort_type='prom_type';
4224   - }else{
4225   - var auto_promote_sale=auto_promote_sale.split(',');
4226   - //-- 循环处理 --
4227   - k_item.act_arr.map(function (e){
4228   - var fd=auto_promote_sale.indexOf(e.prom_type+'');
4229   - e.sort=fd;
4230   - })
4231   - sort_type='sort';
4232   - }
4233   - //-- 排序一下,进行升序 --
4234   - function comp(a, b) {
4235   - return a[sort_type]-b[sort_type]; //升序
4236   - }
4237   - //活动要排序一下
4238   - k_item.act_arr.sort(comp);
4239   -
4240   - //确定一下活动,先看一下有没有选择的活动
4241   - ck_prom_type=k_item.act_arr.find(function (el){
4242   - return el.sele;
4243   - })
4244   -
4245   - }
4246   - //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 --
4247   - if(!ck_prom_type) ck_prom_type=k_item.act_arr[0];
4248   -
4249   - //-- 此时要把购物车中的商品确定活动 --
4250   - for (var b=0; b<ck_prom_type.goods.length;b++){
4251   - //-- 开始查找 --
4252   - var fg=goods.findIndex(function (g_item){
4253   - return g_item.goods_id==ck_prom_type.goods[b].goods_id && [0,3,5,7,10].indexOf(g_item.prom_type)>-1;
4254   - })
4255   - if(fg>-1){
4256   - goods[fg].prom_type=ck_prom_type.prom_type;
4257   - goods[fg].prom_id=ck_prom_type.prom_id;
4258   - }
4259   - }
4260   -
4261   - }
4262   - func(show_can_cx);
4263   - return false;
4264   - }
4265   -
4266   - var th=this;
4267   - //-- 促销活动对象表,最初的map表,包含活动类型,活动id,goods商品 ---
4268   - var cx_act_map=[];
4269   - for(var i=0; i<goods.length;i++){
4270   - var c_item=goods[i];
4271   - //没有选中
4272   - if(!c_item.selected) continue;
4273   - //如果是秒杀之类是商品
4274   - if([1,2,4,6,8,9].indexOf(c_item.prom_type)>-1) continue;
4275   -
4276   - //-- 把活动进行规整 --
4277   - var more_cx=c_item.more_cx;
4278   - for (var j=0;j<more_cx.length;j++){
4279   - var n_item=more_cx[j];
4280   - var key=n_item.prom_type+'-'+n_item.prom_id;
4281   - var fd=cx_act_map.find(function (e){
4282   - return e.key==key;
4283   - })
4284   - if(fd){
4285   - fd.goods.push(c_item);
4286   - }else{
4287   - var p_item={key:key,prom_type:n_item.prom_type,prom_id:n_item.prom_id,goods:[],act:n_item};
4288   - if(n_item.prom_type==7){
4289   - p_item.zh_pro=n_item.zh_pro;
4290   - }
4291   - p_item.goods.push(c_item);
4292   - cx_act_map.push(p_item);
4293   - }
4294   - }
4295   - goods[i].prom_type=0;
4296   - goods[i].prom_id=0;
4297   - }
4298   - //-- 如果活动数量大于1个,那么活动就要排序一下,有商品种类数最多排再前面,降序进行排列 --
4299   - if(cx_act_map.length>1){
4300   - //门店分类要排序下
4301   - function compare(a, b) {
4302   - var value1 = a.goods.length;
4303   - var value2 = b.goods.length;
4304   - return value2 - value1;
4305   - }
4306   - cx_act_map.sort(compare);
4307   - }
4308   - //-- 能够进行最后计算的活动(包含切换) --
4309   - var can_calc_cx=[];
4310   - //-- 此时对数组的活动进行判断,看能不能达到购买数量的条件 --
4311   - for(var ii=0;ii<cx_act_map.length;ii++){
4312   -
4313   - var item_act_map=cx_act_map[ii];
4314   - //如果活动有交集的时候,商品数量一样多(不是完全相同时,就是参与的商品有交集),就按照后台确定的活动顺序
4315   - //如果活动商品数量少的和 活动数量多的 有交集,那么数量少的不显示,也不计算
4316   - //如果活动的商品一样(那就是多活动切换),优先计算的活动按照后台确定的活动顺序
4317   - if(!th.check_ok_cx_pro(item_act_map,can_calc_cx)){
4318   - continue;
4319   - }
4320   - switch(item_act_map.prom_type){
4321   - case 3:
4322   - //活动ID
4323   - var aid=item_act_map.prom_id;
4324   - var need_num=0;
4325   - //-- 这个时候要判断是不是要判断优惠促销多门店的时候的限购 --
4326   - if(is_need_ck_num){
4327   - need_num=th.data.in_yhact_new[aid]?th.data.in_yhact_new[aid]:0;
4328   - }
4329   - //-- 判断优惠促销要不要限购 --
4330   - var fd=null;
4331   - var fd_res = await getApp().request.promiseGet('/api/weshop/promgoods/get/'+os.stoid+'/'+ky0,{})
4332   - if(fd_res && fd_res.data.code==0 ){
4333   - fd=fd_res.data.data;
4334   - }
4335   - //如果有限购的时候,也要计算一下
4336   - if (fd && fd['limit_num'] > 0){
4337   - //-- 获取已经购买了多少件 --
4338   - var url = "/api/weshop/ordergoods/getUserBuyPromNum?store_id="+os.stoid+"&user_id="
4339   - +getApp().globalData.user_id+"&prom_type=3&prom_id="+zh_pro0.id;
4340   - await getApp().request.promiseGet(url, {}).then(rh => {
4341   - if(rh.data.code==0){
4342   - item_act_map.buyed=rh.data.data.userbuynum;
4343   - }
4344   - })
4345   - if(item_act_map.buyed+need_num>=fd['limit_num']){
4346   - continue; //-- 进行下一个循环 --
4347   - }
4348   - }
4349   -
4350   - var fir_act=item_act_map.act.fir_act;
4351   - var t_goods=item_act_map.goods;
4352   - var all_num=0;
4353   - var all_pri=0;
4354   - for(var f=0;f<t_goods.length;f++){
4355   - all_num+=t_goods[f].goods_num;
4356   - all_pri+=t_goods[f].goods_num*t_goods[f].goods_price;
4357   - }
4358   - var yh_ok=1;
4359   - switch (fir_act.prom_type){
4360   - case 0:
4361   - if(all_pri<fir_act.condition) {
4362   - yh_ok=0;
4363   - }
4364   - break;
4365   - case 1:
4366   - if(all_num<fir_act.condition) {
4367   - yh_ok=0;
4368   - }
4369   - break;
4370   - }
4371   - //-- 如果有满足优惠条件的时候 --
4372   - if(yh_ok){
4373   - can_calc_cx.push(item_act_map)
4374   - }
4375   - break
4376   -
4377   - case 7:
4378   - //-- 活动列表 --
4379   - var zhact_gdlist=item_act_map.act.gdlist;
4380   - var zh_goods=item_act_map.goods;
4381   - //--- 要循环计算一下商品的已购数量 ---
4382   - for(var h=0;h<zh_goods.length;h++){
4383   - //-- 商品的限购 --
4384   - var promgoodsbuynum = 0;
4385   - var res=await getApp().request.promiseGet("/api/weshop/ordergoods/getUserBuyGoodsNum", {
4386   - data: {
4387   - store_id: os.stoid,
4388   - user_id: getApp().globalData.user_id,
4389   - goods_id: zh_goods[h].goods_id,
4390   - prom_type: 7,
4391   - prom_id: item_act_map.prom_id
4392   - },
4393   - })
4394   - if(res.data.code==0 && res.data.data && res.data.data.promgoodsbuynum){
4395   - promgoodsbuynum = res.data.data.promgoodsbuynum;
4396   - }
4397   - zh_goods[h].zh_b_num=promgoodsbuynum;
4398   - }
4399   - //-- 放到参与组合优惠促销的map中 --
4400   - th.data.zuhe_map_good[item_act_map.prom_id] = zhact_gdlist;
4401   - if(!car_item.zh_prom_goods) car_item.zh_prom_goods={};
4402   - car_item.zh_prom_goods[item_act_map.prom_id] = zhact_gdlist;
4403   -
4404   - var zh_pro0 = th.data.zuhe_map[item_act_map.prom_id];
4405   -
4406   - //-- 获取活动信息 --
4407   - var url = "/api/weshop/ordergoods/getUserBuyPromNum?store_id="+os.stoid+"&user_id="
4408   - +getApp().globalData.user_id+"&prom_type=7&prom_id="+zh_pro0.id;
4409   - await getApp().request.promiseGet(url, {}).then(rh => {
4410   - if(rh.data.code==0){
4411   - item_act_map.buyed=rh.data.data.userbuynum;
4412   - }
4413   - })
4414   - //当满足组合的要求:总数要满足,起购数要满足
4415   - if(zh_calc.ch_zh_ok(zh_pro0,zhact_gdlist,zh_goods,th,item_act_map,is_need_ck_num)){
4416   - can_calc_cx.push(item_act_map)
4417   - }
4418   - break;
4419   - default:
4420   - can_calc_cx.push(item_act_map);
4421   - }
4422   -
4423   - }
4424 4214  
4425   - //-- 此时来给满足条件的活动进行分组~~相同参与商品和数量的归纳再一起, --
4426   - //-- 同时相同商品数量的活动,还要看取那一个来进行计算金额。 默认的时候是按照后台的顺序。--
4427   - //-- 有选择的时候,就按照切换选择了什么就按照什么来计算 --
4428   - //-- can_calc_cx的元素(item_act_map)最后是放到act_arr里面去了 --
4429   - var show_can_cx={};
4430   - if(can_calc_cx.length){
4431   - for(var p=0;p<can_calc_cx.length;p++){
4432   - var ch_map=[];
4433   - can_calc_cx[p].goods.map(function (gd){
4434   - ch_map.push(gd.goods_id);
4435   - })
4436   - ch_map.sort();
4437   - //-- 先找一下,有没有参与的商品一模一样的 --
4438   - var fd=show_can_cx[ch_map.join()];
4439   - if(fd){
4440   - //-- 把数组添加进去 --ch_map
4441   - fd.act_arr.push(can_calc_cx[p])
4442   - }else{
4443   - var e={ch_map:ch_map,act_arr:[]};
4444   - if(ch_map.length>1){
4445   - e.is_duo_gd=1;
4446   - }
4447   - e.act_arr.push(can_calc_cx[p]);
4448   - show_can_cx[ch_map.join()]=e;
4449   - }
4450   - }
4451   - }
4452   -
4453   - for(var k in show_can_cx){
4454   - var k_item=show_can_cx[k];
4455   - var ck_prom_type=null;
4456   - //-- 如果是多活动,先把活动按照后台的顺序排序一下,
4457   - //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 --
4458   - if(k_item.act_arr.length>1){
4459   - var json_d =this.data.json_d;
4460   - var auto_promote_sale=json_d.auto_promote_sale;
4461   - var sort_type='';
4462   -
4463   - if(!auto_promote_sale){
4464   - sort_type='prom_type';
4465   - }else{
4466   - var auto_promote_sale=auto_promote_sale.split(',');
4467   - //-- 循环处理 --
4468   - k_item.act_arr.map(function (e){
4469   - var fd=auto_promote_sale.indexOf(e.prom_type+'');
4470   - e.sort=fd;
4471   - })
4472   - sort_type='sort';
4473   - }
4474   - //-- 排序一下,进行升序 --
4475   - function comp(a, b) {
4476   - return a[sort_type]-b[sort_type]; //升序
4477   - }
4478   - //活动要排序一下
4479   - k_item.act_arr.sort(comp);
4480   -
4481   - //确定一下活动,先看一下有没有选择的活动
4482   - ck_prom_type=k_item.act_arr.find(function (el){
4483   - return el.sele;
4484   - })
4485   -
4486   - }
4487   - //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 --
4488   - if(!ck_prom_type){
4489   - ck_prom_type=k_item.act_arr[0];
4490   - k_item.act_arr[0].sele=1;
4491   - }
4492   -
4493   - //-- 如果是要控制数量的时候,也就是全选的时候,或者加减号的时候 --
4494   - if(is_need_ck_num){
4495   - var t_pid=ck_prom_type.prom_id;
4496   - switch (ck_prom_type.prom_type){
4497   - case 3:
4498   - if(!th.data.in_yhact_new[t_pid]) th.data.in_yhact_new[t_pid]=0;
4499   - th.data.in_yhact_new[t_pid]++;
4500   - break;
4501   - case 7:
4502   - if(!th.data.in_zhact_new[t_pid]) th.data.in_zhact_new[t_pid]=0;
4503   - th.data.in_zhact_new[t_pid]+=ck_prom_type.act_num;
4504   - //-- 数组的优化 --
4505   - var nei_gd_map=ck_prom_type.in_zhact_gdmap;
4506   - if(nei_gd_map){
4507   - for (var vg in nei_gd_map) {
4508   - if (!th.data.in_zhact_gdmap_new[vg]) th.data.in_zhact_gdmap_new[vg] = 0;
4509   - th.data.in_zhact_gdmap_new[vg] += nei_gd_map[vg];
4510   - }
4511   - }
4512   - break;
4513   - }
4514   - }
4515   - //-- 此时要把购物车中的商品确定活动 --
4516   - for (var b=0; b<ck_prom_type.goods.length;b++){
4517   - //-- 开始查找 --
4518   - var fg=goods.findIndex(function (g_item){
4519   - return g_item.goods_id==ck_prom_type.goods[b].goods_id && [0,3,5,7,10].indexOf(g_item.prom_type)>-1;
4520   - })
4521   - if(fg>-1){
4522   - goods[fg].prom_type=ck_prom_type.prom_type;
4523   - goods[fg].prom_id=ck_prom_type.prom_id;
4524   - }
4525   - }
4526   - }
4527   - //-- 显示到前端,并切换 --
4528   - //th.setData({show_can_cx})
4529   - //--- 调用回调函数 ---
4530   - func(show_can_cx);
4531   -
4532   - },
4533   - //-- 查看活动参与的商品是不是有重复交集的地方,是不是一样的商品数量,can_calc_cx这个数组也是按照商品的数量降序排列的--
4534   - check_ok_cx_pro(item_act_map,can_calc_cx){
4535   - //-- 加入第一个,返回真 --
4536   - if(!can_calc_cx.length) return true;
4537   - var th_goods=item_act_map.goods;
4538   - for(var i=0;i<can_calc_cx.length;i++){
4539   - var can_goods=can_calc_cx[i].goods;
4540   - //计算一下有交集的数量,没有交集,OK
4541   - var num=this.hasJiao(can_goods,th_goods);
4542   - if(!num) continue;
4543   - //计算一下俩个shu
4544   - if(can_goods.length==th_goods.length && can_goods.length==num){
4545   - return true;
4546   - }
4547   - if(can_goods.length>th_goods.length){
4548   - return false;
4549   - }
4550   - }
4551   - return true;
4552   - },
4553   - //-- 判断是不是有交集,返回交集的数量 --
4554   - hasJiao(arr1, arr2){
4555   - var num=0;
4556   - arr1.map(function (e){
4557   - var idx=arr2.findIndex(function (g){
4558   - return g.goods_id==e.goods_id;
4559   - })
4560   - if(idx>-1) num++;
4561   - })
4562   - return num;
4563   - },
4564 4215  
4565 4216 //-- 开始显示活动的弹出 --
4566 4217 switch_cx_group:function (e){
... ... @@ -4607,10 +4258,17 @@ Page({
4607 4258 else cx_prom_group[dx].sele=1;
4608 4259 }
4609 4260  
4610   - this.cx_check_ok2(function (the_rs){
  4261 + this.cx_check_ok2(async function (the_rs){
4611 4262 if(the_rs.code==0){
4612 4263 th.data.change_act=1;
4613   - th.doCheckAll();
  4264 +
  4265 +
  4266 + th.doCheckAll(async function (){
  4267 + for (var i in th.data.requestData) {
  4268 + await th.check_prom_activity(i)
  4269 + }
  4270 + });
  4271 +
4614 4272 }else{
4615 4273 wx.showToast({
4616 4274 title: the_rs.msg,
... ... @@ -4655,12 +4313,11 @@ Page({
4655 4313 }
4656 4314 }
4657 4315 //-- 先批量判断一下活动的类型,同时要同步跟新 --
4658   - this.cart_cx_group(item,car[c_idx],0,(show_can_cx)=>{
  4316 + m_cx.cart_cx_group(this,item,car[c_idx],0,0,(show_can_cx)=>{
4659 4317 car[c_idx].show_can_cx=show_can_cx;
4660 4318 th.cx_check_ok2(func,car);
4661 4319 });
4662 4320  
4663   -
4664 4321 },
4665 4322  
4666 4323 //--- 在点击商品和或者门店的时候调用,这个可以在活动切换的时候调用,也可以被单个选择调用---
... ...
pages/cart/cart/cart.wxml
... ... @@ -137,7 +137,7 @@
137 137 data-index="{{pidx}}"
138 138 data-gd_key="{{items.goods_id}}"
139 139 class="cx-frame flex" style="position: relative">
140   - <view class="cx-sizs fs30">促销</view>
  140 + <view class="cx-sizs fs30">可参促销</view>
141 141 <view class="flex ai_c f1 pdh20">
142 142 <view class="xc-coupon-fram" wx:for="{{item.show_can_cx[items.goods_id].act_arr}}" >
143 143 <view wx:if="{{item.prom_type==3}}" class="xc-coupon t-c four-level-word">优惠促销</view>
... ... @@ -166,7 +166,7 @@
166 166 data-index="{{pidx}}"
167 167 data-gd_key="{{index}}"
168 168 class="cx-frame flex" style="position: relative">
169   - <view class="cx-sizs fs30">促销</view>
  169 + <view class="cx-sizs fs30">可参促销</view>
170 170 <view class="flex ai_c f1 pdh20">
171 171 <view class="xc-coupon-fram" wx:for="{{pitem.act_arr}}" >
172 172 <view wx:if="{{item.prom_type==3}}" class="xc-coupon t-c four-level-word">优惠促销</view>
... ...
pages/cart/cart/zh_calculate.js
... ... @@ -787,7 +787,9 @@ module.exports = {
787 787 item_act_map.in_zhact_gdmap=in_zhact_gdmap;
788 788 return true;
789 789 }
790   - return false;
  790 +
  791 + item_act_map.act_num=0;
  792 + return true;
791 793 }
792 794  
793 795  
... ...
utils/more_cx.js 0 → 100644
  1 +var regeneratorRuntime = require('runtime.js');
  2 +module.exports = {
  3 + zhqty_bz_fun(zhqty_bz,be,zhqty_bz_arr){
  4 + let zhqty_bz_flag =true;
  5 + for(let i=0;i<zhqty_bz.length;i++){
  6 + let item=zhqty_bz[i];
  7 + let bz_num = be * item['zhqty']; //超量倍增
  8 + let num = item['num'] - item['zhqty']; //购买数量减去超量
  9 + if (bz_num > num) {
  10 + zhqty_bz_flag=false;
  11 +
  12 + var be=0;
  13 + if (num % vv.zhqty == 0) {
  14 + be = num / vv.zhqty;
  15 + } else {
  16 + be = Math.floor(num / vv.zhqty)
  17 + }
  18 + item.be=item;
  19 +
  20 + zhqty_bz_arr.push(item);
  21 + // zhqty_bz.splice(i,1)
  22 + }
  23 + }
  24 + return zhqty_bz_flag;
  25 + },
  26 + //-- 判断组合购有没有满足,只有在检查的时候,要用新的 ---
  27 + ch_zh_ok(act,gdlist,c_goods,th,item_act_map,is_need_ck_num,need_ok){
  28 +
  29 + //-- 寻找一下 --
  30 + function get_num(ite) {
  31 + for (let v1 in c_goods) {
  32 + var vh = c_goods[v1];
  33 + if (vh.goods_id == ite.goods_id) {
  34 + return vh;
  35 + }
  36 + }
  37 + return 0;
  38 + }
  39 + var goods =gdlist;
  40 + var all_num=0;
  41 + var need_to_buy=0;
  42 + var all_zhqty=0;
  43 + //-- 是综合考虑到组合购的总数量和限购数量 --
  44 + var min_can_buy=-1;
  45 + var aid=act.id;
  46 +
  47 + let no_in_arr = []; //剩余的未加入组合购
  48 + let out_arr = []; //超出活动限购的商品放入
  49 +
  50 + //-- 判断组合购的总数量是不是到了 --
  51 + if(act.zh_num>0){
  52 + //如果是在全选的情况下,那么就需要in_zhact_new来控制数量
  53 + var need_ck=0;
  54 + if(is_need_ck_num){
  55 + need_ck=th.data.in_zhact_new[aid]?th.data.in_zhact_new[aid]:0;
  56 + }
  57 + if(need_ck+act.zh_buy_num>=act.zh_num ){
  58 + return false;
  59 + }else{
  60 + min_can_buy= act.zh_num-act.zh_buy_num-need_ck;
  61 + }
  62 + }
  63 + //-- 判断组合购的限购是不是到了 --
  64 + if(act.buy_limit>0){
  65 + var need_ck0=0;
  66 + if(is_need_ck_num){
  67 + need_ck0=th.data.in_zhact_new[aid]?th.data.in_zhact_new[aid]:0;
  68 + }
  69 + var min_can_buy0=0;
  70 + if(need_ck+item_act_map.buyed>=act.buy_limit ){
  71 + return false;
  72 + }else{
  73 + min_can_buy0=act.buy_limit-item_act_map.buyed-need_ck;
  74 + }
  75 + if(min_can_buy>0){
  76 + if(min_can_buy0<min_can_buy) min_can_buy=min_can_buy0;
  77 + }else{
  78 + min_can_buy=min_can_buy0;
  79 + }
  80 + }
  81 +
  82 + if(!need_ok) return true;
  83 + for (var i in goods) {
  84 + var item = goods[i];
  85 + var cart_num = get_num(item).goods_num;
  86 + var zh_b_num = get_num(item).zh_b_num;
  87 + if (!cart_num) {
  88 + if (item.zhqty) {
  89 + need_to_buy += item.zhqty;
  90 + }
  91 + continue;
  92 + }
  93 +
  94 + item.cart_num = cart_num;
  95 + //-- 当商品有购买的时候,以及有限购的时候 --
  96 + if (item.buyqty > 0) {
  97 + var cbuy = item.buyqty - zh_b_num;
  98 + var key = item.goods_id + "." + act.id;
  99 + if (is_need_ck_num && th.data.in_zhact_gdmap_new[key]) {
  100 + var cbuy = item.buyqty - zh_b_num - th.data.in_zhact_gdmap_new[key];
  101 + }
  102 + //当可买的数量为0
  103 + if (cbuy <= 0) {
  104 + item.num = 0;
  105 + out_arr.push({
  106 + goods_id: item.goods_id,
  107 + num: cart_num
  108 + })
  109 + } else {
  110 + if (cbuy >= cart_num) item.num = cart_num;
  111 + else {
  112 + item.num = cbuy;
  113 + out_arr.push({
  114 + goods_id: item.goods_id,
  115 + num: cart_num - cbuy
  116 + })
  117 + }
  118 + }
  119 + } else {
  120 + item.num = cart_num;
  121 + }
  122 +
  123 + if (item.num) {
  124 + all_num += item.num;
  125 + //当有起购数的控制的时候
  126 + if (item.zhqty) {
  127 + all_zhqty += item.zhqty;
  128 + if (item.num < item.zhqty) {
  129 + need_to_buy += item.zhqty - item.num;
  130 + }
  131 + if (item.num > item.zhqty) {
  132 + for (let i = 0; i < item.num - item.zhqty; i++) {
  133 + no_in_arr.push({
  134 + goods_id: item.goods_id,
  135 + })
  136 + }
  137 + }
  138 + }
  139 + else {
  140 + for (let j = 0; j < item.num; j++) {
  141 + no_in_arr.push({
  142 + goods_id: item.goods_id,
  143 + })
  144 + }
  145 + }
  146 + } else {
  147 + if (item.zhqty) {
  148 + need_to_buy += item.zhqty;
  149 + }
  150 + }
  151 + }
  152 + //当满足组合的要求:总数要满足,起购数要满足
  153 + if (all_num >= act.zhbuyqty && !need_to_buy) {
  154 + //默认数量是1
  155 + var act_num=1;
  156 + function sortData(a, b) {
  157 + return a.price - b.price
  158 + }
  159 + if (no_in_arr.length > 0) no_in_arr.sort(sortData);
  160 + if (act.zhbuyqty > all_zhqty) {
  161 + for (let n = 0; n < act.zhbuyqty - all_zhqty; n++) {
  162 + no_in_arr.pop();
  163 + }
  164 + }
  165 +
  166 + //看一下剩下的数量有没有满足组合购的要求,以及要不要倍增
  167 + if (act.is_bz && no_in_arr.length >= act.zhbuyqty) {
  168 +
  169 + var bz_num_ok = 0; //超量倍增是否满足
  170 + var zhqty_len = 0; //几个超量倍增
  171 + var delete_num = 0;
  172 + //看一下是几倍
  173 + let be = parseInt(no_in_arr.length / act.zhbuyqty);
  174 + //如果有总数控制的时候
  175 + if (min_can_buy>0) {
  176 + var be1 = min_can_buy - 1;
  177 + if (be1 < be) be = be1;
  178 + }
  179 + if(be) {
  180 + if (act.is_bzyh && zhqty_bz.length > 0) {
  181 +
  182 + let zhqty_bz_arr = [];
  183 + let zhqty_bz_flag = this.zhqty_bz_fun(zhqty_bz, be, zhqty_bz_arr);
  184 + if (zhqty_bz_flag) {
  185 + for (let i = 0; i < zhqty_bz.length; i++) {
  186 + var vv = zhqty_bz[i];
  187 + for (let j = 0; j < be * vv['zhqty']; j++) {
  188 + let index = no_in_arr.findIndex(i => {
  189 + return vv.goods_id === i.goods_id
  190 + })
  191 + if (index > -1) {
  192 + delete_num++
  193 + no_in_arr.splice(index, 1)
  194 + }
  195 + }
  196 + }
  197 + } else {
  198 + zhqty_len = 1;
  199 + let min_bz_num = Math.min.apply(Math, zhqty_bz_arr.map(function (o) {
  200 + return o['be'];
  201 + }));
  202 + let new_arr = zhqty_bz_arr.filter(ii => {
  203 + return ii['be'] == min_bz_num;
  204 + })
  205 + //-- 要看一下倍数还有没有 ---
  206 + be = new_arr[0].be;
  207 + //如果有总数控制的时候
  208 + if (min_can_buy>0) {
  209 + var be1 = min_can_buy - 1;
  210 + if (be1 < be) be = be1;
  211 + }
  212 + if(be){
  213 + for (let i = 0; i < zhqty_bz.length; i++) {
  214 + let item1 = zhqty_bz[i];
  215 + for (let j = 0; j < be * item1['zhqty']; j++) {
  216 + let index = no_in_arr.findIndex(i => {
  217 + return item1.goods_id === i.goods_id
  218 + })
  219 + if (index > -1) {
  220 + no_in_arr.splice(index, 1)
  221 + }
  222 + }
  223 + }
  224 + act_num+=be;
  225 + }
  226 + }
  227 + }
  228 + if (!zhqty_len) {
  229 + let pop_num = be * act.zhbuyqty - delete_num;
  230 + for (var m = 0; m < pop_num; m++) {
  231 + no_in_arr.pop();
  232 + }
  233 + act_num+=be;
  234 + }
  235 + }
  236 + }
  237 +
  238 + //-- 参与活动的金额要返回回去 --
  239 + item_act_map.act_num=act_num;
  240 + let goods_map = {};
  241 + //算一下剩余的商品
  242 + if (no_in_arr.length) {
  243 + for (let ii in no_in_arr) {
  244 + let item = no_in_arr[ii];
  245 + if (goods_map[item.goods_id]) {
  246 + var num = goods_map[item.goods_id];
  247 + goods_map[item.goods_id] = ++num;
  248 + } else {
  249 + goods_map[item.goods_id] = 1;
  250 + }
  251 + }
  252 + }
  253 + //超量的部分也要计算一下
  254 + if (out_arr.length) {
  255 + for (var m in out_arr) {
  256 + if (goods_map[item.goods_id]) {
  257 + var num = goods_map[item.goods_id];
  258 + num += item.num
  259 + goods_map[item.goods_id] = num;
  260 + } else {
  261 + goods_map[item.goods_id] = item.num;
  262 + }
  263 + }
  264 + }
  265 +
  266 + //-- 组合购的商品限购的数组控制 --
  267 + var in_zhact_gdmap={};
  268 + //商品的列表
  269 + for (var u in goods) {
  270 + var ite = goods[u];
  271 + var cart_num = get_num(ite).goods_num;
  272 +
  273 + if (ite.buyqty > 0 && cart_num > 0) {
  274 + var key = ite.goods_id + "." + act.id;
  275 + if(goods_map[ite.goods_id]){
  276 + cart_num-=goods_map[ite.goods_id];
  277 + }
  278 + if(cart_num>0){
  279 + if (in_zhact_gdmap[key]) {
  280 + in_zhact_gdmap[key] += ite.num;
  281 + } else {
  282 + in_zhact_gdmap[key] = ite.num;
  283 + }
  284 + }
  285 +
  286 + }
  287 + }
  288 + item_act_map.in_zhact_gdmap=in_zhact_gdmap;
  289 + return true;
  290 + }
  291 + return false;
  292 + },
  293 + //-- 判读一下促销分组的问题 --
  294 + //-- is_need_ck_num 是多门店计算的时候,数量是不是要累家计算 --
  295 + //-- need_ok是判断要不要满足条件 --
  296 + async cart_cx_group(th,goods,car_item,is_need_ck_num,need_ok,func){
  297 +
  298 + var os= getApp().globalData.setting;
  299 + //更改活动的时候,就不能再重新计算活动,只有再加减数量和选择商品的时候,就要重新计算活动
  300 + if(th.data.change_act || (car_item.show_can_cx && Object.keys(car_item.show_can_cx).length>0)){
  301 + var show_can_cx=car_item.show_can_cx;
  302 + for(var k in show_can_cx){
  303 + var k_item=show_can_cx[k];
  304 + var ck_prom_type=null;
  305 + //-- 如果是多活动,先把活动按照后台的顺序排序一下,
  306 + //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 --
  307 + if(k_item.act_arr.length>1){
  308 + var json_d =th.data.json_d;
  309 + var auto_promote_sale=json_d.auto_promote_sale;
  310 + var sort_type='';
  311 +
  312 + if(!auto_promote_sale){
  313 + sort_type='prom_type';
  314 + }else{
  315 + var auto_promote_sale=auto_promote_sale.split(',');
  316 + //-- 循环处理 --
  317 + k_item.act_arr.map(function (e){
  318 + var fd=auto_promote_sale.indexOf(e.prom_type+'');
  319 + e.sort=fd;
  320 + })
  321 + sort_type='sort';
  322 + }
  323 + //-- 排序一下,进行升序 --
  324 + function comp(a, b) {
  325 + return a[sort_type]-b[sort_type]; //升序
  326 + }
  327 + //活动要排序一下
  328 + k_item.act_arr.sort(comp);
  329 +
  330 + //确定一下活动,先看一下有没有选择的活动
  331 + ck_prom_type=k_item.act_arr.find(function (el){
  332 + return el.sele;
  333 + })
  334 +
  335 + }
  336 + //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 --
  337 + if(!ck_prom_type) ck_prom_type=k_item.act_arr[0];
  338 +
  339 + //-- 此时要把购物车中的商品确定活动 --
  340 + for (var b=0; b<ck_prom_type.goods.length;b++){
  341 + //-- 开始查找 --
  342 + var fg=goods.findIndex(function (g_item){
  343 + return g_item.goods_id==ck_prom_type.goods[b].goods_id && [0,3,5,7,10].indexOf(g_item.prom_type)>-1;
  344 + })
  345 + if(fg>-1){
  346 + goods[fg].prom_type=ck_prom_type.prom_type;
  347 + goods[fg].prom_id=ck_prom_type.prom_id;
  348 + }
  349 + }
  350 +
  351 + }
  352 + func(show_can_cx);
  353 + return false;
  354 + }
  355 +
  356 + //-- 促销活动对象表,最初的map表,包含活动类型,活动id,goods商品 ---
  357 + var cx_act_map=[];
  358 + for(var i=0; i<goods.length;i++){
  359 + var c_item=goods[i];
  360 + //没有选中
  361 + if(!c_item.selected) continue;
  362 + //如果是秒杀之类是商品
  363 + if([1,2,4,6,8,9].indexOf(c_item.prom_type)>-1) continue;
  364 +
  365 + //-- 把活动进行规整 --
  366 + var more_cx=c_item.more_cx;
  367 + for (var j=0;j<more_cx.length;j++){
  368 + var n_item=more_cx[j];
  369 + var key=n_item.prom_type+'-'+n_item.prom_id;
  370 + var fd=cx_act_map.find(function (e){
  371 + return e.key==key;
  372 + })
  373 + if(fd){
  374 + fd.goods.push(c_item);
  375 + }else{
  376 + var p_item={key:key,prom_type:n_item.prom_type,prom_id:n_item.prom_id,goods:[],act:n_item};
  377 + if(n_item.prom_type==7){
  378 + p_item.zh_pro=n_item.zh_pro;
  379 + }
  380 + p_item.goods.push(c_item);
  381 + cx_act_map.push(p_item);
  382 + }
  383 + }
  384 + goods[i].prom_type=0;
  385 + goods[i].prom_id=0;
  386 + }
  387 + //-- 如果活动数量大于1个,那么活动就要排序一下,有商品种类数最多排再前面,降序进行排列 --
  388 + if(cx_act_map.length>1){
  389 + //门店分类要排序下
  390 + function compare(a, b) {
  391 + var value1 = a.goods.length;
  392 + var value2 = b.goods.length;
  393 + return value2 - value1;
  394 + }
  395 + cx_act_map.sort(compare);
  396 + }
  397 + //-- 能够进行最后计算的活动(包含切换) --
  398 + var can_calc_cx=[];
  399 + //-- 此时对数组的活动进行判断,看能不能达到购买数量的条件 --
  400 + for(var ii=0;ii<cx_act_map.length;ii++){
  401 +
  402 + var item_act_map=cx_act_map[ii];
  403 + //如果活动有交集的时候,商品数量一样多(不是完全相同时,就是参与的商品有交集),就按照后台确定的活动顺序
  404 + //如果活动商品数量少的和 活动数量多的 有交集,那么数量少的不显示,也不计算
  405 + //如果活动的商品一样(那就是多活动切换),优先计算的活动按照后台确定的活动顺序
  406 + if(!this.check_ok_cx_pro(item_act_map,can_calc_cx)){
  407 + continue;
  408 + }
  409 + switch(item_act_map.prom_type){
  410 + case 3:
  411 + //活动ID
  412 + var aid=item_act_map.prom_id;
  413 + var need_num=0;
  414 + //-- 这个时候要判断是不是要判断优惠促销多门店的时候的限购 --
  415 + if(is_need_ck_num){
  416 + need_num=th.data.in_yhact_new[aid]?th.data.in_yhact_new[aid]:0;
  417 + }
  418 + //-- 判断优惠促销要不要限购 --
  419 + var fd=null;
  420 + var fd_res = await getApp().request.promiseGet('/api/weshop/promgoods/get/'+os.stoid+'/'+ky0,{})
  421 + if(fd_res && fd_res.data.code==0 ){
  422 + fd=fd_res.data.data;
  423 + }
  424 + //如果有限购的时候,也要计算一下
  425 + if (fd && fd['limit_num'] > 0){
  426 + //-- 获取已经购买了多少件 --
  427 + var url = "/api/weshop/ordergoods/getUserBuyPromNum?store_id="+os.stoid+"&user_id="
  428 + +getApp().globalData.user_id+"&prom_type=3&prom_id="+zh_pro0.id;
  429 + await getApp().request.promiseGet(url, {}).then(rh => {
  430 + if(rh.data.code==0){
  431 + item_act_map.buyed=rh.data.data.userbuynum;
  432 + }
  433 + })
  434 + if(item_act_map.buyed+need_num>=fd['limit_num']){
  435 + continue; //-- 进行下一个循环 --
  436 + }
  437 + }
  438 +
  439 + if(!need_ok){
  440 + can_calc_cx.push(item_act_map);
  441 + continue;
  442 + }
  443 +
  444 + var fir_act=item_act_map.act.fir_act;
  445 + var t_goods=item_act_map.goods;
  446 + var all_num=0;
  447 + var all_pri=0;
  448 + for(var f=0;f<t_goods.length;f++){
  449 + all_num+=t_goods[f].goods_num;
  450 + all_pri+=t_goods[f].goods_num*t_goods[f].goods_price;
  451 + }
  452 + var yh_ok=1;
  453 + switch (fir_act.prom_type){
  454 + case 0:
  455 + if(all_pri<fir_act.condition) {
  456 + yh_ok=0;
  457 + }
  458 + break;
  459 + case 1:
  460 + if(all_num<fir_act.condition) {
  461 + yh_ok=0;
  462 + }
  463 + break;
  464 + }
  465 + //-- 如果有满足优惠条件的时候 --
  466 + if(yh_ok){
  467 + can_calc_cx.push(item_act_map)
  468 + }
  469 + break
  470 +
  471 + case 7:
  472 + //-- 活动列表 --
  473 + var zhact_gdlist=item_act_map.act.gdlist;
  474 + var zh_goods=item_act_map.goods;
  475 + //--- 要循环计算一下商品的已购数量 ---
  476 + for(var h=0;h<zh_goods.length;h++){
  477 + //-- 商品的限购 --
  478 + var promgoodsbuynum = 0;
  479 + var res=await getApp().request.promiseGet("/api/weshop/ordergoods/getUserBuyGoodsNum", {
  480 + data: {
  481 + store_id: os.stoid,
  482 + user_id: getApp().globalData.user_id,
  483 + goods_id: zh_goods[h].goods_id,
  484 + prom_type: 7,
  485 + prom_id: item_act_map.prom_id
  486 + },
  487 + })
  488 + if(res.data.code==0 && res.data.data && res.data.data.promgoodsbuynum){
  489 + promgoodsbuynum = res.data.data.promgoodsbuynum;
  490 + }
  491 + zh_goods[h].zh_b_num=promgoodsbuynum;
  492 + }
  493 + //-- 放到参与组合优惠促销的map中 --
  494 + th.data.zuhe_map_good[item_act_map.prom_id] = zhact_gdlist;
  495 + if(!car_item.zh_prom_goods) car_item.zh_prom_goods={};
  496 + car_item.zh_prom_goods[item_act_map.prom_id] = zhact_gdlist;
  497 +
  498 + //-- 兼容购物车和确认订单的页面 --
  499 + var ob=th.data.zuhe_map;
  500 + if(!ob) ob=th.data.zhhe_act_map;
  501 +
  502 + var zh_pro0 = ob[item_act_map.prom_id];
  503 +
  504 + //-- 获取活动信息 --
  505 + var url = "/api/weshop/ordergoods/getUserBuyPromNum?store_id="+os.stoid+"&user_id="
  506 + +getApp().globalData.user_id+"&prom_type=7&prom_id="+zh_pro0.id;
  507 + await getApp().request.promiseGet(url, {}).then(rh => {
  508 + if(rh.data.code==0){
  509 + item_act_map.buyed=rh.data.data.userbuynum;
  510 + }
  511 + })
  512 + //当满足组合的要求:总数要满足,起购数要满足
  513 + if(this.ch_zh_ok(zh_pro0,zhact_gdlist,zh_goods,th,item_act_map,is_need_ck_num,need_ok)){
  514 + can_calc_cx.push(item_act_map)
  515 + }
  516 + break;
  517 + default:
  518 + can_calc_cx.push(item_act_map);
  519 + }
  520 +
  521 + }
  522 +
  523 + //-- 此时来给满足条件的活动进行分组~~相同参与商品和数量的归纳再一起, --
  524 + //-- 同时相同商品数量的活动,还要看取那一个来进行计算金额。 默认的时候是按照后台的顺序。--
  525 + //-- 有选择的时候,就按照切换选择了什么就按照什么来计算 --
  526 + //-- can_calc_cx的元素(item_act_map)最后是放到act_arr里面去了 --
  527 + var show_can_cx={};
  528 + if(can_calc_cx.length){
  529 + for(var p=0;p<can_calc_cx.length;p++){
  530 + var ch_map=[];
  531 + can_calc_cx[p].goods.map(function (gd){
  532 + ch_map.push(gd.goods_id);
  533 + })
  534 + ch_map.sort();
  535 + //-- 先找一下,有没有参与的商品一模一样的 --
  536 + var fd=show_can_cx[ch_map.join()];
  537 + if(fd){
  538 + //-- 把数组添加进去 --ch_map
  539 + fd.act_arr.push(can_calc_cx[p])
  540 + }else{
  541 + var e={ch_map:ch_map,act_arr:[]};
  542 + if(ch_map.length>1){
  543 + e.is_duo_gd=1;
  544 + }
  545 + e.act_arr.push(can_calc_cx[p]);
  546 + show_can_cx[ch_map.join()]=e;
  547 + }
  548 + }
  549 + }
  550 +
  551 + for(var k in show_can_cx){
  552 + var k_item=show_can_cx[k];
  553 + var ck_prom_type=null;
  554 + //-- 如果是多活动,先把活动按照后台的顺序排序一下,
  555 + //-- 同时确定一下商品最终要用什么活动来购买计算。 --就是要进行切换 --
  556 + if(k_item.act_arr.length>1){
  557 + var json_d =th.data.json_d;
  558 + var auto_promote_sale=json_d.auto_promote_sale;
  559 + var sort_type='';
  560 +
  561 + if(!auto_promote_sale){
  562 + sort_type='prom_type';
  563 + }else{
  564 + var auto_promote_sale=auto_promote_sale.split(',');
  565 + //-- 循环处理 --
  566 + k_item.act_arr.map(function (e){
  567 + var fd=auto_promote_sale.indexOf(e.prom_type+'');
  568 + e.sort=fd;
  569 + })
  570 + sort_type='sort';
  571 + }
  572 + //-- 排序一下,进行升序 --
  573 + function comp(a, b) {
  574 + return a[sort_type]-b[sort_type]; //升序
  575 + }
  576 + //活动要排序一下
  577 + k_item.act_arr.sort(comp);
  578 +
  579 + //确定一下活动,先看一下有没有选择的活动
  580 + ck_prom_type=k_item.act_arr.find(function (el){
  581 + return el.sele;
  582 + })
  583 +
  584 + }
  585 + //-- 此时已经确定了商品的活动是什么类型的,可以确定购物车中商品的具体活动进行金额的计算 --
  586 + if(!ck_prom_type){
  587 + ck_prom_type=k_item.act_arr[0];
  588 + k_item.act_arr[0].sele=1;
  589 + }
  590 +
  591 + //-- 如果是要控制数量的时候,也就是全选的时候,或者加减号的时候 --
  592 + if(is_need_ck_num){
  593 + var t_pid=ck_prom_type.prom_id;
  594 + switch (ck_prom_type.prom_type){
  595 + case 3:
  596 + if(!th.data.in_yhact_new[t_pid]) th.data.in_yhact_new[t_pid]=0;
  597 + th.data.in_yhact_new[t_pid]++;
  598 + break;
  599 + case 7:
  600 + if(!th.data.in_zhact_new[t_pid]) th.data.in_zhact_new[t_pid]=0;
  601 + th.data.in_zhact_new[t_pid]+=ck_prom_type.act_num;
  602 + //-- 数组的优化 --
  603 + var nei_gd_map=ck_prom_type.in_zhact_gdmap;
  604 + if(nei_gd_map){
  605 + for (var vg in nei_gd_map) {
  606 + if (!th.data.in_zhact_gdmap_new[vg]) th.data.in_zhact_gdmap_new[vg] = 0;
  607 + th.data.in_zhact_gdmap_new[vg] += nei_gd_map[vg];
  608 + }
  609 + }
  610 + break;
  611 + }
  612 + }
  613 + //-- 此时要把购物车中的商品确定活动 --
  614 + for (var b=0; b<ck_prom_type.goods.length;b++){
  615 + //-- 开始查找 --
  616 + var fg=goods.findIndex(function (g_item){
  617 + return g_item.goods_id==ck_prom_type.goods[b].goods_id && [0,3,5,7,10].indexOf(g_item.prom_type)>-1;
  618 + })
  619 + if(fg>-1){
  620 + goods[fg].prom_type=ck_prom_type.prom_type;
  621 + goods[fg].prom_id=ck_prom_type.prom_id;
  622 + }
  623 + }
  624 + }
  625 + //-- 显示到前端,并切换 --
  626 + //th.setData({show_can_cx})
  627 + //--- 调用回调函数 ---
  628 + func(show_can_cx);
  629 +
  630 + },
  631 + //-- 查看活动参与的商品是不是有重复交集的地方,是不是一样的商品数量,can_calc_cx这个数组也是按照商品的数量降序排列的--
  632 + check_ok_cx_pro(item_act_map,can_calc_cx){
  633 + //-- 加入第一个,返回真 --
  634 + if(!can_calc_cx.length) return true;
  635 + var th_goods=item_act_map.goods;
  636 + for(var i=0;i<can_calc_cx.length;i++){
  637 + var can_goods=can_calc_cx[i].goods;
  638 + //计算一下有交集的数量,没有交集,OK
  639 + var num=this.hasJiao(can_goods,th_goods);
  640 + if(!num) continue;
  641 + //计算一下俩个shu
  642 + if(can_goods.length==th_goods.length && can_goods.length==num){
  643 + return true;
  644 + }
  645 + if(can_goods.length>th_goods.length){
  646 + return false;
  647 + }
  648 + }
  649 + return true;
  650 + },
  651 + //-- 判断是不是有交集,返回交集的数量 --
  652 + hasJiao(arr1, arr2){
  653 + var num=0;
  654 + arr1.map(function (e){
  655 + var idx=arr2.findIndex(function (g){
  656 + return g.goods_id==e.goods_id;
  657 + })
  658 + if(idx>-1) num++;
  659 + })
  660 + return num;
  661 + },
  662 +
  663 +
  664 +}
0 665 \ No newline at end of file
... ...