修改确认订单逻辑

This commit is contained in:
2025-09-28 09:47:09 +08:00
parent 86edc7bb02
commit 87fafdbf9a
18 changed files with 4785 additions and 1816 deletions

View File

@@ -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
})
}

View File

@@ -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
})
}

View File

@@ -85,26 +85,53 @@ export const joinMember = (data) => {
} }
//会员购买支付 //会员购买支付
export const ltPayMember = (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({ return request({
url: url + '/pay/ltPayMember', url: url + '/pay/ltPayMember',
method: 'post', method: 'post',
data: { data: {
platformType, platformType,
payType, payType,
openId: uni.cache.get('miniAppOpenId'), openId,
...data ...data
} }
}) })
} }
//智慧充值 //智慧充值
export const recharge = (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({ return request({
url: url + '/pay/recharge', url: url + '/pay/recharge',
method: 'post', method: 'post',
data: { data: {
platformType, platformType,
payType, 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 ...data
} }
}) })

View File

@@ -1,10 +1,12 @@
{ {
"dependencies": { "dependencies": {
"@dcloudio/uni-app": "^2.0.2-4040520250103001", "@dcloudio/uni-app": "^2.0.2-4040520250103001",
"bignumber.js": "^9.3.1",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"jsbarcode": "^3.11.6", "jsbarcode": "^3.11.6",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"pinia": "^2.3.1", "pinia": "^2.3.1",
"pinia-plugin-unistorage": "^0.1.2" "pinia-plugin-unistorage": "^0.1.2",
"ysk-utils": "^1.0.28"
} }
} }

View File

@@ -7,9 +7,16 @@
:placeholder="instructions" /> :placeholder="instructions" />
</view> </view>
<!-- <view class="instructions">{{ instructions }}</view> --> <!-- <view class="instructions">{{ instructions }}</view> -->
<up-button type="primary" @click="confirmIntegral" text="确定"></up-button> <view class="u-flex gap-20" style="width: 100%; padding-bottom: 40px;">
<view class="u-flex-1">
<up-button style="margin-top: 20rpx;" @click="IntegralInputclose">取消</up-button> <up-button style="margin-top: 20rpx;" @click="IntegralInputclose">取消</up-button>
</view> </view>
<view class="u-flex-1">
<up-button type="primary" @click="confirmIntegral" text="确定"></up-button>
</view>
</view>
</view>
</view> </view>
</template> </template>
@@ -117,7 +124,9 @@
height: 100%; height: 100%;
z-index: 9999; z-index: 9999;
} }
.gap-20{
gap: 20rpx;
}
.modal-mask { .modal-mask {
position: absolute; position: absolute;
top: 0; top: 0;
@@ -146,6 +155,7 @@
.input-wrapper { .input-wrapper {
margin-bottom: 15px; margin-bottom: 15px;
width: 100%;
} }
.instructions { .instructions {

View File

@@ -0,0 +1,161 @@
<template>
<view>
<view class="box" v-if="isShow">
<view class="u-flex u-col-center" style="align-items: center;">
<image src="/static/icon/charge.png" class="charge" mode=""></image>
<view class="u-m-l-28 color-333 font-700"> 充值享优惠</view>
</view>
<scroll-view scroll-x="true" class="u-m-t-20">
<view class="list">
<view class="item color1" @click="itemClick" v-for="(item,index) in list" :key="index"
:class="{active:sel==index}">
<view class="">
<text></text>
<text class="font-700" style="font-size: 48rpx;"
:class="{color2:sel==index}">{{item.amount}}</text>
</view>
<view class="font-12" v-if="item.rewardAmount" :class="{color2:sel==index}">
<text></text>
<text></text>
<text class="font-14">{{item.rewardAmount}}</text>
</view>
<view class="font-12" v-if="item.rewardPoints">
<text></text>
<text></text>
<text class="font-14">{{item.rewardPoints}}</text>
</view>
<view class="font-12 color-666" v-if="item.couponInfoList.length">
<text></text>
<text>{{item.couponInfoList.length}}</text>
<text>张券</text>
<text class="color2 u-m-l-8" v-if="sel==index">查看</text>
</view>
<view class="sel u-flex" v-if="sel==index">
<image class="image" src="/static/vip/sel.png" mode=""></image>
</view>
</view>
</view>
</scroll-view>
</view>
<view class="" v-else></view>
</view>
</template>
<script setup>
import * as rechargeApi from '@/common/api/market/recharge.js'
import {
useCartsStore
} from '@/stores/carts.js';
const cartStore = useCartsStore()
import {
onMounted,
ref,
watch
} from 'vue';
const list = ref([])
const sel = ref(-1)
const isShow = ref(false)
let data={}
let $riginList=[]
async function init() {
console.log('recharge', )
const shopId = uni.cache.get('shopId')
const res = await rechargeApi.config({
shopId
})
if (res) {
data=res;
$riginList=res.rechargeDetailList
isShow.value = res.isOrder
list.value = res.rechargeDetailList.filter(v=>v.amount>cartStore.orderCostSummary.finalPayAmount)
if(list.value.length){
sel.value=0
updateSel()
}
}
}
watch(()=>cartStore.orderCostSummary.finalPayAmount,(newval)=>{
list.value=$riginList.filter(v=>v.amount>newval)
if(list.value.length){
sel.value=0
updateSel()
}
})
function updateSel(){
const selItem=list.value[sel.value]
emits('updateChargeSel',selItem?selItem:{})
emits('updateRechargeId',data.id)
}
function itemClick(index){
if(sel.value==index){
sel.value=-1
}
sel.value=index
}
const emits=defineEmits(['updateChargeSel'])
watch(()=>sel.value,(newval)=>{
updateSel()
})
onMounted(() => {
init()
})
</script>
<style lang="scss" scoped>
.box {
background: linear-gradient(179.4deg, #f8eadc 0%, #fdf9f6 82%, #ffffff 100%);
padding: 30rpx;
margin-top: 32rpx;
border-radius: 22rpx;
overflow: hidden;
}
.charge {
width: 70rpx;
height: 70rpx;
}
.list {
display: flex;
gap: 20rpx;
padding: 20rpx 0;
.item {
padding: 36rpx 22rpx;
border-radius: 42rpx;
background: linear-gradient(180deg, #F5F5F5 58.54%, #FFF 140.47%);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
box-sizing: border-box;
border: 6rpx solid transparent;
transition: all .3s ease-in-out;
min-width: 202rpx;
&.active {
background: linear-gradient(180deg, #FFC29A -26.17%, #FFF 64.06%);
border: 6rpx solid #FE6C0E;
box-shadow: 0 0 31rpx 2rpx #fe8b435e;
}
.sel {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%) translateY(21rpx);
.image {
width: 42rpx;
height: 42rpx;
}
}
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -25,24 +25,7 @@
</view> </view>
<view class="value" v-if="listinfo.tableName"> {{ listinfo.tableName || '' }} </view> <view class="value" v-if="listinfo.tableName"> {{ listinfo.tableName || '' }} </view>
</view> </view>
<!-- <view class="pack" v-else>
<view class="top">
<text class="title">{{ shopInfo.shopName }}</text>
<text class="address">{{ shopInfo.address }}</text>
</view>
<view class="list">
<view class="item">
<view class="lable">取餐时间</view>
<view class="text">立即取餐</view>
</view>
<view class="item">
<view class="lable">预留电话</view>
<view class="getPhone text"><u-input class="inputVal" v-model="order.phone"
input-align="right" placeholder="请输入预留电话以便联系您"></u-input><text
class="getBtn">获取手机号</text></view>
</view>
</view>
</view> -->
</view> </view>
<view class="card"> <view class="card">
@@ -79,33 +62,20 @@
</view> </view>
</view> </view>
</view> </view>
<!--<view class="status" v-if="listinfo.status == 'unpaid' || listinfo.status == 'paying'">未付款</view>
<view class="totalAmount">
<view class="label">小计</view>
<view class="price"> {{item.totalAmount}} </view>
</view> -->
<!-- <view class="semicircle_icon" v-if="index > 0">
<view class="semicircle_left_icon"></view>
<view class="semicircle_right_icon"></view>
</view> -->
</view> </view>
<view class="total-wrap u-m-t-30" v-if="listinfo.status == 'unpaid'||!listinfo.id"> <view class="total-wrap u-m-t-30" v-if="listinfo.status == 'unpaid'||!listinfo.id">
<view>总计</view> <view>总计</view>
<view class="price"> {{listinfo.totalCost||''}} </view> <view class="price"> {{cartStore.orderCostSummary.goodsRealAmount}} </view>
</view> </view>
<view class="total-wrap" v-else> <!-- <view class="total-wrap" v-else>
<view>实付</view> <view>实付</view>
<view class="price"> {{listinfo.payAmount||''}} </view> <view class="price"> {{listinfo.payAmount||''}} </view>
</view> </view> -->
<view class="cell-item" v-if="is_type != 0"> <view class="cell-item" v-if="is_type != 0">
<view class="label">打包费</view> <view class="label">打包费</view>
@@ -119,12 +89,12 @@
<!-- isTableFee == 0是不免除 --> <!-- isTableFee == 0是不免除 -->
<view class="cell-item" <view class="cell-item"
v-if="ordershopUserInfo.isTableFee == 0 && is_type == 0 && listinfo.Seatcharge != 0"> v-if="cartStore.orderCostSummary.seatFee">
<view class="label">餐位费</view> <view class="label">餐位费</view>
<view class="val"> <view class="val">
<view>X{{listinfo.Seatcharge}}</view> <view>X{{cartStore.seatFeeConfig.personCount}}</view>
<view style="font-size: 28rpx;"></view> <view style="font-size: 28rpx;"></view>
<view>{{listinfo.Seatcharge}}</view> <view>{{cartStore.orderCostSummary.seatFee}}</view>
</view> </view>
</view> </view>
@@ -150,26 +120,21 @@
<text class="name u-m-l-16"> {{ item.name }} </text> <text class="name u-m-l-16"> {{ item.name }} </text>
</view> </view>
<!-- 商品卷 -->
<view class="favorable_right" :class="{column:item.value}" v-if="item.type=='product'">
<view :class="{column:item.value}">
<view class="favorable_right_text" v-if="item.value.uniqueIds">
<text>{{item.value.uniqueIds}}</text>
<text>-{{item.value.Productroll}}</text>
</view>
</view>
<up-icon name="arrow-right" color="#575B66" size="16"
style="margin-top: 5rpx;"></up-icon>
</view>
<!-- 优惠卷 --> <!-- 优惠卷 -->
<view class="favorable_right" v-if="item.type=='coupon'"> <view class="favorable_right" v-if="item.type=='coupon'">
<text class="favorable_right_text">{{item.value.name}}</text> <text class="favorable_right_text red" v-if="returnCouponDiscount>0">-{{returnCouponDiscount}}</text>
<up-icon name="arrow-right" color="#575B66" size="16" <up-icon name="arrow-right" color="#575B66" size="16"
v-if="listinfo.status == 'unpaid' || listinfo.status == 'paying'||!listinfo.id"></up-icon> v-if="listinfo.status == 'unpaid' || listinfo.status == 'paying'||!listinfo.id"></up-icon>
</view> </view>
<!-- 新客立减 -->
<view class="favorable_right" v-if="item.type=='newUser'">
<text class="favorable_right_text red" v-if="newUserDiscount>0">-{{newUserDiscount}}</text>
</view>
<!-- 积分 --> <!-- 积分 -->
<view class="favorable_right" v-if="item.type=='points'"> <view class="favorable_right" v-if="item.type=='points'">
<text class="favorable_right_text" style="color: #666;margin-right: 16rpx;" <text class="favorable_right_text" style="color: #666;margin-right: 16rpx;"
@@ -251,6 +216,8 @@
<IntegralInput :visible="calcUsablePointsData.showModal" :minValue="calcUsablePointsData.minIntegral" <IntegralInput :visible="calcUsablePointsData.showModal" :minValue="calcUsablePointsData.minIntegral"
:maxValue="calcUsablePointsData.maxIntegral" :instructions="calcUsablePointsData.instructionText" :maxValue="calcUsablePointsData.maxIntegral" :instructions="calcUsablePointsData.instructionText"
@confirm="handleConfirm" @close="calcUsablePointsData.showModal = false" @confirm="handleConfirm" @close="calcUsablePointsData.showModal = false"
@@ -264,6 +231,9 @@
useCartsStore useCartsStore
} from '@/stores/carts.js'; } from '@/stores/carts.js';
const cartStore = useCartsStore() const cartStore = useCartsStore()
import {
consumeDiscount
} from '@/common/api/market/index.js'
import orderItemVue from './order-item.vue'; import orderItemVue from './order-item.vue';
import { import {
ref, ref,
@@ -308,13 +278,17 @@
}, },
]) ])
const favorablelist = reactive([{ const favorablelist = reactive([
name: "商品券", {
type: "product", name: "新客立减",
value: [], type: "newUser",
icon: goodsIcon, width: '40rpx',
height: '34rpx',
value: "",
icon: coupIcon,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/coupon.png" url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/coupon.png"
}, { },
{
name: "优惠券", name: "优惠券",
type: "coupon", type: "coupon",
width: '40rpx', width: '40rpx',
@@ -323,7 +297,6 @@
icon: coupIcon, icon: coupIcon,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/coupon.png" url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/coupon.png"
}, },
// { name: "团购优惠", type: "group",value: "", url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/groupOffer.png"},
{ {
icon: pointsIcon, icon: pointsIcon,
name: "积分抵扣", name: "积分抵扣",
@@ -384,7 +357,8 @@
default: () => { default: () => {
return [] return []
} }
} },
}) })
const is_type = ref(0) const is_type = ref(0)
@@ -392,30 +366,45 @@
const tabClick = (item, index) => { const tabClick = (item, index) => {
is_type.value = index is_type.value = index
emits("istype", is_type.value) emits("istype", is_type.value)
cartStore.setDinnerType(item.val)
// this.getchoseEatModel('tabClick', index, item); // this.getchoseEatModel('tabClick', index, item);
} }
// 操作优惠卷 // 操作优惠卷
const dataprocessing = (data) => { const dataprocessing = (data) => {
if (data.typeOrder == 1) { favorablelist[1].value = data
favorablelist[1].value = data.item
} else {
favorablelist[0].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 = () => { const bwcclear = () => {
IntegralInputclose() IntegralInputclose()
// 清空优惠卷 // 清空优惠卷
favorablelist[1].value = '' favorablelist[1].value = ''
favorablelist[0].value = '' favorablelist[1].value = ''
} }
const dinnerType = computed(() => {
return is_type.value ? 'take-out' : 'dine-ine'
})
// 跳转 // 跳转
const goUrl = (item) => { 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) { if (props.isBwc) {
uni.showToast({ uni.showToast({
title: '不可与其他优惠共享!', title: '不可与其他优惠共享!',
@@ -440,22 +429,7 @@
shoppingCart: JSON.stringify([...props.nowCarts, ...props.listinfo.combinedArray]), shoppingCart: JSON.stringify([...props.nowCarts, ...props.listinfo.combinedArray]),
}) })
break; 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': case 'points':
IntegralInputclose() IntegralInputclose()
if (calcUsablePointsData.usable == 0) { if (calcUsablePointsData.usable == 0) {
@@ -483,12 +457,15 @@
const handleConfirm = async (integral) => { const handleConfirm = async (integral) => {
//积分可抵扣最大金额
const maxMoney= cartStore.orderCostSummary.goodsRealAmount-cartStore.orderCostSummary.couponDeductionAmount
calcUsablePointsData.integral = integral calcUsablePointsData.integral = integral
props.listinfo.pointsDiscountAmount = await APImemberPointscalcDeductionAmount({ props.listinfo.pointsDiscountAmount = await APImemberPointscalcDeductionAmount({
points: integral, points: integral,
shopUserId: props.orderVIP.id, shopUserId: props.orderVIP.id,
orderAmount: props.listinfo.totalCost orderAmount:maxMoney
}) })
cartStore.setUserPoints(integral)
emits('clickPointsamount', { emits('clickPointsamount', {
pointsDiscountAmount: props.listinfo.pointsDiscountAmount, pointsDiscountAmount: props.listinfo.pointsDiscountAmount,
pointsNum: calcUsablePointsData.integral pointsNum: calcUsablePointsData.integral
@@ -499,6 +476,7 @@
const getCalcUsablePoints = async (data) => { const getCalcUsablePoints = async (data) => {
Object.assign(calcUsablePointsData, data); Object.assign(calcUsablePointsData, data);
try { try {
cartStore.setPointDeductionRule(data.equivalentPoints,data.maxDeductionAmount)
calcUsablePointsData.minIntegral = data.minDeductionPoints calcUsablePointsData.minIntegral = data.minDeductionPoints
calcUsablePointsData.maxIntegral = data.maxUsablePoints calcUsablePointsData.maxIntegral = data.maxUsablePoints
calcUsablePointsData.instructionText = calcUsablePointsData.instructionText =
@@ -514,6 +492,7 @@
calcUsablePointsData.integral = null calcUsablePointsData.integral = null
props.listinfo.pointsDiscountAmount = 0 props.listinfo.pointsDiscountAmount = 0
calcUsablePointsData.showModal = false calcUsablePointsData.showModal = false
cartStore.setUserPoints(0);
} }
// * 复制订单号 // * 复制订单号
@@ -537,23 +516,42 @@
bwcclear, bwcclear,
IntegralInputclose 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()
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .orderInfo .u-textarea{ ::v-deep .orderInfo .u-textarea {
background: #FAFAFA; background: #FAFAFA;
border-radius: 10rpx 10rpx 10rpx 10rpx; border-radius: 10rpx 10rpx 10rpx 10rpx;
} }
::v-deep .u-textarea__field{
::v-deep .u-textarea__field {
background: #FAFAFA; background: #FAFAFA;
border-radius: 10rpx 10rpx 10rpx 10rpx; border-radius: 10rpx 10rpx 10rpx 10rpx;
} }
.t{
.t {
font-weight: bold; font-weight: bold;
font-size: 28rpx; font-size: 28rpx;
color: #333333; color: #333333;
flex-shrink: 0; flex-shrink: 0;
} }
.card_box { .card_box {
background-color: #fff; background-color: #fff;
// box-shadow: 0rpx 8rpx 12rpx 2rpx rgba(87,86,86,0.35); // box-shadow: 0rpx 8rpx 12rpx 2rpx rgba(87,86,86,0.35);
@@ -1048,6 +1046,9 @@
font-size: 24rpx; font-size: 24rpx;
color: #999; color: #999;
font-weight: 400rpx; font-weight: 400rpx;
&.red{
color: #FF3232;
}
} }
} }
@@ -1060,7 +1061,9 @@
.favorable_right_text { .favorable_right_text {
margin-bottom: 10rpx; margin-bottom: 10rpx;
&.red{
color: #FF3232;
}
text:nth-child(1) { text:nth-child(1) {
font-size: 26rpx; font-size: 26rpx;
color: #999; color: #999;
@@ -1205,4 +1208,7 @@
} }
} }
} }
.red{
color:#FF3232;
}
</style> </style>

File diff suppressed because it is too large Load Diff

View File

@@ -36,6 +36,8 @@
</view> </view>
{{cartStore.orderCostSummary}}
<!-- 详情 --> <!-- 详情 -->
<orderInfo :useVipPrice="cartStore.useVipPrice" :packfee="packfee" :shifu="shifu" :nowCarts="cartStore.carts" <orderInfo :useVipPrice="cartStore.useVipPrice" :packfee="packfee" :shifu="shifu" :nowCarts="cartStore.carts"
ref="orderInfoAfterRef" :freeCheck="freeCheck" :listinfo="listinfo" :orderVIP="orderVIP" ref="orderInfoAfterRef" :freeCheck="freeCheck" :listinfo="listinfo" :orderVIP="orderVIP"
@@ -47,6 +49,8 @@
v-if="(listinfo.status == 'unpaid'||!listinfo.id) && orderVIP.freeDineConfig.enable" v-if="(listinfo.status == 'unpaid'||!listinfo.id) && orderVIP.freeDineConfig.enable"
@changeFree="changeFree"> @changeFree="changeFree">
</rechargeFree> </rechargeFree>
<!-- 充值享优惠 -->
<ChargeVue @updateChargeSel="updateChargeSel" @updateRechargeId="updateRechargeId" v-else></ChargeVue>
<!-- 支付方式 --> <!-- 支付方式 -->
<paymentMethodes ref="paymentMethodref" :orderVIP="orderVIP" @groupChange="groupChange" <paymentMethodes ref="paymentMethodref" :orderVIP="orderVIP" @groupChange="groupChange"
:changeFreeenable="isBwc" v-if="listinfo.status == 'unpaid'||!listinfo.id"> :changeFreeenable="isBwc" v-if="listinfo.status == 'unpaid'||!listinfo.id">
@@ -56,7 +60,7 @@
<view class="fixedview_one flex-start"> <view class="fixedview_one flex-start">
<view class="fixedview_oneone"> 实付金额 </view> <view class="fixedview_oneone"> 实付金额 </view>
<view class="fixedview_onetow"> <view class="fixedview_onetow">
<text>¥</text>{{listinfo.totalCost}} <text>¥</text>{{cartStore.orderCostSummary.finalPayAmount}}
</view> </view>
</view> </view>
<view class="flex-colum-end u-flex u-flex-y-center"> <view class="flex-colum-end u-flex u-flex-y-center">
@@ -110,7 +114,11 @@
import { import {
onLoad onLoad
} from '@dcloudio/uni-app' } from '@dcloudio/uni-app'
import {
BigNumber
} from 'bignumber.js';
import ChargeVue from './components/charge.vue';
import {pay} from '@/utils/pay.js'
function onback() { function onback() {
closeSocket() closeSocket()
back() back()
@@ -122,6 +130,7 @@
'border-radius': '106rpx', 'border-radius': '106rpx',
'border': '2rpx solid #E8AD7B' 'border': '2rpx solid #E8AD7B'
} }
import _ from "lodash";
import { import {
ref, ref,
reactive, reactive,
@@ -140,9 +149,10 @@
import { import {
APIgetOrderById, APIgetOrderById,
APIputuserorder, APIputuserorder,
APIhistoryOrder APIhistoryOrder,rechargePayOrder
} from '@/common/api/order/index.js' } from '@/common/api/order/index.js'
import { import {
APIusershopInfodetail,
APIshopUserInfo APIshopUserInfo
} from '@/common/api/member.js' } from '@/common/api/member.js'
import { import {
@@ -156,6 +166,19 @@
useWebSocket useWebSocket
} from '@/stores/carts-websocket.js'; } from '@/stores/carts-websocket.js';
const cartStore = useCartsStore() 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) { async function onMessage(Message) {
cartStore.onMessage(Message, cartsSocket) cartStore.onMessage(Message, cartsSocket)
listinfo.totalPrices = historyTotalPrices * 1 + cartStore.totalPrice * 1 listinfo.totalPrices = historyTotalPrices * 1 + cartStore.totalPrice * 1
@@ -324,8 +347,10 @@
listinfo.tableName = tableRes.name; listinfo.tableName = tableRes.name;
} }
} }
cartStore.setOldOrder(res);
socketInit() socketInit()
console.log(res); console.log(res);
getOrderInfoAfterCalcInit(res) getOrderInfoAfterCalcInit(res)
} }
@@ -609,12 +634,12 @@
//先付 //先付
if (isPayBefor()) { if (isPayBefor()) {
console.log('isPayBefor'); console.log('isPayBefor');
console.log(cartStore.isEmpty);
// 购物车有数据 // 购物车有数据
if (!cartStore.isEmpty) { if (!cartStore.isEmpty) {
const res = await createOrder() const res = await createOrder()
goToPay()
} }
goToPay()
} else { } else {
//后付 //后付
@@ -725,7 +750,7 @@
shopUserId: orderVIP.value.id, shopUserId: orderVIP.value.id,
orderId: listinfo.id, orderId: listinfo.id,
userAllPack: is_type.value == 0 ? 0 : 1, //是否整单打包 userAllPack: is_type.value == 0 ? 0 : 1, //是否整单打包
amount: listinfo.totalCost, // 最终订单金额 amount: cartStore.orderCostSummary.finalPayAmount, // 最终订单金额
returnUrl: '', //跳转地址 returnUrl: '', //跳转地址
buyerRemark: '', buyerRemark: '',
seatNum: is_type.value == 0 ? listinfo.seatNum : 0, //用餐人数 seatNum: is_type.value == 0 ? listinfo.seatNum : 0, //用餐人数
@@ -739,27 +764,44 @@
orderId: listinfo.id, orderId: listinfo.id,
vipPrice: cartStore.useVipPrice ? 1 : 0, //是否使用会员价0否1是 vipPrice: cartStore.useVipPrice ? 1 : 0, //是否使用会员价0否1是
userAllPack: is_type.value == 0 ? 0 : 1, //是否整单打包 userAllPack: is_type.value == 0 ? 0 : 1, //是否整单打包
seatNum: is_type.value == 0 ? listinfo.seatNum : 0, //用餐人数 seatNum: is_type.value == 0 ? cartStore.seatFeeConfig.personCount : 0, //用餐人数
originAmount: listinfo.originAmount, //订单原金额(包含打包费+餐位费) 不含折扣价格 originAmount: cartStore.orderCostSummary.goodsRealAmount , //订单原金额(包含打包费+餐位费) 不含折扣价格
discountRatio: 1, //折扣比例(计算时 向上取整保留 两位小数) 写死1 discountRatio: 1, //折扣比例(计算时 向上取整保留 两位小数) 写死1
discountAmount: 0, //手动优惠金额 写死0 discountAmount: 0, //手动优惠金额 写死0
productCouponDiscountAmount: listinfo.Productroll, //商品优惠券抵扣金额 productCouponDiscountAmount: cartStore.orderCostSummary.productCouponDeduction, //商品优惠券抵扣金额
fullCouponDiscountAmount: listinfo.coupondiscountAmount, //满减优惠券抵扣金额 otherCouponDiscountAmount: cartStore.orderCostSummary.fullCouponDeduction, //其他优惠券抵扣金额
couponList: uniqueIds.value, //用户使用的卡券 couponList: cartStore.backendCoupons.map(v => v.id), //用户使用的卡券
orderAmount: listinfo.totalCost, // 最终订单金额 orderAmount: cartStore.orderCostSummary.finalPayAmount, // 最终订单金额
roundAmount: 0, //抹零金额 减免多少钱 roundAmount: 0, //抹零金额 减免多少钱
pointsDiscountAmount: listinfo.pointsDiscountAmount, //积分抵扣金额(tb_points_basic_setting表) pointsDiscountAmount: cartStore.orderCostSummary
.pointDeductionAmount, //积分抵扣金额(tb_points_basic_setting表)
pointsNum: listinfo.pointsNum, //(扣除各类折扣 enable_deduction后使用) pointsNum: listinfo.pointsNum, //(扣除各类折扣 enable_deduction后使用)
remark: '', //用户备注 remark: '', //用户备注
} }
console.log('topay checkOrderPay', checkOrderPay); console.log('topay checkOrderPay', checkOrderPay);
try { try {
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({ await storeMemberpay.actionsltPayOrder({
checkOrderPay, checkOrderPay,
payType: paymentmethod.payType, payType: paymentmethod.payType,
buyerRemark: '', buyerRemark: '',
returnUrl: '' returnUrl: ''
}) })
}
} catch (error) { } catch (error) {
pay_unlock() pay_unlock()
//TODO handle the exception //TODO handle the exception
@@ -787,21 +829,24 @@
// 余额支付 // 余额支付
const accountPayevent = async (pwd) => { const accountPayevent = async (pwd) => {
ispws.value = false; ispws.value = false;
let checkOrderPay = { let checkOrderPay = {
userId: uni.cache.get('userInfo').id, userId: uni.cache.get('userInfo').id,
orderId: listinfo.id, orderId: listinfo.id,
vipPrice: cartStore.useVipPrice ? 1 : 0, //是否使用会员价0否1是 vipPrice: cartStore.useVipPrice ? 1 : 0, //是否使用会员价0否1是
userAllPack: is_type.value == 0 ? 0 : 1, //是否整单打包 userAllPack: is_type.value == 0 ? 0 : 1, //是否整单打包
seatNum: is_type.value == 0 ? listinfo.seatNum : 0, //用餐人数 seatNum: is_type.value == 0 ? cartStore.seatFeeConfig.personCount : 0, //用餐人数
originAmount: listinfo.originAmount, //订单原金额(包含打包费+餐位费) 不含折扣价格 originAmount: cartStore.orderCostSummary.goodsRealAmount , //订单原金额(包含打包费+餐位费) 不含折扣价格
discountRatio: 1, //折扣比例(计算时 向上取整保留 两位小数) 写死1 discountRatio: 1, //折扣比例(计算时 向上取整保留 两位小数) 写死1
discountAmount: 0, //手动优惠金额 写死0 discountAmount: 0, //手动优惠金额 写死0
productCouponDiscountAmount: listinfo.Productroll, //商品优惠券抵扣金额 productCouponDiscountAmount: cartStore.orderCostSummary.productCouponDeduction, //商品优惠券抵扣金额
fullCouponDiscountAmount: listinfo.coupondiscountAmount, //满减优惠券抵扣金额 otherCouponDiscountAmount: cartStore.orderCostSummary.fullCouponDeduction, //其他优惠券抵扣金额
couponList: uniqueIds.value, //用户使用的卡券 couponList: cartStore.backendCoupons.map(v => v.id), //用户使用的卡券
orderAmount: listinfo.totalCost, // 最订单金额 orderAmount: cartStore.orderCostSummary.finalPayAmount, // 最订单金额
roundAmount: 0, //抹零金额 减免多少钱 roundAmount: 0, //抹零金额 减免多少钱
pointsDiscountAmount: listinfo.pointsDiscountAmount, //积分抵扣金额(tb_points_basic_setting表) pointsDiscountAmount: cartStore.orderCostSummary
.pointDeductionAmount, //积分抵扣金额(tb_points_basic_setting表)
pointsNum: listinfo.pointsNum, //(扣除各类折扣 enable_deduction后使用) pointsNum: listinfo.pointsNum, //(扣除各类折扣 enable_deduction后使用)
remark: '', //用户备注 remark: '', //用户备注
} }
@@ -853,7 +898,15 @@
//TODO handle the exception //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 = {} let options = {}
@@ -904,12 +957,19 @@
async function init(opt) { async function init(opt) {
Object.assign(options, opt) Object.assign(options, opt)
listinfo.id = options.orderId; listinfo.id = options.orderId;
console.log('init', listinfo); console.log('options', options);
if (options.shopId) { if (options.shopId) {
// 每次进来全局更新shopId // 每次进来全局更新shopId
uni.cache.set('shopId', options.shopId, 30) uni.cache.set('shopId', options.shopId, 30)
uni.$on('returnData', handleReturnData); uni.$on('returnData', handleReturnData);
} }
//获取店铺信息
const shopInfoRes = await APIusershopInfodetail({
shopId: options.shopId
})
if (shopInfoRes) {
cartStore.shopInfo = shopInfoRes.shopInfo;
}
// * 获取会员信息 // * 获取会员信息
await storeuser.actionsproductqueryProduct() await storeuser.actionsproductqueryProduct()
await nextTick() await nextTick()

View File

@@ -16,14 +16,18 @@
</view> </view>
</view> --> </view> -->
<view class="status-wrap"> <view class="status-wrap">
<view class="item" :class="{ active: querForm.statusActiveIndex == index }" v-for="(item, index) in statusList" :key="item.value" @click="tabChange(index)"> <view class="item" :class="{ active: querForm.statusActiveIndex == 0 }" @click="tabChange(0)">
<text class="t">{{ item.label }}0</text> <text class="t">商品兑换券 {{returnSelNumber(0)}}</text>
</view> </view>
<view class="icon-wrap" :style="{ width: `${100 / statusList.length}%`, left: `${(100 / statusList.length) * querForm.statusActiveIndex}%` }"> <view class="item" :class="{ active: querForm.statusActiveIndex == 1 }" @click="tabChange(1)">
<image <text class="t">折扣优惠券{{returnSelNumber(1)}}</text>
class="active-icon" </view>
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAMCAYAAAB4MH11AAACKUlEQVR4AaRTS2sTURT+MpkxUzNtRpuYpBsrqbgQH6BYRHGllloQN+5cuNeV6MKfoj9BwYUgIsXHRqE+SluliFLbBqmENJNMMpMm87qecw1NglJse+HMPeee833nce8oIgpFq7wsGt/fCb9eFrtdfmNd1L+9Jc4Vog6E4jcqqM0/R+3zNOwv09jtshdfSx7mDJwKqAMfIvAAEaFVWkLgWjvOEbVdtNa+Epf4wxmFUNTkfqiDGUkqogDu8icKiKS9nQ9jnR8fqM5AwuJJE/G9JhRF05E8dAqIKeDlrsyiWVxg9f+Fum+uzsFZmtnEGIVxKHsGIFn1bAF6ZlQ6I28D9uIrmYSrkodbfETgw6GubZo9Yzk0kR4Fc7IuE8QUFebJKSTSB/kM4UYd1scnKL18QInm4Vk/6W6qiNoOwpZDuoX2elFWXHrzELW5Z+RzJVbPHca+09doIKq0ZQLW+C44iWbm2ZQSNMqozj5F5f1jWCSVGd4fwerstYUXCOplGcsfxponJqHS7Nlm2UyAWAza0AFkzt1A6uhFqEYaoHsR9BLCpg2vukZVr5IU4dV+yU7oRikkTrHDMI9PIHPhJrhQ9Kxugs6hkkhi8Mh5DI9flyCep6ImOt7uxnF6dgypYxMy1hg7S0/yH3FdSL+mpbIw6CVwVSNX7yM/eQfZS7eQu3wb+St3MTJ1D2nq1iicgZbK9YN7rL866PH1qfGBIWj0v/Do4rrR59vK+A0AAP//GfTndQAAAAZJREFUAwCu+SjIaSGpLwAAAABJRU5ErkJggg=="
></image> <view class="icon-wrap"
:style="{ width: `${100 / statusList.length}%`, left: `${(100 / statusList.length) * querForm.statusActiveIndex}%` }">
<image class="active-icon"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAMCAYAAAB4MH11AAACKUlEQVR4AaRTS2sTURT+MpkxUzNtRpuYpBsrqbgQH6BYRHGllloQN+5cuNeV6MKfoj9BwYUgIsXHRqE+SluliFLbBqmENJNMMpMm87qecw1NglJse+HMPeee833nce8oIgpFq7wsGt/fCb9eFrtdfmNd1L+9Jc4Vog6E4jcqqM0/R+3zNOwv09jtshdfSx7mDJwKqAMfIvAAEaFVWkLgWjvOEbVdtNa+Epf4wxmFUNTkfqiDGUkqogDu8icKiKS9nQ9jnR8fqM5AwuJJE/G9JhRF05E8dAqIKeDlrsyiWVxg9f+Fum+uzsFZmtnEGIVxKHsGIFn1bAF6ZlQ6I28D9uIrmYSrkodbfETgw6GubZo9Yzk0kR4Fc7IuE8QUFebJKSTSB/kM4UYd1scnKL18QInm4Vk/6W6qiNoOwpZDuoX2elFWXHrzELW5Z+RzJVbPHca+09doIKq0ZQLW+C44iWbm2ZQSNMqozj5F5f1jWCSVGd4fwerstYUXCOplGcsfxponJqHS7Nlm2UyAWAza0AFkzt1A6uhFqEYaoHsR9BLCpg2vukZVr5IU4dV+yU7oRikkTrHDMI9PIHPhJrhQ9Kxugs6hkkhi8Mh5DI9flyCep6ImOt7uxnF6dgypYxMy1hg7S0/yH3FdSL+mpbIw6CVwVSNX7yM/eQfZS7eQu3wb+St3MTJ1D2nq1iicgZbK9YN7rL866PH1qfGBIWj0v/Do4rrR59vK+A0AAP//GfTndQAAAAZJREFUAwCu+SjIaSGpLwAAAABJRU5ErkJggg==">
</image>
</view> </view>
</view> </view>
</view> </view>
@@ -33,9 +37,9 @@
</view> </view>
<view class="title-wrap"> <view class="title-wrap">
<text class="t">可用红包</text> <text class="t">可用红包</text>
<text class="n">3</text> <text class="n">{{list.canUseCoupons.length}}</text>
</view> </view>
<view class="item" v-for="item in list.data" :key="item.id" @click="toUseHandle(item)"> <view class="item" v-for="item in list.canUseCoupons" :key="item.id" @click="changeSelCoupon(item)">
<view class="top"> <view class="top">
<view class="icon"> <view class="icon">
<couponIcon :item="item" /> <couponIcon :item="item" />
@@ -45,18 +49,21 @@
<text class="t">{{ item.name }}</text> <text class="t">{{ item.name }}</text>
</view> </view>
<view class="view time"> <view class="view time">
<text class="t">{{ dayjs(item.effectStartTime).format('YYYY.M.D') }} - {{ dayjs(item.effectEndTime).format('YYYY.M.D') }}</text> <text class="t">{{ dayjs(item.effectStartTime).format('YYYY.M.D') }} -
{{ dayjs(item.effectEndTime).format('YYYY.M.D') }}</text>
</view> </view>
</view> </view>
<view class="btn"> <view class="btn">
<view class="round" v-if="!item.active"></view> <view class="active" v-if="isActive(item)">
<view class="active" v-else>
<up-icon name="checkmark-circle-fill" size="24" color="#FF3232"></up-icon> <up-icon name="checkmark-circle-fill" size="24" color="#FF3232"></up-icon>
</view> </view>
<view class="round" v-else></view>
</view> </view>
</view> </view>
<view class="btm"> <view class="btm">
<view class="left">1可适用门店{{ item.useShops }} 2可适用商品{{ item.foods }}3可使用类型{{ convertValuesToLabels(item.useType) }}</view> <view class="left">1可适用门店{{ item.useShops }}
2可适用商品{{ item.foods }}3可使用类型{{ convertValuesToLabels(item.useType) }}</view>
<view class="right" @click.stop="showDetailHandle(item)"> <view class="right" @click.stop="showDetailHandle(item)">
<text class="t">查看详情</text> <text class="t">查看详情</text>
</view> </view>
@@ -64,9 +71,9 @@
</view> </view>
<view class="title-wrap"> <view class="title-wrap">
<text class="t">不可用红包</text> <text class="t">不可用红包</text>
<text class="n">3</text> <text class="n">{{list.noCanUseCoupons.length}}</text>
</view> </view>
<view class="item disabled" v-for="item in list.data" :key="item.id"> <view class="item disabled" v-for="item in list.noCanUseCoupons" :key="item.id">
<view class="top"> <view class="top">
<view class="icon"> <view class="icon">
<couponIcon :item="item" /> <couponIcon :item="item" />
@@ -76,7 +83,8 @@
<text class="t">{{ item.name }}</text> <text class="t">{{ item.name }}</text>
</view> </view>
<view class="view time"> <view class="view time">
<text class="t">{{ dayjs(item.effectStartTime).format('YYYY.M.D') }} - {{ dayjs(item.effectEndTime).format('YYYY.M.D') }}</text> <text class="t">{{ dayjs(item.effectStartTime).format('YYYY.M.D') }} -
{{ dayjs(item.effectEndTime).format('YYYY.M.D') }}</text>
</view> </view>
</view> </view>
<view class="btn"> <view class="btn">
@@ -90,7 +98,7 @@
</view> --> </view> -->
<view class="error"> <view class="error">
<text class="t t1">不可用原因</text> <text class="t t1">不可用原因</text>
<text class="t t2">不在使用时间内</text> <text class="t t2">{{returnNoUseRestrictions(item) }}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -117,7 +125,9 @@
</view> </view>
<scroll-view class="popup-list" direction="vertical"> <scroll-view class="popup-list" direction="vertical">
<view class="ul"> <view class="ul">
<view class="li" v-for="(item, index) in selectListItemDetails" :key="index">{{ index + 1 }}{{ item }}</view> <view class="li" v-for="(item, index) in selectListItemDetails" :key="index">
{{ index + 1 }}{{ item }}
</view>
</view> </view>
</scroll-view> </scroll-view>
</view> </view>
@@ -126,44 +136,59 @@
</template> </template>
<script setup> <script setup>
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { ref, reactive, onMounted } from 'vue'; import {
import { onLoad, onReady, onShow, onPageScroll, onReachBottom } from '@dcloudio/uni-app'; ref,
import { APIcouponfindByUserId, APIfindCoupon, getCouponShops } from '@/common/api/member.js'; reactive,
import couponIcon from '@/pages/user/components/coupon-icon.vue'; onMounted,
computed,
watch
} from 'vue';
import {
onLoad,
onReady,
onShow,
onPageScroll,
onReachBottom,
onBackPress
} from '@dcloudio/uni-app';
import {
APIcouponfindByUserId,
APIfindCoupon,
getCouponShops
} from '@/common/api/member.js';
import {
findCoupon
} from '@/common/api/market/coupon.js';
import couponIcon from '@/pages/user/components/coupon-icon.vue';
import * as UTILS from '@/utils/goods-utils.js'
import {
useCartsStore
} from '@/stores/carts.js';
const cartStore = useCartsStore()
const show = ref(false);
const querForm = ref({ //返回不可用原因
function returnNoUseRestrictions(item) {
if (item.noUseRestrictions) {
return item.noUseRestrictions
}
if (item.canuseResult) {
return item.canuseResult.reason
}
return ''
}
const show = ref(false);
const querForm = ref({
searchValue: '', searchValue: '',
shopId: '', shopId: '',
shopName: '', shopName: '',
statusActiveIndex: 0 statusActiveIndex: 0
}); });
// 状态 const statusList = ref([{
// const statusList = ref([
// {
// value: 0,
// label: '未使用',
// bg: '#333333',
// color: '#ffffff'
// },
// {
// value: 1,
// label: '已使用',
// bg: '#F8F8F8',
// color: '#999999'
// },
// {
// value: 2,
// label: '已失效',
// bg: '#F8F8F8',
// color: '#999999'
// }
// ]);
const statusList = ref([
{
value: 0, value: 0,
label: '商品兑换券', label: '商品兑换券',
bg: '#333333', bg: '#333333',
@@ -175,25 +200,23 @@ const statusList = ref([
bg: '#F8F8F8', bg: '#F8F8F8',
color: '#999999' color: '#999999'
} }
]); ]);
const list = reactive({ const list = reactive({
page: 1, page: 1,
size: 10, size: 10,
status: 'loading', status: 'nomore',
data: [] data: [],
}); noCanUseCoupons: [],
canUseCoupons: []
});
// onReachBottom(() => {
// if (list.status != 'nomore') {
// list.page++;
// getCouponList();
// }
// });
const showDetail = ref(false);
const selectListItem = ref(''); const showDetail = ref(false);
const selectListItemDetails = ref([]); const selectListItem = ref('');
function showDetailHandle(item) { const selectListItemDetails = ref([]);
function showDetailHandle(item) {
showDetail.value = true; showDetail.value = true;
selectListItemDetails.value = [ selectListItemDetails.value = [
`可适用门店:${item.useShops}`, `可适用门店:${item.useShops}`,
@@ -212,85 +235,204 @@ function showDetailHandle(item) {
if (item.type == 3) { if (item.type == 3) {
selectListItemDetails.value.unshift(`最高抵扣${item.maxDiscountAmount}`); selectListItemDetails.value.unshift(`最高抵扣${item.maxDiscountAmount}`);
} }
} }
// 搜索 function returnSelNumber(index) {
function searchHandle() { if (index) {
if (couponSel.value.id) {
return '(1)'
} else {
return '(0)'
}
} else {
if (goodsCouponSel.value.id) {
return '(1)'
} else {
return '(0)'
}
}
}
// 搜索
function searchHandle() {
list.page = 1; list.page = 1;
list.status = 'loading'; list.status = 'nomore';
getCouponList(); getCouponList();
} }
// 切换类型 // 切换类型
function tabChange(index) { function tabChange(index) {
querForm.value.statusActiveIndex = index; querForm.value.statusActiveIndex = index;
list.page = 1; list.page = 1;
list.status = 'loading'; list.status = 'nomore';
getCouponList(); getCouponList();
} }
// 去使用 function changeSelCoupon(item) {
function toUseHandle(item) { if (querForm.value.statusActiveIndex) {
console.log(item); if (couponSel.value.id == item.id) {
item.active = !item.active; couponSel.value = {
// uni.cache.set('shopId', item.shopId); id: ''
// uni.switchTab({ }
// url: '/pages/index/index' } else {
// }); couponSel.value = item
} }
} else {
if (goodsCouponSel.value.id == item.id) {
goodsCouponSel.value = {
id: ''
}
} else {
goodsCouponSel.value = item
}
}
}
// 获取优惠券列表 const couponSel = ref({
async function getCouponList() { id: ''
})
const goodsCouponSel = ref({
id: ''
})
const quansSelArr = computed(() => {
return [couponSel.value, goodsCouponSel.value].filter((v) => v.id);
})
function isActive(item) {
if (querForm.value.statusActiveIndex) {
return couponSel.value.id == item.id
} else {
return goodsCouponSel.value.id == item.id
}
}
// 获取优惠券列表
async function getCouponList() {
try { try {
uni.showLoading({ uni.showLoading({
title: '加载中...', title: '加载中...',
mask: true mask: true
}); });
const res = await APIcouponfindByUserId({ const res = await findCoupon({
userId: uni.cache.get('userInfo').id, shopUserId: uni.cache.get('shopUserInfo').id,
name: querForm.value.searchValue,
status: '',
shopId: querForm.value.shopId ? querForm.value.shopId : uni.cache.get('shopId'),
// page: list.page,
// size: list.size,
page: 1,
size: 500
});
res.records.map((item) => {
item.active = false;
}); });
if (list.page == 1) {
list.data = res.records; let canUseGoodsCoupon = []
let canUseDiscountCoupon = []
let noUseGoodsCoupon = []
let noUseDiscountCoupon = []
const user = uni.cache.get('shopUserInfo')
const shopInfo = uni.cache.get('shopInfo')
const goodsOrderPrice = uni.getStorageSync('goodsOrderPrice') || 0
const goodsList = uni.getStorageSync('canDikouGoodsArr') || []
const dinnerType = uni.getStorageSync('dinnerType')
const canDikouGoodsArr = UTILS.returnCanDikouGoods(cartStore.allGoods, [], user);
const shopId = uni.cache.get('shopId')
for (let i = 0; i < res.length; i++) {
const coupon = res[i]
const canuseResult = UTILS.returnCouponCanUse({
canDikouGoodsArr,
coupon,
goodsOrderPrice,
user,
selCoupon: [],
shopInfo
})
const {
canUse,
reason
} = canuseResult
if (coupon.type == 2) {
if (canUse) {
canUseGoodsCoupon.push(coupon)
} else { } else {
list.data.push(...res.records); noUseGoodsCoupon.push({
...coupon,
canuseResult
})
}
} else {
if (canUse) {
canUseDiscountCoupon.push(coupon)
} else {
noUseDiscountCoupon.push({
...coupon,
canuseResult
})
}
}
}
//商品券
canUseGoodsCoupon = canUseGoodsCoupon.map(v => {
const discount = UTILS.returnCouponDiscount(
canDikouGoodsArr,
v,
user,
goodsOrderPrice,
[],
shopInfo
);
return {
...v,
discount,
discountAmount: discount ? discount.discountPrice : v.discountAmount,
};
})
//非商品券
canUseDiscountCoupon = canUseDiscountCoupon.map(v => {
const discount = UTILS.returnCouponDiscount(
canDikouGoodsArr,
v,
user,
goodsOrderPrice,
quansSelArr.value,
shopInfo
);
return {
...v,
discount,
discountAmount: discount ? discount.discountPrice : v.discountAmount,
}
})
if (querForm.value.statusActiveIndex == 0) {
list.noCanUseCoupons = noUseGoodsCoupon
list.canUseCoupons = canUseGoodsCoupon
} else {
list.noCanUseCoupons = noUseDiscountCoupon
list.canUseCoupons = canUseDiscountCoupon
} }
if (res.pageNumber == res.totalPage || res.records.length == 0) { console.log('canUseGoodsCoupon', canUseGoodsCoupon);
list.status = 'nomore'; console.log('noUseGoodsCoupon', noUseGoodsCoupon);
} console.log('canUseDiscountCoupon', canUseDiscountCoupon);
console.log('noUseDiscountCoupon', noUseDiscountCoupon);
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
uni.hideLoading(); uni.hideLoading();
} }
// 店铺列表滚动到底部了 // 店铺列表滚动到底部了
function scrollBottom() { function scrollBottom() {
console.log('店铺列表滚动到底部了'); console.log('店铺列表滚动到底部了');
} }
/** /**
* 将value数组字符串转换为对应的label拼接字符串 * 将value数组字符串转换为对应的label拼接字符串
* @param {Array} options - 包含value和label的选项数组格式如[{value: 'xxx', label: 'xxx'}, ...] * @param {Array} options - 包含value和label的选项数组格式如[{value: 'xxx', label: 'xxx'}, ...]
* @param {string} valueStr - 包含value的数组字符串格式如'["dine","pickup"]' * @param {string} valueStr - 包含value的数组字符串格式如'["dine","pickup"]'
* @param {string} separator - 标签拼接分隔符,默认值为'、' * @param {string} separator - 标签拼接分隔符,默认值为'、'
* @returns {string} 拼接后的label字符串如"堂食、自取" * @returns {string} 拼接后的label字符串如"堂食、自取"
*/ */
function convertValuesToLabels(valueStr, options, separator = '、') { function convertValuesToLabels(valueStr, options, separator = '、') {
try { try {
options = [ options = [{
{
value: 'dine', value: 'dine',
label: '堂食' label: '堂食'
}, },
@@ -338,46 +480,53 @@ function convertValuesToLabels(valueStr, options, separator = '、') {
console.error('转换失败:', error.message); console.error('转换失败:', error.message);
return ''; // 出错时返回空字符串 return ''; // 出错时返回空字符串
} }
} }
// 选择店铺 // 选择店铺
function selectShopHandle(item) { function selectShopHandle(item) {
querForm.value.shopId = item.shopId; querForm.value.shopId = item.shopId;
querForm.value.shopName = item.shopName; querForm.value.shopName = item.shopName;
list.page = 1; list.page = 1;
show.value = false; show.value = false;
getCouponList(); getCouponList();
} }
// 获取当前店铺会员信息 // 获取当前店铺会员信息
const shopList = ref([]); const shopList = ref([]);
async function getCouponShopsAjax() { async function getCouponShopsAjax() {
try { try {
const res = await getCouponShops(); const res = await getCouponShops();
shopList.value = res; shopList.value = res;
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
} }
onShow(() => { onShow(() => {
getCouponList(); getCouponList();
}); });
onLoad(() => { onLoad(() => {
getCouponShopsAjax(); getCouponShopsAjax();
}); });
watch(() => quansSelArr.value, (newval) => {
uni.$emit('selCoupon', newval)
}, {
deep: true
})
</script> </script>
<style> <style>
page { page {
background-color: #f7f7f7; background-color: #f7f7f7;
} }
</style> </style>
<style scoped lang="scss"> <style scoped lang="scss">
.container { .container {
padding: 136upx 28upx 28upx; padding: 136upx 28upx 28upx;
} }
.header-wrap {
.header-wrap {
width: 100%; width: 100%;
background-color: #fff; background-color: #fff;
position: fixed; position: fixed;
@@ -385,45 +534,56 @@ page {
left: 0; left: 0;
z-index: 99; z-index: 99;
padding: 28upx; padding: 28upx;
.search-wrap { .search-wrap {
display: flex; display: flex;
gap: 28upx; gap: 28upx;
.input-wrap { .input-wrap {
flex: 1; flex: 1;
height: 70upx; height: 70upx;
border: 1px solid #ececec; border: 1px solid #ececec;
border-radius: 8upx; border-radius: 8upx;
position: relative; position: relative;
&:first-child { &:first-child {
flex: 1.5; flex: 1.5;
} }
.icon { .icon {
position: absolute; position: absolute;
top: 50%; top: 50%;
transform: translateY(-50%); transform: translateY(-50%);
&.left { &.left {
left: 14upx; left: 14upx;
} }
&.right { &.right {
right: 14upx; right: 14upx;
} }
} }
.ipt { .ipt {
width: 100%; width: 100%;
height: 100%; height: 100%;
&.left { &.left {
padding-left: 68upx; padding-left: 68upx;
} }
&.right { &.right {
padding: 0 56upx 0 28upx; padding: 0 56upx 0 28upx;
} }
} }
} }
} }
.status-wrap { .status-wrap {
display: flex; display: flex;
// padding-top: 28upx; // padding-top: 28upx;
position: relative; position: relative;
.icon-wrap { .icon-wrap {
height: 12upx; height: 12upx;
position: absolute; position: absolute;
@@ -434,23 +594,27 @@ page {
justify-content: center; justify-content: center;
transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out;
padding-right: 28upx; padding-right: 28upx;
.active-icon { .active-icon {
width: 24upx; width: 24upx;
height: 12upx; height: 12upx;
z-index: 9; z-index: 9;
} }
} }
.item { .item {
flex: 1; flex: 1;
height: 80upx; height: 80upx;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
.t { .t {
font-size: 32upx; font-size: 32upx;
color: #666666; color: #666666;
transition: all 0.3s ease-in-out 0.1s; transition: all 0.3s ease-in-out 0.1s;
} }
&.active { &.active {
.t { .t {
color: #e3ad7f; color: #e3ad7f;
@@ -458,39 +622,48 @@ page {
} }
} }
} }
} }
.list-wrap {
.list-wrap {
padding-top: 28upx; padding-top: 28upx;
.tips { .tips {
.t { .t {
color: #666; color: #666;
font-size: 24upx; font-size: 24upx;
} }
} }
.title-wrap { .title-wrap {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10upx; gap: 10upx;
padding-top: 28upx; padding-top: 28upx;
.t { .t {
font-size: 32upx; font-size: 32upx;
color: #333; color: #333;
} }
.n { .n {
color: #666; color: #666;
font-size: 24upx; font-size: 24upx;
} }
} }
.item { .item {
border-radius: 18upx; border-radius: 18upx;
background-color: #fff; background-color: #fff;
padding: 28upx; padding: 28upx;
&:not(:first-child) { &:not(:first-child) {
margin-top: 28upx; margin-top: 28upx;
} }
&.disabled { &.disabled {
.top { .top {
position: relative; position: relative;
&::after { &::after {
content: ''; content: '';
width: 100%; width: 100%;
@@ -501,6 +674,7 @@ page {
z-index: 10; z-index: 10;
background-color: rgba(255, 255, 255, 0.6); background-color: rgba(255, 255, 255, 0.6);
} }
.btn { .btn {
.round { .round {
background-color: #f0f0f0; background-color: #f0f0f0;
@@ -508,16 +682,19 @@ page {
} }
} }
} }
.top { .top {
display: flex; display: flex;
align-items: center; align-items: center;
padding-bottom: 28upx; padding-bottom: 28upx;
.icon { .icon {
$size: 140upx; $size: 140upx;
width: $size; width: $size;
height: $size; height: $size;
margin-right: 28upx; margin-right: 28upx;
} }
.info { .info {
flex: 1; flex: 1;
display: flex; display: flex;
@@ -526,6 +703,7 @@ page {
gap: 8upx; gap: 8upx;
padding: 0 28upx; padding: 0 28upx;
position: relative; position: relative;
&::after { &::after {
$height: 100upx; $height: 100upx;
content: ''; content: '';
@@ -536,12 +714,15 @@ page {
margin-top: $height * 0.5 * -1; margin-top: $height * 0.5 * -1;
left: 0; left: 0;
} }
.view { .view {
flex: 1; flex: 1;
&.name { &.name {
font-size: 32upx; font-size: 32upx;
color: #333; color: #333;
} }
&.time { &.time {
.t { .t {
font-size: 24upx; font-size: 24upx;
@@ -550,12 +731,14 @@ page {
} }
} }
} }
.btn { .btn {
width: 40upx; width: 40upx;
height: 40upx; height: 40upx;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
.round { .round {
width: 100%; width: 100%;
height: 100%; height: 100%;
@@ -565,11 +748,13 @@ page {
} }
} }
} }
.btm { .btm {
display: flex; display: flex;
align-items: center; align-items: center;
padding: 28upx 0 14upx; padding: 28upx 0 14upx;
border-top: 1upx solid #f7f7f7; border-top: 1upx solid #f7f7f7;
.left { .left {
flex: 1; flex: 1;
height: 40upx; height: 40upx;
@@ -579,25 +764,30 @@ page {
font-size: 24upx; font-size: 24upx;
color: #999; color: #999;
} }
.right { .right {
flex: 1; flex: 1;
display: flex; display: flex;
align-items: center; align-items: center;
padding-left: 28upx; padding-left: 28upx;
justify-content: flex-end; justify-content: flex-end;
.t { .t {
font-size: 24upx; font-size: 24upx;
color: #333; color: #333;
} }
} }
.error { .error {
flex: 1; flex: 1;
.t { .t {
font-size: 24upx; font-size: 24upx;
&.t1 { &.t1 {
color: #ff1c1c; color: #ff1c1c;
} }
&.t2 { &.t2 {
color: #333; color: #333;
} }
@@ -605,22 +795,27 @@ page {
} }
} }
} }
} }
.shoplist-popup {
.shoplist-popup {
padding: 0 28upx 28upx; padding: 0 28upx 28upx;
.title { .title {
padding: 28upx 0; padding: 28upx 0;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
.t { .t {
font-size: 32upx; font-size: 32upx;
font-weight: bold; font-weight: bold;
color: #333; color: #333;
} }
} }
.popup-list { .popup-list {
max-height: 50vh; max-height: 50vh;
.item { .item {
padding: 28upx; padding: 28upx;
border-radius: 12upx; border-radius: 12upx;
@@ -629,17 +824,20 @@ page {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 28upx; padding: 28upx;
.t { .t {
font-size: 28upx; font-size: 28upx;
font-weight: bold; font-weight: bold;
color: #333; color: #333;
/* 必须设置宽度 */ /* 必须设置宽度 */
width: 600upx; /* 或具体像素值 */ width: 600upx;
/* 或具体像素值 */
/* 关键属性 */ /* 关键属性 */
display: -webkit-box; display: -webkit-box;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
-webkit-line-clamp: 1; /* 显示2行 */ -webkit-line-clamp: 1;
/* 显示2行 */
overflow: hidden; overflow: hidden;
/* 文本溢出省略号 */ /* 文本溢出省略号 */
@@ -647,19 +845,24 @@ page {
/* 可选:防止行高度,确保计算准确 */ /* 可选:防止行高度,确保计算准确 */
line-height: 1.5; line-height: 1.5;
word-break: break-all; /* 允许在单词内换行 */ word-break: break-all;
word-wrap: break-word; /* 允许单词或URL换行 */ /* 允许单词换行 */
word-wrap: break-word;
/* 允许长单词或URL换行 */
} }
.intro { .intro {
font-size: 28upx; font-size: 28upx;
color: #999; color: #999;
/* 必须设置宽度 */ /* 必须设置宽度 */
width: 600upx; /* 或具体像素值 */ width: 600upx;
/* 或具体像素值 */
/* 关键属性 */ /* 关键属性 */
display: -webkit-box; display: -webkit-box;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 显示2行 */ -webkit-line-clamp: 2;
/* 显示2行 */
overflow: hidden; overflow: hidden;
/* 文本溢出省略号 */ /* 文本溢出省略号 */
@@ -667,15 +870,19 @@ page {
/* 可选:防止行高度,确保计算准确 */ /* 可选:防止行高度,确保计算准确 */
line-height: 1.5; line-height: 1.5;
word-break: break-all; /* 允许在单词内换行 */ word-break: break-all;
word-wrap: break-word; /* 允许单词或URL换行 */ /* 允许单词换行 */
word-wrap: break-word;
/* 允许长单词或URL换行 */
} }
} }
.ul { .ul {
.li { .li {
color: #999; color: #999;
font-size: 28upx; font-size: 28upx;
padding: 8upx 0; padding: 8upx 0;
.t { .t {
color: #999; color: #999;
font-size: 28upx; font-size: 28upx;
@@ -683,5 +890,5 @@ page {
} }
} }
} }
} }
</style> </style>

View File

@@ -36,7 +36,7 @@
<text class="color-333 font-14 u-m-l-20">储值</text> <text class="color-333 font-14 u-m-l-20">储值</text>
</view> </view>
<view class="u-flex color-666" @click="toChargeList"> <view class="u-flex color-666" @click="toChargeList">
<text class="font-12 u-m-r-4">{{rechargeList.length}}家店</text> <text class="font-12 u-m-r-4">{{rechargeTotal}}家店</text>
<up-icon name="arrow-down" color="#666" size="12px"></up-icon> <up-icon name="arrow-down" color="#666" size="12px"></up-icon>
</view> </view>
</view> </view>
@@ -68,7 +68,7 @@
<text class="color-333 font-14 u-m-l-20">会员</text> <text class="color-333 font-14 u-m-l-20">会员</text>
</view> </view>
<view class="u-flex color-666" @click="tomemberList"> <view class="u-flex color-666" @click="tomemberList">
<text class="font-12 u-m-r-4">{{memberList.length}}家店</text> <text class="font-12 u-m-r-4">{{memberTotal}}家店</text>
<up-icon name="arrow-down" color="#666" size="12px"></up-icon> <up-icon name="arrow-down" color="#666" size="12px"></up-icon>
</view> </view>
</view> </view>
@@ -300,10 +300,14 @@
const memberList = ref([]) const memberList = ref([])
const rechargeList = ref([]) const rechargeList = ref([])
const memberTotal=ref(0)
const rechargeTotal=ref(0)
async function getData() { async function getData() {
const res = await vipApi.list() const res = await vipApi.list()
memberTotal.value=res.length
memberList.value = res.slice(0, 3); memberList.value = res.slice(0, 3);
const res1 = await rechargeApi.list() const res1 = await rechargeApi.list()
rechargeTotal.value=res1.length
rechargeList.value = res1.slice(0, 3); rechargeList.value = res1.slice(0, 3);
} }
onShow(() => { onShow(() => {

830
pnpm-lock.yaml generated
View File

@@ -4,10 +4,16 @@ settings:
autoInstallPeers: true autoInstallPeers: true
excludeLinksFromLockfile: false excludeLinksFromLockfile: false
dependencies: importers:
.:
dependencies:
'@dcloudio/uni-app': '@dcloudio/uni-app':
specifier: ^2.0.2-4040520250103001 specifier: ^2.0.2-4040520250103001
version: 2.0.2-4070620250821001(@dcloudio/types@3.4.21)(@vue/composition-api@1.7.2) 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: dayjs:
specifier: ^1.11.13 specifier: ^1.11.13
version: 1.11.18 version: 1.11.18
@@ -19,10 +25,13 @@ dependencies:
version: 4.17.21 version: 4.17.21
pinia: pinia:
specifier: ^2.3.1 specifier: ^2.3.1
version: 2.3.1(@vue/composition-api@1.7.2)(vue@3.5.21) version: 2.3.1(@vue/composition-api@1.7.2(vue@3.5.22))(vue@3.5.22)
pinia-plugin-unistorage: pinia-plugin-unistorage:
specifier: ^0.1.2 specifier: ^0.1.2
version: 0.1.2 version: 0.1.2
ysk-utils:
specifier: ^1.0.28
version: 1.0.28
packages: packages:
@@ -52,53 +61,9 @@ packages:
'@dcloudio/types': ^3.0.15 '@dcloudio/types': ^3.0.15
'@vue/composition-api': ^1.7.0 '@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': '@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 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': '@vue/compiler-core@3.5.22':
resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==}
@@ -136,115 +101,8 @@ packages:
'@vue/shared@3.5.22': '@vue/shared@3.5.22':
resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==}
'@webassemblyjs/ast@1.14.1': bignumber.js@9.3.1:
resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
'@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
csstype@3.1.3: csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
@@ -252,175 +110,30 @@ packages:
dayjs@1.11.18: dayjs@1.11.18:
resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} 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: entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'} 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: estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 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: jsbarcode@3.12.1:
resolution: {integrity: sha512-QZQSqIknC2Rr/YOUyOkCBqsoiBAOTYK+7yNN3JsqfoUtJtkazxNw1dmPpxuv7VVvqW13kA3/mKiLq+s/e3o9hQ==} resolution: {integrity: sha512-QZQSqIknC2Rr/YOUyOkCBqsoiBAOTYK+7yNN3JsqfoUtJtkazxNw1dmPpxuv7VVvqW13kA3/mKiLq+s/e3o9hQ==}
<<<<<<< HEAD lodash@4.17.21:
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 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: magic-string@0.30.19:
>>>>>>> a39c9f4d7228eb5bd0bda613fd326824fc7777ee
resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} 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: nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true 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: picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 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: pinia-plugin-unistorage@0.1.2:
resolution: {integrity: sha512-WXit2cGnm5rG6CDTcLSLehNWhyJS/Yq7WEeeXAapZbCnqoPJxlszqg7rT8S+OP47az0h5nlajGo+LuyMxUQ2uw==} resolution: {integrity: sha512-WXit2cGnm5rG6CDTcLSLehNWhyJS/Yq7WEeeXAapZbCnqoPJxlszqg7rT8S+OP47az0h5nlajGo+LuyMxUQ2uw==}
@@ -437,94 +150,10 @@ packages:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14} 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: source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'} 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: vue-demi@0.14.10:
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
engines: {node: '>=12'} engines: {node: '>=12'}
@@ -544,23 +173,8 @@ packages:
typescript: typescript:
optional: true optional: true
watchpack@2.4.4: ysk-utils@1.0.28:
resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} resolution: {integrity: sha512-VpEYjK5ldWgZXY+rxcwef8DB9/K9K13BPZEL3l3NXybofLsh1089sMJF4B4rVpqYszcTF13ZLL6WJWCkhCPOkg==}
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
snapshots: snapshots:
@@ -584,57 +198,8 @@ snapshots:
'@dcloudio/types': 3.4.21 '@dcloudio/types': 3.4.21
'@vue/composition-api': 1.7.2(vue@3.5.22) '@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/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': '@vue/compiler-core@3.5.22':
dependencies: dependencies:
'@babel/parser': 7.28.4 '@babel/parser': 7.28.4
@@ -695,274 +260,28 @@ snapshots:
'@vue/shared@3.5.22': {} '@vue/shared@3.5.22': {}
'@webassemblyjs/ast@1.14.1': bignumber.js@9.3.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
csstype@3.1.3: {} csstype@3.1.3: {}
dayjs@1.11.18: {} 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: {} 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: {} 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: {} jsbarcode@3.12.1: {}
json-parse-even-better-errors@2.3.1: {} lodash@4.17.21: {}
json-schema-traverse@1.0.0: {}
loader-runner@4.3.0: {}
magic-string@0.30.19: magic-string@0.30.19:
dependencies: dependencies:
'@jridgewell/sourcemap-codec': 1.5.5 '@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: {} 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: {} picocolors@1.1.1: {}
picomatch@2.3.1: {}
pinia-plugin-unistorage@0.1.2: {} pinia-plugin-unistorage@0.1.2: {}
pinia@2.3.1(@vue/composition-api@1.7.2(vue@3.5.22))(vue@3.5.22): 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 picocolors: 1.1.1
source-map-js: 1.2.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-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): vue-demi@0.14.10(@vue/composition-api@1.7.2(vue@3.5.22))(vue@3.5.22):
dependencies: dependencies:
vue: 3.5.22 vue: 3.5.22
@@ -1067,41 +314,6 @@ snapshots:
'@vue/server-renderer': 3.5.22(vue@3.5.22) '@vue/server-renderer': 3.5.22(vue@3.5.22)
'@vue/shared': 3.5.22 '@vue/shared': 3.5.22
watchpack@2.4.4: ysk-utils@1.0.28:
dependencies: dependencies:
glob-to-regexp: 0.4.1 bignumber.js: 9.3.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

BIN
static/icon/charge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -144,7 +144,7 @@ export const useWebSocket = defineStore('socketTask', () => {
}); });
socketTask.value.onMessage((res) => { socketTask.value.onMessage((res) => {
receivedMessages.value = JSON.parse(res.data) receivedMessages.value = JSON.parse(res.data)
console.log('收到消息',receivedMessages.value) // console.log('收到消息',receivedMessages.value)
sendMessage({ sendMessage({
type: 'receipt', type: 'receipt',
msg_id: receivedMessages.value.msg_id msg_id: receivedMessages.value.msg_id

View File

@@ -1,11 +1,24 @@
import { import {
defineStore defineStore
} from 'pinia'; } from 'pinia';
import yskUtils from 'ysk-utils'
const {
OrderPriceCalculator,
BaseCartItem,
BackendCoupon,
ActivityConfig,
OrderExtraConfig,
MerchantReductionConfig,
MerchantReductionType,
GoodsType
} = yskUtils
import { import {
ref, ref,
computed, computed,
reactive, reactive,
watchEffect watchEffect,
watch
} from 'vue'; } from 'vue';
import { import {
productminiApphotsquery, productminiApphotsquery,
@@ -13,16 +26,156 @@ import {
} from "@/common/api/product/product.js"; } from "@/common/api/product/product.js";
export const useCartsStore = defineStore('cart', 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 shopInfo = ref(uni.cache.get('shopInfo') || {
// const isTableFee = uni.cache.get('ordershopUserInfo').isTableFee //此店是否免桌位费 isMemberPrice: 0,
// const tableFee = uni.cache.get('ordershopUserInfo').tableFee //一个餐位费多钱 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); const goodsIsloading = ref(true);
//商品数据Map //商品数据Map
const goodsMap = reactive({}) const goodsMap = reactive({})
//获取商品数据 //获取商品数据
@@ -62,13 +215,6 @@ export const useCartsStore = defineStore('cart',
let skuData = undefined; let skuData = undefined;
skuData = goods?.skuList.find((sku) => sku.id == v.sku_id); 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); skuData = goods?.skuList.find((sku) => sku.id == v.sku_id);
if (skuData) { if (skuData) {
@@ -135,7 +281,6 @@ export const useCartsStore = defineStore('cart',
if (Message.operate_type == 'del' && Message.status == 1) { 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 !== 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') { if (Message.type == 'no_suit_num') {
// console.log(specifications)
uni.showModal({ uni.showModal({
title: '提示', title: '提示',
showCancel: false, showCancel: false,
@@ -177,9 +321,6 @@ export const useCartsStore = defineStore('cart',
} }
}); });
} }
} }
} }
@@ -193,6 +334,10 @@ export const useCartsStore = defineStore('cart',
originAmount: 0 originAmount: 0
}) })
function setOldOrder(data) {
oldOrder.value = data
}
// 会员信息 // 会员信息
const orderVIP = ref(uni.cache.get('orderVIP') || { 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(() => { const useVipPrice = computed(() => {
@@ -264,16 +406,6 @@ export const useCartsStore = defineStore('cart',
return money return money
}) })
//商品券抵扣金额
// const productCouponDiscountAmount = computed(() => {
// let index = -1;
// return quansSelArr.value.reduce((pre, cur) => {
// index++;
// return pre + returnProDiscount(cur, index) * 1;
// }, 0);
// });
//返回打包数量称重商品打包数量最大为1 //返回打包数量称重商品打包数量最大为1
function returnCartPackNumber(cur) { function returnCartPackNumber(cur) {
const maxReturnNum = cur.number - (cur.returnNum || 0); const maxReturnNum = cur.number - (cur.returnNum || 0);
@@ -343,8 +475,6 @@ export const useCartsStore = defineStore('cart',
if (!matchedProducts || !Array.isArray(matchedProducts)) { if (!matchedProducts || !Array.isArray(matchedProducts)) {
return 0; return 0;
} }
// console.log(uni.cache.get('orderVIP').isVip, uni.cache.get('ordershopUserInfo').isMemberPrice,
// 111)
// 购物车总数价格 // 购物车总数价格
console.log('isBwc'); console.log('isBwc');
console.log(isBwc); console.log(isBwc);
@@ -366,8 +496,6 @@ export const useCartsStore = defineStore('cart',
cart = cart.toFixed(2) cart = cart.toFixed(2)
console.log(parseFloat(cart)) console.log(parseFloat(cart))
// 向上取整并保留两位小数
// let result = roundUpToTwoDecimals(cart, 'upward')
return parseFloat(cart); return parseFloat(cart);
}; };
@@ -399,9 +527,6 @@ export const useCartsStore = defineStore('cart',
if (uni.cache.get('ordershopUserInfo').isTableFee == 0 && seatNum) { if (uni.cache.get('ordershopUserInfo').isTableFee == 0 && seatNum) {
cart = parseFloat(seatNum) * parseFloat(uni.cache.get('ordershopUserInfo').tableFee) 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') let result = roundUpToTwoDecimals(cart, 'downward')
@@ -417,18 +542,9 @@ export const useCartsStore = defineStore('cart',
// 向下取整并保留两位小数 // 向下取整并保留两位小数
let result = roundUpToTwoDecimals(total, 'downward') let result = roundUpToTwoDecimals(total, 'downward')
return result; return result;
// return Math.floor(total * 100) / 100;
}); });
//获取热门商品
async function getHotProduct() {
}
//获取分组商品
async function getGroupProduct() {
}
return { return {
getTotalPackFee, getTotalPackFee,
@@ -446,7 +562,21 @@ export const useCartsStore = defineStore('cart',
totalPackFee, totalPackFee,
updateData, updateData,
useVipPrice, useVipPrice,
totalOriginPrice totalOriginPrice,
orderCostSummary,
setCoupons,
setUserPoints,
setPointDeductionRule,
setOldOrder,
//优惠券列表
backendCoupons,
allGoods,
setDinnerType,
setSeatFeeConfig,
seatFeeConfig,
shopInfo,
//新客立减金额
newUserDiscount
}; };
} }
); );

View File

@@ -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;
}

View File

@@ -1,33 +1,23 @@
import { BigNumber } from "bignumber.js"; import {
BigNumber
} from "bignumber.js";
import _ from "lodash"; 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 goods 商品
* @param user 用户信息 * @param user 用户信息
* @param {Object} shopInfo
*/ */
export function returnGoodsPrice(goods, user) { export function returnGoodsPrice(goods, user, shopInfo) {
if (goods.discount_sale_amount * 1 > 0) { if (goods.discount_sale_amount * 1 > 0) {
return goods.discount_sale_amount; 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) { if (user.isVip && goods.memberPrice * 1 <= goods.salePrice * 1 && goods.memberPrice * 1 > 0) {
return goods.memberPrice; return goods.memberPrice;
} }
@@ -94,31 +84,43 @@ export function returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user) {
} }
/** /**
* 判断优惠券是否可使用 * 判断优惠券是否可使用,并返回不可用原因
* *
* @param {Object} args - 函数参数集合 * @param {Object} args - 函数参数集合
* @param {Array} args.canDikouGoodsArr - 可参与抵扣的商品列表每个元素包含商品信息productId、num等 * @param {Array} args.canDikouGoodsArr - 可参与抵扣的商品列表
* @param {Object} args.coupon - 优惠券信息对象 * @param {Object} args.coupon - 优惠券信息对象
* @param {boolean} args.coupon.use - 优惠券是否启用true为启用false为禁用 * @param {boolean} args.coupon.use - 优惠券是否启用
* @param {Array} args.coupon.useFoods - 优惠券适用的商品ID列表(空数组表示适用全部商品) * @param {Array} args.coupon.useFoods - 优惠券适用的商品ID列表
* @param {number} args.coupon.fullAmount - 优惠券使用门槛金额 * @param {number} args.coupon.fullAmount - 优惠券使用门槛金额
* @param {number} args.coupon.type - 优惠券类型1:满减券, 2:商品券, 3:折扣券, 4:第二件半价券, 6:买一送一券) * @param {number} args.coupon.type - 优惠券类型
* @param {number} args.goodsOrderPrice - 订单中所有商品的总金额(未筛选时的初始金额) * @param {number} args.goodsOrderPrice - 订单中所有商品的总金额
* @param {Object} args.user - 用户信息对象(用于计算商品价格,如会员价等) * @param {Object} args.user - 用户信息对象
* @param {Object} args.user - 用户信息对象(用于计算商品价格,如会员价等)
* @param {Object} args.selCoupon - 已经选择的优惠券信息对象 * @param {Object} args.selCoupon - 已经选择的优惠券信息对象
* @returns {boolean} - 优惠券是否可用true可用false不可用 * @param {Object} args.shopInfo
* @returns {Object} - { canUse: boolean, reason: string } 可用状态及不可用原因
*/ */
export function returnCouponCanUse(args) { export function returnCouponCanUse(args) {
let { canDikouGoodsArr, coupon, goodsOrderPrice, user, selCoupon } = args; let {
canDikouGoodsArr,
coupon,
goodsOrderPrice,
user,
selCoupon,
shopInfo
} = args;
// 优惠券未启用
if (!coupon.use) { if (!coupon.use) {
return false; return {
canUse: false,
reason: "优惠券未启用"
};
} }
canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user); canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user,shopInfo);
// 计算门槛金额 // 计算门槛金额
let fullAmount = goodsOrderPrice; let fullAmount = goodsOrderPrice;
//是否抵扣全部商品 // 是否抵扣全部商品
const isDikouAll = coupon.useFoods.length === 0; const isDikouAll = coupon.useFoods.length === 0;
let canCalcGoodsArr = []; let canCalcGoodsArr = [];
// 订单里参与门槛计算的商品 // 订单里参与门槛计算的商品
@@ -127,73 +129,86 @@ export function returnCouponCanUse(args) {
return coupon.useFoods.find((food) => food.id == v.productId); return coupon.useFoods.find((food) => food.id == v.productId);
}); });
fullAmount = canCalcGoodsArr.reduce((pre, cur) => { fullAmount = canCalcGoodsArr.reduce((pre, cur) => {
return pre + returnGoodsPrice(cur, user) * cur.num; return pre + returnGoodsPrice(cur, user,shopInfo) * cur.num;
}, 0); }, 0);
} }
//没有符合商品 // 没有符合条件的商品
if (!isDikouAll && canCalcGoodsArr.length == 0) { if (!isDikouAll && canCalcGoodsArr.length === 0) {
return false; return {
canUse: false,
reason: "没有符合条件的商品"
};
} }
//不满足门槛金额 // 不满足门槛金额
if (fullAmount < coupon.fullAmount) { if (fullAmount < coupon.fullAmount) {
console.log("不满足门槛金额"); return {
return false; canUse: false,
reason: `${coupon.fullAmount}元可用,当前可参与金额${fullAmount}`
};
} }
if (coupon.type == 2) { // 商品券特殊验证
//商品券 if (coupon.type === 2) {
return isDikouAll || canCalcGoodsArr.length > 0; if (!(isDikouAll || canCalcGoodsArr.length > 0)) {
return {
canUse: false,
reason: "没有符合条件的商品可抵扣"
};
} }
if (coupon.type == 1) {
//满减券
return fullAmount >= coupon.fullAmount;
} }
if (coupon.type == 6) {
//买一送一券
// 买一送一券特殊验证
if (coupon.type === 6) {
let canUse = false; let canUse = false;
if (isDikouAll) { if (isDikouAll) {
canUse = canDikouGoodsArr.some((v) => v.num >= 2); canUse = canDikouGoodsArr.some((v) => v.num >= 2);
} else if (canCalcGoodsArr.length > 0) {
canUse = canCalcGoodsArr.some((v) => v.num >= 2);
} }
if (canCalcGoodsArr.length > 0) {
canUse = canDikouGoodsArr if (!canUse) {
.filter((v) => { return {
return coupon.useFoods.find((food) => food.id == v.productId); canUse: false,
}) reason: "需要购买至少2件相同的商品才能使用"
.some((v) => v.num >= 2); };
} }
return canUse;
} }
if (coupon.type == 4) {
//第二件半价券 // 第二件半价券特殊验证
if (coupon.type === 4) {
let canUse = false; let canUse = false;
if (isDikouAll) { if (isDikouAll) {
canUse = canDikouGoodsArr.some((v) => v.num >= 2); canUse = canDikouGoodsArr.some((v) => v.num >= 2);
} else if (canCalcGoodsArr.length > 0) {
canUse = canCalcGoodsArr.some((v) => v.num >= 2);
} }
if (canCalcGoodsArr.length > 0) {
canUse = canDikouGoodsArr if (!canUse) {
.filter((v) => { return {
return coupon.useFoods.find((food) => food.id == v.productId); canUse: false,
}) reason: "需要购买至少2件相同的商品才能使用"
.some((v) => v.num >= 2); };
} }
return canUse;
}
if (coupon.type == 3) {
//折扣券
return true;
} }
// 所有条件都满足
return {
canUse: true,
reason: ""
};
} }
/** /**
* 计算抵扣商品金额 * 计算抵扣商品金额
* @param discountGoodsArr 可抵扣商品列表 * @param discountGoodsArr 可抵扣商品列表
* @param discountNum 抵扣数量 * @param discountNum 抵扣数量
* @param user 用户信息 * @param user 用户信息
* @param {Object} shopInfo 店铺信息
*/ */
export function calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user) { export function calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user,shopInfo) {
let hasCountNum = 0; let hasCountNum = 0;
let discountPrice = 0; let discountPrice = 0;
let hasDiscountGoodsArr = []; let hasDiscountGoodsArr = [];
@@ -204,23 +219,31 @@ export function calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user) {
const goods = discountGoodsArr[i]; const goods = discountGoodsArr[i];
const shengyuNum = discountNum - hasCountNum; const shengyuNum = discountNum - hasCountNum;
const num = Math.min(goods.num, shengyuNum); const num = Math.min(goods.num, shengyuNum);
discountPrice += returnGoodsPrice(goods, user) * num; discountPrice += returnGoodsPrice(goods, user,shopInfo) * num;
hasCountNum += num; hasCountNum += num;
hasDiscountGoodsArr.push({ ...goods, num }); hasDiscountGoodsArr.push({
...goods,
num
});
} }
return { discountPrice, hasDiscountGoodsArr }; return {
discountPrice,
hasDiscountGoodsArr
};
} }
/** /**
* 计算优惠券抵扣金额 * 计算优惠券抵扣金额
* @param canDikouGoodsArr 可抵扣商品列表 * @param arr 可抵扣商品列表
* @param coupon 优惠券 * @param coupon 优惠券
* @param user 用户信息 * @param user 用户信息
* @param goodsOrderPrice 商品订单金额 * @param goodsOrderPrice 商品订单金额
* @param selCoupon 已选择的优惠券列表 * @param selCoupon 已选择的优惠券列表
*/ */
export function returnCouponDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice, selCoupon) { export function returnCouponDiscount(arr, coupon, user, goodsOrderPrice, selCoupon) {
canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user); console.log('arr', arr);
const canDikouGoodsArr = returnCanDikouGoodsArr(arr, selCoupon, user);
console.log('canDikouGoodsArr', canDikouGoodsArr);
if (coupon.type == 2) { if (coupon.type == 2) {
return returnCouponProductDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice); return returnCouponProductDiscount(canDikouGoodsArr, coupon, user, goodsOrderPrice);
} }
@@ -251,7 +274,10 @@ export function returnCouponZhekouDiscount(
goodsOrderPrice, goodsOrderPrice,
selCoupon selCoupon
) { ) {
const { discountRate, maxDiscountAmount } = coupon; const {
discountRate,
maxDiscountAmount
} = coupon;
const goodsCouponDiscount = selCoupon const goodsCouponDiscount = selCoupon
.filter((v) => v.type == 2) .filter((v) => v.type == 2)
@@ -259,7 +285,6 @@ export function returnCouponZhekouDiscount(
return prve + cur.discount.discountPrice; return prve + cur.discount.discountPrice;
}, 0); }, 0);
goodsOrderPrice -= goodsCouponDiscount; goodsOrderPrice -= goodsCouponDiscount;
// 使用bignumber处理高精度计算 // 使用bignumber处理高精度计算
// 1. 计算折扣率百分比转小数discountRate / 100 // 1. 计算折扣率百分比转小数discountRate / 100
const discountRatio = new BigNumber(discountRate).dividedBy(100); const discountRatio = new BigNumber(discountRate).dividedBy(100);
@@ -284,11 +309,13 @@ export function returnCouponZhekouDiscount(
* @param user 用户信息 * @param user 用户信息
*/ */
export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user) { export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user) {
const { useFoods, discountNum, useRule } = coupon; const {
useFoods,
discountNum,
useRule
} = coupon;
//抵扣商品数组 //抵扣商品数组
let discountGoodsArr = []; let discountGoodsArr = [];
//抵扣全部商品 //抵扣全部商品
if (useFoods.length === 0) { if (useFoods.length === 0) {
if (useRule == "price_asc") { if (useRule == "price_asc") {
@@ -312,7 +339,6 @@ export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user) {
} }
} }
const result = calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user); const result = calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user);
console.log(result);
return result; return result;
} }
@@ -321,9 +347,13 @@ export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user) {
* @param canDikouGoodsArr 可抵扣商品列表 * @param canDikouGoodsArr 可抵扣商品列表
* @param coupon 优惠券 * @param coupon 优惠券
* @param user 用户信息 * @param user 用户信息
* @param shopInfo 店铺信息
*/ */
function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user) { function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user,shopInfo) {
const { useFoods, useRule } = coupon; const {
useFoods,
useRule
} = coupon;
//抵扣商品 //抵扣商品
let discountGoods = undefined; let discountGoods = undefined;
//符合买一送一条件的商品 //符合买一送一条件的商品
@@ -338,18 +368,18 @@ function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user) {
} else { } else {
//符合抵扣条件的商品 //符合抵扣条件的商品
const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId)); const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId));
console.log(canUseGoods1);
if (useRule == "price_asc") { if (useRule == "price_asc") {
discountGoods = canUseGoods1[canUseGoods1.length - 1]; discountGoods = canUseGoods1[canUseGoods1.length - 1];
} else { } else {
discountGoods = canUseGoods1.slice(0, 1); discountGoods = canUseGoods1.slice(0, 1);
} }
} }
console.log("discountGoods"); const discountPrice = returnGoodsPrice(discountGoods, user,shopInfo);
console.log(discountGoods);
const discountPrice = returnGoodsPrice(discountGoods, user);
const hasDiscountGoodsArr = [discountGoods]; const hasDiscountGoodsArr = [discountGoods];
return { discountPrice, hasDiscountGoodsArr }; return {
discountPrice,
hasDiscountGoodsArr
};
} }
/** /**
@@ -357,9 +387,13 @@ function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user) {
* @param canDikouGoodsArr 可抵扣商品列表 * @param canDikouGoodsArr 可抵扣商品列表
* @param coupon 优惠券 * @param coupon 优惠券
* @param user 用户信息 * @param user 用户信息
* @param shopInfo 店铺信息
*/ */
function returnSecoendDiscount(canDikouGoodsArr, coupon, user) { function returnSecoendDiscount(canDikouGoodsArr, coupon, user,shopInfo) {
const { useFoods, useRule } = coupon; const {
useFoods,
useRule
} = coupon;
//抵扣商品 //抵扣商品
let discountGoods = undefined; let discountGoods = undefined;
//符合买一送一条件的商品 //符合买一送一条件的商品
@@ -374,14 +408,13 @@ function returnSecoendDiscount(canDikouGoodsArr, coupon, user) {
} else { } else {
//符合抵扣条件的商品 //符合抵扣条件的商品
const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId)); const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId));
console.log(canUseGoods1);
if (useRule == "price_asc") { if (useRule == "price_asc") {
discountGoods = canUseGoods1[canUseGoods1.length - 1]; discountGoods = canUseGoods1[canUseGoods1.length - 1];
} else { } else {
discountGoods = canUseGoods1.slice(0, 1); discountGoods = canUseGoods1.slice(0, 1);
} }
} }
const discountPrice = returnGoodsPrice(discountGoods, user); const discountPrice = returnGoodsPrice(discountGoods, user,shopInfo);
const hasDiscountGoodsArr = [discountGoods]; const hasDiscountGoodsArr = [discountGoods];
//返回半价价格 //返回半价价格
return { return {
@@ -389,3 +422,23 @@ function returnSecoendDiscount(canDikouGoodsArr, coupon, user) {
hasDiscountGoodsArr, 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;
}