From 6216dcbfeeee4e4b40624756c3fe5af0438fea29 Mon Sep 17 00:00:00 2001 From: YeMingfei666 <1619116647@qq.com> Date: Mon, 13 Oct 2025 11:24:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E6=83=A0=E5=88=B8=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- pages/order/components/orderInfo.vue | 11 +- pnpm-lock.yaml | 214 ++------ utils/goods-utils.js | 742 +++++++++++++-------------- 4 files changed, 419 insertions(+), 550 deletions(-) diff --git a/package.json b/package.json index 1511c7e..036e425 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,6 @@ "lodash": "^4.17.21", "pinia": "^2.3.1", "pinia-plugin-unistorage": "^0.1.2", - "ysk-utils": "^1.0.35" + "ysk-utils": "^1.0.40" } } diff --git a/pages/order/components/orderInfo.vue b/pages/order/components/orderInfo.vue index 721aacc..59684f6 100644 --- a/pages/order/components/orderInfo.vue +++ b/pages/order/components/orderInfo.vue @@ -464,8 +464,8 @@ const maxPointDiscount = ref(0) //积分可抵扣最大金额 const maxMoney = computed(() => { - return cartStore.orderCostSummary.goodsRealAmount - cartStore.orderCostSummary - .couponDeductionAmount + return cartStore.orderCostSummary.finalPayAmount + cartStore.orderCostSummary + .pointDeductionAmount }) async function getMaxPointsDiscount() { @@ -553,11 +553,8 @@ favorablelist.value = back_favorablelist.filter(v => v.name != '新客立减') return } - if (!consumeDiscountRes.isUse) { - favorablelist.value = back_favorablelist.filter(v => v.name != '新客立减') - return - } - if (consumeDiscountRes && consumeDiscountRes.isUse) { + + if (consumeDiscountRes) { newUserDiscount.value = consumeDiscountRes.amount cartStore.newUserDiscount = consumeDiscountRes.amount || 0 cartStore.consumeDiscount = consumeDiscountRes diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92a7d56..17c1f22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -30,191 +30,114 @@ importers: specifier: ^0.1.2 version: 0.1.2 ysk-utils: - specifier: ^1.0.35 - version: 1.0.35 + specifier: ^1.0.40 + version: 1.0.40 packages: - /@babel/helper-string-parser@7.27.1: + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-validator-identifier@7.27.1: + '@babel/helper-validator-identifier@7.27.1': resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - dev: false - /@babel/parser@7.28.4: + '@babel/parser@7.28.4': resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.28.4 - dev: false - /@babel/types@7.28.4: + '@babel/types@7.28.4': resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - dev: false - /@dcloudio/types@3.4.21: + '@dcloudio/types@3.4.21': resolution: {integrity: sha512-rsv3XfAaD/dtuVboPeYh+vPcULnWyozGaGKHWyN0dYRm7L1uypFUM30qNYMj9iNmbAENuBjV177S1gNEBIvdDA==} - dev: false - /@dcloudio/uni-app@2.0.2-4070620250821001(@dcloudio/types@3.4.21)(@vue/composition-api@1.7.2): + '@dcloudio/uni-app@2.0.2-4070620250821001': resolution: {integrity: sha512-kZBLLRmFsF3HvqfgTKHh1NDb1G7L5jJXZ3rncrGnaIirc6mE4jpBoSeqQY5jFxgQXFdJVXsHvLezBi13XiqazA==} peerDependencies: '@dcloudio/types': ^3.0.15 '@vue/composition-api': ^1.7.0 - dependencies: - '@dcloudio/types': 3.4.21 - '@vue/composition-api': 1.7.2(vue@3.5.21) - dev: false - /@jridgewell/sourcemap-codec@1.5.5: + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - dev: false - /@vue/compiler-core@3.5.21: - resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} - dependencies: - '@babel/parser': 7.28.4 - '@vue/shared': 3.5.21 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - dev: false + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} - /@vue/compiler-dom@3.5.21: - resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} - dependencies: - '@vue/compiler-core': 3.5.21 - '@vue/shared': 3.5.21 - dev: false + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} - /@vue/compiler-sfc@3.5.21: - resolution: {integrity: sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==} - dependencies: - '@babel/parser': 7.28.4 - '@vue/compiler-core': 3.5.21 - '@vue/compiler-dom': 3.5.21 - '@vue/compiler-ssr': 3.5.21 - '@vue/shared': 3.5.21 - estree-walker: 2.0.2 - magic-string: 0.30.19 - postcss: 8.5.6 - source-map-js: 1.2.1 - dev: false + '@vue/compiler-sfc@3.5.22': + resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} - /@vue/compiler-ssr@3.5.21: - resolution: {integrity: sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==} - dependencies: - '@vue/compiler-dom': 3.5.21 - '@vue/shared': 3.5.21 - dev: false + '@vue/compiler-ssr@3.5.22': + resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} - /@vue/composition-api@1.7.2(vue@3.5.21): + '@vue/composition-api@1.7.2': resolution: {integrity: sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==} peerDependencies: vue: '>= 2.5 < 2.7' - dependencies: - vue: 3.5.21 - dev: false - /@vue/devtools-api@6.6.4: + '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - dev: false - /@vue/reactivity@3.5.21: - resolution: {integrity: sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==} - dependencies: - '@vue/shared': 3.5.21 - dev: false + '@vue/reactivity@3.5.22': + resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} - /@vue/runtime-core@3.5.21: - resolution: {integrity: sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==} - dependencies: - '@vue/reactivity': 3.5.21 - '@vue/shared': 3.5.21 - dev: false + '@vue/runtime-core@3.5.22': + resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} - /@vue/runtime-dom@3.5.21: - resolution: {integrity: sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==} - dependencies: - '@vue/reactivity': 3.5.21 - '@vue/runtime-core': 3.5.21 - '@vue/shared': 3.5.21 - csstype: 3.1.3 - dev: false + '@vue/runtime-dom@3.5.22': + resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} - /@vue/server-renderer@3.5.21(vue@3.5.21): - resolution: {integrity: sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==} + '@vue/server-renderer@3.5.22': + resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} peerDependencies: - vue: 3.5.21 - dependencies: - '@vue/compiler-ssr': 3.5.21 - '@vue/shared': 3.5.21 - vue: 3.5.21 - dev: false + vue: 3.5.22 - /@vue/shared@3.5.21: - resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} - dev: false + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} - /bignumber.js@9.3.1: + bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - dev: false - /csstype@3.1.3: + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: false - /dayjs@1.11.18: + dayjs@1.11.18: resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} - dev: false - /entities@4.5.0: + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: false - /estree-walker@2.0.2: + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: false - /jsbarcode@3.12.1: + jsbarcode@3.12.1: resolution: {integrity: sha512-QZQSqIknC2Rr/YOUyOkCBqsoiBAOTYK+7yNN3JsqfoUtJtkazxNw1dmPpxuv7VVvqW13kA3/mKiLq+s/e3o9hQ==} - dev: false - /lodash@4.17.21: + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - /magic-string@0.30.19: + magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - dev: false - /nanoid@3.3.11: + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: false - /picocolors@1.1.1: + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - dev: false - /pinia-plugin-unistorage@0.1.2: + pinia-plugin-unistorage@0.1.2: resolution: {integrity: sha512-WXit2cGnm5rG6CDTcLSLehNWhyJS/Yq7WEeeXAapZbCnqoPJxlszqg7rT8S+OP47az0h5nlajGo+LuyMxUQ2uw==} - dev: false - /pinia@2.3.1(@vue/composition-api@1.7.2)(vue@3.5.21): + pinia@2.3.1: resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} peerDependencies: typescript: '>=4.4.4' @@ -222,56 +145,36 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - '@vue/devtools-api': 6.6.4 - vue: 3.5.21 - vue-demi: 0.14.10(@vue/composition-api@1.7.2)(vue@3.5.21) - transitivePeerDependencies: - - '@vue/composition-api' - dev: false - /postcss@8.5.6: + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - dev: false - /source-map-js@1.2.1: + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - dev: false - /vue-demi@0.14.10(@vue/composition-api@1.7.2)(vue@3.5.21): + vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} hasBin: true - requiresBuild: true peerDependencies: '@vue/composition-api': ^1.0.0-rc.1 vue: ^3.0.0-0 || ^2.6.0 peerDependenciesMeta: '@vue/composition-api': optional: true - dependencies: - '@vue/composition-api': 1.7.2(vue@3.5.21) - vue: 3.5.21 - dev: false - /vue@3.5.21: - resolution: {integrity: sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==} + vue@3.5.22: + resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true -<<<<<<< HEAD -======= - ysk-utils@1.0.35: - resolution: {integrity: sha512-kxPtEk5zs0HjdazbH2l2x1Tm5BUpmj1MBiOnb9Xquuj2hW2NtICtq+JB6RWFO7tzAAnOC5MRw366VOKceyeK5Q==} + ysk-utils@1.0.40: + resolution: {integrity: sha512-Hi+XI7sykGJizExMY5kVWIBhPvO3wudp2q92Vqv6zI6eDtquLz4CwxIfOLEXFfn5crYXVu/yfJQVjK3WAyNYDQ==} snapshots: @@ -280,19 +183,9 @@ snapshots: '@babel/helper-validator-identifier@7.27.1': {} '@babel/parser@7.28.4': ->>>>>>> a8c20960968cbcde30318c14633993aaff66a437 dependencies: - '@vue/compiler-dom': 3.5.21 - '@vue/compiler-sfc': 3.5.21 - '@vue/runtime-dom': 3.5.21 - '@vue/server-renderer': 3.5.21(vue@3.5.21) - '@vue/shared': 3.5.21 - dev: false + '@babel/types': 7.28.4 -<<<<<<< HEAD - /ysk-utils@1.0.35: - resolution: {integrity: sha512-kxPtEk5zs0HjdazbH2l2x1Tm5BUpmj1MBiOnb9Xquuj2hW2NtICtq+JB6RWFO7tzAAnOC5MRw366VOKceyeK5Q==} -======= '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -421,8 +314,7 @@ snapshots: '@vue/server-renderer': 3.5.22(vue@3.5.22) '@vue/shared': 3.5.22 - ysk-utils@1.0.35: ->>>>>>> a8c20960968cbcde30318c14633993aaff66a437 + ysk-utils@1.0.40: dependencies: bignumber.js: 9.3.1 - dev: false + lodash: 4.17.21 diff --git a/utils/goods-utils.js b/utils/goods-utils.js index bcad2d8..cb454ab 100644 --- a/utils/goods-utils.js +++ b/utils/goods-utils.js @@ -1,10 +1,6 @@ -import { - BigNumber -} from "bignumber.js"; +import { BigNumber } from "bignumber.js"; import _ from "lodash"; - - /** * 返回商品单价 * @param goods 商品 @@ -12,19 +8,19 @@ import _ from "lodash"; * @param {Object} shopInfo */ export function returnGoodsPrice(goods, user, shopInfo) { - if (!goods) { - return 0 - } - if (goods.discount_sale_amount * 1 > 0) { - return goods.discount_sale_amount; - } - if (shopInfo && !shopInfo.isMemberPrice) { - return goods.salePrice; - } - if (user.isVip && goods.memberPrice * 1 <= goods.salePrice * 1 && goods.memberPrice * 1 > 0) { - return goods.memberPrice; - } - return goods.salePrice; + if (!goods) { + return 0; + } + if (goods.discount_sale_amount * 1 > 0) { + return goods.discount_sale_amount; + } + if (shopInfo && !shopInfo.isMemberPrice) { + return goods.salePrice; + } + if (user.isVip && goods.memberPrice * 1 <= goods.salePrice * 1 && goods.memberPrice * 1 > 0) { + return goods.memberPrice; + } + return goods.salePrice; } /** @@ -32,15 +28,15 @@ export function returnGoodsPrice(goods, user, shopInfo) { * @param arr 商品列表 */ export function returnGoodsGroupMap(arr) { - let map = {}; - arr.forEach((v) => { - const key = v.productId + "_" + v.skuId; - if (!map[key]) { - map[key] = []; - } - map[key].push(v); - }); - return map; + let map = {}; + arr.forEach((v) => { + const key = v.productId + "_" + v.skuId; + if (!map[key]) { + map[key] = []; + } + map[key].push(v); + }); + return map; } /** @@ -48,17 +44,17 @@ export function returnGoodsGroupMap(arr) { * @param coupon */ export function returnCoupType(coupon) { - const couponTypes = { - 1: "满减券", - 2: "商品券", - 3: "折扣券", - 4: "第二件半价券", - 5: "消费送券", - 6: "买一送一券", - 7: "固定价格券", - 8: "免配送费券", - }; - return couponTypes[coupon.type] || "未知类型"; + const couponTypes = { + 1: "满减券", + 2: "商品券", + 3: "折扣券", + 4: "第二件半价券", + 5: "消费送券", + 6: "买一送一券", + 7: "固定价格券", + 8: "免配送费券", + }; + return couponTypes[coupon.type] || "未知类型"; } /** @@ -68,37 +64,37 @@ export function returnCoupType(coupon) { * @param user 用户信息 */ export function returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user) { - const types = [2, 4, 6]; - // 收集已抵扣商品并关联对应的优惠券类型 - const goodsCouponGoods = selCoupon - .filter((v) => types.includes(v.type)) - .reduce((prev, cur) => { - // 给每个抵扣商品添加所属优惠券类型 - const goodsWithType = cur.discount.hasDiscountGoodsArr.map(goods => ({ - ...goods, - couponType: cur.type // 记录该商品是被哪种类型的优惠券抵扣的 - })); - prev.push(...goodsWithType); - return prev; - }, []); - const arr = _.cloneDeep(canDikouGoodsArr) - .map((v) => { - const findCart = goodsCouponGoods.find((carts) => carts.id == v.id); - if (findCart) { - // 根据优惠券类型判断扣减数量 - if ([4, 6].includes(findCart.couponType)) { - // 类型4(第二件半价)或6(买一送一),数量减2 - v.num -= 2; - } else { - // 其他类型(如类型2商品券),按原逻辑扣减对应数量 - v.num -= findCart.num; - } - } - return v; - }) - .filter((v) => v.num > 0); // 过滤掉数量<=0的商品 + const types = [2, 4, 6]; + // 收集已抵扣商品并关联对应的优惠券类型 + const goodsCouponGoods = selCoupon + .filter((v) => types.includes(v.type)) + .reduce((prev, cur) => { + // 给每个抵扣商品添加所属优惠券类型 + const goodsWithType = cur.discount.hasDiscountGoodsArr.map((goods) => ({ + ...goods, + couponType: cur.type, // 记录该商品是被哪种类型的优惠券抵扣的 + })); + prev.push(...goodsWithType); + return prev; + }, []); + const arr = _.cloneDeep(canDikouGoodsArr) + .map((v) => { + const findCart = goodsCouponGoods.find((carts) => carts.id == v.id); + if (findCart) { + // 根据优惠券类型判断扣减数量 + if ([4, 6].includes(findCart.couponType)) { + // 类型4(第二件半价)或6(买一送一),数量减2 + v.num -= 2; + } else { + // 其他类型(如类型2商品券),按原逻辑扣减对应数量 + v.num -= findCart.num; + } + } + return v; + }) + .filter((v) => v.num > 0); // 过滤掉数量<=0的商品 - return arr; + return arr; } /** @@ -118,177 +114,178 @@ export function returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user) { * @returns {Object} - { canUse: boolean, reason: string } 可用状态及不可用原因 */ export function returnCouponCanUse(args) { - let { - canDikouGoodsArr, - coupon, - goodsOrderPrice, - user, - selCoupon, - shopInfo - } = args; - // 优惠券未启用 - if (!coupon.use) { - return { - canUse: false, - reason:coupon.noUseRestrictions|| "不在可用时间段内" - }; - } + let { canDikouGoodsArr, coupon, goodsOrderPrice, user, selCoupon, shopInfo } = args; + // 优惠券未启用 + if (!coupon.use) { + return { + canUse: false, + reason: coupon.noUseRestrictions || "不在可用时间段内", + }; + } - // 计算门槛金额 - let fullAmount = goodsOrderPrice; - canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user, shopInfo); - //优惠券指定门槛商品列表 - let canCalcGoodsArr = [...canDikouGoodsArr] - //部分商品参与门槛计算 - if (coupon.thresholdFoods.length) { - canCalcGoodsArr = canDikouGoodsArr.filter((v) => { - return coupon.thresholdFoods.find((food) => food.id == v.productId); - }); - fullAmount = canCalcGoodsArr.reduce((pre, cur) => { - return pre + returnGoodsPrice(cur, user, shopInfo) * cur.num; - }, 0); - } + // 计算门槛金额 + let fullAmount = goodsOrderPrice; + canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user, shopInfo); + //优惠券指定门槛商品列表 + let canCalcGoodsArr = [...canDikouGoodsArr]; + //部分商品参与门槛计算 + if (coupon.thresholdFoods.length) { + canCalcGoodsArr = canDikouGoodsArr.filter((v) => { + return coupon.thresholdFoods.find((food) => food.id == v.productId); + }); + fullAmount = canCalcGoodsArr.reduce((pre, cur) => { + return pre + returnGoodsPrice(cur, user, shopInfo) * cur.num; + }, 0); + } + // 是否全部商品可用 + const isDikouAll = coupon.useFoods.length === 0; + // 订单可用商品列表 + let canUseGoodsArr = []; + if (!isDikouAll) { + canUseGoodsArr = canDikouGoodsArr.filter((v) => { + return coupon.useFoods.find((food) => food.id == v.productId); + }); + } + if (user.isVip && !coupon.vipPriceShare) { + return { + canUse: false, + reason: "非会员可用", + }; + } + if (selCoupon.length > 0 && !selCoupon[0].otherCouponShare) { + return { + canUse: false, + reason: "当前选中的券不可与其他券同享", + }; + } + if (selCoupon.length > 0 && !coupon.otherCouponShare) { + return { + canUse: false, + reason: "当前选中的券不可与其他券同享", + }; + } + // 满减券和折扣券计算门槛金额是否满足 + if ([1, 3].includes(coupon.type)) { + if (canCalcGoodsArr.length <= 0) { + return { + canUse: false, + reason: "没有可参与计算门槛的商品", + }; + } + // 不满足门槛金额 + if (fullAmount < coupon.fullAmount) { + return { + canUse: false, + reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元`, + }; + } + } + // 商品兑换券,第二件半价和买一送一判断是否有可用商品 + if ([2, 4, 5].includes(coupon.type)) { + console.log("商品兑换券", fullAmount, coupon.fullAmount); + if (coupon.type == 2 && fullAmount < coupon.fullAmount) { + console.log("商品兑换券", coupon); + return { + canUse: false, + reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元`, + }; + } + // 没有符合条件的商品 + if (isDikouAll && canDikouGoodsArr.length === 0) { + return { + canUse: false, + reason: "没有符合条件的商品", + }; + } + if (!isDikouAll && canUseGoodsArr.length === 0) { + return { + canUse: false, + reason: "没有符合条件的商品", + }; + } + } + //商品兑换券是否达到门槛金额 + if (coupon.type == 2 && goodsOrderPrice < coupon.fullAmount) { + return { + canUse: false, + reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元`, + }; + } - // 是否全部商品可用 - const isDikouAll = coupon.useFoods.length === 0; - // 订单可用商品列表 - let canUseGoodsArr = []; - if (!isDikouAll) { - canUseGoodsArr = canDikouGoodsArr.filter((v) => { - return coupon.useFoods.find((food) => food.id == v.productId); - }); - } - if (user.isVip && !coupon.vipPriceShare) { - return { - canUse: false, - reason: "非会员可用" - }; - } - if (selCoupon.length > 0 && !selCoupon[0].otherCouponShare) { - return { - canUse: false, - reason: "当前选中的券不可与其他券同享" - }; - } - if (selCoupon.length > 0 && !coupon.otherCouponShare) { - return { - canUse: false, - reason: "当前选中的券不可与其他券同享" - }; - } - // 满减券和折扣券计算门槛金额是否满足 - if ([1, 3].includes(coupon.type)) { - if (canCalcGoodsArr.length <= 0) { - return { - canUse: false, - reason: "没有可参与计算门槛的商品" - }; - } - // 不满足门槛金额 - if (fullAmount < coupon.fullAmount) { - return { - canUse: false, - reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元` - }; - } - } - // 商品兑换券,第二件半价和买一送一判断是否有可用商品 - if ([2, 4, 5].includes(coupon.type)) { - // 没有符合条件的商品 - if (isDikouAll && canDikouGoodsArr.length === 0) { - return { - canUse: false, - reason: "没有符合条件的商品" - }; - } - if (!isDikouAll && canUseGoodsArr.length === 0) { - return { - canUse: false, - reason: "没有符合条件的商品" - }; - } - } - //商品兑换券是否达到门槛金额 - if (coupon.type == 2 && goodsOrderPrice < coupon.fullAmount) { - return { - canUse: false, - reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元` - }; - } + // 买一送一券特殊验证 + if (coupon.type === 6) { + let canUse = false; + if (isDikouAll) { + canUse = canDikouGoodsArr.some((v) => v.num >= 2); + } else if (canCalcGoodsArr.length > 0) { + canUse = canCalcGoodsArr.some((v) => v.num >= 2); + } - // 买一送一券特殊验证 - if (coupon.type === 6) { - let canUse = false; - if (isDikouAll) { - canUse = canDikouGoodsArr.some((v) => v.num >= 2); - } else if (canCalcGoodsArr.length > 0) { - canUse = canCalcGoodsArr.some((v) => v.num >= 2); - } + if (!canUse) { + return { + canUse: false, + reason: "需要购买至少2件相同的商品才能使用", + }; + } + } - if (!canUse) { - return { - canUse: false, - reason: "需要购买至少2件相同的商品才能使用" - }; - } - } + // 第二件半价券特殊验证 + if (coupon.type === 4) { + let canUse = false; + if (isDikouAll) { + canUse = canDikouGoodsArr.some((v) => v.num >= 2); + } else if (canCalcGoodsArr.length > 0) { + canUse = canCalcGoodsArr.some((v) => v.num >= 2); + } - // 第二件半价券特殊验证 - if (coupon.type === 4) { - let canUse = false; - if (isDikouAll) { - canUse = canDikouGoodsArr.some((v) => v.num >= 2); - } else if (canCalcGoodsArr.length > 0) { - canUse = canCalcGoodsArr.some((v) => v.num >= 2); - } + if (!canUse) { + return { + canUse: false, + reason: "需要购买至少2件相同的商品才能使用", + }; + } + } - if (!canUse) { - return { - canUse: false, - reason: "需要购买至少2件相同的商品才能使用" - }; - } - } - - // 所有条件都满足 - return { - canUse: true, - reason: "" - }; + // 所有条件都满足 + return { + canUse: true, + reason: "", + }; } - /** * 计算抵扣商品金额 * @param discountGoodsArr 可抵扣商品列表 * @param discountNum 抵扣数量 * @param user 用户信息 - * @param {Object} shopInfo 店铺信息 + * @param {Object} shopInfo 店铺信息 */ export function calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user, shopInfo) { - let hasCountNum = 0; - let discountPrice = 0; - let hasDiscountGoodsArr = []; - for (let i = 0; i < discountGoodsArr.length; i++) { - if (hasCountNum >= discountNum) { - break; - } - const goods = discountGoodsArr[i]; - const shengyuNum = discountNum - hasCountNum; - const num = Math.min(goods.num, shengyuNum); - discountPrice += returnGoodsPrice(goods, user, shopInfo) * num; - hasCountNum += num; - hasDiscountGoodsArr.push({ - ...goods, - num - }); - } - return { - discountPrice, - hasDiscountGoodsArr - }; + let hasCountNum = 0; + let discountPrice = 0; + let hasDiscountGoodsArr = []; + for (let i = 0; i < discountGoodsArr.length; i++) { + if (hasCountNum >= discountNum) { + break; + } + const goods = discountGoodsArr[i]; + const shengyuNum = discountNum - hasCountNum; + const num = Math.min(goods.num, shengyuNum); + discountPrice += returnGoodsPrice(goods, user, shopInfo) * num; + + hasCountNum += num; + hasDiscountGoodsArr.push({ + ...goods, + num, + }); + } + + return { + discountPrice, + hasDiscountGoodsArr, + }; } /** @@ -301,20 +298,20 @@ export function calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user, s * @param shopInfo 店铺信息 */ export function returnCouponDiscount(arr, coupon, user, goodsOrderPrice, selCoupon, shopInfo) { - const canDikouGoodsArr = returnCanDikouGoodsArr(arr, selCoupon, user); - if (coupon.type == 2) { - return returnCouponProductDiscount(canDikouGoodsArr, coupon, user, shopInfo); - } - if (coupon.type == 6) { - const result = returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user, shopInfo); - return result - } - if (coupon.type == 4) { - return returnSecoendDiscount(canDikouGoodsArr, coupon, user, shopInfo); - } - if (coupon.type == 3) { - return returnCouponZhekouDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice, selCoupon); - } + const canDikouGoodsArr = returnCanDikouGoodsArr(arr, selCoupon, user); + if (coupon.type == 2) { + return returnCouponProductDiscount(canDikouGoodsArr, coupon, user, shopInfo); + } + if (coupon.type == 6) { + const result = returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user, shopInfo); + return result; + } + if (coupon.type == 4) { + return returnSecoendDiscount(canDikouGoodsArr, coupon, user, shopInfo); + } + if (coupon.type == 3) { + return returnCouponZhekouDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice, selCoupon); + } } /** @@ -327,45 +324,42 @@ export function returnCouponDiscount(arr, coupon, user, goodsOrderPrice, selCoup * */ export function returnCouponZhekouDiscount( - canDikouGoodsArr, - coupon, - user, - goodsOrderPrice, - selCoupon + canDikouGoodsArr, + coupon, + user, + goodsOrderPrice, + selCoupon ) { - const { - discountRate, - maxDiscountAmount - } = coupon; + const { discountRate, maxDiscountAmount } = coupon; - // 计算商品优惠券折扣总和,使用BigNumber避免精度问题 - const goodsCouponDiscount = selCoupon - .filter((v) => v.type == 2) - .reduce((prve, cur) => { - return new BigNumber(prve).plus(new BigNumber(cur.discount.discountPrice)); - }, new BigNumber(0)); + // 计算商品优惠券折扣总和,使用BigNumber避免精度问题 + const goodsCouponDiscount = selCoupon + .filter((v) => v.type == 2) + .reduce((prve, cur) => { + return new BigNumber(prve).plus(new BigNumber(cur.discount.discountPrice)); + }, new BigNumber(0)); - // 将商品订单价格转换为BigNumber并减去优惠券折扣 - const adjustedGoodsOrderPrice = new BigNumber(goodsOrderPrice).minus(goodsCouponDiscount); - console.log('adjustedGoodsOrderPrice', adjustedGoodsOrderPrice.toNumber()); + // 将商品订单价格转换为BigNumber并减去优惠券折扣 + const adjustedGoodsOrderPrice = new BigNumber(goodsOrderPrice).minus(goodsCouponDiscount); - // 计算优惠比例:(100 - 折扣率) / 100 - const discountAmountRatio = new BigNumber(100).minus(discountRate).dividedBy(100); + // 计算优惠比例:(100 - 折扣率) / 100 + const discountAmountRatio = new BigNumber(100).minus(discountRate).dividedBy(100); - // 计算折扣金额:调整后的商品订单金额 × 优惠比例 - let discountPrice = adjustedGoodsOrderPrice.times(discountAmountRatio) - .decimalPlaces(2, BigNumber.ROUND_FLOOR) - .toNumber(); + // 计算折扣金额:调整后的商品订单金额 × 优惠比例 + let discountPrice = adjustedGoodsOrderPrice + .times(discountAmountRatio) + .decimalPlaces(2, BigNumber.ROUND_FLOOR) + .toNumber(); - // 应用最大折扣金额限制 - if (maxDiscountAmount !== 0) { - discountPrice = discountPrice >= maxDiscountAmount ? maxDiscountAmount : discountPrice; - } + // 应用最大折扣金额限制 + if (maxDiscountAmount !== 0) { + discountPrice = discountPrice >= maxDiscountAmount ? maxDiscountAmount : discountPrice; + } - return { - discountPrice, // 折扣抵扣金额(即优惠的金额) - hasDiscountGoodsArr: [], - }; + return { + discountPrice, // 折扣抵扣金额(即优惠的金额) + hasDiscountGoodsArr: [], + }; } /** @@ -376,37 +370,29 @@ export function returnCouponZhekouDiscount( * @param shopInfo 店铺信息 */ export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user, shopInfo) { - const { - useFoods, - discountNum, - useRule - } = coupon; - //抵扣商品数组 - let discountGoodsArr = []; - //抵扣全部商品 - if (useFoods.length === 0) { - if (useRule == "price_asc") { - discountGoodsArr = canDikouGoodsArr - .slice(canDikouGoodsArr.length - discountNum, canDikouGoodsArr.length) - .reverse(); - } else { - discountGoodsArr = canDikouGoodsArr.slice(0, discountNum); - } - } else { - //抵扣选中商品 - const discountSelGoodsArr = canDikouGoodsArr.filter((v) => - useFoods.find((food) => food.id == v.productId) - ); - if (useRule == "price_asc") { - discountGoodsArr = discountSelGoodsArr - .slice(discountSelGoodsArr.length - discountNum, discountSelGoodsArr.length) - .reverse(); - } else { - discountGoodsArr = discountSelGoodsArr.slice(0, discountNum); - } - } - const result = calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user, shopInfo); - return result; + const { useFoods, discountNum, useRule } = coupon; + //抵扣商品数组 + let discountGoodsArr = []; + //抵扣全部商品 + if (useFoods.length === 0) { + if (useRule == "price_asc") { + discountGoodsArr = canDikouGoodsArr.slice(discountNum * -1).reverse(); + } else { + discountGoodsArr = canDikouGoodsArr.slice(0, discountNum); + } + } else { + //抵扣选中商品 + const discountSelGoodsArr = canDikouGoodsArr.filter((v) => + useFoods.find((food) => food.id == v.productId) + ); + if (useRule == "price_asc") { + discountGoodsArr = discountSelGoodsArr.slice(discountNum * -1).reverse(); + } else { + discountGoodsArr = discountSelGoodsArr.slice(0, discountNum); + } + } + const result = calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user, shopInfo); + return result; } // 返回买一送一券抵扣详情 @@ -417,41 +403,38 @@ export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user, shop * @param shopInfo 店铺信息 */ function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user, shopInfo) { - const { - useFoods, - useRule - } = coupon; - //抵扣商品 - let discountGoods = undefined; - //符合买一送一条件的商品 - const canUseGoods = canDikouGoodsArr.filter((v) => v.num >= 2); - //抵扣全部商品 - if (useFoods.length === 0) { - if (useRule == "price_asc") { - discountGoods = canUseGoods[canUseGoods.length - 1] - } else { - discountGoods = canUseGoods[0]; - } - } else { - //符合抵扣条件的商品 - const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId)); - if (useRule == "price_asc") { - discountGoods = canUseGoods1[canUseGoods1.length - 1] - } else { - discountGoods = canUseGoods1[0] - } - } - let discountPrice = 0; - let hasDiscountGoodsArr = [] - console.log('returnCouponBuyOneGiveOneDiscount:discountGoods',discountGoods); - if (discountGoods) { - discountPrice = returnGoodsPrice(discountGoods, user, shopInfo); - hasDiscountGoodsArr = [discountGoods]; - } - return { - discountPrice:discountPrice<=0?0:discountPrice, - hasDiscountGoodsArr - }; + const { useFoods, useRule } = coupon; + //抵扣商品 + let discountGoods = undefined; + //符合买一送一条件的商品 + const canUseGoods = canDikouGoodsArr.filter((v) => v.num >= 2); + //抵扣全部商品 + if (useFoods.length === 0) { + if (useRule == "price_asc") { + discountGoods = canUseGoods[canUseGoods.length - 1]; + } else { + discountGoods = canUseGoods[0]; + } + } else { + //符合抵扣条件的商品 + const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId)); + if (useRule == "price_asc") { + discountGoods = canUseGoods1[canUseGoods1.length - 1]; + } else { + discountGoods = canUseGoods1[0]; + } + } + let discountPrice = 0; + let hasDiscountGoodsArr = []; + console.log("returnCouponBuyOneGiveOneDiscount:discountGoods", discountGoods); + if (discountGoods) { + discountPrice = returnGoodsPrice(discountGoods, user, shopInfo); + hasDiscountGoodsArr = [discountGoods]; + } + return { + discountPrice: discountPrice <= 0 ? 0 : discountPrice, + hasDiscountGoodsArr, + }; } /** @@ -462,41 +445,38 @@ function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user, shopI * @param shopInfo 店铺信息 */ function returnSecoendDiscount(canDikouGoodsArr, coupon, user, shopInfo) { - const { - useFoods, - useRule - } = coupon; - //抵扣商品 - let discountGoods = undefined; - //符合条件的商品 - const canUseGoods = canDikouGoodsArr.filter((v) => v.num >= 2); - //抵扣全部商品 - if (useFoods.length === 0) { - if (useRule == "price_asc") { - discountGoods = canUseGoods[canUseGoods.length - 1] - } else { - discountGoods = canUseGoods[0] - } - } else { - //符合抵扣条件的商品 - const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId)); - if (useRule == "price_asc") { - discountGoods = canUseGoods1[canUseGoods1.length - 1] - } else { - discountGoods = canUseGoods1[0] - } - } - let discountPrice = 0; - let hasDiscountGoodsArr = [] - if (discountGoods) { - discountPrice = returnGoodsPrice(discountGoods, user, shopInfo); - hasDiscountGoodsArr = [discountGoods]; - } - //返回半价价格 - return { - discountPrice: discountPrice <= 0 ? 0 : new BigNumber(discountPrice).dividedBy(2).toNumber(), - hasDiscountGoodsArr, - }; + const { useFoods, useRule } = coupon; + //抵扣商品 + let discountGoods = undefined; + //符合条件的商品 + const canUseGoods = canDikouGoodsArr.filter((v) => v.num >= 2); + //抵扣全部商品 + if (useFoods.length === 0) { + if (useRule == "price_asc") { + discountGoods = canUseGoods[canUseGoods.length - 1]; + } else { + discountGoods = canUseGoods[0]; + } + } else { + //符合抵扣条件的商品 + const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId)); + if (useRule == "price_asc") { + discountGoods = canUseGoods1[canUseGoods1.length - 1]; + } else { + discountGoods = canUseGoods1[0]; + } + } + let discountPrice = 0; + let hasDiscountGoodsArr = []; + if (discountGoods) { + discountPrice = returnGoodsPrice(discountGoods, user, shopInfo); + hasDiscountGoodsArr = [discountGoods]; + } + //返回半价价格 + return { + discountPrice: discountPrice <= 0 ? 0 : new BigNumber(discountPrice).dividedBy(2).toNumber(), + hasDiscountGoodsArr, + }; } /** @@ -506,15 +486,15 @@ function returnSecoendDiscount(canDikouGoodsArr, coupon, user, shopInfo) { * @param shopInfo 店铺信息 */ export function returnCanDikouGoods(arr, user, shopInfo) { - const result = arr - .filter((v) => { - return v.is_temporary != 1 && v.is_gift != 1; - }) - .filter((v) => { - return v.num > 0; - }) - .sort((a, b) => { - return returnGoodsPrice(b, user, shopInfo) - returnGoodsPrice(a, user, shopInfo); - }); - return result; -} \ No newline at end of file + const result = arr + .filter((v) => { + return v.is_temporary != 1 && v.is_gift != 1; + }) + .filter((v) => { + return v.num > 0; + }) + .sort((a, b) => { + return returnGoodsPrice(b, user, shopInfo) - returnGoodsPrice(a, user, shopInfo); + }); + return result; +}