You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

403 lines
11 KiB

<template>
<view class="container">
<view class="prod-list">
<block
v-for="(item, scIndex) in shopCartItemDiscounts"
:key="scIndex"
>
<view class="prod-block">
<view
v-if="item.chooseDiscountItemDto"
class="discount-tips"
>
<text class="text-block">
{{ wxs.parseDiscount(item.chooseDiscountItemDto.discountRule) }}
</text>
<text class="text-list">
{{
wxs.parseDiscountMsg(item.chooseDiscountItemDto.discountRule, item.chooseDiscountItemDto.needAmount, item.chooseDiscountItemDto.discount)
}}
</text>
</view>
<block
v-for="(prod, index) in item.shopCartItems"
:key="index"
>
<view class="item">
<view class="btn">
<label>
<checkbox
:data-scindex="scIndex"
:data-index="index"
:value="prod.prodId"
:checked="prod.checked"
color="#105c3e"
@tap="onSelectedItem"
/>
</label>
</view>
<view class="prodinfo">
<view class="pic">
<image :src="prod.pic" />
</view>
<view class="opt">
<view class="prod-name">
{{ prod.prodName }}
</view>
<text :class="'prod-info-text ' + (prod.skuName?'':'empty-n')">
{{ prod.skuName }}
</text>
<view class="price-count">
<view class="price">
<text class="symbol">
</text>
<text class="big-num">
{{ wxs.parsePrice(prod.price)[0] }}
</text>
<text class="small-num">
.{{ wxs.parsePrice(prod.price)[1] }}
</text>
</view>
<view class="m-numSelector">
<view
class="minus"
:data-scindex="scIndex"
:data-index="index"
@tap="onCountMinus"
/>
<input
type="number"
:value="prod.prodCount"
disabled
>
<view
class="plus"
:data-scindex="scIndex"
:data-index="index"
@tap="onCountPlus"
/>
</view>
</view>
</view>
</view>
</view>
</block>
</view>
</block>
</view>
<view
v-if="!shopCartItemDiscounts.length"
class="empty"
>
<view class="img">
<image src="@/static/images/tabbar/basket.png" />
</view>
<view class="txt">
您还没有添加任何商品哦~
</view>
</view>
<!-- 底部按钮 -->
<view
v-if="shopCartItemDiscounts.length>0"
class="cart-footer"
>
<view class="btn all">
<label @tap="onSelAll">
<checkbox
:checked="allChecked"
color="#f7d731;"
/>
全选</label>
</view>
<view
class="btn del"
@tap="onDelBasket"
>
<text>删除</text>
</view>
<view class="btn total">
<view class="finally">
<text>合计:</text>
<view class="price">
<text class="symbol">
</text>
<text class="big-num">
{{ wxs.parsePrice(finalMoney)[0] }}
</text>
<text class="small-num">
.{{ wxs.parsePrice(finalMoney)[1] }}
</text>
</view>
</view>
<view
v-if="subtractMoney>0"
class="total-msg"
>
总额:¥{{ wxs.toPrice(totalMoney) }} 立减:¥{{ wxs.toPrice(subtractMoney) }}
</view>
</view>
<view
class="btn settle"
@tap="toFirmOrder"
>
<text>结算</text>
</view>
</view>
<!-- end 底部按钮 -->
</view>
</template>
<script setup>
const wxs = number()
/**
* 生命周期函数--监听页面显示
*/
onShow(() => {
loadBasketData()
http.getCartCount() // 重新计算购物车总数量
})
const allChecked = ref(false)
const shopCartItemDiscounts = ref([])
const loadBasketData = () => {
uni.showLoading() // 加载购物车
http.request({
url: '/p/shopCart/info',
method: 'POST',
data: {}
})
.then(({ data }) => {
if (data.length > 0) {
// 默认不选中
const shopCartItemDiscountsParam = data[0].shopCartItemDiscounts
shopCartItemDiscountsParam.forEach(shopCartItemDiscount => {
shopCartItemDiscount.shopCartItems.forEach(shopCartItem => {
shopCartItem.checked = false
})
})
shopCartItemDiscounts.value = shopCartItemDiscountsParam
allChecked.value = false
} else {
shopCartItemDiscounts.value = []
}
calTotalPrice() // 计算总价
uni.hideLoading()
})
}
/**
* 去结算
*/
const toFirmOrder = () => {
const shopCartItemDiscountsParam = shopCartItemDiscounts.value
const basketIds = []
shopCartItemDiscountsParam.forEach(shopCartItemDiscount => {
shopCartItemDiscount.shopCartItems.forEach(shopCartItem => {
if (shopCartItem.checked) {
basketIds.push(shopCartItem.basketId)
}
})
})
if (!basketIds.length) {
uni.showToast({
title: '请选择商品',
icon: 'none'
})
return
}
uni.setStorageSync('basketIds', JSON.stringify(basketIds))
uni.navigateTo({
url: '/pages/submit-order/submit-order?orderEntry=0'
})
}
/**
* 全选
*/
const onSelAll = () => {
let allCheckedParam = allChecked.value
allCheckedParam = !allCheckedParam // 改变状态
const shopCartItemDiscountsParam = shopCartItemDiscounts.value
for (let i = 0; i < shopCartItemDiscountsParam.length; i++) {
const cItems = shopCartItemDiscountsParam[i].shopCartItems
for (let j = 0; j < cItems.length; j++) {
cItems[j].checked = allCheckedParam
}
}
allChecked.value = allCheckedParam
shopCartItemDiscounts.value = shopCartItemDiscountsParam
calTotalPrice() // 计算总价
}
/**
* 每一项的选择事件
* +
*/
const onSelectedItem = (e) => {
const index = e.currentTarget.dataset.index // 获取data- 传进来的index
const scindex = e.currentTarget.dataset.scindex
const shopCartItemDiscountsParam = shopCartItemDiscounts.value // 获取购物车列表
const checked = shopCartItemDiscountsParam[scindex].shopCartItems[index].checked // 获取当前商品的选中状态
shopCartItemDiscountsParam[scindex].shopCartItems[index].checked = !checked // 改变状态
shopCartItemDiscounts.value = shopCartItemDiscountsParam
checkAllSelected() // 检查全选状态
calTotalPrice() // 计算总价
}
/**
* 检查全选状态
*/
const checkAllSelected = () => {
let allCheckedParam = true
const shopCartItemDiscountsParam = shopCartItemDiscounts.value
let flag = false
for (let i = 0; i < shopCartItemDiscountsParam.length; i++) {
const cItems = shopCartItemDiscountsParam[i].shopCartItems
for (let j = 0; j < cItems.length; j++) {
if (!cItems[j].checked) {
allCheckedParam = !allCheckedParam
flag = true
break
}
}
if (flag) break
}
allChecked.value = allCheckedParam
}
const totalMoney = ref(0)
const subtractMoney = ref(0)
const finalMoney = ref(0)
/**
* 计算购物车总额
*/
const calTotalPrice = () => {
const shopCartItemDiscountsParam = shopCartItemDiscounts.value
const shopCartIds = []
for (let i = 0; i < shopCartItemDiscountsParam.length; i++) {
const cItems = shopCartItemDiscountsParam[i].shopCartItems
for (let j = 0; j < cItems.length; j++) {
if (cItems[j].checked) {
shopCartIds.push(cItems[j].basketId)
}
}
}
uni.showLoading()
http.request({
url: '/p/shopCart/totalPay',
method: 'POST',
data: shopCartIds
})
.then(({ data }) => {
finalMoney.value = data.finalMoney
totalMoney.value = data.totalMoney
subtractMoney.value = data.subtractMoney
uni.hideLoading()
})
}
/**
* 减少数量
*/
const onCountMinus = (e) => {
const index = e.currentTarget.dataset.index
const scindex = e.currentTarget.dataset.scindex
const shopCartItemDiscountsParam = shopCartItemDiscounts.value
const prodCount = shopCartItemDiscountsParam[scindex].shopCartItems[index].prodCount
if (prodCount > 1) {
updateCount(shopCartItemDiscountsParam, scindex, index, -1)
}
}
/**
* 增加数量
*/
const onCountPlus = (e) => {
const index = e.currentTarget.dataset.index
const scindex = e.currentTarget.dataset.scindex
const shopCartItemDiscountsParam = shopCartItemDiscounts.value
updateCount(shopCartItemDiscountsParam, scindex, index, 1)
}
/**
* 改变购物车数量接口
*/
const updateCount = (shopCartItemDiscountsParam, scindex, index, prodCount) => {
uni.showLoading({
mask: true
})
http.request({
url: '/p/shopCart/changeItem',
method: 'POST',
data: {
count: prodCount,
prodId: shopCartItemDiscountsParam[scindex].shopCartItems[index].prodId,
skuId: shopCartItemDiscountsParam[scindex].shopCartItems[index].skuId,
shopId: 1
}
})
.then(() => {
shopCartItemDiscountsParam[scindex].shopCartItems[index].prodCount += prodCount
shopCartItemDiscounts.value = shopCartItemDiscountsParam
calTotalPrice() // 计算总价
uni.hideLoading()
http.getCartCount() // 重新计算购物车总数量
})
}
/**
* 删除购物车商品
*/
const onDelBasket = () => {
const shopCartItemDiscountsParam = shopCartItemDiscounts.value
const basketIds = []
for (let i = 0; i < shopCartItemDiscountsParam.length; i++) {
const cItems = shopCartItemDiscountsParam[i].shopCartItems
for (let j = 0; j < cItems.length; j++) {
if (cItems[j].checked) {
basketIds.push(cItems[j].basketId)
}
}
}
if (!basketIds.length) {
uni.showToast({
title: '请选择商品',
icon: 'none'
})
} else {
uni.showModal({
title: '',
content: '确认要删除选中的商品吗?',
confirmColor: '#eb2444',
success (res) {
if (res.confirm) {
uni.showLoading({
mask: true
})
http.request({
url: '/p/shopCart/deleteItem',
method: 'DELETE',
data: basketIds
})
.then(() => {
uni.hideLoading()
loadBasketData()
})
}
}
})
}
}
</script>
<style scoped lang="scss">
@import "./basket.scss";
</style>