glhcp/business/components/goods-spec/goods-spec.vue

277 lines
9.9 KiB
Vue
Raw Normal View History

2023-08-10 06:59:52 +00:00
<template>
<u-popup v-model="showPop" height="70vh" mode="bottom" border-radius="14" :closeable="true" @close="onClose"
:safe-area-inset-bottom="true">
<view class="bg-white spec-contain">
<view class="spec-header flex">
<u-image class="m-r-20" width="180rpx" height="180rpx" border-radius="10rpx" @tap="previewImage(checkedGoods.image)"
:src="checkedGoods.image"></u-image>
<view class="goods-info">
<view class="primary flex">
<price :content="checkedGoods.price" main-size="46rpx" minor-size="38rpx" color="#FF2C3C">
</price>
</view>
<view class="sm m-t-120">
库存{{stock}}
</view>
</view>
</view>
<!-- 规格 -->
<view class="spec-main">
<scroll-view style="min-height: 600rpx;" scroll-y="true">
<view class="spec-list">
<view v-for="(item, index) in specList" :key="index" class="spec">
<view class="flex row-between">
<view class="name m-b-30">{{ item.name }}</view>
</view>
<view class="flex wrap">
<view v-for="(specitem, index2) in item.spec_value" :key="index2"
:class="'spec-item sm ' + ( specitem.checked ? 'checked' : '' )"
@tap="choseSpecItem(item.id, specitem.id)">
{{ specitem.value }}
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</u-popup>
</template>
<script>
export default {
data() {
return {
stock: 0,//库存
checkedGoods: {},
specList: [],
showPop: false,
isSelectedAll: true, //是否全选
selectStr: '', // 已选规格
specListAll: [], // 是否全选
};
},
components: {},
props: {
show: {
type: Boolean
},
goods: {
type: Object
}
},
mounted() {},
watch: {
// 监听商品
goods(value) {
this.stock = value.stock
let specList = value.goods_spec || [];
let goodsItem = value.goods_item || [];
specList.forEach(item => {
if (item.spec_value) {
item.spec_value.forEach((specitem, specindex) => {
specitem.checked = 1;
});
}
this.specListAll[item.id] = true
});
this.specList = specList
this.checkedGoods = goodsItem.length ? goodsItem[0] : {};
},
// 监听规格
specList(value) {
const {
goods_item
} = this.goods;
let keyArr = [];
let specArr = [];
let specArrCM = []; // 个规格选中的id
value.forEach(item => {
if (item.spec_value) {
item.spec_value.forEach((specitem, indexS) => {
if (specitem.checked) {
keyArr.push(specitem.id);
specArr.push(specitem.value)
specArrCM.push(specitem.id)
}
if (indexS == item.spec_value.length - 1) {
if (specArrCM.length == item.spec_value.length) {
this.specListAll[item.id] = true
} else {
this.specListAll[item.id] = false
}
specArrCM = []
}
});
}
});
this.selectStr = specArr.join('、')
// hsz
if (!keyArr.length) return;
let key = keyArr[0];
let index = goods_item.findIndex(item => {
return item.spec_value_ids == key;
});
if (index == -1) return;
this.checkedGoods = goods_item[index]
this.$emit('change', {
detail: goods_item[index]
});
},
show(val) {
this.showPop = val
}
},
methods: {
onClose() {
this.$emit('close')
},
// 点击选中规格。
choseSpecItem(id, specid) {
this.specList.forEach(item => {
if (item.spec_value && item.id == id) {
item.spec_value.forEach(specitem => {
if (specitem.id == specid) {
if (specitem.checked == 1) {
specitem.checked = 0;
} else {
specitem.checked = 1;
}
}
});
}
});
this.specList = [...this.specList]
this.getStock();
},
getStock() {
let sku = [];
// 遍历得到sku = [[1],[157158]]数组
this.specList.forEach((item, index) => {
sku.push([])
item.spec_value.forEach(specitem => {
if (specitem.checked) {
sku[index].push(specitem.id)
}
});
});
// 算出数组多种规格组合
let keyArr = this.dkej(sku)
let stock = 0
keyArr.forEach((item) => {
const a = item.join(',')
let index = this.goods.goods_item.findIndex(item => {
return item.spec_value_ids == a;
});
if (index == -1) return;
stock += this.goods.goods_item[index].stock
})
this.stock = stock
},
dkej(arr) {
let accArr = []
for (var arrar in arr) {
arrar = arr[arrar]
let result = []
for (var i in arrar) {
if (accArr.length) {
for (var x in accArr) {
result.push(accArr[x].concat(arrar[i]))
}
} else {
result.push([arrar[i]])
}
}
accArr = result
}
return accArr
},
previewImage(current) {
uni.previewImage({
current,
// 当前显示图片的http链接
urls: [current] // 需要预览的图片http链接列表
});
}
}
};
</script>
<style lang="scss" scoped>
.spec-contain {
border-radius: 10rpx 10rpx 0 0;
overflow: hidden;
position: relative;
.close {
position: absolute;
right: 10rpx;
top: 10rpx;
}
.spec-header {
padding: 30rpx;
padding-right: 70rpx;
align-items: flex-start;
border: $-solid-border;
.vip-price {
margin: 0 24rpx;
background-color: #FFE9BA;
line-height: 36rpx;
border-radius: 6rpx;
overflow: hidden;
.price-name {
background-color: #101010;
padding: 3rpx 12rpx;
color: #FFD4B7;
position: relative;
overflow: hidden;
&::after {
content: '';
display: block;
width: 20rpx;
height: 20rpx;
position: absolute;
right: -15rpx;
background-color: #FFE9BA;
border-radius: 50%;
top: 50%;
transform: translateY(-50%);
box-sizing: border-box;
}
}
}
}
.spec-main {
.spec-list {
padding: 30rpx 20rpx;
.spec-item {
line-height: 52rpx;
padding: 0 30rpx;
background-color: #F6F6F6;
border-radius: 30rpx;
margin: 0 20rpx 20rpx 0;
border: 1rpx solid #F6F6F6;
&.checked {
font-weight: 500;
border: 1rpx solid $-color-primary;
color: #fff;
background-color: $-color-primary;
}
}
}
}
}
</style>