Showing
1 changed file
with
36 additions
and
51 deletions
| @@ -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 |
-
Please register or login to post a comment