185 lines
6.5 KiB
JavaScript
185 lines
6.5 KiB
JavaScript
/**
|
|
* 商品规格相关的公共方法
|
|
*/
|
|
import {getProductDetail} from "../api/product";
|
|
import {ProductMarketingTypeEnum} from "../enums/productEnums";
|
|
|
|
export default {
|
|
data(){
|
|
return{
|
|
cartId: 0,
|
|
product_id: 0,
|
|
// attr: {
|
|
// cartAttr: false,
|
|
// productAttr: [],
|
|
// productSelect: {}
|
|
// },
|
|
productValue: [], //系统属性
|
|
productInfo: {},
|
|
attrValue: '', //已选属性
|
|
attrTxt: '请选择', //属性页面提示
|
|
// marketingType: 0,
|
|
ProductMarketingTypeEnum: ProductMarketingTypeEnum
|
|
}
|
|
},
|
|
methods: {
|
|
/**
|
|
* 获取产品详情
|
|
*
|
|
*/
|
|
getGoodsDetails: function(item) {
|
|
uni.showLoading({
|
|
title: '加载中',
|
|
mask: true
|
|
});
|
|
this.cartId = item.id;
|
|
this.product_id = item.productId;
|
|
getProductDetail(item.productId, 0,0,'').then(res => {
|
|
uni.hideLoading();
|
|
this.attr.cartAttr = true;
|
|
let productInfo = res.data.productInfo;
|
|
this.$set(this, 'productInfo', productInfo);
|
|
this.$set(this, 'productValue', res.data.productValue);
|
|
let productAttr = res.data.productAttr.map(item => {
|
|
return {
|
|
attrName: item.attributeName,
|
|
attrValues: item.optionList.map(items => items.optionName),
|
|
id: item.id,
|
|
isDel: item.isDel,
|
|
productId: item.productId,
|
|
optionList: item.optionList,
|
|
isShowImage: item.isShowImage
|
|
}
|
|
});
|
|
this.$set(this.attr, 'productAttr', productAttr);
|
|
this.defaultSelect();
|
|
}).catch(err => {
|
|
uni.hideLoading();
|
|
})
|
|
},
|
|
/**
|
|
* 获取符合条件的规格值
|
|
* @param {Array} values - 规格值数组
|
|
* @returns {Array} - 有效的规格值数组
|
|
*/
|
|
getValidSku(values) {
|
|
const isGroupbuying = this.marketingType === this.ProductMarketingTypeEnum.Groupbuying;
|
|
|
|
// 检查库存条件
|
|
const hasValidStock = (item) => {
|
|
if (isGroupbuying) {
|
|
return item.stock !== 0 && item.groupStock !== 0;
|
|
}
|
|
return item.stock !== 0;
|
|
};
|
|
|
|
// 先找默认规格中库存不为0的
|
|
const defaultSku = values.find(item => item.isDefault && hasValidStock(item));
|
|
if (defaultSku) {
|
|
return defaultSku.sku.split(',');
|
|
}
|
|
|
|
// 再找非默认规格中库存不为0的
|
|
const nonDefaultSku = values.find(item => hasValidStock(item));
|
|
return nonDefaultSku ? nonDefaultSku.sku.split(',') : [];
|
|
},
|
|
|
|
/**
|
|
* 设置已选中的规格
|
|
* @param {Object} productSelect - 选中的商品规格信息
|
|
*/
|
|
setCheckedAttr(productSelect) {
|
|
const attrs = {
|
|
name: this.productInfo.name,
|
|
image: productSelect.image,
|
|
price: productSelect.price,
|
|
stock: productSelect.stock,
|
|
unique: productSelect.id,
|
|
cart_num: 1,
|
|
vipPrice: productSelect.vipPrice,
|
|
otPrice: productSelect.otPrice,
|
|
groupPrice: productSelect.groupPrice,
|
|
groupStock: productSelect.groupStock,
|
|
isPaidMember: this.productInfo.isPaidMember,
|
|
redeemIntegral: productSelect.redeemIntegral,
|
|
cost: productSelect.cost
|
|
};
|
|
|
|
Object.entries(attrs).forEach(([key, value]) => {
|
|
this.$set(this.attr.productSelect, key, value);
|
|
});
|
|
|
|
this.$set(this, "attrTxt", "已选择");
|
|
},
|
|
|
|
/**
|
|
* 设置未选中规格的默认值
|
|
*/
|
|
noCheckedAttr() {
|
|
const attrs = {
|
|
name: this.productInfo.name,
|
|
image: this.productInfo.image,
|
|
price: this.productInfo.price,
|
|
stock: 0,
|
|
unique: this.productInfo.id,
|
|
cart_num: 1,
|
|
vipPrice: this.productInfo.vipPrice,
|
|
otPrice: this.productInfo.otPrice,
|
|
groupPrice: this.productInfo.groupPrice,
|
|
isPaidMember: this.productInfo.isPaidMember,
|
|
redeemIntegral: this.productInfo.redeemIntegral,
|
|
cost: this.productInfo.cost
|
|
};
|
|
|
|
Object.entries(attrs).forEach(([key, value]) => {
|
|
this.$set(this.attr.productSelect, key, value);
|
|
});
|
|
|
|
this.$set(this, "attrValue", "");
|
|
this.$set(this, "attrTxt", "请选择");
|
|
},
|
|
|
|
/**
|
|
* 设置默认选中的规格
|
|
*/
|
|
defaultSelect() {
|
|
const productAttr = this.attr.productAttr;
|
|
const productValues = Object.values(this.productValue);
|
|
|
|
// 获取有效的规格值
|
|
const value = this.getValidSku(productValues);
|
|
|
|
// 设置规格属性
|
|
if (value.length) {
|
|
productAttr.forEach((attr, index) => {
|
|
this.$set(attr, "index", value[index]);
|
|
});
|
|
}
|
|
|
|
// 处理规格选择结果
|
|
const productSelect = this.productValue[value.join(",")];
|
|
if (productSelect && productAttr.length) {
|
|
this.setCheckedAttr(productSelect);
|
|
this.$set(this, "attrValue", value.join(","));
|
|
this.$set(this, "attrTxt", "已选择");
|
|
} else {
|
|
this.noCheckedAttr();
|
|
}
|
|
// 更新商品价格
|
|
this.getProductPrice();
|
|
},
|
|
//获取被选中属性;
|
|
getCheckedValue: function() {
|
|
let productAttr = this.attr.productAttr;
|
|
let value = [];
|
|
for (let i = 0; i < productAttr.length; i++) {
|
|
for (let j = 0; j < productAttr[i].attrValues.length; j++) {
|
|
if (productAttr[i].index === productAttr[i].attrValues[j]) {
|
|
value.push(productAttr[i].attrValues[j]);
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
},
|
|
}
|
|
}; |