|
@@ -27,7 +27,39 @@
|
|
<!-- 购买数量- 库存 -->
|
|
<!-- 购买数量- 库存 -->
|
|
<div class="modal-content">
|
|
<div class="modal-content">
|
|
<!-- 只展示库存 -->
|
|
<!-- 只展示库存 -->
|
|
- <div v-if="props.goodsType === 99" class="parameterColor mb-10"><span class="l-s-10">库存</span>:{{ totalStock }}</div>
|
|
|
|
|
|
+ <div v-if="props.goodsType === 99" class="mb-7">
|
|
|
|
+ <div class="parameterColor mb-3"><span class="l-s-10">库存</span>:{{ totalStock }}</div>
|
|
|
|
+ <!-- 我要房券 -->
|
|
|
|
+ <div v-if="showPrize">
|
|
|
|
+ <v-checkbox-btn
|
|
|
|
+ v-model="isGetPrize"
|
|
|
|
+ color="primary"
|
|
|
|
+ label="我要房券"
|
|
|
|
+ class="ml-n3"
|
|
|
|
+ :disabled="false"
|
|
|
|
+ hide-details
|
|
|
|
+ @update:modelValue="isGetPrizeChange"
|
|
|
|
+ ></v-checkbox-btn>
|
|
|
|
+ <div v-if="showPrize && noCity" style="color: gray;" class="ma-3">房券已被抢完啦</div>
|
|
|
|
+ <div v-show="isGetPrize" class="ml-7">
|
|
|
|
+ <div class="getPrizeTip">{{ $t('mall.getPrizeTip') }}</div>
|
|
|
|
+ <v-card :loading="getPrizeLoading" elevation="0" class="prizeArea">
|
|
|
|
+ <v-checkbox
|
|
|
|
+ v-model="choose"
|
|
|
|
+ v-for="(item, index) of prizeAreaList"
|
|
|
|
+ :key="item+index"
|
|
|
|
+ color="primary"
|
|
|
|
+ class="mr-3"
|
|
|
|
+ :label="item"
|
|
|
|
+ :value="item"
|
|
|
|
+ density="compact"
|
|
|
|
+ :disabled="choose.length > 2 && !choose.includes(item)"
|
|
|
|
+ hide-details
|
|
|
|
+ ></v-checkbox>
|
|
|
|
+ </v-card>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
<div v-else class="d-flex align-center mb-10">
|
|
<div v-else class="d-flex align-center mb-10">
|
|
<div class="buyCount mr-3">
|
|
<div class="buyCount mr-3">
|
|
<span class="parameterColor"><span class="l-s-10">数量</span>:</span>
|
|
<span class="parameterColor"><span class="l-s-10">数量</span>:</span>
|
|
@@ -46,8 +78,8 @@
|
|
</div>
|
|
</div>
|
|
<!-- 操作区 -->
|
|
<!-- 操作区 -->
|
|
<div>
|
|
<div>
|
|
- <v-btn color="primary" width="200" @click="onBuy">立即购买</v-btn>
|
|
|
|
- <v-btn class="ml-3" color="warning" width="200" @click="onAddCart">加入购物车</v-btn>
|
|
|
|
|
|
+ <v-btn class="mr-3" color="primary" width="200" @click="onBuy">立即购买</v-btn>
|
|
|
|
+ <v-btn v-if="props.goodsType !== 99" color="warning" width="200" @click="onAddCart">加入购物车</v-btn>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
@@ -58,6 +90,8 @@
|
|
import suNumberBox from '@/components/FormUI/su-number-box/su-number-box.vue'
|
|
import suNumberBox from '@/components/FormUI/su-number-box/su-number-box.vue'
|
|
import { computed, reactive, watch, ref } from 'vue'
|
|
import { computed, reactive, watch, ref } from 'vue'
|
|
import { convertProductPropertyList } from '@/views/mall/utils'
|
|
import { convertProductPropertyList } from '@/views/mall/utils'
|
|
|
|
+ import { getPrizeAreaByGoodsId } from '@/api/mall/prize'
|
|
|
|
+ import { toNumber } from 'lodash-es'
|
|
|
|
|
|
const emits = defineEmits(['change', 'addCart', 'buy', 'close']);
|
|
const emits = defineEmits(['change', 'addCart', 'buy', 'close']);
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
@@ -69,8 +103,14 @@
|
|
type: Number,
|
|
type: Number,
|
|
default: 0,
|
|
default: 0,
|
|
},
|
|
},
|
|
|
|
+ showPrize: { // 是否可以抽取房券
|
|
|
|
+ type: Boolean,
|
|
|
|
+ default: false,
|
|
|
|
+ },
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+ const isGetPrize = ref(false)
|
|
|
|
+
|
|
const totalStock = ref(props.goodsInfo?.stock-0 || 0)
|
|
const totalStock = ref(props.goodsInfo?.stock-0 || 0)
|
|
const state = reactive({
|
|
const state = reactive({
|
|
selectedSku: {}, // 选中的 SKU
|
|
selectedSku: {}, // 选中的 SKU
|
|
@@ -119,6 +159,11 @@
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (isGetPrize.value && !choose.value?.length) {
|
|
|
|
+ Snackbar.warning('请勾选期望获赠房券的所在地!')
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
emits('addCart', state.selectedSku);
|
|
emits('addCart', state.selectedSku);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -132,7 +177,7 @@
|
|
Snackbar.warning('库存不足')
|
|
Snackbar.warning('库存不足')
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- emits('buy', state.selectedSku);
|
|
|
|
|
|
+ emits('buy', { ...state.selectedSku, city: choose.value });
|
|
}
|
|
}
|
|
|
|
|
|
// 改变禁用状态:计算每个 property 属性值的按钮,是否禁用
|
|
// 改变禁用状态:计算每个 property 属性值的按钮,是否禁用
|
|
@@ -278,6 +323,45 @@
|
|
if (e.values && e.values.length) onSelectSku(e.id, e.values[0].id)
|
|
if (e.values && e.values.length) onSelectSku(e.id, e.values[0].id)
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ const choose = ref([])
|
|
|
|
+ const noCity = ref(false)
|
|
|
|
+ // const getPrizeLoading = ref(false)
|
|
|
|
+ const prizeAreaList = ref([])
|
|
|
|
+ // 根据商品id活动对应的奖品区域信息
|
|
|
|
+ const getAreaData = async () => {
|
|
|
|
+ const id = props.goodsInfo?.id
|
|
|
|
+ if (!id) return
|
|
|
|
+ const params = {
|
|
|
|
+ spuId: id,
|
|
|
|
+ type: 'city',
|
|
|
|
+ }
|
|
|
|
+ // getPrizeLoading.value = true
|
|
|
|
+ const data = await getPrizeAreaByGoodsId(params)
|
|
|
|
+ if (!data || !Object.keys(data).length) {
|
|
|
|
+ noCity.value = true
|
|
|
|
+ isGetPrize.value = false
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let list = [] // 只显示还有库存的城市
|
|
|
|
+ Object.keys(data).forEach(cityName => {
|
|
|
|
+ if (data[cityName]?.length) {
|
|
|
|
+ let total = 0
|
|
|
|
+ data[cityName].forEach(i => { if (i.total) total+= toNumber(i.total) })
|
|
|
|
+ if (total) list.push(cityName)
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ prizeAreaList.value = [...new Set(list)]
|
|
|
|
+ // getPrizeLoading.value = false
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const isGetPrizeChange = (bool) => {
|
|
|
|
+ if (!bool) {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ getAreaData()
|
|
|
|
+ }
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
@@ -410,4 +494,13 @@
|
|
content: '¥';
|
|
content: '¥';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ .getPrizeTip {
|
|
|
|
+ font-size: 13px;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ text-decoration: underline;
|
|
|
|
+ }
|
|
|
|
+ .prizeArea {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+ }
|
|
</style>
|
|
</style>
|