|
@@ -51,6 +51,7 @@
|
|
|
<div v-else class="order-table">
|
|
<div v-else class="order-table">
|
|
|
<div class="order-table-head">
|
|
<div class="order-table-head">
|
|
|
<span style="flex:2;">菜品</span>
|
|
<span style="flex:2;">菜品</span>
|
|
|
|
|
+ <span style="width:80px;text-align:center;">图片</span>
|
|
|
<span style="width:120px;text-align:right;">单价</span>
|
|
<span style="width:120px;text-align:right;">单价</span>
|
|
|
<span style="width:120px;text-align:right;">总价</span>
|
|
<span style="width:120px;text-align:right;">总价</span>
|
|
|
<span style="width:80px;text-align:center;">数量</span>
|
|
<span style="width:80px;text-align:center;">数量</span>
|
|
@@ -58,6 +59,10 @@
|
|
|
<div class="order-table-body">
|
|
<div class="order-table-body">
|
|
|
<div v-for="item in orderedList" :key="item.dishId" class="order-table-row">
|
|
<div v-for="item in orderedList" :key="item.dishId" class="order-table-row">
|
|
|
<span style="flex:2;">{{ item.dishName }}</span>
|
|
<span style="flex:2;">{{ item.dishName }}</span>
|
|
|
|
|
+ <span style="width:80px;text-align:center;">
|
|
|
|
|
+ <img v-if="item.previewImageUrl" style="width:48px;height:48px;border-radius:4px;object-fit:cover;cursor:pointer;" :src="item.previewImageUrl" @click="openDishPreview(item)">
|
|
|
|
|
+ <span v-else style="color:#ccc;font-size:12px;">无图</span>
|
|
|
|
|
+ </span>
|
|
|
<span style="width:120px;text-align:right;">¥{{ formatPrice(item.salePrice) }}</span>
|
|
<span style="width:120px;text-align:right;">¥{{ formatPrice(item.salePrice) }}</span>
|
|
|
<span style="width:120px;text-align:right;color:#f56c6c;">¥{{ formatPrice(itemTotal(item)) }}</span>
|
|
<span style="width:120px;text-align:right;color:#f56c6c;">¥{{ formatPrice(itemTotal(item)) }}</span>
|
|
|
<span style="width:80px;text-align:center;">{{ item.quantity }}</span>
|
|
<span style="width:80px;text-align:center;">{{ item.quantity }}</span>
|
|
@@ -121,9 +126,9 @@
|
|
|
</div>
|
|
</div>
|
|
|
<div class="dish-bottom">
|
|
<div class="dish-bottom">
|
|
|
<span class="dish-price">¥{{ formatPrice(item.salePrice) }}</span>
|
|
<span class="dish-price">¥{{ formatPrice(item.salePrice) }}</span>
|
|
|
- <div v-if="orderedRow(item)" class="card-stepper">
|
|
|
|
|
|
|
+ <div v-if="orderedRow(item) && (hasCurrentOrder ? orderedRow(item).pendingQuantity > 0 : true)" class="card-stepper">
|
|
|
<span class="step-btn" @click="reduceDish(orderedRow(item))">-</span>
|
|
<span class="step-btn" @click="reduceDish(orderedRow(item))">-</span>
|
|
|
- <span class="step-qty">{{ orderedRow(item).quantity }}</span>
|
|
|
|
|
|
|
+ <span class="step-qty">{{ hasCurrentOrder ? orderedRow(item).pendingQuantity : orderedRow(item).quantity }}</span>
|
|
|
<span class="step-btn plus" @click="increaseOrderedDish(orderedRow(item))">+</span>
|
|
<span class="step-btn plus" @click="increaseOrderedDish(orderedRow(item))">+</span>
|
|
|
</div>
|
|
</div>
|
|
|
<NButton v-else size="tiny" type="primary" @click="addDish(item)">
|
|
<NButton v-else size="tiny" type="primary" @click="addDish(item)">
|
|
@@ -183,16 +188,16 @@
|
|
|
¥{{ formatPrice(item.salePrice) }}
|
|
¥{{ formatPrice(item.salePrice) }}
|
|
|
</div>
|
|
</div>
|
|
|
<div class="ordered-total">
|
|
<div class="ordered-total">
|
|
|
- ¥{{ formatPrice(itemTotal(item)) }}
|
|
|
|
|
|
|
+ ¥{{ formatPrice(pendingItemTotal(item)) }}
|
|
|
</div>
|
|
</div>
|
|
|
<div class="ordered-qty">
|
|
<div class="ordered-qty">
|
|
|
- <NButton v-if="!hasCurrentOrder" size="tiny" circle @click="reduceDish(item)">
|
|
|
|
|
|
|
+ <NButton size="tiny" circle @click="reduceDish(item)">
|
|
|
<template #icon>
|
|
<template #icon>
|
|
|
<NIcon><RemoveOutline /></NIcon>
|
|
<NIcon><RemoveOutline /></NIcon>
|
|
|
</template>
|
|
</template>
|
|
|
</NButton>
|
|
</NButton>
|
|
|
- <span>{{ item.quantity }}</span>
|
|
|
|
|
- <NButton v-if="!hasCurrentOrder" size="tiny" circle type="primary" @click="increaseOrderedDish(item)">
|
|
|
|
|
|
|
+ <span>{{ hasCurrentOrder ? item.pendingQuantity : item.quantity }}</span>
|
|
|
|
|
+ <NButton size="tiny" circle type="primary" @click="increaseOrderedDish(item)">
|
|
|
<template #icon>
|
|
<template #icon>
|
|
|
<NIcon><AddOutline /></NIcon>
|
|
<NIcon><AddOutline /></NIcon>
|
|
|
</template>
|
|
</template>
|
|
@@ -559,7 +564,7 @@ const displayOrderedList = computed(() => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const displayOrderTotal = computed(() => {
|
|
const displayOrderTotal = computed(() => {
|
|
|
- return displayOrderedList.value.reduce((total, item) => total + itemTotal(item), 0)
|
|
|
|
|
|
|
+ return displayOrderedList.value.reduce((total, item) => total + pendingItemTotal(item), 0)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const submitDetailList = computed(() => {
|
|
const submitDetailList = computed(() => {
|
|
@@ -591,6 +596,7 @@ function initPage() {
|
|
|
return sortA - sortB
|
|
return sortA - sortB
|
|
|
})
|
|
})
|
|
|
orderedList.value = sorted.map(item => toOrderedItem(item, item.quantity || 0, 0))
|
|
orderedList.value = sorted.map(item => toOrderedItem(item, item.quantity || 0, 0))
|
|
|
|
|
+ loadOrderImages()
|
|
|
viewMode.value = 'order'
|
|
viewMode.value = 'order'
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
@@ -631,6 +637,7 @@ function loadCurrentOrder(roomId) {
|
|
|
return sortA - sortB
|
|
return sortA - sortB
|
|
|
})
|
|
})
|
|
|
orderedList.value = sorted.map(item => toOrderedItem(item, item.quantity || 0, 0))
|
|
orderedList.value = sorted.map(item => toOrderedItem(item, item.quantity || 0, 0))
|
|
|
|
|
+ loadOrderImages()
|
|
|
refreshDishSort()
|
|
refreshDishSort()
|
|
|
}
|
|
}
|
|
|
orderLoading.value = false
|
|
orderLoading.value = false
|
|
@@ -715,6 +722,21 @@ function getPreviewUrl(url) {
|
|
|
return resolveRenderableFileUrl(url).catch(() => url)
|
|
return resolveRenderableFileUrl(url).catch(() => url)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 加载订单菜品图片
|
|
|
|
|
+function loadOrderImages() {
|
|
|
|
|
+ orderedList.value.forEach((row) => {
|
|
|
|
|
+ const urls = getImageUrls(row.image)
|
|
|
|
|
+ if (urls.length === 0) {
|
|
|
|
|
+ row.previewImageUrl = ''
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ row.previewImageUrl = urls[0]
|
|
|
|
|
+ Promise.all(urls.map(url => getPreviewUrl(url))).then((list) => {
|
|
|
|
|
+ row.previewImageUrl = list[0]
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// ==================== 点菜操作 ====================
|
|
// ==================== 点菜操作 ====================
|
|
|
function addDish(dish) {
|
|
function addDish(dish) {
|
|
|
const row = orderedList.value.find(item => item.dishId === dish.dishId)
|
|
const row = orderedList.value.find(item => item.dishId === dish.dishId)
|
|
@@ -733,6 +755,9 @@ function increaseOrderedDish(item) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function reduceDish(item) {
|
|
function reduceDish(item) {
|
|
|
|
|
+ // 加菜模式下防止 pendingQuantity 减到负数
|
|
|
|
|
+ if (hasCurrentOrder.value && item.pendingQuantity <= 0)
|
|
|
|
|
+ return
|
|
|
if (item.quantity <= 0)
|
|
if (item.quantity <= 0)
|
|
|
return
|
|
return
|
|
|
item.quantity -= 1
|
|
item.quantity -= 1
|
|
@@ -762,6 +787,8 @@ function toOrderedItem(item, quantity, pendingQuantity) {
|
|
|
baseQuantity: quantity - pendingQuantity,
|
|
baseQuantity: quantity - pendingQuantity,
|
|
|
pendingQuantity,
|
|
pendingQuantity,
|
|
|
dishSort: item.dishSort || 0,
|
|
dishSort: item.dishSort || 0,
|
|
|
|
|
+ image: item.image,
|
|
|
|
|
+ previewImageUrl: '',
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -775,6 +802,12 @@ function itemTotal(item) {
|
|
|
return Number(item.salePrice || 0) * Number(item.quantity || 0)
|
|
return Number(item.salePrice || 0) * Number(item.quantity || 0)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 加菜模式下按 pendingQuantity 计算单项总价(只算本次新增部分)
|
|
|
|
|
+function pendingItemTotal(item) {
|
|
|
|
|
+ const qty = hasCurrentOrder.value ? item.pendingQuantity : item.quantity
|
|
|
|
|
+ return Number(item.salePrice || 0) * Number(qty || 0)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function formatMoney(value) {
|
|
function formatMoney(value) {
|
|
|
return Number(value || 0).toFixed(2)
|
|
return Number(value || 0).toFixed(2)
|
|
|
}
|
|
}
|
|
@@ -796,6 +829,7 @@ function goToOrderPage() {
|
|
|
return sortA - sortB
|
|
return sortA - sortB
|
|
|
})
|
|
})
|
|
|
orderedList.value = sorted.map(item => toOrderedItem(item, item.quantity || 0, 0))
|
|
orderedList.value = sorted.map(item => toOrderedItem(item, item.quantity || 0, 0))
|
|
|
|
|
+ loadOrderImages()
|
|
|
viewMode.value = 'order'
|
|
viewMode.value = 'order'
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|