|
|
@@ -1,7 +1,8 @@
|
|
|
<!--
|
|
|
商品详情选规格/数量弹层
|
|
|
用途:加购或立即购买前选择规格与数量;秒杀会按限购、活动库存收紧可选上限;
|
|
|
- 无价格商品作为秒杀时按活动价允许加购/购买,不拦截询价
|
|
|
+ 无价格商品作为秒杀时按活动价允许加购/购买,不拦截询价;
|
|
|
+ 秒杀挂在某个规格 SKU 上时只展示该规格名(不可切换),不与主商品 specList 叠两套 UI
|
|
|
使用方:pages/goods/detail
|
|
|
-->
|
|
|
<template>
|
|
|
@@ -11,7 +12,8 @@
|
|
|
<view class="tui-popup-box">
|
|
|
<scroll-view scroll-y class="tui-popup-scroll">
|
|
|
<view class="tui-scrolldiv-box">
|
|
|
- <view v-if="info.specEnabled == 1" class="spec-list">
|
|
|
+ <!-- 主商品多规格:可切换;秒杀挂在某个规格 SKU 上时走下方只读展示,避免两套规格区叠出 -->
|
|
|
+ <view v-if="showSwitchableSpec" class="spec-list">
|
|
|
<view class="tui-attr-title">规格</view>
|
|
|
<button v-for="(spec,index) in info.specList" :key="spec.id" class="spec-button" :class="{active:selIndex===index}" @click="selectSpec(index)">{{spec.specName}}</button>
|
|
|
</view>
|
|
|
@@ -39,10 +41,10 @@
|
|
|
</view>
|
|
|
</scroll-view>
|
|
|
<view class="tui-popup-btn">
|
|
|
- <button v-if="mode === 'cart'" class="button-com red enhanced-btn" @click="addCartFn">
|
|
|
+ <button v-if="mode === 'cart'" class="button-com enhanced-btn" @click="addCartFn">
|
|
|
加入购物车
|
|
|
</button>
|
|
|
- <button v-else class="button-com red enhanced-btn" @click="nextFn">
|
|
|
+ <button v-else class="button-com enhanced-btn" @click="nextFn">
|
|
|
下一步
|
|
|
</button>
|
|
|
</view>
|
|
|
@@ -132,11 +134,19 @@ export default {
|
|
|
/**
|
|
|
* 是否为挂在主商品下的规格 SKU(masterId/master 不为 0)
|
|
|
* 与主商品开启 specEnabled 选规格不同:此时详情页就是某一个规格本身
|
|
|
+ * 秒杀常挂在某个规格上,接口仍可能带回主商品 specEnabled/specList,两套 UI 必须互斥
|
|
|
*/
|
|
|
isMasterSpecSku() {
|
|
|
const master = this.info.masterId != null ? this.info.masterId : this.info.master;
|
|
|
return master != null && String(master) !== '0' && Number(master) > 0;
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 是否展示可切换规格列表
|
|
|
+ * 仅主商品多规格展示;当前页已是某个规格 SKU 时不展示,避免和只读规格名叠两套
|
|
|
+ */
|
|
|
+ showSwitchableSpec() {
|
|
|
+ return this.info.specEnabled == 1 && !this.isMasterSpecSku;
|
|
|
+ },
|
|
|
/** 主商品 id:规格 SKU 场景下用于购物车 goodsId */
|
|
|
masterGoodsId() {
|
|
|
if (!this.isMasterSpecSku) return 0;
|
|
|
@@ -144,10 +154,11 @@ export default {
|
|
|
return Number(master) || 0;
|
|
|
},
|
|
|
maxStock() {
|
|
|
- const spec = this.info.specEnabled == 1 && this.info.specList ? this.info.specList[this.selIndex] : this.info;
|
|
|
+ // 规格 SKU 详情(含秒杀挂在该规格上)按当前商品库存,不用主商品 specList
|
|
|
+ const spec = this.showSwitchableSpec && this.info.specList ? this.info.specList[this.selIndex] : this.info;
|
|
|
let max = Number(spec && spec.stockSet == 1 ? spec.stock : 9999) || 9999;
|
|
|
// 多规格按当前规格库存限制;主记录承载首规格后,不能再用主记录库存截断其他规格
|
|
|
- if (this.info.specEnabled != 1) {
|
|
|
+ if (!this.showSwitchableSpec) {
|
|
|
const goodsStock = Number(this.info && this.info.stock);
|
|
|
if (goodsStock > 0) {
|
|
|
max = Math.min(max, goodsStock);
|
|
|
@@ -191,12 +202,14 @@ export default {
|
|
|
};
|
|
|
},
|
|
|
getSelectedSpec() {
|
|
|
- let spec = this.info.specEnabled == 1 ? this.info.specList[this.selIndex] : null;
|
|
|
- // 详情本身是规格 SKU:没有 specList 可选,直接把当前商品当作规格带上
|
|
|
- if (!spec && this.isMasterSpecSku) {
|
|
|
+ let spec = null;
|
|
|
+ // 详情本身就是规格 SKU:以当前商品为准,避免秒杀规格仍带回 specList 时误用首规格
|
|
|
+ if (this.isMasterSpecSku) {
|
|
|
spec = this.buildMasterSpecPayload();
|
|
|
+ } else if (this.info.specEnabled == 1) {
|
|
|
+ spec = this.info.specList[this.selIndex];
|
|
|
}
|
|
|
- if (this.info.specEnabled == 1 && !spec) {
|
|
|
+ if (this.showSwitchableSpec && !spec) {
|
|
|
this.$msg('请选择规格');
|
|
|
return null;
|
|
|
}
|
|
|
@@ -349,7 +362,7 @@ export default {
|
|
|
padding: 0;
|
|
|
|
|
|
&.enhanced-btn {
|
|
|
- background: linear-gradient(135deg, #ff4757 0%, #e41f19 100%);
|
|
|
+ background: #FF4D6D;
|
|
|
border: none;
|
|
|
color: #fff;
|
|
|
}
|