couponUtil.js 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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(productIds, couponList) {
  10. const list = couponList.filter(coupon => coupon.productType === 1 || isIntersect(productIds, coupon.productIds
  11. .split(',')))
  12. return couponSort(list)
  13. }
  14. /**
  15. * 优惠券是否可用
  16. * 1 无门槛
  17. * 2 有门槛
  18. * 1 全部商品可用
  19. * 全部商品价格总计 >= 当前优惠券的触发金额
  20. * 2 指定商品可用
  21. * 当前优惠券可用的商品的价格总计 >= 当前优惠券的触发金额
  22. * */
  23. // 判断可用优惠券是否满足使用条件 返回抵扣金额最高的优惠券索引 -1:无可用优惠券
  24. export function canUseCoupon(current, productIds, canUseCouponList, selectedPoducts) {
  25. if (productIds.length <= 0 || canUseCouponList.length <= 0) return -1
  26. const len = canUseCouponList.length
  27. if (current >= len) return len
  28. const currentCoupon = canUseCouponList[current]
  29. if (
  30. currentCoupon.noThresholdFlag === 1 ||
  31. (currentCoupon.productType === 1 && allProdoceUseCheck(selectedPoducts, currentCoupon)) ||
  32. (currentCoupon.productType === 2 && someProductUseCheck(selectedPoducts, currentCoupon))
  33. ) {
  34. return current
  35. } else {
  36. return canUseCoupon(++current, productIds, canUseCouponList, selectedPoducts)
  37. }
  38. }
  39. // 判断全部商品可用 (全部商品价格总计 是否大于 当前优惠券的触发金额)
  40. export function allProdoceUseCheck(productList, coupon) {
  41. const countPrice = productList.reduce((countPrice, prod) => countPrice + prod.price * prod.productCount, 0)
  42. return countPrice >= coupon.touchPrice
  43. }
  44. // 判断指定商品可用 (当前优惠券可用的商品的价格总计 是否大于 当前优惠券的触发金额)
  45. export function someProductUseCheck(productList, coupon) {
  46. const countPrice = productList.reduce((countPrice, prod) => {
  47. // 当前优惠券可用的商品总价
  48. const isIncludes = coupon.productIds.indexOf(prod.productId.toString()) > -1
  49. return isIncludes ? countPrice + prod.price * prod.productCount : countPrice
  50. }, 0)
  51. return countPrice >= coupon.touchPrice
  52. }
  53. // 计算当前优惠券可使用的商品的总价
  54. export function getCountPrice(productList, coupon) {
  55. let countPrice = 0
  56. // 针对全部商品
  57. if (coupon.productType === 1) {
  58. countPrice = productList.reduce((countPrice, prod) => countPrice + prod.price * prod.productCount, 0)
  59. }
  60. // 只针对优惠券可用商品
  61. if (coupon.productType === 2) {
  62. countPrice = productList.reduce((countPrice, prod) => {
  63. // 当前优惠券可用的商品总价
  64. const isIncludes = coupon.productIds.indexOf(prod.productId.toString()) > -1
  65. return isIncludes ? countPrice + prod.price * prod.productCount : countPrice
  66. }, 0)
  67. }
  68. return countPrice
  69. }
  70. // 将优惠券按抵扣金额从大到小排序
  71. export function couponSort(couponList) {
  72. return couponList.sort((a, b) => b.couponAmount - a.couponAmount)
  73. }
  74. // 对优惠券去重 过滤掉相同id的优惠券
  75. export function couponFilterRepeat(couponList) {
  76. const list = []
  77. couponList.forEach(coupon => {
  78. if (list.findIndex(v => v.couponId === coupon.couponId) === -1) list.push(coupon)
  79. })
  80. return list
  81. }
  82. // 为优惠券设置唯一ID
  83. export function setCouponUniqueId(couponList = []) {
  84. return couponList.map((coupon, index) => {
  85. coupon.uniqueId = index
  86. return coupon
  87. })
  88. }