Commit f47ab5024731acffe34437c09e5a653d15142ce3

Authored by pengye
1 parent b59d5233

付款页筛选后累计获取可叠加的优惠券组合

@@ -528,65 +528,49 @@ Page({ @@ -528,65 +528,49 @@ Page({
528 const isValid = validCoupons.some(validCoupon => validCoupon.activity_id == item.activity_id); 528 const isValid = validCoupons.some(validCoupon => validCoupon.activity_id == item.activity_id);
529 item.canCheck = isValid ? '1' : '0'; // 如果在 validCoupons 中,设置 canCheck 为 1,否则为 0 529 item.canCheck = isValid ? '1' : '0'; // 如果在 validCoupons 中,设置 canCheck 为 1,否则为 0
530 }); 530 });
531 - // 输入的金额 > 可选券的总优惠金额 勾选所有可选券(未完成)  
532 - // let yxDesc=0  
533 - // let yxArr=[]  
534 - // let yxSum = validCoupons.reduce((pre,cur)=>{  
535 - // if (cur.accumulationShow==1 && cur.canCheck == '1') {  
536 - // if (cur.desc==0||!cur.desc) {  
537 - // yxDesc+=parseFloat(cur.price)  
538 - // }else{  
539 - // yxDesc+=parseFloat(cur.desc)  
540 - // }  
541 -  
542 - // pre+=parseFloat(cur.price)  
543 - // yxArr.push(cur)  
544 - // }  
545 - // return pre;  
546 - // },0)  
547 - // console.log('yxSum',yxSum,'yxDesc',yxDesc,'yxArr',yxArr);  
548 console.log('可以勾选的券 && 满足付款条件的券', validCoupons); 531 console.log('可以勾选的券 && 满足付款条件的券', validCoupons);
  532 + let stackingCoupons = validCoupons.filter(i => {
  533 + return i.accumulationShow == '1'
  534 + })
549 let list1 = []; // 可叠加的优惠券组合 535 let list1 = []; // 可叠加的优惠券组合
550 let list2 = []; // 最优惠的不可叠加的优惠券 536 let list2 = []; // 最优惠的不可叠加的优惠券
551 let finalList = []; //最终用的优惠券组合 537 let finalList = []; //最终用的优惠券组合
552 // 计算可叠加的组合 538 // 计算可叠加的组合
553 - let closestSum = -Infinity; // 最接近或等于输入值的和  
554 - let descSum = 0;//满减金额之和  
555 - function backtrack(startIndex, currentCombination, currentSum,couponCount) {  
556 - // 如果当前和等于输入值,直接返回  
557 - if (currentSum == amount) {  
558 - closestSum = currentSum;  
559 - list1 = [...currentCombination];  
560 - return;  
561 - }  
562 - // 如果当前和小于等于输入值且更接近输入值,更新最优解  
563 - if (currentSum <= amount && currentSum > closestSum) {  
564 - closestSum = currentSum;  
565 - list1 = [...currentCombination]; 539 + let remainingPrice = amount; // 剩余金额
  540 + let totalDiscount = 0; // 总优惠金额
  541 + // 1. 优先排序 desc 为空或为 0 的,再根据 price 从大到小排序,再根据满减条件 desc 从大到小排序
  542 + stackingCoupons.sort((a, b) => {
  543 + if (a.desc === '0' || a.desc === '') return -1; // 优先选择 desc 为空或为 0 的
  544 + if (b.desc === '0' || b.desc === '') return 1;
  545 + if (parseFloat(b.price) !== parseFloat(a.price)) return parseFloat(b.price) - parseFloat(a.price); // 按 price 从大到小
  546 + return parseFloat(b.desc) - parseFloat(a.desc); // 按满减条件 desc 从大到小
  547 + });
  548 + console.log('排序后的可叠加券列表',stackingCoupons);
  549 + // 2. 从排序后的券中选择
  550 + for (let coupon of stackingCoupons) {
  551 + let couponDesc = parseFloat(coupon.desc);
  552 + let couponPrice = parseFloat(coupon.price);
  553 + let kyNum = Math.floor(remainingPrice / couponDesc);// 计算券可用张数
  554 + if (couponDesc === 0) {// 如果满减条件为 0,直接选择
  555 + list1.push(coupon);
  556 + remainingPrice -= couponPrice; // 减去价格
  557 + totalDiscount += couponPrice; // 计算优惠金额
  558 + continue;
566 } 559 }
567 - // 遍历数组  
568 - for (let i = startIndex; i < validCoupons.length; i++) {  
569 - const obj = validCoupons[i];  
570 - if (obj.accumulationShow == '1') { // 仅考虑可叠加的优惠券  
571 - if (currentSum*1 + obj.price*1 > amount) continue; // 如果当前和已经超过输入值,跳过  
572 - descSum += obj.desc*1;  
573 - let remainingPrice = amount - descSum;//输入金额 - 总满减条件金额  
574 - let kyNum = Math.floor(remainingPrice/parseFloat(obj.desc))  
575 - if (amount - obj.price*1 >= 0&&(!couponCount[obj.aid]||couponCount[obj.aid] < kyNum) && kyNum>-1) {  
576 - couponCount[obj.aid] = (couponCount[obj.aid] || 0) + 1; // 更新使用次数  
577 - currentCombination.push(obj); // 添加当前数字到组合  
578 - backtrack(i + 1, currentCombination, currentSum*1 + obj.price*1,couponCount); // 递归  
579 - currentCombination.pop(); // 回溯  
580 - couponCount[obj.aid]--; // 回溯时减少使用次数  
581 - }  
582 - // 提前退出:如果当前和加上当前数字已经小于输入值,后续的数字也会更小  
583 - if (currentSum*1 + obj.price*1 < amount) break; 560 + // 如果剩余金额足够,选择券
  561 + if (remainingPrice >= couponDesc) {
  562 + // 计算实际使用的张数,不能超过 kyNum
  563 + let usedCount = Math.min(kyNum, 1); // 假设每次只使用一张
  564 + let potentialDiscount = couponDesc * usedCount; // 计算潜在的优惠金额
  565 + if (totalDiscount + potentialDiscount <= amount) {// 检查总优惠金额是否会超过总金额
  566 + list1.push(coupon);
  567 + remainingPrice -= couponPrice * usedCount; // 减去价格
  568 + totalDiscount += potentialDiscount; // 计算优惠金额
584 } 569 }
585 -  
586 } 570 }
  571 + // 如果剩余金额已经小于等于 0,停止选择
  572 + if (remainingPrice <= 0) break;
587 } 573 }
588 - const couponCount = {};  
589 - backtrack(0, [], 0,couponCount); // 开始回溯  
590 // 遍历有效优惠券,寻找不可叠加的优惠券 574 // 遍历有效优惠券,寻找不可叠加的优惠券
591 let maxNonStackableValue = 0 575 let maxNonStackableValue = 0
592 validCoupons.forEach(coupon => { 576 validCoupons.forEach(coupon => {
@@ -607,7 +591,8 @@ Page({ @@ -607,7 +591,8 @@ Page({
607 console.log('不可叠加的优惠券', list2); 591 console.log('不可叠加的优惠券', list2);
608 // 计算两个列表的最大优惠值 592 // 计算两个列表的最大优惠值
609 let maxStackableValue = list1.reduce((total, coupon) => total + parseFloat(coupon.price), 0); 593 let maxStackableValue = list1.reduce((total, coupon) => total + parseFloat(coupon.price), 0);
610 - 594 + console.log('可叠加优惠券组合总金额', maxStackableValue);
  595 + console.log('不可叠加的优惠券总金额', maxNonStackableValue);
611 // 比较两个最大值并输出结果 596 // 比较两个最大值并输出结果
612 if (maxStackableValue > maxNonStackableValue) { 597 if (maxStackableValue > maxNonStackableValue) {
613 finalList = list1 598 finalList = list1