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.
 
 
 

318 lines
7.9 KiB

<template>
<view class="augmented">
<view class="product-container">
<view>
<img src="https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/details/pic_augmented.png" alt=""
style="width:100%;margin-bottom: 10px;" mode="widthFix">
</view>
<uni-collapse v-for="(item,i) in products" class="product" :key="i">
<uni-collapse-item :title="item.itemName" :open="item.isOpen">
<view v-for="(subItem,j) in item.subItem" class="product-content" :key="subItem.id">
<radio :checked="subItem.isSelected" @click="changeSelect(i,j)"
style="transform:scale(0.7);margin-right: 5px;" color="#FFB13F" />
<img class="product-img" style="min-width: 98px; max-width: 98px; height:98px;"
:src="subItem.pic" alt="">
<view class="product-text">
<view class="product-name">
{{subItem.name}}
</view>
<view class="product-desc">
{{subItem.shortDescription}}
</view>
<view class="product-price-number">
<view class="product-price">
<text style="font-size: 18px;">¥{{subItem.price}}元</text>/次
</view>
<uni-number-box v-if="!(subItem.name.indexOf('提前熟悉')>-1)" class="product-number"
background="#fff" @change="e=>changeNumber(e,i,j)" :value="subItem.quantity"
:min="0" :max="999">
</uni-number-box>
</view>
</view>
</view>
</uni-collapse-item>
</uni-collapse>
</view>
<view class="payment">
<view class="total-price">
<text class="total-price-text">应付价格</text>
<text class="total-price-value">{{totalPrice}}</text>
</view>
<button class="payment-btn" @click="goNext">下一步</button>
</view>
<Kefu></Kefu>
</view>
</template>
<script>
import Kefu from '../common/kefu.vue'
import {
getProductList
} from "@/api/system/user"
export default {
data() {
return {
totalPrice: 0,
basePrice: 0,
products: [],
selectProducts: [],
categoryIds: [78, 82, 79, 80, 81],
}
},
components:{
Kefu
},
mounted() {
this.basePrice = this.$globalData.submitData.totalPrice;
this.getTotalPrice()
this.getProductList()
},
methods: {
getProductList() {
getProductList({
"publishStatus": 1,
"categoryIds": this.categoryIds,
"needSku": true
}).then(response => {
if (response && response.content && response.content.length > 0) {
const produtNumberSelect = response.content.map(item => {
Object.assign(item, {
isSelected: false,
quantity: 0
})
})
// const groupByCategory = response.content.groupBy(product => {
// return product.categoryId;
// });
const groupedAndSortedRes = response.content.reduce((result, obj) => {
const categoryId = obj.categoryId;
// 检查结果中是否已存在该 categoryId 的分组
const existingGroup = result.find(group => group.key === categoryId);
if (existingGroup) {
// 如果已存在分组,则将当前对象添加到该分组的数组中
existingGroup.values.push(obj);
} else {
// 如果不存在分组,则创建一个新的分组并添加到结果中
result.push({
key: categoryId,
values: [obj]
});
}
return result;
}, [])
.sort((a, b) => {
const indexA = this.categoryIds.indexOf(a.key);
const indexB = this.categoryIds.indexOf(b.key);
return indexA - indexB;
});
this.products = []
for (let category in groupedAndSortedRes) {
let productCategoryName = groupedAndSortedRes[category].values[0].productCategoryName
let productObj = {
id: category,
isOpen: true,
itemName: productCategoryName,
subItem: groupedAndSortedRes[category].values
}
this.products.push(productObj)
}
console.log(this.products);
}
})
},
changeSelect(i, j) {
const outerObj = this.products[i];
const innerObj = outerObj.subItem[j];
innerObj.isSelected = !innerObj.isSelected;
if(innerObj.isSelected){
innerObj.quantity = 1;
}else{
innerObj.quantity = 0;
}
this.getTotalPrice();
console.log(this.products);
},
changeNumber(e, i, j) {
const outerObj = this.products[i];
const innerObj = outerObj.subItem[j];
if(e>0){
innerObj.isSelected=true
} else {
innerObj.isSelected=false
}
innerObj.quantity = e;
this.getTotalPrice();
console.log(this.products);
},
getTotalPrice() {
let currentPrice = 0
let tempSelectProducts = []
for (let i = 0; i < this.products.length; i++) {
for (let j = 0; j < this.products[i].subItem.length; j++) {
if (this.products[i].subItem[j].isSelected) {
tempSelectProducts.push(this.products[i].subItem[j])
currentPrice += this.products[i].subItem[j].quantity * this.products[i].subItem[j].price;
}
}
}
this.selectProducts = tempSelectProducts;
this.totalPrice = currentPrice + this.basePrice;
},
goNext() {
this.$globalData.submitData.totalPrice = this.totalPrice;
this.setItemPrices()
uni.navigateTo({
url: '/pages/details/confirm'
});
},
setItemPrices() {
let itemPrices = [];
let productSkus = [];
for (let i = 0; i < this.selectProducts.length; i++) {
if (this.selectProducts[i].quantity > 0) {
let itemPrice = {
itemType: this.selectProducts[i].productCategoryName + '-' + this.selectProducts[i].name,
price: this.selectProducts[i].price,
quantity: this.selectProducts[i].quantity,
unit: this.selectProducts[i].unit
}
itemPrices.push(itemPrice)
let productSku = {
"skuId": this.selectProducts[i].skus[0].id,
"quantity": this.selectProducts[i].quantity
}
productSkus.push(productSku)
}
}
this.$globalData.itemPrices = itemPrices;
this.$globalData.augmentedSku = [...productSkus];
},
}
}
</script>
<style lang="scss">
.product-container {
padding: 10px;
background-color: #F5F5F7;
.product {
border-radius: 8px;
background-color: #ffffff;
.product-content {
padding: 14px 10px;
display: flex;
align-items: center;
.product-img {
width: 98px;
height: 98px;
border-radius: 4px;
}
.product-text {
padding: 0 5px;
display: flex;
flex-wrap: wrap;
align-content: space-between;
.product-name {
font-size: 16px;
color: #333;
line-height: 16px;
margin-left: 5px;
}
.product-desc {
color: #A94F20;
font-size: 11px;
line-height: 14px;
display: flex;
align-items: center;
background-color: #FFFCF2;
padding: 5px;
margin: 5px 0;
width: 100%;
min-height: 48px;
}
.product-price-number {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
.product-price {
color: #FF530A;
font-size: 14px;
line-height: 16px;
}
.product-number {
border: 1px solid #FFE8C6;
border-radius: 4px;
}
}
}
}
}
}
.augmented {
position: relative;
height: 100%;
padding-bottom: 58px;
.payment {
height: 58px;
position: fixed;
bottom: 0;
width: 100%;
margin-top: 10px;
padding: 10px 20px;
background-color: #ffffff;
display: flex;
justify-content: space-between;
align-items: center;
z-index: 100;
.total-price-text {
color: #333;
font-size: 16px;
font-weight: blob;
line-height: 16px;
}
.total-price-value {
color: #FF530A;
font-size: 22px;
font-weight: blob;
line-height: 16px;
}
.payment-btn {
width: 140px;
height: 38px;
border-radius: 6px;
background: #FFB13F;
color: #fff;
font-size: 16px;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
}
}
}
</style>