From 87fafdbf9a1706f7aea39d6c763615f794920753 Mon Sep 17 00:00:00 2001 From: YeMingfei666 <1619116647@qq.com> Date: Sun, 28 Sep 2025 09:47:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=A1=AE=E8=AE=A4=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/api/market/coupon.js | 11 + common/api/market/index.js | 11 + common/api/order/index.js | 31 +- package.json | 4 +- pages/order/components/IntegralInput.vue | 16 +- pages/order/components/charge.vue | 161 ++ .../order/components/orderInfo - 副本 (2).vue | 1224 ++++++++++++++ pages/order/components/orderInfo.vue | 178 ++- pages/order/confirm-order - 副本.vue | 1407 +++++++++++++++++ pages/order/confirm-order.vue | 118 +- pages/order/coupon.vue | 1265 ++++++++------- pages/user/user.vue | 8 +- pnpm-lock.yaml | 862 +--------- static/icon/charge.png | Bin 0 -> 6615 bytes stores/carts-websocket.js | 2 +- stores/carts.js | 232 ++- utils/goods-utils - 副本.js | 444 ++++++ utils/goods-utils.js | 627 ++++---- 18 files changed, 4785 insertions(+), 1816 deletions(-) create mode 100644 common/api/market/coupon.js create mode 100644 common/api/market/index.js create mode 100644 pages/order/components/charge.vue create mode 100644 pages/order/components/orderInfo - 副本 (2).vue create mode 100644 pages/order/confirm-order - 副本.vue create mode 100644 static/icon/charge.png create mode 100644 utils/goods-utils - 副本.js diff --git a/common/api/market/coupon.js b/common/api/market/coupon.js new file mode 100644 index 0000000..d293081 --- /dev/null +++ b/common/api/market/coupon.js @@ -0,0 +1,11 @@ +// 引入 request 文件 +import request from '@/common/api/request.js' +import {prveUrl} from './config.js' + +export const findCoupon = (data) => { + return request({ + url: prveUrl + '/user/coupon/findCoupon', + method: 'get', + data: data + }) +} diff --git a/common/api/market/index.js b/common/api/market/index.js new file mode 100644 index 0000000..0f3ed65 --- /dev/null +++ b/common/api/market/index.js @@ -0,0 +1,11 @@ +// 引入 request 文件 +import request from '@/common/api/request.js' +import {prveUrl} from './config.js' + +export const consumeDiscount = (data) => { + return request({ + url: prveUrl + '/user/consumeDiscount', + method: 'get', + data: data + }) +} diff --git a/common/api/order/index.js b/common/api/order/index.js index 943609c..173a445 100644 --- a/common/api/order/index.js +++ b/common/api/order/index.js @@ -85,26 +85,53 @@ export const joinMember = (data) => { } //会员购买支付 export const ltPayMember = (data) => { + // #ifdef MP-WEIXIN + const openId=uni.cache.get('userInfo').wechatOpenId; + // #endif + // #ifdef MP-ALIPAY + const openId=uni.cache.get('userInfo').alipayOpenId; + // #endif return request({ url: url + '/pay/ltPayMember', method: 'post', data: { platformType, payType, - openId: uni.cache.get('miniAppOpenId'), + openId, ...data } }) } //智慧充值 export const recharge = (data) => { + // #ifdef MP-WEIXIN + const openId=uni.cache.get('userInfo').wechatOpenId; + // #endif + // #ifdef MP-ALIPAY + const openId=uni.cache.get('userInfo').alipayOpenId; + // #endif return request({ url: url + '/pay/recharge', method: 'post', data: { platformType, payType, - openId: uni.cache.get('miniAppOpenId'), + openId, + ...data + } + }) +} + + + +export const rechargePayOrder = (data) => { + return request({ + url: url + '/pay/rechargePayOrder', + method: 'post', + data: { + platformType, + payType, + openId: uni.cache.get('userInfo').wechatOpenId, ...data } }) diff --git a/package.json b/package.json index 1f364de..4aecfb5 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,12 @@ { "dependencies": { "@dcloudio/uni-app": "^2.0.2-4040520250103001", + "bignumber.js": "^9.3.1", "dayjs": "^1.11.13", "jsbarcode": "^3.11.6", "lodash": "^4.17.21", "pinia": "^2.3.1", - "pinia-plugin-unistorage": "^0.1.2" + "pinia-plugin-unistorage": "^0.1.2", + "ysk-utils": "^1.0.28" } } diff --git a/pages/order/components/IntegralInput.vue b/pages/order/components/IntegralInput.vue index 8e2382e..494f152 100644 --- a/pages/order/components/IntegralInput.vue +++ b/pages/order/components/IntegralInput.vue @@ -7,8 +7,15 @@ :placeholder="instructions" /> - - 取消 + + + 取消 + + + + + + @@ -117,7 +124,9 @@ height: 100%; z-index: 9999; } - + .gap-20{ + gap: 20rpx; + } .modal-mask { position: absolute; top: 0; @@ -146,6 +155,7 @@ .input-wrapper { margin-bottom: 15px; + width: 100%; } .instructions { diff --git a/pages/order/components/charge.vue b/pages/order/components/charge.vue new file mode 100644 index 0000000..9f87b28 --- /dev/null +++ b/pages/order/components/charge.vue @@ -0,0 +1,161 @@ + + + + + \ No newline at end of file diff --git a/pages/order/components/orderInfo - 副本 (2).vue b/pages/order/components/orderInfo - 副本 (2).vue new file mode 100644 index 0000000..c1538a2 --- /dev/null +++ b/pages/order/components/orderInfo - 副本 (2).vue @@ -0,0 +1,1224 @@ + + + + + \ No newline at end of file diff --git a/pages/order/components/orderInfo.vue b/pages/order/components/orderInfo.vue index f113a63..f13dafd 100644 --- a/pages/order/components/orderInfo.vue +++ b/pages/order/components/orderInfo.vue @@ -25,24 +25,7 @@ {{ listinfo.tableName || '' }} - + @@ -79,33 +62,20 @@ - - - - - - 总计¥ - {{listinfo.totalCost||''}} + {{cartStore.orderCostSummary.goodsRealAmount}} - + 打包费 @@ -119,12 +89,12 @@ + v-if="cartStore.orderCostSummary.seatFee"> 餐位费 - X{{listinfo.Seatcharge}} + X{{cartStore.seatFeeConfig.personCount}} - {{listinfo.Seatcharge}} + {{cartStore.orderCostSummary.seatFee}} @@ -150,25 +120,20 @@ {{ item.name }} - - - - - {{item.value.uniqueIds}}张 - ¥-{{item.value.Productroll}} - - - - - {{item.value.name}} + -¥{{returnCouponDiscount}} + + + + -¥{{newUserDiscount}} + + @@ -250,6 +215,8 @@ + + { return [] } - } + }, + }) const is_type = ref(0) @@ -392,30 +366,45 @@ const tabClick = (item, index) => { is_type.value = index emits("istype", is_type.value) + cartStore.setDinnerType(item.val) // this.getchoseEatModel('tabClick', index, item); } // 操作优惠卷 const dataprocessing = (data) => { - if (data.typeOrder == 1) { - favorablelist[1].value = data.item - } else { - favorablelist[0].value = data - } + favorablelist[1].value = data } + const returnCouponDiscount = computed(() => { + if(!favorablelist[1].value){ + return 0 + } + return favorablelist[1].value.reduce((prve,cur)=>{ + return prve+(cur.discountAmount||0) + },0) + }) + // 清空 const bwcclear = () => { IntegralInputclose() // 清空优惠卷 favorablelist[1].value = '' - favorablelist[0].value = '' + favorablelist[1].value = '' } - + const dinnerType = computed(() => { + return is_type.value ? 'take-out' : 'dine-ine' + }) // 跳转 const goUrl = (item) => { - console.log(props.listinfo.totalPrices, props.listinfo.Productroll) + const canDikouGoodsArr = props.nowCarts + const goodsOrderPrice = props.listinfo.totalPrices + // const user=uni.cache.get('shopUserInfo') + uni.setStorageSync('canDikouGoodsArr', canDikouGoodsArr) + uni.setStorageSync('goodsOrderPrice', goodsOrderPrice) + uni.setStorageSync('dinnerType', dinnerType.value) + + if (props.isBwc) { uni.showToast({ title: '不可与其他优惠共享!', @@ -440,22 +429,7 @@ shoppingCart: JSON.stringify([...props.nowCarts, ...props.listinfo.combinedArray]), }) break; - case 'product': - // 清空积分 - IntegralInputclose() - console.log('props.listinfo.combinedArray', props.listinfo.combinedArray); - // 清空优惠卷 - favorablelist[1].value = '' - favorablelist[0].value = '' - emits('learcoupons', 'product') - uni.pro.navigateTo('/pages/order/coupon', { - type: "confirm_order_product", - shopId: uni.cache.get('orderVIP').shopId, - shopUserId: props.orderVIP.id, - payAmount: props.listinfo.totalPrices, - shoppingCart: JSON.stringify([...props.nowCarts, ...props.listinfo.combinedArray]), - }) - break; + case 'points': IntegralInputclose() if (calcUsablePointsData.usable == 0) { @@ -483,12 +457,15 @@ const handleConfirm = async (integral) => { + //积分可抵扣最大金额 + const maxMoney= cartStore.orderCostSummary.goodsRealAmount-cartStore.orderCostSummary.couponDeductionAmount calcUsablePointsData.integral = integral props.listinfo.pointsDiscountAmount = await APImemberPointscalcDeductionAmount({ points: integral, shopUserId: props.orderVIP.id, - orderAmount: props.listinfo.totalCost + orderAmount:maxMoney }) + cartStore.setUserPoints(integral) emits('clickPointsamount', { pointsDiscountAmount: props.listinfo.pointsDiscountAmount, pointsNum: calcUsablePointsData.integral @@ -499,6 +476,7 @@ const getCalcUsablePoints = async (data) => { Object.assign(calcUsablePointsData, data); try { + cartStore.setPointDeductionRule(data.equivalentPoints,data.maxDeductionAmount) calcUsablePointsData.minIntegral = data.minDeductionPoints calcUsablePointsData.maxIntegral = data.maxUsablePoints calcUsablePointsData.instructionText = @@ -514,6 +492,7 @@ calcUsablePointsData.integral = null props.listinfo.pointsDiscountAmount = 0 calcUsablePointsData.showModal = false + cartStore.setUserPoints(0); } // * 复制订单号 @@ -537,23 +516,42 @@ bwcclear, IntegralInputclose }); + + watch(()=>props.listinfo.seatNum,(newval)=>{ + cartStore.setSeatFeeConfig('personCount',newval||1) + }) + + const newUserDiscount=ref(0) + async function getConsumeDiscount(){ + const consumeDiscountRes = await consumeDiscount({ + shopId: uni.cache.get('shopId'), + }) + if(consumeDiscountRes){ + newUserDiscount.value=consumeDiscountRes.amount + cartStore.newUserDiscount=consumeDiscountRes.amount||0 + } + } + getConsumeDiscount() \ No newline at end of file diff --git a/pages/order/confirm-order - 副本.vue b/pages/order/confirm-order - 副本.vue new file mode 100644 index 0000000..04219fc --- /dev/null +++ b/pages/order/confirm-order - 副本.vue @@ -0,0 +1,1407 @@ + + + + \ No newline at end of file diff --git a/pages/order/confirm-order.vue b/pages/order/confirm-order.vue index a1a7792..517edf6 100644 --- a/pages/order/confirm-order.vue +++ b/pages/order/confirm-order.vue @@ -36,6 +36,8 @@ + {{cartStore.orderCostSummary}} + + + @@ -56,7 +60,7 @@ 实付金额: - ¥{{listinfo.totalCost}} + ¥{{cartStore.orderCostSummary.finalPayAmount}} @@ -110,7 +114,11 @@ import { onLoad } from '@dcloudio/uni-app' - + import { + BigNumber + } from 'bignumber.js'; + import ChargeVue from './components/charge.vue'; + import {pay} from '@/utils/pay.js' function onback() { closeSocket() back() @@ -122,6 +130,7 @@ 'border-radius': '106rpx', 'border': '2rpx solid #E8AD7B' } + import _ from "lodash"; import { ref, reactive, @@ -140,9 +149,10 @@ import { APIgetOrderById, APIputuserorder, - APIhistoryOrder + APIhistoryOrder,rechargePayOrder } from '@/common/api/order/index.js' import { + APIusershopInfodetail, APIshopUserInfo } from '@/common/api/member.js' import { @@ -156,6 +166,19 @@ useWebSocket } from '@/stores/carts-websocket.js'; const cartStore = useCartsStore() + + + //充值相关 + const rechargeItem=ref(null) + const rechargeId=ref(null) + + function updateRechargeId(e){ + rechargeId.value=e + } + function updateChargeSel(e){ + rechargeItem.value=e + } + async function onMessage(Message) { cartStore.onMessage(Message, cartsSocket) listinfo.totalPrices = historyTotalPrices * 1 + cartStore.totalPrice * 1 @@ -324,8 +347,10 @@ listinfo.tableName = tableRes.name; } } + cartStore.setOldOrder(res); socketInit() console.log(res); + getOrderInfoAfterCalcInit(res) } @@ -609,12 +634,12 @@ //先付 if (isPayBefor()) { console.log('isPayBefor'); + console.log(cartStore.isEmpty); // 购物车有数据 if (!cartStore.isEmpty) { const res = await createOrder() - goToPay() } - + goToPay() } else { //后付 @@ -725,7 +750,7 @@ shopUserId: orderVIP.value.id, orderId: listinfo.id, userAllPack: is_type.value == 0 ? 0 : 1, //是否整单打包 - amount: listinfo.totalCost, // 最终订单金额 + amount: cartStore.orderCostSummary.finalPayAmount, // 最终订单金额 returnUrl: '', //跳转地址 buyerRemark: '', seatNum: is_type.value == 0 ? listinfo.seatNum : 0, //用餐人数 @@ -739,27 +764,44 @@ orderId: listinfo.id, vipPrice: cartStore.useVipPrice ? 1 : 0, //是否使用会员价0否1是 userAllPack: is_type.value == 0 ? 0 : 1, //是否整单打包 - seatNum: is_type.value == 0 ? listinfo.seatNum : 0, //用餐人数 - originAmount: listinfo.originAmount, //订单原金额(包含打包费+餐位费) 不含折扣价格 + seatNum: is_type.value == 0 ? cartStore.seatFeeConfig.personCount : 0, //用餐人数 + originAmount: cartStore.orderCostSummary.goodsRealAmount , //订单原金额(包含打包费+餐位费) 不含折扣价格 discountRatio: 1, //折扣比例(计算时 向上取整保留 两位小数) 写死1 discountAmount: 0, //手动优惠金额 写死0 - productCouponDiscountAmount: listinfo.Productroll, //商品优惠券抵扣金额 - fullCouponDiscountAmount: listinfo.coupondiscountAmount, //满减优惠券抵扣金额 - couponList: uniqueIds.value, //用户使用的卡券 - orderAmount: listinfo.totalCost, // 最终订单金额 + productCouponDiscountAmount: cartStore.orderCostSummary.productCouponDeduction, //商品优惠券抵扣金额 + otherCouponDiscountAmount: cartStore.orderCostSummary.fullCouponDeduction, //其他优惠券抵扣金额 + couponList: cartStore.backendCoupons.map(v => v.id), //用户使用的卡券 + orderAmount: cartStore.orderCostSummary.finalPayAmount, // 最终订单金额 roundAmount: 0, //抹零金额 减免多少钱 - pointsDiscountAmount: listinfo.pointsDiscountAmount, //积分抵扣金额(tb_points_basic_setting表) + pointsDiscountAmount: cartStore.orderCostSummary + .pointDeductionAmount, //积分抵扣金额(tb_points_basic_setting表) pointsNum: listinfo.pointsNum, //(扣除各类折扣 enable_deduction后使用) remark: '', //用户备注 } console.log('topay checkOrderPay', checkOrderPay); try { - await storeMemberpay.actionsltPayOrder({ - checkOrderPay, - payType: paymentmethod.payType, - buyerRemark: '', - returnUrl: '' - }) + if(rechargeItem.value.id&&rechargeId.value){ + //充值支付 + const payRes= await rechargePayOrder({ + checkOrderPay, + payType: paymentmethod.payType, + buyerRemark: '', + returnUrl: '', + rechargeId:rechargeId.value, + rechargeDetailId:rechargeItem.value.id, + shopUserId:orderVIP.value.id, + shopId: orderVIP.value.shopId, + }) + pay(payRes) + }else{ + await storeMemberpay.actionsltPayOrder({ + checkOrderPay, + payType: paymentmethod.payType, + buyerRemark: '', + returnUrl: '' + }) + } + } catch (error) { pay_unlock() //TODO handle the exception @@ -787,21 +829,24 @@ // 余额支付 const accountPayevent = async (pwd) => { ispws.value = false; + + let checkOrderPay = { userId: uni.cache.get('userInfo').id, orderId: listinfo.id, vipPrice: cartStore.useVipPrice ? 1 : 0, //是否使用会员价0否1是 userAllPack: is_type.value == 0 ? 0 : 1, //是否整单打包 - seatNum: is_type.value == 0 ? listinfo.seatNum : 0, //用餐人数 - originAmount: listinfo.originAmount, //订单原金额(包含打包费+餐位费) 不含折扣价格 + seatNum: is_type.value == 0 ? cartStore.seatFeeConfig.personCount : 0, //用餐人数 + originAmount: cartStore.orderCostSummary.goodsRealAmount , //订单原金额(包含打包费+餐位费) 不含折扣价格 discountRatio: 1, //折扣比例(计算时 向上取整保留 两位小数) 写死1 discountAmount: 0, //手动优惠金额 写死0 - productCouponDiscountAmount: listinfo.Productroll, //商品优惠券抵扣金额 - fullCouponDiscountAmount: listinfo.coupondiscountAmount, //满减优惠券抵扣金额 - couponList: uniqueIds.value, //用户使用的卡券 - orderAmount: listinfo.totalCost, // 最中订单金额 + productCouponDiscountAmount: cartStore.orderCostSummary.productCouponDeduction, //商品优惠券抵扣金额 + otherCouponDiscountAmount: cartStore.orderCostSummary.fullCouponDeduction, //其他优惠券抵扣金额 + couponList: cartStore.backendCoupons.map(v => v.id), //用户使用的卡券 + orderAmount: cartStore.orderCostSummary.finalPayAmount, // 最终订单金额 roundAmount: 0, //抹零金额 减免多少钱 - pointsDiscountAmount: listinfo.pointsDiscountAmount, //积分抵扣金额(tb_points_basic_setting表) + pointsDiscountAmount: cartStore.orderCostSummary + .pointDeductionAmount, //积分抵扣金额(tb_points_basic_setting表) pointsNum: listinfo.pointsNum, //(扣除各类折扣 enable_deduction后使用) remark: '', //用户备注 } @@ -852,8 +897,16 @@ } catch (error) { //TODO handle the exception } - - orderorderInfo() + + + orderorderInfo() + uni.$off('selCoupon') + uni.$on('selCoupon', function(data) { + console.log('selCoupon', data) + orderInfoAfterRef.value.dataprocessing(_.cloneDeep(data)) + cartStore.setCoupons(_.cloneDeep(data)) + }) + }); let options = {} @@ -904,12 +957,19 @@ async function init(opt) { Object.assign(options, opt) listinfo.id = options.orderId; - console.log('init', listinfo); + console.log('options', options); if (options.shopId) { // 每次进来全局更新shopId uni.cache.set('shopId', options.shopId, 30) uni.$on('returnData', handleReturnData); } + //获取店铺信息 + const shopInfoRes = await APIusershopInfodetail({ + shopId: options.shopId + }) + if (shopInfoRes) { + cartStore.shopInfo = shopInfoRes.shopInfo; + } // * 获取会员信息 await storeuser.actionsproductqueryProduct() await nextTick() diff --git a/pages/order/coupon.vue b/pages/order/coupon.vue index fa91e36..94afc1d 100644 --- a/pages/order/coupon.vue +++ b/pages/order/coupon.vue @@ -16,14 +16,18 @@ --> - - {{ item.label }}(0) + + 商品兑换券 {{returnSelNumber(0)}} - - + + 折扣优惠券{{returnSelNumber(1)}} + + + + + @@ -33,9 +37,9 @@ 可用红包 - 3张 + {{list.canUseCoupons.length}}张 - + @@ -45,18 +49,21 @@ {{ item.name }} - {{ dayjs(item.effectStartTime).format('YYYY.M.D') }} - {{ dayjs(item.effectEndTime).format('YYYY.M.D') }} + {{ dayjs(item.effectStartTime).format('YYYY.M.D') }} - + {{ dayjs(item.effectEndTime).format('YYYY.M.D') }} - - + + + - 1、可适用门店:{{ item.useShops }} 2、可适用商品:{{ item.foods }}3、可使用类型:{{ convertValuesToLabels(item.useType) }} + 1、可适用门店:{{ item.useShops }} + 2、可适用商品:{{ item.foods }}3、可使用类型:{{ convertValuesToLabels(item.useType) }} 查看详情 @@ -64,9 +71,9 @@ 不可用红包 - 3张 + {{list.noCanUseCoupons.length}}张 - + @@ -76,7 +83,8 @@ {{ item.name }} - {{ dayjs(item.effectStartTime).format('YYYY.M.D') }} - {{ dayjs(item.effectEndTime).format('YYYY.M.D') }} + {{ dayjs(item.effectStartTime).format('YYYY.M.D') }} - + {{ dayjs(item.effectEndTime).format('YYYY.M.D') }} @@ -90,7 +98,7 @@ --> 不可用原因: - 不在使用时间内 + {{returnNoUseRestrictions(item) }} @@ -117,7 +125,9 @@ - {{ index + 1 }}、{{ item }} + + {{ index + 1 }}、{{ item }} + @@ -126,562 +136,759 @@ + + .shoplist-popup { + padding: 0 28upx 28upx; + + .title { + padding: 28upx 0; + display: flex; + align-items: center; + justify-content: center; + + .t { + font-size: 32upx; + font-weight: bold; + color: #333; + } + } + + .popup-list { + max-height: 50vh; + + .item { + padding: 28upx; + border-radius: 12upx; + background-color: #f7f7f7; + margin-bottom: 28upx; + display: flex; + flex-direction: column; + padding: 28upx; + + .t { + font-size: 28upx; + font-weight: bold; + color: #333; + /* 必须设置宽度 */ + width: 600upx; + /* 或具体像素值 */ + + /* 关键属性 */ + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + /* 显示2行 */ + overflow: hidden; + + /* 文本溢出省略号 */ + text-overflow: ellipsis; + + /* 可选:防止行高度,确保计算准确 */ + line-height: 1.5; + word-break: break-all; + /* 允许在单词内换行 */ + word-wrap: break-word; + /* 允许长单词或URL换行 */ + } + + .intro { + font-size: 28upx; + color: #999; + /* 必须设置宽度 */ + width: 600upx; + /* 或具体像素值 */ + + /* 关键属性 */ + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + /* 显示2行 */ + overflow: hidden; + + /* 文本溢出省略号 */ + text-overflow: ellipsis; + + /* 可选:防止行高度,确保计算准确 */ + line-height: 1.5; + word-break: break-all; + /* 允许在单词内换行 */ + word-wrap: break-word; + /* 允许长单词或URL换行 */ + } + } + + .ul { + .li { + color: #999; + font-size: 28upx; + padding: 8upx 0; + + .t { + color: #999; + font-size: 28upx; + } + } + } + } + } + \ No newline at end of file diff --git a/pages/user/user.vue b/pages/user/user.vue index 51679f4..b545ec4 100644 --- a/pages/user/user.vue +++ b/pages/user/user.vue @@ -36,7 +36,7 @@ 储值 - {{rechargeList.length}}家店 + {{rechargeTotal}}家店 @@ -68,7 +68,7 @@ 会员 - {{memberList.length}}家店 + {{memberTotal}}家店 @@ -300,10 +300,14 @@ const memberList = ref([]) const rechargeList = ref([]) + const memberTotal=ref(0) + const rechargeTotal=ref(0) async function getData() { const res = await vipApi.list() + memberTotal.value=res.length memberList.value = res.slice(0, 3); const res1 = await rechargeApi.list() + rechargeTotal.value=res1.length rechargeList.value = res1.slice(0, 3); } onShow(() => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6287a21..7e30eb0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,25 +4,34 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@dcloudio/uni-app': - specifier: ^2.0.2-4040520250103001 - version: 2.0.2-4070620250821001(@dcloudio/types@3.4.21)(@vue/composition-api@1.7.2) - dayjs: - specifier: ^1.11.13 - version: 1.11.18 - jsbarcode: - specifier: ^3.11.6 - version: 3.12.1 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - pinia: - specifier: ^2.3.1 - version: 2.3.1(@vue/composition-api@1.7.2)(vue@3.5.21) - pinia-plugin-unistorage: - specifier: ^0.1.2 - version: 0.1.2 +importers: + + .: + dependencies: + '@dcloudio/uni-app': + specifier: ^2.0.2-4040520250103001 + version: 2.0.2-4070620250821001(@dcloudio/types@3.4.21)(@vue/composition-api@1.7.2(vue@3.5.22)) + bignumber.js: + specifier: ^9.3.1 + version: 9.3.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.18 + jsbarcode: + specifier: ^3.11.6 + version: 3.12.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + pinia: + specifier: ^2.3.1 + version: 2.3.1(@vue/composition-api@1.7.2(vue@3.5.22))(vue@3.5.22) + pinia-plugin-unistorage: + specifier: ^0.1.2 + version: 0.1.2 + ysk-utils: + specifier: ^1.0.28 + version: 1.0.28 packages: @@ -52,53 +61,9 @@ packages: '@dcloudio/types': ^3.0.15 '@vue/composition-api': ^1.7.0 - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/node@24.5.2': - resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} - '@vue/compiler-core@3.5.22': resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} @@ -136,115 +101,8 @@ packages: '@vue/shared@3.5.22': resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} - peerDependencies: - acorn: ^8.14.0 - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - baseline-browser-mapping@2.8.6: - resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} - hasBin: true - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.26.2: - resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - caniuse-lite@1.0.30001745: - resolution: {integrity: sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==} - - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - copy-webpack-plugin@12.0.2: - resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.1.0 + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -252,175 +110,30 @@ packages: dayjs@1.11.18: resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} - electron-to-chromium@1.5.223: - resolution: {integrity: sha512-qKm55ic6nbEmagFlTFczML33rF90aU+WtrJ9MdTCThrcvDNdUHN4p6QfVN78U06ZmguqXIyMPyYhw2TrbDUwPQ==} - - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} - engines: {node: '>=10.13.0'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - jsbarcode@3.12.1: resolution: {integrity: sha512-QZQSqIknC2Rr/YOUyOkCBqsoiBAOTYK+7yNN3JsqfoUtJtkazxNw1dmPpxuv7VVvqW13kA3/mKiLq+s/e3o9hQ==} -<<<<<<< HEAD - /lodash@4.17.21: + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - - /magic-string@0.30.19: -======= - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} magic-string@0.30.19: ->>>>>>> a39c9f4d7228eb5bd0bda613fd326824fc7777ee resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - node-releases@2.0.21: - resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - pinia-plugin-unistorage@0.1.2: resolution: {integrity: sha512-WXit2cGnm5rG6CDTcLSLehNWhyJS/Yq7WEeeXAapZbCnqoPJxlszqg7rT8S+OP47az0h5nlajGo+LuyMxUQ2uw==} @@ -437,94 +150,10 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} - engines: {node: '>= 10.13.0'} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - tapable@2.2.3: - resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} - engines: {node: '>=6'} - - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@5.44.0: - resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} - engines: {node: '>=10'} - hasBin: true - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - undici-types@7.12.0: - resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} - - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -544,23 +173,8 @@ packages: typescript: optional: true - watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} - engines: {node: '>=10.13.0'} - - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} - engines: {node: '>=10.13.0'} - - webpack@5.101.3: - resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + ysk-utils@1.0.28: + resolution: {integrity: sha512-VpEYjK5ldWgZXY+rxcwef8DB9/K9K13BPZEL3l3NXybofLsh1089sMJF4B4rVpqYszcTF13ZLL6WJWCkhCPOkg==} snapshots: @@ -584,57 +198,8 @@ snapshots: '@dcloudio/types': 3.4.21 '@vue/composition-api': 1.7.2(vue@3.5.22) - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@sindresorhus/merge-streams@2.3.0': {} - - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - - '@types/estree@1.0.8': {} - - '@types/json-schema@7.0.15': {} - - '@types/node@24.5.2': - dependencies: - undici-types: 7.12.0 - '@vue/compiler-core@3.5.22': dependencies: '@babel/parser': 7.28.4 @@ -695,274 +260,28 @@ snapshots: '@vue/shared@3.5.22': {} - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - - acorn-import-phases@1.0.4(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - - acorn@8.15.0: {} - - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - baseline-browser-mapping@2.8.6: {} - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.26.2: - dependencies: - baseline-browser-mapping: 2.8.6 - caniuse-lite: 1.0.30001745 - electron-to-chromium: 1.5.223 - node-releases: 2.0.21 - update-browserslist-db: 1.1.3(browserslist@4.26.2) - - buffer-from@1.1.2: {} - - caniuse-lite@1.0.30001745: {} - - chrome-trace-event@1.0.4: {} - - commander@2.20.3: {} - - copy-webpack-plugin@12.0.2(webpack@5.101.3): - dependencies: - fast-glob: 3.3.3 - glob-parent: 6.0.2 - globby: 14.1.0 - normalize-path: 3.0.0 - schema-utils: 4.3.2 - serialize-javascript: 6.0.2 - webpack: 5.101.3 + bignumber.js@9.3.1: {} csstype@3.1.3: {} dayjs@1.11.18: {} - electron-to-chromium@1.5.223: {} - - enhanced-resolve@5.18.3: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.3 - entities@4.5.0: {} - es-module-lexer@1.7.0: {} - - escalade@3.2.0: {} - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - estree-walker@2.0.2: {} - events@3.3.0: {} - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-uri@3.1.0: {} - - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-to-regexp@0.4.1: {} - - globby@14.1.0: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.3 - ignore: 7.0.5 - path-type: 6.0.0 - slash: 5.1.0 - unicorn-magic: 0.3.0 - - graceful-fs@4.2.11: {} - - has-flag@4.0.0: {} - - ignore@7.0.5: {} - - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - jest-worker@27.5.1: - dependencies: - '@types/node': 24.5.2 - merge-stream: 2.0.0 - supports-color: 8.1.1 - jsbarcode@3.12.1: {} - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@1.0.0: {} - - loader-runner@4.3.0: {} + lodash@4.17.21: {} magic-string@0.30.19: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - nanoid@3.3.11: {} - neo-async@2.6.2: {} - - node-releases@2.0.21: {} - - normalize-path@3.0.0: {} - - path-type@6.0.0: {} - picocolors@1.1.1: {} - picomatch@2.3.1: {} - pinia-plugin-unistorage@0.1.2: {} pinia@2.3.1(@vue/composition-api@1.7.2(vue@3.5.22))(vue@3.5.22): @@ -979,80 +298,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - queue-microtask@1.2.3: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - require-from-string@2.0.2: {} - - reusify@1.1.0: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-buffer@5.2.1: {} - - schema-utils@4.3.2: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - slash@5.1.0: {} - source-map-js@1.2.1: {} - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - tapable@2.2.3: {} - - terser-webpack-plugin@5.3.14(webpack@5.101.3): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.2 - serialize-javascript: 6.0.2 - terser: 5.44.0 - webpack: 5.101.3 - - terser@5.44.0: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - undici-types@7.12.0: {} - - unicorn-magic@0.3.0: {} - - update-browserslist-db@1.1.3(browserslist@4.26.2): - dependencies: - browserslist: 4.26.2 - escalade: 3.2.0 - picocolors: 1.1.1 - vue-demi@0.14.10(@vue/composition-api@1.7.2(vue@3.5.22))(vue@3.5.22): dependencies: vue: 3.5.22 @@ -1067,41 +314,6 @@ snapshots: '@vue/server-renderer': 3.5.22(vue@3.5.22) '@vue/shared': 3.5.22 - watchpack@2.4.4: + ysk-utils@1.0.28: dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - webpack-sources@3.3.3: {} - - webpack@5.101.3: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.26.2 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.3 - terser-webpack-plugin: 5.3.14(webpack@5.101.3) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js + bignumber.js: 9.3.1 diff --git a/static/icon/charge.png b/static/icon/charge.png new file mode 100644 index 0000000000000000000000000000000000000000..83e5eb370f12dd1473ea2ddd714203dad1caf075 GIT binary patch literal 6615 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 { }); socketTask.value.onMessage((res) => { receivedMessages.value = JSON.parse(res.data) - console.log('收到消息',receivedMessages.value) + // console.log('收到消息',receivedMessages.value) sendMessage({ type: 'receipt', msg_id: receivedMessages.value.msg_id diff --git a/stores/carts.js b/stores/carts.js index 9965c60..321ae53 100644 --- a/stores/carts.js +++ b/stores/carts.js @@ -1,11 +1,24 @@ import { defineStore } from 'pinia'; +import yskUtils from 'ysk-utils' +const { + OrderPriceCalculator, + BaseCartItem, + BackendCoupon, + ActivityConfig, + OrderExtraConfig, + MerchantReductionConfig, + MerchantReductionType, + GoodsType +} = yskUtils + import { ref, computed, reactive, - watchEffect + watchEffect, + watch } from 'vue'; import { productminiApphotsquery, @@ -13,16 +26,156 @@ import { } from "@/common/api/product/product.js"; export const useCartsStore = defineStore('cart', () => { - // const dinersNum = uni.cache.get('dinersNum') - // const isVip = uni.cache.get('orderVIP').isVip //此用户是否是会员 - // const isMemberPrice = uni.cache.get('ordershopUserInfo').isMemberPrice //此店是否可以用会员 - // const isTableFee = uni.cache.get('ordershopUserInfo').isTableFee //此店是否免桌位费 - // const tableFee = uni.cache.get('ordershopUserInfo').tableFee //一个餐位费多钱 + + // 商品订单会员 + const shopInfo = ref(uni.cache.get('shopInfo') || { + isMemberPrice: 0, + isTableFee: 1 + }) + + // 适配工具库 BaseCartItem 接口的商品数据转换函数 + const convertToBaseCartItem = (item) => { + const skuData = item.skuData ? { + id: item.skuData.id || item.sku_id, + salePrice: item.skuData.salePrice || 0, + memberPrice: item.skuData.memberPrice || 0 + } : + undefined; + + + + return { + ...item, + id: item.id, + product_id: item.product_id || item.productId, + salePrice: item.salePrice || item.price, + number: item.number || item.num || 0, + product_type: item.productType, + is_temporary: !!(item.is_temporary || item.isTemporary), + is_gift: !!(item.is_gift || item.isGift), + returnNum: item.returnNum || 0, + memberPrice: item.memberPrice || 0, + discountSaleAmount: item.discount_sale_amount || item.discountSaleAmount || 0, + packFee: item.packFee || 0, + packNumber: item.pack_number || item.packNumber || 0, + activityInfo: item.activityInfo ? { + type: item.activityInfo.type, + discountRate: OrderPriceCalculator.formatDiscountRate(item.activityInfo.discountRate), + vipPriceShare: !!item.activityInfo.vipPriceShare + } : undefined, + skuData + }; + }; + + // 合并所有商品列表 + const allGoods = computed(() => { + const currentGoods = (carts.value).map(convertToBaseCartItem); + const giftGoods = [].map(convertToBaseCartItem); + // 扁平化历史订单商品 + const oldOrderGoods = Object.values(oldOrder.value.detailMap || {}) + .flat() + .map(convertToBaseCartItem); + return [...currentGoods, ...giftGoods, ...oldOrderGoods]; + }) + + + // 就餐类型 'dine-in' | 'take-out' + + let dinnerType = ref('dine-in'); + + function setDinnerType(str) { + dinnerType.value = str + } + //餐位费配置 + + const dinersNum = uni.cache.set('dinersNum') || 1 + const seatFeeConfig = ref({ + pricePerPerson: shopInfo.value.tableFee || 1, + personCount: dinersNum, + isEnabled: !shopInfo.value.isTableFee + }) + watch(() => shopInfo.value.isTableFee, (newval) => { + seatFeeConfig.value.isEnabled = !shopInfo.value.isTableFee + }) + + function setSeatFeeConfig(key, val) { + seatFeeConfig.value[key] = val; + } + watch(() => seatFeeConfig.value, (newval) => { + console.log('seatFeeConfig', seatFeeConfig.value); + }, { + deep: true + }) + + //积分规则 + const pointDeductionRule = ref({ + pointsPerYuan: 100, + maxDeductionAmount: Infinity + }) + + function setPointDeductionRule(pointsPerYuan, maxDeductionAmount) { + pointDeductionRule.value.pointsPerYuan = pointsPerYuan + pointDeductionRule.value.maxDeductionAmount = maxDeductionAmount + } + + // 初始配置:默认无减免(固定金额 0 元) + const merchantReductionConfig = ref({ + type: 'fixed_amount', + fixedAmount: 0 + }); + //使用积分数量 + const userPoints = ref(0); + + function setUserPoints(newval) { + userPoints.value = newval + } + + + //新客立减 + const newUserDiscount = ref(0); + // 订单额外配置 + const orderExtraConfig = computed(() => ({ + // 引用扩展后的商家减免配置 + merchantReduction: merchantReductionConfig.value, + additionalFee: 0, + pointDeductionRule: pointDeductionRule.value, + seatFeeConfig: seatFeeConfig.value, + currentStoreId: '', + userPoints: userPoints.value, + isMember: useVipPrice.value, + memberDiscountRate: 1, + newUserDiscount: newUserDiscount.value + })); + + // 营销活动列表 + const activityList = computed(() => { + return []; + }); + // 优惠券列表 + const backendCoupons = ref([]) + + function setCoupons(cps) { + console.log('setCoupons', cps); + backendCoupons.value = cps; + } + // 商品加入购物车顺序 + const cartOrder = ref({}); + // 订单费用汇总 + const orderCostSummary = computed(() => { + const costSummary = OrderPriceCalculator.calculateOrderCostSummary( + allGoods.value, + dinnerType.value, + backendCoupons.value, + activityList.value, + orderExtraConfig.value, + cartOrder.value, + new Date() + ); + return costSummary; + }); const goodsIsloading = ref(true); - - //商品数据Map const goodsMap = reactive({}) //获取商品数据 @@ -62,13 +215,6 @@ export const useCartsStore = defineStore('cart', let skuData = undefined; skuData = goods?.skuList.find((sku) => sku.id == v.sku_id); - // if (goods.type == 'package') { - // //套餐商品 - // const SnapSku = findInGroupSnapSku(goods.groupSnap, v.sku_id) - // skuData = { ...SnapSku, salePrice: SnapSku ? SnapSku.price : 0 } - // } else { - // skuData = goods?.skuList.find((sku: { id: string, salePrice: number }) => sku.id == v.sku_id); - // } skuData = goods?.skuList.find((sku) => sku.id == v.sku_id); if (skuData) { @@ -135,7 +281,6 @@ export const useCartsStore = defineStore('cart', if (Message.operate_type == 'del' && Message.status == 1) { // 优化:使用可选链操作符避免报错 carts.value = carts.value.filter(item => item.id !== msgData?.id); - // carts.value = carts.value.filter(item => item.id != Message.data.id); } // 添加或者减少购物后返回 @@ -167,7 +312,6 @@ export const useCartsStore = defineStore('cart', } if (Message.type == 'no_suit_num') { - // console.log(specifications) uni.showModal({ title: '提示', showCancel: false, @@ -177,9 +321,6 @@ export const useCartsStore = defineStore('cart', } }); } - - - } } @@ -193,6 +334,10 @@ export const useCartsStore = defineStore('cart', originAmount: 0 }) + function setOldOrder(data) { + oldOrder.value = data + } + // 会员信息 const orderVIP = ref(uni.cache.get('orderVIP') || { @@ -210,10 +355,7 @@ export const useCartsStore = defineStore('cart', } } - // 商品订单会员 - const shopInfo = ref(uni.cache.get('shopInfo') || { - isMemberPrice: 0 - }) + //是否使用会员价 const useVipPrice = computed(() => { @@ -264,16 +406,6 @@ export const useCartsStore = defineStore('cart', return money }) - //商品券抵扣金额 - // const productCouponDiscountAmount = computed(() => { - // let index = -1; - // return quansSelArr.value.reduce((pre, cur) => { - // index++; - // return pre + returnProDiscount(cur, index) * 1; - // }, 0); - // }); - - //返回打包数量(称重商品打包数量最大为1) function returnCartPackNumber(cur) { const maxReturnNum = cur.number - (cur.returnNum || 0); @@ -343,8 +475,6 @@ export const useCartsStore = defineStore('cart', if (!matchedProducts || !Array.isArray(matchedProducts)) { return 0; } - // console.log(uni.cache.get('orderVIP').isVip, uni.cache.get('ordershopUserInfo').isMemberPrice, - // 111) // 购物车总数价格 console.log('isBwc'); console.log(isBwc); @@ -366,8 +496,6 @@ export const useCartsStore = defineStore('cart', cart = cart.toFixed(2) console.log(parseFloat(cart)) - // 向上取整并保留两位小数 - // let result = roundUpToTwoDecimals(cart, 'upward') return parseFloat(cart); }; @@ -399,9 +527,6 @@ export const useCartsStore = defineStore('cart', if (uni.cache.get('ordershopUserInfo').isTableFee == 0 && seatNum) { cart = parseFloat(seatNum) * parseFloat(uni.cache.get('ordershopUserInfo').tableFee) - - // Math.ceil(parseFloat(seatNum) * parseFloat( - // uni.cache.get('ordershopUserInfo').tableFee) * 100) / 100; } // 向下取整并保留两位小数 let result = roundUpToTwoDecimals(cart, 'downward') @@ -417,18 +542,9 @@ export const useCartsStore = defineStore('cart', // 向下取整并保留两位小数 let result = roundUpToTwoDecimals(total, 'downward') return result; - // return Math.floor(total * 100) / 100; }); - //获取热门商品 - async function getHotProduct() { - } - - //获取分组商品 - async function getGroupProduct() { - - } return { getTotalPackFee, @@ -446,7 +562,21 @@ export const useCartsStore = defineStore('cart', totalPackFee, updateData, useVipPrice, - totalOriginPrice + totalOriginPrice, + orderCostSummary, + setCoupons, + setUserPoints, + setPointDeductionRule, + setOldOrder, + //优惠券列表 + backendCoupons, + allGoods, + setDinnerType, + setSeatFeeConfig, + seatFeeConfig, + shopInfo, + //新客立减金额 + newUserDiscount }; } ); \ No newline at end of file diff --git a/utils/goods-utils - 副本.js b/utils/goods-utils - 副本.js new file mode 100644 index 0000000..db21553 --- /dev/null +++ b/utils/goods-utils - 副本.js @@ -0,0 +1,444 @@ +import { + BigNumber +} from "bignumber.js"; +import _ from "lodash"; + + + +/** + * 返回商品单价 + * @param goods 商品 + * @param user 用户信息 + * @param {Object} shopInfo + */ +export function returnGoodsPrice(goods, user, shopInfo) { + 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; +} + +/** + * 返回商品分组 + * @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; +} + +/** + * 优惠券类型:1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券,5-消费送券,6-买一送一券,7-固定价格券,8-免配送费券 + * @param coupon + */ +export function returnCoupType(coupon) { + const couponTypes = { + 1: "满减券", + 2: "商品券", + 3: "折扣券", + 4: "第二件半价券", + 5: "消费送券", + 6: "买一送一券", + 7: "固定价格券", + 8: "免配送费券", + }; + return couponTypes[coupon.type] || "未知类型"; +} + +/** + * 返回商品券抵扣后的商品列表 + * @param canDikouGoodsArr 可抵扣商品列表 + * @param selCoupon 已选择的优惠券列表 + * @param user 用户信息 + */ +export function returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user) { + const goodsCouponGoods = selCoupon + .filter((v) => v.type == 2) + .reduce((prve, cur) => { + prve.push(...cur.discount.hasDiscountGoodsArr); + return prve; + }, []); + const arr = _.cloneDeep(canDikouGoodsArr) + .map((v) => { + const findCart = goodsCouponGoods.find((carts) => carts.id == v.id); + if (findCart) { + v.num -= findCart.num; + } + return v; + }) + .filter((v) => v.num > 0); + return arr; +} + +/** + * 判断优惠券是否可使用,并返回不可用原因 + * + * @param {Object} args - 函数参数集合 + * @param {Array} args.canDikouGoodsArr - 可参与抵扣的商品列表 + * @param {Object} args.coupon - 优惠券信息对象 + * @param {boolean} args.coupon.use - 优惠券是否启用 + * @param {Array} args.coupon.useFoods - 优惠券适用的商品ID列表 + * @param {number} args.coupon.fullAmount - 优惠券使用门槛金额 + * @param {number} args.coupon.type - 优惠券类型 + * @param {number} args.goodsOrderPrice - 订单中所有商品的总金额 + * @param {Object} args.user - 用户信息对象 + * @param {Object} args.selCoupon - 已经选择的优惠券信息对象 + * @param {Object} args.shopInfo + * @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: "优惠券未启用" + }; + } + + canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user,shopInfo); + // 计算门槛金额 + let fullAmount = goodsOrderPrice; + // 是否抵扣全部商品 + const isDikouAll = coupon.useFoods.length === 0; + let canCalcGoodsArr = []; + // 订单里参与门槛计算的商品 + if (!isDikouAll) { + canCalcGoodsArr = canDikouGoodsArr.filter((v) => { + return coupon.useFoods.find((food) => food.id == v.productId); + }); + fullAmount = canCalcGoodsArr.reduce((pre, cur) => { + return pre + returnGoodsPrice(cur, user,shopInfo) * cur.num; + }, 0); + } + + // 没有符合条件的商品 + if (!isDikouAll && canCalcGoodsArr.length === 0) { + return { + canUse: false, + reason: "没有符合条件的商品" + }; + } + + // 不满足门槛金额 + if (fullAmount < coupon.fullAmount) { + return { + canUse: false, + reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元` + }; + } + + // 商品券特殊验证 + if (coupon.type === 2) { + if (!(isDikouAll || canCalcGoodsArr.length > 0)) { + return { + canUse: false, + reason: "没有符合条件的商品可抵扣" + }; + } + } + + // 买一送一券特殊验证 + 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 (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件相同的商品才能使用" + }; + } + } + + // 所有条件都满足 + return { + canUse: true, + reason: "" + }; +} + + +/** + * 计算抵扣商品金额 + * @param discountGoodsArr 可抵扣商品列表 + * @param discountNum 抵扣数量 + * @param user 用户信息 + * @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 + }; +} + +/** + * 计算优惠券抵扣金额 + * @param arr 可抵扣商品列表 + * @param coupon 优惠券 + * @param user 用户信息 + * @param goodsOrderPrice 商品订单金额 + * @param selCoupon 已选择的优惠券列表 + */ +export function returnCouponDiscount(arr, coupon, user, goodsOrderPrice, selCoupon) { + console.log('arr', arr); + const canDikouGoodsArr = returnCanDikouGoodsArr(arr, selCoupon, user); + console.log('canDikouGoodsArr', canDikouGoodsArr); + if (coupon.type == 2) { + return returnCouponProductDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); + } + if (coupon.type == 6) { + return returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); + } + if (coupon.type == 4) { + return returnSecoendDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); + } + if (coupon.type == 3) { + return returnCouponZhekouDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice, selCoupon); + } +} + +/** + * 折扣券抵扣金额 + * @param canDikouGoodsArr 可抵扣商品列表 + * @param coupon 优惠券 + * @param user 用户信息 + * @param goodsOrderPrice 商品订单金额 + * @param selCoupon 已选择的优惠券列表 + * + */ +export function returnCouponZhekouDiscount( + canDikouGoodsArr, + coupon, + user, + goodsOrderPrice, + selCoupon +) { + const { + discountRate, + maxDiscountAmount + } = coupon; + + const goodsCouponDiscount = selCoupon + .filter((v) => v.type == 2) + .reduce((prve, cur) => { + return prve + cur.discount.discountPrice; + }, 0); + goodsOrderPrice -= goodsCouponDiscount; + // 使用bignumber处理高精度计算 + // 1. 计算折扣率(百分比转小数):discountRate / 100 + const discountRatio = new BigNumber(discountRate).dividedBy(100); + // 2. 计算优惠比例:1 - 折扣率(例如:8折的优惠比例是 1 - 0.8 = 0.2) + const discountAmountRatio = new BigNumber(1).minus(discountRatio); + // 3. 计算折扣金额:商品订单金额 × 优惠比例 + let discountPrice = new BigNumber(goodsOrderPrice).times(discountAmountRatio).toNumber(); + if (maxDiscountAmount != 0) { + discountPrice = discountPrice >= maxDiscountAmount ? maxDiscountAmount : discountPrice; + } + + return { + discountPrice, // 折扣抵扣金额(即优惠的金额) + hasDiscountGoodsArr: [], + }; +} + +/** + * 商品券抵扣金额 + * @param canDikouGoodsArr 可抵扣商品列表 + * @param coupon 优惠券 + * @param user 用户信息 + */ +export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user) { + 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); + return result; +} + +// 返回买一送一券抵扣详情 +/** + * @param canDikouGoodsArr 可抵扣商品列表 + * @param coupon 优惠券 + * @param user 用户信息 + * @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.slice(0, 1); + } + } 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.slice(0, 1); + } + } + const discountPrice = returnGoodsPrice(discountGoods, user,shopInfo); + const hasDiscountGoodsArr = [discountGoods]; + return { + discountPrice, + hasDiscountGoodsArr + }; +} + +/** + * 返回第二件半价券抵扣详情 + * @param canDikouGoodsArr 可抵扣商品列表 + * @param coupon 优惠券 + * @param user 用户信息 + * @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.slice(0, 1); + } + } 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.slice(0, 1); + } + } + const discountPrice = returnGoodsPrice(discountGoods, user,shopInfo); + const hasDiscountGoodsArr = [discountGoods]; + //返回半价价格 + return { + discountPrice: new BigNumber(discountPrice).dividedBy(2).toNumber(), + hasDiscountGoodsArr, + }; +} + +/** + * 返回可以抵扣优惠券的商品列表,过滤掉赠品、临时商品,价格从高到低排序 + * @param arr 商品列表 + * @param user 用户信息 + * @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, use, shopInfo) - returnGoodsPrice(a, user, shopInfo); + }); + return result; +} \ No newline at end of file diff --git a/utils/goods-utils.js b/utils/goods-utils.js index b8ea534..db21553 100644 --- a/utils/goods-utils.js +++ b/utils/goods-utils.js @@ -1,37 +1,27 @@ -import { BigNumber } from "bignumber.js"; +import { + BigNumber +} from "bignumber.js"; import _ from "lodash"; -/** - * 返回可以抵扣优惠券的商品列表,过滤掉赠品、临时商品,价格从高到低排序 - * @param arr 商品列表 - * @param user 用户信息 - */ -export function returnCanDikouGoods(arr, user) { - return 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) - returnGoodsPrice(a, user); - }); -} + /** * 返回商品单价 * @param goods 商品 * @param user 用户信息 + * @param {Object} shopInfo */ -export function returnGoodsPrice(goods, user) { - if (goods.discount_sale_amount * 1 > 0) { - return goods.discount_sale_amount; - } - if (user.isVip && goods.memberPrice * 1 <= goods.salePrice * 1 && goods.memberPrice * 1 > 0) { - return goods.memberPrice; - } - return goods.salePrice; +export function returnGoodsPrice(goods, user, shopInfo) { + 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; } /** @@ -39,15 +29,15 @@ export function returnGoodsPrice(goods, user) { * @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; } /** @@ -55,17 +45,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] || "未知类型"; } /** @@ -75,164 +65,197 @@ export function returnCoupType(coupon) { * @param user 用户信息 */ export function returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user) { - const goodsCouponGoods = selCoupon - .filter((v) => v.type == 2) - .reduce((prve, cur) => { - prve.push(...cur.discount.hasDiscountGoodsArr); - return prve; - }, []); - const arr = _.cloneDeep(canDikouGoodsArr) - .map((v) => { - const findCart = goodsCouponGoods.find((carts) => carts.id == v.id); - if (findCart) { - v.num -= findCart.num; - } - return v; - }) - .filter((v) => v.num > 0); - return arr; + const goodsCouponGoods = selCoupon + .filter((v) => v.type == 2) + .reduce((prve, cur) => { + prve.push(...cur.discount.hasDiscountGoodsArr); + return prve; + }, []); + const arr = _.cloneDeep(canDikouGoodsArr) + .map((v) => { + const findCart = goodsCouponGoods.find((carts) => carts.id == v.id); + if (findCart) { + v.num -= findCart.num; + } + return v; + }) + .filter((v) => v.num > 0); + return arr; } /** - * 判断优惠券是否可使用 + * 判断优惠券是否可使用,并返回不可用原因 * * @param {Object} args - 函数参数集合 - * @param {Array} args.canDikouGoodsArr - 可参与抵扣的商品列表,每个元素包含商品信息(productId、num等) + * @param {Array} args.canDikouGoodsArr - 可参与抵扣的商品列表 * @param {Object} args.coupon - 优惠券信息对象 - * @param {boolean} args.coupon.use - 优惠券是否启用(true为启用,false为禁用) - * @param {Array} args.coupon.useFoods - 优惠券适用的商品ID列表(空数组表示适用全部商品) + * @param {boolean} args.coupon.use - 优惠券是否启用 + * @param {Array} args.coupon.useFoods - 优惠券适用的商品ID列表 * @param {number} args.coupon.fullAmount - 优惠券使用门槛金额 - * @param {number} args.coupon.type - 优惠券类型(1:满减券, 2:商品券, 3:折扣券, 4:第二件半价券, 6:买一送一券) - * @param {number} args.goodsOrderPrice - 订单中所有商品的总金额(未筛选时的初始金额) - * @param {Object} args.user - 用户信息对象(用于计算商品价格,如会员价等) - * @param {Object} args.user - 用户信息对象(用于计算商品价格,如会员价等) + * @param {number} args.coupon.type - 优惠券类型 + * @param {number} args.goodsOrderPrice - 订单中所有商品的总金额 + * @param {Object} args.user - 用户信息对象 * @param {Object} args.selCoupon - 已经选择的优惠券信息对象 - * @returns {boolean} - 优惠券是否可用(true可用,false不可用) + * @param {Object} args.shopInfo + * @returns {Object} - { canUse: boolean, reason: string } 可用状态及不可用原因 */ export function returnCouponCanUse(args) { - let { canDikouGoodsArr, coupon, goodsOrderPrice, user, selCoupon } = args; - if (!coupon.use) { - return false; - } + let { + canDikouGoodsArr, + coupon, + goodsOrderPrice, + user, + selCoupon, + shopInfo + } = args; - canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user); - // 计算门槛金额 - let fullAmount = goodsOrderPrice; - //是否抵扣全部商品 - const isDikouAll = coupon.useFoods.length === 0; - let canCalcGoodsArr = []; - // 订单里参与门槛计算的商品 - if (!isDikouAll) { - canCalcGoodsArr = canDikouGoodsArr.filter((v) => { - return coupon.useFoods.find((food) => food.id == v.productId); - }); - fullAmount = canCalcGoodsArr.reduce((pre, cur) => { - return pre + returnGoodsPrice(cur, user) * cur.num; - }, 0); - } + // 优惠券未启用 + if (!coupon.use) { + return { + canUse: false, + reason: "优惠券未启用" + }; + } - //没有符合商品 - if (!isDikouAll && canCalcGoodsArr.length == 0) { - return false; - } + canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user,shopInfo); + // 计算门槛金额 + let fullAmount = goodsOrderPrice; + // 是否抵扣全部商品 + const isDikouAll = coupon.useFoods.length === 0; + let canCalcGoodsArr = []; + // 订单里参与门槛计算的商品 + if (!isDikouAll) { + canCalcGoodsArr = canDikouGoodsArr.filter((v) => { + return coupon.useFoods.find((food) => food.id == v.productId); + }); + fullAmount = canCalcGoodsArr.reduce((pre, cur) => { + return pre + returnGoodsPrice(cur, user,shopInfo) * cur.num; + }, 0); + } - //不满足门槛金额 - if (fullAmount < coupon.fullAmount) { - console.log("不满足门槛金额"); - return false; - } + // 没有符合条件的商品 + if (!isDikouAll && canCalcGoodsArr.length === 0) { + return { + canUse: false, + reason: "没有符合条件的商品" + }; + } - if (coupon.type == 2) { - //商品券 - return isDikouAll || canCalcGoodsArr.length > 0; - } - if (coupon.type == 1) { - //满减券 - return fullAmount >= coupon.fullAmount; - } - if (coupon.type == 6) { - //买一送一券 + // 不满足门槛金额 + if (fullAmount < coupon.fullAmount) { + return { + canUse: false, + reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元` + }; + } - let canUse = false; - if (isDikouAll) { - canUse = canDikouGoodsArr.some((v) => v.num >= 2); - } - if (canCalcGoodsArr.length > 0) { - canUse = canDikouGoodsArr - .filter((v) => { - return coupon.useFoods.find((food) => food.id == v.productId); - }) - .some((v) => v.num >= 2); - } - return canUse; - } - if (coupon.type == 4) { - //第二件半价券 - let canUse = false; - if (isDikouAll) { - canUse = canDikouGoodsArr.some((v) => v.num >= 2); - } - if (canCalcGoodsArr.length > 0) { - canUse = canDikouGoodsArr - .filter((v) => { - return coupon.useFoods.find((food) => food.id == v.productId); - }) - .some((v) => v.num >= 2); - } - return canUse; - } - if (coupon.type == 3) { - //折扣券 - return true; - } + // 商品券特殊验证 + if (coupon.type === 2) { + if (!(isDikouAll || canCalcGoodsArr.length > 0)) { + return { + canUse: false, + reason: "没有符合条件的商品可抵扣" + }; + } + } + + // 买一送一券特殊验证 + 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 (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件相同的商品才能使用" + }; + } + } + + // 所有条件都满足 + return { + canUse: true, + reason: "" + }; } + /** * 计算抵扣商品金额 * @param discountGoodsArr 可抵扣商品列表 * @param discountNum 抵扣数量 * @param user 用户信息 + * @param {Object} shopInfo 店铺信息 */ -export function calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user) { - 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) * num; - hasCountNum += num; - hasDiscountGoodsArr.push({ ...goods, num }); - } - return { discountPrice, hasDiscountGoodsArr }; +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 + }; } /** * 计算优惠券抵扣金额 - * @param canDikouGoodsArr 可抵扣商品列表 + * @param arr 可抵扣商品列表 * @param coupon 优惠券 * @param user 用户信息 * @param goodsOrderPrice 商品订单金额 * @param selCoupon 已选择的优惠券列表 */ -export function returnCouponDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice, selCoupon) { - canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user); - if (coupon.type == 2) { - return returnCouponProductDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); - } - if (coupon.type == 6) { - return returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); - } - if (coupon.type == 4) { - return returnSecoendDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); - } - if (coupon.type == 3) { - return returnCouponZhekouDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice, selCoupon); - } +export function returnCouponDiscount(arr, coupon, user, goodsOrderPrice, selCoupon) { + console.log('arr', arr); + const canDikouGoodsArr = returnCanDikouGoodsArr(arr, selCoupon, user); + console.log('canDikouGoodsArr', canDikouGoodsArr); + if (coupon.type == 2) { + return returnCouponProductDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); + } + if (coupon.type == 6) { + return returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); + } + if (coupon.type == 4) { + return returnSecoendDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); + } + if (coupon.type == 3) { + return returnCouponZhekouDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice, selCoupon); + } } /** @@ -245,36 +268,38 @@ export function returnCouponDiscount(canDikouGoodsArr, coupon, user, goodsOrderP * */ export function returnCouponZhekouDiscount( - canDikouGoodsArr, - coupon, - user, - goodsOrderPrice, - selCoupon + canDikouGoodsArr, + coupon, + user, + goodsOrderPrice, + selCoupon ) { - const { discountRate, maxDiscountAmount } = coupon; + const { + discountRate, + maxDiscountAmount + } = coupon; - const goodsCouponDiscount = selCoupon - .filter((v) => v.type == 2) - .reduce((prve, cur) => { - return prve + cur.discount.discountPrice; - }, 0); - goodsOrderPrice -= goodsCouponDiscount; + const goodsCouponDiscount = selCoupon + .filter((v) => v.type == 2) + .reduce((prve, cur) => { + return prve + cur.discount.discountPrice; + }, 0); + goodsOrderPrice -= goodsCouponDiscount; + // 使用bignumber处理高精度计算 + // 1. 计算折扣率(百分比转小数):discountRate / 100 + const discountRatio = new BigNumber(discountRate).dividedBy(100); + // 2. 计算优惠比例:1 - 折扣率(例如:8折的优惠比例是 1 - 0.8 = 0.2) + const discountAmountRatio = new BigNumber(1).minus(discountRatio); + // 3. 计算折扣金额:商品订单金额 × 优惠比例 + let discountPrice = new BigNumber(goodsOrderPrice).times(discountAmountRatio).toNumber(); + if (maxDiscountAmount != 0) { + discountPrice = discountPrice >= maxDiscountAmount ? maxDiscountAmount : discountPrice; + } - // 使用bignumber处理高精度计算 - // 1. 计算折扣率(百分比转小数):discountRate / 100 - const discountRatio = new BigNumber(discountRate).dividedBy(100); - // 2. 计算优惠比例:1 - 折扣率(例如:8折的优惠比例是 1 - 0.8 = 0.2) - const discountAmountRatio = new BigNumber(1).minus(discountRatio); - // 3. 计算折扣金额:商品订单金额 × 优惠比例 - let discountPrice = new BigNumber(goodsOrderPrice).times(discountAmountRatio).toNumber(); - if (maxDiscountAmount != 0) { - discountPrice = discountPrice >= maxDiscountAmount ? maxDiscountAmount : discountPrice; - } - - return { - discountPrice, // 折扣抵扣金额(即优惠的金额) - hasDiscountGoodsArr: [], - }; + return { + discountPrice, // 折扣抵扣金额(即优惠的金额) + hasDiscountGoodsArr: [], + }; } /** @@ -284,36 +309,37 @@ export function returnCouponZhekouDiscount( * @param user 用户信息 */ export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user) { - 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); - console.log(result); - return result; + 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); + return result; } // 返回买一送一券抵扣详情 @@ -321,35 +347,39 @@ export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user) { * @param canDikouGoodsArr 可抵扣商品列表 * @param coupon 优惠券 * @param user 用户信息 + * @param shopInfo 店铺信息 */ -function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user) { - 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.slice(0, 1); - } - } else { - //符合抵扣条件的商品 - const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId)); - console.log(canUseGoods1); - if (useRule == "price_asc") { - discountGoods = canUseGoods1[canUseGoods1.length - 1]; - } else { - discountGoods = canUseGoods1.slice(0, 1); - } - } - console.log("discountGoods"); - console.log(discountGoods); - const discountPrice = returnGoodsPrice(discountGoods, user); - const hasDiscountGoodsArr = [discountGoods]; - return { discountPrice, hasDiscountGoodsArr }; +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.slice(0, 1); + } + } 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.slice(0, 1); + } + } + const discountPrice = returnGoodsPrice(discountGoods, user,shopInfo); + const hasDiscountGoodsArr = [discountGoods]; + return { + discountPrice, + hasDiscountGoodsArr + }; } /** @@ -357,35 +387,58 @@ function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user) { * @param canDikouGoodsArr 可抵扣商品列表 * @param coupon 优惠券 * @param user 用户信息 + * @param shopInfo 店铺信息 */ -function returnSecoendDiscount(canDikouGoodsArr, coupon, user) { - 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.slice(0, 1); - } - } else { - //符合抵扣条件的商品 - const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId)); - console.log(canUseGoods1); - if (useRule == "price_asc") { - discountGoods = canUseGoods1[canUseGoods1.length - 1]; - } else { - discountGoods = canUseGoods1.slice(0, 1); - } - } - const discountPrice = returnGoodsPrice(discountGoods, user); - const hasDiscountGoodsArr = [discountGoods]; - //返回半价价格 - return { - discountPrice: new BigNumber(discountPrice).dividedBy(2).toNumber(), - hasDiscountGoodsArr, - }; +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.slice(0, 1); + } + } 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.slice(0, 1); + } + } + const discountPrice = returnGoodsPrice(discountGoods, user,shopInfo); + const hasDiscountGoodsArr = [discountGoods]; + //返回半价价格 + return { + discountPrice: new BigNumber(discountPrice).dividedBy(2).toNumber(), + hasDiscountGoodsArr, + }; } + +/** + * 返回可以抵扣优惠券的商品列表,过滤掉赠品、临时商品,价格从高到低排序 + * @param arr 商品列表 + * @param user 用户信息 + * @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, use, shopInfo) - returnGoodsPrice(a, user, shopInfo); + }); + return result; +} \ No newline at end of file