couponUtil.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { isIntersect } from '@/common/util.js'
  2. // 获取选中商品
  3. export function fetchSelectedProducts(goodsList) {
  4. const productList = []
  5. goodsList.forEach(shop => productList.push(...shop.productList.filter(prod => prod.productsChecked)))
  6. return productList
  7. }
  8. // 根据选中商品筛选可用优惠券并排序
  9. export function findCouponBySelected(ids, couponList) {
  10. const list = couponList.filter(coupon => coupon.productType === 1 || isIntersect(ids, coupon.productIds.split(',')))
  11. return couponSort(list)
  12. }
  13. /**
  14. * 优惠券是否可用
  15. * 1 无门槛
  16. * 2 有门槛
  17. * 1 全部商品可用
  18. * 全部商品价格总计 >= 当前优惠券的触发金额
  19. * 2 指定商品可用
  20. * 当前优惠券可用的商品的价格总计 >= 当前优惠券的触发金额
  21. * */
  22. // 判断可用优惠券是否满足使用条件
  23. export function canUseCoupon(current, productIds, canUseCouponList, selectedPoducts) {
  24. if (productIds.length <= 0 || canUseCouponList.length <= 0) return -1
  25. const len = canUseCouponList.length
  26. if (current >= len) return len
  27. const currentCoupon = canUseCouponList[current]
  28. if (
  29. currentCoupon.noThresholdFlag === 1 ||
  30. (currentCoupon.productType === 1 && allProdoceUseCheck(selectedPoducts, currentCoupon)) ||
  31. (currentCoupon.productType === 2 && someProductUseCheck(selectedPoducts, currentCoupon))
  32. ) {
  33. return current
  34. } else {
  35. return canUseCoupon(++current, productIds, canUseCouponList, selectedPoducts)
  36. }
  37. }
  38. // 判断全部商品可用 (全部商品价格总计 是否大于 当前优惠券的触发金额)
  39. export function allProdoceUseCheck(productList, coupon) {
  40. const countPrice = productList.reduce((countPrice, prod) => countPrice + prod.price * prod.productCount, 0)
  41. return countPrice >= coupon.touchPrice
  42. }
  43. // 判断指定商品可用 (当前优惠券可用的商品的价格总计 是否大于 当前优惠券的触发金额)
  44. export function someProductUseCheck(productList, coupon) {
  45. const countPrice = productList.reduce((countPrice, prod) => {
  46. // 当前优惠券可用的商品总价
  47. const isIncludes = coupon.productIds.indexOf(prod.productId.toString()) > -1
  48. return isIncludes ? countPrice + prod.price * prod.productCount : countPrice
  49. }, 0)
  50. return countPrice >= coupon.touchPrice
  51. }
  52. // 统计当前优惠券商品可用的价格
  53. export function getCountPrice(productList, coupon) {
  54. let countPrice = 0
  55. // 针对全部商品
  56. if (coupon.productType === 1) {
  57. countPrice = productList.reduce((countPrice, prod) => countPrice + prod.price * prod.productCount, 0)
  58. }
  59. // 只针对优惠券可用商品
  60. if (coupon.productType === 2) {
  61. countPrice = productList.reduce((countPrice, prod) => {
  62. // 当前优惠券可用的商品总价
  63. const isIncludes = coupon.productIds.indexOf(prod.productId.toString()) > -1
  64. return isIncludes ? countPrice + prod.price * prod.productCount : countPrice
  65. }, 0)
  66. }
  67. return countPrice
  68. }
  69. // 将优惠券按金额从大到小排序
  70. export function couponSort(couponList) {
  71. return couponList.sort((a, b) => b.couponAmount - a.couponAmount)
  72. }