修复库存回显问题,修复多次加菜弹窗问题

This commit is contained in:
2026-04-13 18:12:46 +08:00
parent 2db9f6811a
commit dbe74f6486
8 changed files with 92 additions and 81 deletions

View File

@@ -8,9 +8,9 @@
:height="height" :height="height"
:maxCount="maxCount" :maxCount="maxCount"
> >
<template #default v-if="$slots.default"> <!-- <template #default v-if="$slots.default">
<slot></slot> <slot></slot>
</template> </template> -->
</up-upload> </up-upload>
</template> </template>

View File

@@ -42,7 +42,8 @@ async function getProductListAjax() {
mask: true mask: true
}); });
const res = await getProductList(); const res = await getProductList();
list.value = res.productList; console.log('res',res);
list.value = res;
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }

View File

@@ -145,7 +145,7 @@
let obj = pageData.types.find(item=> item.value == e) let obj = pageData.types.find(item=> item.value == e)
return obj.name return obj.name
} }
let selArr=[]
getGoods() getGoods()
/** /**
* 获取商品列表 * 获取商品列表
@@ -200,7 +200,6 @@
const show = ref(props.modelValue) const show = ref(props.modelValue)
let selArr=[]
let $selGoodsMap={} let $selGoodsMap={}
async function open(arr) { async function open(arr) {

View File

@@ -75,7 +75,7 @@
<up-radio v-for="(item,index) in tuiStockTypes" :key="index" :label="item.label" <up-radio v-for="(item,index) in tuiStockTypes" :key="index" :label="item.label"
:name="item.key"></up-radio> :name="item.key"></up-radio>
</up-radio-group> </up-radio-group>
<view class="color-red u-m-t-10">当前店铺退菜退库存规则跟随商品分类</view> <view class="color-red u-m-t-10">当前店铺退菜退库存规则{{nowRefundRule}}</view>
</view> </view>
</view> </view>
@@ -143,7 +143,13 @@
} }
} }
}) })
const shopInfo=uni.getStorageSync('shopInfo')
const nowRefundRule=computed(()=>{
if(!shopInfo||!shopInfo.refundMode){
return ''
}
return shopInfo.refundMode==1?'跟随商品分类':'跟随单商品'
})
const pageData = reactive({ const pageData = reactive({
isBindGuige: false, //是否绑定至规格 isBindGuige: false, //是否绑定至规格
}) })

View File

@@ -31,7 +31,7 @@
<view class="u-flex u-row-between"> <view class="u-flex u-row-between">
<view>上传图片</view> <view>上传图片</view>
</view> </view>
<view class="u-m-t-16"> <view class="u-m-t-16" >
<my-up-upload :maxCount="1" :multiple="false" v-model="form.coverImg"></my-up-upload> <my-up-upload :maxCount="1" :multiple="false" v-model="form.coverImg"></my-up-upload>
</view> </view>
</view> </view>

View File

@@ -3,7 +3,7 @@
<up-image :src="data.coverImg" mode="aspectFill" :width="img.width" :height="img.height"></up-image> <up-image :src="data.coverImg" mode="aspectFill" :width="img.width" :height="img.height"></up-image>
<view class="info u-flex u-row-between u-col-top u-flex-col"> <view class="info u-flex u-row-between u-col-top u-flex-col">
<view class="limit-discount" v-if="is_time_discount">限时折扣</view> <view class="limit-discount" v-if="is_time_discount">限时折扣</view>
<view class="nowStockerNumber" v-if="nowStockerNumber<=10"> <view class="nowStockerNumber" v-if="data.isAutoSoldStock&&nowStockerNumber<=10&&nowStockerNumber>0">
剩余库存{{nowStockerNumber}} 剩余库存{{nowStockerNumber}}
</view> </view>
<view> <view>
@@ -172,7 +172,7 @@
}) })
// 1. 筛选匹配的耗材列表 // 1. 筛选匹配的耗材列表,增加对应商品数量
const conslist=computed(()=>{ const conslist=computed(()=>{
if(props.consStockList.length<=0){ if(props.consStockList.length<=0){
return [] return []
@@ -181,37 +181,27 @@
return props.data.consList.find(i =>{ return props.data.consList.find(i =>{
return i.consInfoId == v.consId return i.consInfoId == v.consId
}); });
}); }).map(v=>{
}) const cItem=props.data.consList.find(c=>c.consInfoId==v.consId)
// 2. 找到 stockNumber 最小的那一项 const goodsNumber=Math.floor(v.stockNumber/cItem.surplusStock)
const minConsItem=computed(()=>{ console.log('props.data',props.data.name);
if(conslist.value.length<=0){ console.log('goodsNumber',goodsNumber);
return null return {
} ...v,
return conslist.value.reduce((prev, current) => { goodsNumber
return prev.stockNumber < current.stockNumber ? prev : current; }
}); }).sort((a,b)=>{
}) return a.goodsNumber-b.goodsNumber
// 3. 找到和 minItem 的 consId 一样的那个消耗配置项 })
const targetCons=computed(()=>{
if(!minConsItem.value){
return null
}
return props.data.consList.find(i => i.consInfoId == minConsItem.value.consId);
}) })
const nowStockerNumber=computed(()=>{ const nowStockerNumber=computed(()=>{
if(!targetCons.value||!minConsItem.value){ return conslist.value[0]?conslist.value[0].goodsNumber:9999
return 9999
}
return Math.floor(minConsItem.value.stockNumber/targetCons.value.surplusStock)
}) })
function consStockisFull(item) { function consStockisFull(item) {
// 无数据直接返回 true或按你需求返回 false if(!item.isAutoSoldStock){
if (!conslist.value.length) return true; return true
}
if(!minConsItem.value)return true;
if(!targetCons.value) return true;
// 4. 判断:最小库存 > 每份消耗库存 → 返回 true否则 false // 4. 判断:最小库存 > 每份消耗库存 → 返回 true否则 false
if (nowStockerNumber.value>=1) { if (nowStockerNumber.value>=1) {

View File

@@ -409,7 +409,7 @@
} }
const allHistoryOrder=ref([]) const allHistoryOrder = ref([])
/** /**
* 获取订单详情 * 获取订单详情
*/ */
@@ -432,7 +432,7 @@
console.log("data.historyOrder===", data.historyOrder); console.log("data.historyOrder===", data.historyOrder);
allHistoryOrder.value = data.historyOrder.map((item) => { allHistoryOrder.value = data.historyOrder.map((item) => {
return [...item.info]; return [...item.info];
}).flat(); }).flat();
@@ -838,29 +838,34 @@
//更新 //更新
let cartItem = cars[goodsInCarIndex]; let cartItem = cars[goodsInCarIndex];
let number = isAdd ? cartItem.number + 1 : +cartItem.number - 1; let number = isAdd ? cartItem.number + 1 : +cartItem.number - 1;
if(isAdd){ if (isAdd) {
if (number == 2 ) { if (allHistoryOrder.value.find(v => v.productId == $goods.id)) {
// 等待用户点击
const isConfirm = await showConfirmModal(
'购物车已有该商品,请确认是否重复',
'菜名名称:《' + $goods.name + '》'
);
if (!isConfirm) {
return
}
}
if(allHistoryOrder.value.find(v=>v.productId==$goods.id)){
// 等待用户点击 // 等待用户点击
const isConfirm = await showConfirmModal( const isConfirm = await showConfirmModal(
'该商品已下单过,请确认是否重复', '该商品已下单过,请确认是否重复',
'菜名称:《' + $goods.name + '》' '菜名称:《' + $goods.name + '》'
); );
if (!isConfirm) { if (!isConfirm) {
return return
} }
}else{
if (number == 2) {
// 等待用户点击
const isConfirm = await showConfirmModal(
'购物车已有该商品,请确认是否重复',
'菜品名称:《' + $goods.name + '》'
);
if (!isConfirm) {
return
}
}
} }
} }
if (!isAdd) { if (!isAdd) {
if (number === 0 || number < suitNum) { if (number === 0 || number < suitNum) {
//移除 //移除
@@ -901,11 +906,11 @@
return; return;
} }
} }
if(allHistoryOrder.value.find(v=>v.productId==$goods.id)){ if (allHistoryOrder.value.find(v => v.productId == $goods.id)) {
// 等待用户点击 // 等待用户点击
const isConfirm = await showConfirmModal( const isConfirm = await showConfirmModal(
'该商品已下单过,请确认是否重复', '该商品已下单过,请确认是否重复',
'菜名称:《' + $goods.name + '》' '菜名称:《' + $goods.name + '》'
); );
if (!isConfirm) { if (!isConfirm) {
return return
@@ -1144,28 +1149,27 @@
let cartId = carGoods.id; let cartId = carGoods.id;
let suitNum = goods.skuList[0].suitNum || 1; let suitNum = goods.skuList[0].suitNum || 1;
let newNumber = carGoods.number * 1 + suitNum; let newNumber = carGoods.number * 1 + suitNum;
if (newNumber == 2&&carGoods.number<newNumber) {
if (allHistoryOrder.value.find(v => v.productId == goods.id)) {
// 等待用户点击 // 等待用户点击
const isConfirm = await showConfirmModal( const isConfirm = await showConfirmModal(
'请确认当前菜品是否已上菜?', '该商品已下单过,请确认是否重复',
'菜名名称' + goods.name + '' '菜品名称:《' + goods.name + '》'
); );
if (!isConfirm) { if (!isConfirm) {
return return
} }
}else{
if(allHistoryOrder.value.find(v=>v.productId==goods.id)){ if (newNumber == 2 && carGoods.number < newNumber) {
// 等待用户点击 // 等待用户点击
const isConfirm = await showConfirmModal( const isConfirm = await showConfirmModal(
'该商品已下单过,请确认是否重复', '购物车已有该商品,请确认是否重复?',
'菜名称:《' + goods.name + '》' '菜名称:《' + goods.name + '》'
); );
if (!isConfirm) { if (!isConfirm) {
return return
} }
} }
} }
editCart({ editCart({
id: cartId, id: cartId,
@@ -1182,11 +1186,11 @@
data.isGoodsAdd = false; data.isGoodsAdd = false;
} else { } else {
if(allHistoryOrder.value.find(v=>v.productId==goods.id)){ if (allHistoryOrder.value.find(v => v.productId == goods.id)) {
// 等待用户点击 // 等待用户点击
const isConfirm = await showConfirmModal( const isConfirm = await showConfirmModal(
'该商品已下单过,请确认是否重复', '该商品已下单过,请确认是否重复',
'菜名称:《' + goods.name + '》' '菜名称:《' + goods.name + '》'
); );
if (!isConfirm) { if (!isConfirm) {
return return

View File

@@ -12,7 +12,8 @@
</view> </view>
<view class="u-flex"> <view class="u-flex">
<view> <view>
<text :class="[data.status]">{{$dict.getDiceName(data.status,'orderStatus')}}{{data.refundType?'['+$dict.getDiceName(data.refundType,'refundType')+']':''}}</text> <text
:class="[data.status]">{{$dict.getDiceName(data.status,'orderStatus')}}{{data.refundType?'['+$dict.getDiceName(data.refundType,'refundType')+']':''}}</text>
</view> </view>
<view class="line"></view> <view class="line"></view>
<view class=" color-main"> <view class=" color-main">
@@ -33,13 +34,18 @@
<view class="" v-for="(item,index) in data.goods" :key="index"> <view class="" v-for="(item,index) in data.goods" :key="index">
<view class="u-flex u-row-between u-col-top u-m-t-32" v-if="item.productId!=-999"> <view class="u-flex u-row-between u-col-top u-m-t-32" v-if="item.productId!=-999">
<view> <view>
<view class=""> {{item.productName}}</view> <view class="">
<text>{{item.productName}}</text>
</view>
<view class="color-999 u-font-24 u-m-t-8"> <view class="color-999 u-font-24 u-m-t-8">
{{item.skuName}} {{item.skuName}}
</view> </view>
</view> </view>
<view class="u-flex u-flex-1 u-row-right" style="align-items: center;"> <view class="u-flex u-flex-1 u-row-right" style="align-items: center;">
<view style="margin-right: 10rpx;">×{{item.num}}</view> <view style="margin-right: 10rpx;">
<text>×{{item.num}}</text>
<text class="color-red u-m-l-10 font-bold" v-if="item.returnNum">(退{{item.returnNum}})</text>
</view>
<view class="u-text-right u-relative" :style="computedPriceStyle()"> <view class="u-text-right u-relative" :style="computedPriceStyle()">
<text>{{item.unitPrice}}</text> <text>{{item.unitPrice}}</text>
</view> </view>
@@ -56,7 +62,7 @@
<view class="no-wrap u-m-r-32">打包费</view> <view class="no-wrap u-m-r-32">打包费</view>
<view>{{data.packFee||0}}</view> <view>{{data.packFee||0}}</view>
</view> </view>
<view style="height: 32rpx;" ></view> <view style="height: 32rpx;"></view>
<view class="u-flex u-row-between u-col-top" v-if="data.seatInfo&&data.seatInfo.priceAmount>0"> <view class="u-flex u-row-between u-col-top" v-if="data.seatInfo&&data.seatInfo.priceAmount>0">
<view class="no-wrap u-m-r-32">{{data.seatInfo.productName}}</view> <view class="no-wrap u-m-r-32">{{data.seatInfo.productName}}</view>
<view>{{data.seatInfo.priceAmount}}</view> <view>{{data.seatInfo.priceAmount}}</view>
@@ -98,7 +104,12 @@
</template> </template>
<script setup> <script setup>
import { computed, reactive, ref, watch } from 'vue'; import {
computed,
reactive,
ref,
watch
} from 'vue';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import go from '@/commons/utils/go.js' import go from '@/commons/utils/go.js'
@@ -126,8 +137,8 @@
let $goodsMap = {} let $goodsMap = {}
let goosZhonglei = ref(0) let goosZhonglei = ref(0)
let goodsNumber = ref(0) let goodsNumber = ref(0)
let originAmount = computed(()=>{ let originAmount = computed(() => {
let total=0; let total = 0;
for (let i in props.data.goods) { for (let i in props.data.goods) {
const goods = props.data.goods[i] const goods = props.data.goods[i]
if ($goodsMap.hasOwnProperty(goods.productId)) { if ($goodsMap.hasOwnProperty(goods.productId)) {
@@ -142,12 +153,12 @@
return total return total
}) })
const priceSize = 9 const priceSize = 9
let minWidth=ref(36) let minWidth = ref(36)
function computedPriceStyle() { function computedPriceStyle() {
return { return {
'min-width':minWidth.value + 'px' 'min-width': minWidth.value + 'px'
} }
} }