<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>
|