优化判断库存

This commit is contained in:
2026-04-22 10:21:58 +08:00
parent d5c42f2092
commit b637a6dea9

View File

@@ -58,12 +58,11 @@
限时折扣{{ limitDiscountCountdown }}</view>
<!-- <view class="limitDiscount" v-if="item.is_time_discount">
限时折扣{{ limitDiscountCountdown }}</view> -->
<view class="stock_warning" v-if="returnStockNumber(item)<=10&&returnStockNumber(item)>0">
<view class="stock_warning" v-if="showStockNumber(item)&& !showNoBuy(item)">
仅剩{{returnStockNumber(item)}}</view>
</view>
<view class="vifgoodsImg flex-center"
v-if="item.isSale == 0 || (item.isSaleTime == 0 && !item.isSaleTimeshow) || item.isSoldStock == 1 || returnStockNumber(item)<=0">
<view class="vifgoodsImg flex-center" v-if="showNoBuy(item)">
<image v-if="item.isSale == 0" src="@/static/ztt/icon_goods_yxj.svg"
style="width: 200rpx; height: 100%" mode=""></image>
<image v-else-if="item.isSaleTime == 0 && !item.isSaleTimeshow"
@@ -233,16 +232,11 @@
<!-- <view class="limitDiscount" v-if="item1.is_time_discount">
限时折扣{{ limitDiscountCountdown }}</view> -->
<view class="stock_warning" v-if="returnStockNumber(item1)<=10&&returnStockNumber(item1)>0">
<view class="stock_warning" v-if="showStockNumber(item1)&&!showNoBuy(item1)">
仅剩{{returnStockNumber(item1)}}</view>
</view>
<view class="vifgoodsImg" v-if="
item1.isSale == 0 ||
(item1.isSaleTime == 0 && !item1.isSaleTimeshow) ||
item1.isSoldStock == 1 ||
(returnStockNumber(item1)<=0)
">
<view class="vifgoodsImg" v-if="showNoBuy(item1)">
<image v-if="item1.isSale == 0" src="@/static/ztt/icon_goods_yxj.svg"
style="width: 200rpx; height: 100%" mode=""></image>
<image v-else-if="item1.isSaleTime == 0 && !item1.isSaleTimeshow"
@@ -396,193 +390,7 @@
</view>
<!-- 规格 -->
<up-popup :show="showShopsku" :round="20" mode="bottom" @close="(showShopsku = false), (pagemetashow = false)">
<view class="shop_sku">
<scroll-view scroll-y style="max-height: 60vh; width: 100%">
<view class="positionabsolute">
<up-icon name="close-circle" @click="
showShopsku = false;
pagemetashow = false;
" color="#000" size="25"></up-icon>
</view>
<up-swiper :list="specifications.item.images" @change="swiperChange" :current="swiperCurrent"
radius="6px" height="250"
@click="prveImgs(specifications.item.images, specifications.item.images[swiperCurrent])">
<!-- <template v-slot:default="{item}">
<image :src=item></image>
</templte> -->
</up-swiper>
<view class="shop_sku_name">{{ specifications.item.name }}</view>
<view class="shop_sku_description" v-if="isSkuGoods">
{{ specifications.item.shortTitle ? specifications.item.shortTitle : '' }}
</view>
<view v-if="specifications.item.type != 'package'">
<view class="shop_sku_box" v-for="(specOptions, specType) in specifications.item.selectSpecInfo"
:key="specType">
<view class="shop_sku_box_name">
{{ specType }}
</view>
<view class="flex-start">
<view class="shop_sku_box_item" v-for="option in specOptions" :key="option"
@click="selectSpec(specType, option)" :class="{
shop_sku_box_item_selected: isSkuSelected(specType, option)
}">
{{ option }}
<view class="shop_sku_box_item_tip"
v-if="specifications.item.result && specifications.item.result.isSoldStock == 1 && selectedSpecs[specType] === option">
<view>售罄</view>
</view>
<view class="shop_sku_box_item_tip"
v-if="specifications.item.result == 'kong' && canSubmit == false && selectedSpecs[specType] === option">
<view>已下架</view>
</view>
</view>
</view>
</view>
</view>
<!-- 套餐 -->
<view v-else>
<view class="shop_sku_box">
<view v-for="(setmenu, setmenuindex) in specifications.item.groupSnap" :key="setmenuindex">
<view class="shop_sku_box_name">{{ setmenu.title }} {{ setmenu.count }}
选{{ setmenu.number }}</view>
<view class="flex-start">
<view class="shop_sku_box_item" v-for="(option, goodsid) in setmenu.goods"
:key="goodsid" @click="goodsidClick(setmenuindex, option, goodsid)" :class="{
shop_sku_box_item_selected: isOptionSelected(setmenuindex, option)
}" :disabled="isMaxSelected(setmenuindex) && !isOptionSelected(setmenuindex, option)">
{{ option.proName }}
<text v-if="option.unitName">/{{ option.unitName }}</text>
<view class="shop_sku_box_item_tip" v-if="specifications.item.isSoldStock == 1">
<view>售罄</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 推荐搭配 -->
<view class="u-m-t-48 u-p-30">
<view class="font-bold u-font-32 ">推荐搭配</view>
<view class="u-flex recommand-goods">
<view class=" item" v-for="(item,index) in 6" :key="index">
<up-image width="210rpx" height="210rpx" radius="12rpx"></up-image>
<view class="info">
<view class="u-line-2 name u-m-t-10 u-font-32 font-500">
商品名
</view>
<view class="u-flex u-row-between">
<view class="font-bold">
<text class="u-font-24">¥</text>
<text class="u-font-32">40</text>
</view>
<view class="btn">
<up-icon name="plus-circle-fill" color="#E9AB7A" size="25"></up-icon>
</view>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
<!-- 占位 -->
<view class="shop_bottom">
<view class="flex-between">
<view class="price price-sku"
v-if="specifications.item.type != 'package' && specifications.item.result">
<text class="i">¥</text>
<view class="num">
<GoodsPrice :limitDiscount="cartStore.limitTimeDiscount"
:cart="specifications.item.result" :shopUserInfo="shopUserInfo"
:shopInfo="shopInfo"></GoodsPrice>
</view>
<text class="num" v-if="false">
{{
shopUserInfo.isVip == 1 && shopUserInfo.isMemberPrice == 1
? specifications.item.result.memberPrice || specifications.item.result.salePrice
: specifications.item.result.salePrice
}}
</text>
<text class="i"
v-if="specifications.item.unitName">/{{ specifications.item.unitName }}</text>
<text
v-if="specifications.item.result.suitNum > 1">「{{ specifications.item.result.suitNum }}{{ specifications.item.result.unitName }}起点」</text>
</view>
<view class="price price-package" v-else>
<text class="i">¥</text>
<view class="num">
<GoodsPrice :limitDiscount="cartStore.limitTimeDiscount" :cart="specifications.item"
:shopUserInfo="shopUserInfo" :shopInfo="shopInfo"></GoodsPrice>
</view>
<text class="num" v-if="false">
{{
shopUserInfo.isVip == 1 && shopUserInfo.isMemberPrice == 1
? specifications.item.memberPrice || specifications.item.salePrice
: specifications.item.salePrice
}}
</text>
<text class="i"
v-if="specifications.item.unitName">/{{ specifications.item.unitName }}</text>
<text
v-if="specifications.item.suitNum > 1">「{{ specifications.item.suitNum }}{{ specifications.item.unitName }}起点」</text>
</view>
<view class="operation-wrap"
v-if="specifications.item.type != 'package'&&stockNumberIsFull(specifications.item)">
<view class="btn">
<up-icon name="minus-circle-fill" color="#E9AB7A" size="25"
v-if="shopCartNumber > 0"></up-icon>
<view class="btnClick" @click="shopCart('-')"></view>
</view>
<text class="num">{{ shopCartNumber }}</text>
<view class="btn">
<up-icon name="plus-circle-fill" color="#E9AB7A" size="25"></up-icon>
<view class="btnClick" @click="shopCart('+')"></view>
</view>
</view>
</view>
<view class="shop_skuselect flex-start" v-if="selectedSpecsStr">
<view class="shop_skuselectname">{{ selectedSpecsStr }}</view>
</view>
<template v-if="!stockNumberIsFull(specifications.item)">
<view class="addShopping">
库存不足
</view>
</template>
<template v-else>
<template v-if="isSkuGoods">
<view v-if="specifications.item.type == 'package'" class="addShopping"
:class="shopCartNumber > 0 && allConditionsSatisfied ? 'active' : ''"
@click="submitSelection()">
{{ skuBtnText }}
</view>
<view v-else class="addShopping" :class="shopCartNumber > 0 && canSubmit ? 'active' : ''"
@click="submitSelection()">
{{ skuBtnText }}
</view>
</template>
<template v-else>
<view class="addShopping" :class="shopCartNumber > 0 ? 'active' : ''"
@click="submitSelection()">
{{ skuBtnText }}
</view>
</template>
</template>
</view>
</view>
</up-popup>
<view class="history_order" @click="toHistory"
v-if="shopInfo && shopInfo.registerType == 'after' && orderinfo.id">
<image class="img" src="@/static/history.png" mode=""></image>
@@ -754,6 +562,32 @@
productStore
} from '@/stores/user.js';
// 是否显示禁止购买
function showNoBuy(item) {
if (item.isSale == 0) {
return true
}
if (item.isSaleTime == 0 && !item.isSaleTimeshow) {
return true
}
if (item.isSoldStock == 1) {
return true
}
if(item.type==="single"){
const sku=item.skuList[0]
if(!sku){
return true
}
if(sku&&returnStockNumber(item)<sku.suitNum){
return true
}
}
if (returnStockNumber(item) <= 0) {
return true
}
return false
}
const storeMemberpay = Memberpay();
const store = useNavbarStore();
// 动态更新导航栏配置
@@ -1096,8 +930,6 @@
return false
}
/*商品区域轮播图 end*/
// 点击详情
const showShopsku = ref(false);
// 规格信息
const specifications = reactive({
@@ -1392,7 +1224,7 @@
}
console.log('specifications.item', specifications.item);
const number = await calculateValue(res.cartNumber, '+', shopCartNumber.value)
const oldGoodsArr = combineOrderInfoDetailMap(orderinfo.value)
if (oldGoodsArr.find(v => v.productId == specifications.item.id)) {
// 等待用户点击
@@ -1403,7 +1235,7 @@
if (!isConfirm) {
return
}
}else{
} else {
if (res && number * 1 === 2) {
const isConfirm = await showConfirmModal(
'购物车已有该商品,请确认是否重复',
@@ -1412,7 +1244,7 @@
if (!isConfirm) {
return
}
}
}
@@ -1437,7 +1269,6 @@
});
// 清空套餐选中
selectedGroupSnap.value = [];
showShopsku.value = false;
} else {
const number = await calculateValue(res.cartNumber, '+', shopCartNumber.value)
const oldGoodsArr = combineOrderInfoDetailMap(orderinfo.value)
@@ -1450,7 +1281,7 @@
if (!isConfirm) {
return
}
}else{
} else {
if (res && number * 1 === 2) {
const isConfirm = await showConfirmModal(
'购物车已有该商品,请确认是否重复',
@@ -1461,8 +1292,8 @@
}
}
}
websocketsendMessage({
id: res ? res.cartListId : '',
type: 'shopping',
@@ -1478,7 +1309,6 @@
product_type: specifications.item.type,
is_time_discount: showLimitDiscount(specifications.item)
});
showShopsku.value = false;
return;
}
@@ -1593,7 +1423,6 @@
.filter(([_, value]) => value.length > 0));
// 给默认数量
specifications.item.amountcartNumber = 0;
// showShopsku.value = true;
goodsModalList.value.push({
show: true,
goods: {
@@ -1717,8 +1546,16 @@
}
const number = await calculateValue(item.cartNumber, i, suitNum)
const goodsStockNumber = returnStockNumber(item)
console.log('number', number);
if (i === '+') {
if (goodsStockNumber < suitNum) {
return uni.showToast({
title: '库存不足',
icon: 'none'
})
}
const oldGoodsArr = combineOrderInfoDetailMap(orderinfo.value)
if (oldGoodsArr.find(v => v.productId == item.id)) {
// 等待用户点击
@@ -1729,7 +1566,7 @@
if (!isConfirm) {
return
}
}else{
} else {
if (number * 1 == 2) {
const isConfirm = await showConfirmModal(
'购物车已有该商品,请确认是否重复',
@@ -1740,7 +1577,7 @@
}
}
}
}
@@ -2760,25 +2597,31 @@
}
const consStockList = ref([])
// 是否显示剩余库存数量
function showStockNumber(item) {
return !item.isSoldStock && returnStockNumber(item) <= 10 && returnStockNumber(item) > 0
}
function returnStockNumber(item) {
if(!item.isAutoSoldStock){
if (!item.isAutoSoldStock) {
return 9999
}
const consList = item.consList
const matchStockList = consStockList.value.filter(v => {
return consList.find(c => c.consInfoId == v.consId)
}).map(v=>{
const cItem=item.consList.find(c=>c.consInfoId==v.consId)
const goodsNumber=Math.floor(v.stockNumber/cItem.surplusStock)
}).map(v => {
const cItem = item.consList.find(c => c.consInfoId == v.consId)
const goodsNumber = Math.floor(v.stockNumber / cItem.surplusStock)
return {
...v,
goodsNumber
}
}).sort((a,b)=>{
return a.goodsNumber-b.goodsNumber
}).sort((a, b) => {
return a.goodsNumber - b.goodsNumber
})
const minConsStockNumber=matchStockList[0]?matchStockList[0].goodsNumber:9999
const minConsStockNumber = matchStockList[0] ? matchStockList[0].goodsNumber : 9999
return minConsStockNumber
}
onLoad(async (e) => {
@@ -2812,8 +2655,7 @@
}
options.initMessage.shop_id = userStore.shopInfo.id
shopUserInfo.value = userStore.shopUserInfo
//耗材列表
await getConsStocks()
await productqueryProduct();
const extraInitPar = {}
@@ -2951,6 +2793,9 @@
// if(!topArr.value.length){
// getElementTop()
// }
//耗材列表
await getConsStocks()
});
//是否自动关闭socket