Files
MER-2.2_2601/mer_uniapp/mixins/productAttr.js
2026-03-08 20:07:52 +08:00

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;
},
}
};