sunshibo пре 2 месеци
родитељ
комит
97d491e08b
3 измењених фајлова са 39 додато и 39 уклоњено
  1. 3 17
      api/dining.js
  2. 4 4
      pages/orderFood/components/BottomActionBar.vue
  3. 32 18
      pages/orderFood/index.vue

+ 3 - 17
api/dining.js

@@ -22,23 +22,9 @@ export const GetOrderCart = (tableId) =>
 export const PostOrderCartAdd = (dto) =>
   api.post({ url: '/store/order/cart/add', params: dto });
 
-// 将对象转为 x-www-form-urlencoded 字符串(兼容小程序环境无 URLSearchParams)
-function toFormUrlEncoded(obj) {
-  return Object.keys(obj || {})
-    .filter((k) => obj[k] != null && obj[k] !== '')
-    .map((k) => encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]))
-    .join('&');
-}
-
-// 更新购物车(POST /store/order/cart/update,请求类型 x-www-form-urlencoded)
-export const PostOrderCartUpdate = (params) => {
-  const body = toFormUrlEncoded(params);
-  return api.post({
-    url: '/store/order/cart/update',
-    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-    params: body
-  });
-};
+// 更新购物车(PUT /store/order/cart/update,请求类型 x-www-form-urlencoded,由 request 层 formUrlEncoded 封装)
+export const PostOrderCartUpdate = (params) =>
+  api.put({ url: '/store/order/cart/update', params, formUrlEncoded: true });
 
 /**
  * 创建订单 SSE 连接(GET /store/order/sse/{tableId})

+ 4 - 4
pages/orderFood/components/BottomActionBar.vue

@@ -63,16 +63,16 @@ const getItemLinePrice = (item) => {
   return (Number(item?.quantity) || 0) * getItemPrice(item);
 };
 
-// 展示总数量:优先接口 totalQuantity,否则从列表计算
+// 展示总数量:优先父组件传入 totalQuantity,否则从 cart-list 计算
 const displayTotalQuantity = computed(() => {
   if (props.totalQuantity != null && props.totalQuantity !== '') return Number(props.totalQuantity);
-  return props.cartList.reduce((sum, item) => sum + (Number(item?.quantity) || 0), 0);
+  return (props.cartList || []).reduce((sum, item) => sum + (Number(item?.quantity) || 0), 0);
 });
 
-// 展示总金额:优先接口 totalAmount,否则从列表计算(接口项用 subtotalAmount)
+// 展示总金额:优先父组件传入 totalAmount,否则从 cart-list 按行小计累加
 const displayTotalPrice = computed(() => {
   if (props.totalAmount != null && props.totalAmount !== '') return Number(props.totalAmount);
-  return props.cartList.reduce((sum, item) => sum + getItemLinePrice(item), 0);
+  return (props.cartList || []).reduce((sum, item) => sum + getItemLinePrice(item), 0);
 });
 
 // 格式化总金额

+ 32 - 18
pages/orderFood/index.vue

@@ -102,24 +102,30 @@ const displayCartList = computed(() => {
   return cartList.value;
 });
 
-// 展示用总数量:优先接口 totalQuantity,否则从列表计算
+// 行小计:接口项用 subtotalAmount,否则 数量×单价(与 BottomActionBar/CartModal 一致)
+const getItemLinePrice = (item) => {
+  if (item?.subtotalAmount != null) return Number(item.subtotalAmount);
+  const qty = Number(item?.quantity) || 0;
+  const unitPrice = Number(item?.unitPrice ?? item?.price ?? item?.salePrice ?? item?.totalPrice ?? 0) || 0;
+  return qty * unitPrice;
+};
+
+// 展示用总数量:优先接口/本地 cartData.totalQuantity,否则从展示列表计算
 const displayTotalQuantity = computed(() => {
-  if (Array.isArray(cartData.value?.items) && cartData.value.items.length > 0 && cartData.value.totalQuantity != null) {
-    return cartData.value.totalQuantity;
+  const apiItems = cartData.value?.items;
+  if (Array.isArray(apiItems) && apiItems.length > 0 && cartData.value?.totalQuantity != null) {
+    return Number(cartData.value.totalQuantity);
   }
   return displayCartList.value.reduce((sum, item) => sum + (Number(item?.quantity) || 0), 0);
 });
 
-// 展示用总金额:优先接口 totalAmount,否则从列表计算
+// 展示用总金额:优先接口/本地 cartData.totalAmount,否则从展示列表按行小计累加
 const displayTotalAmount = computed(() => {
-  if (Array.isArray(cartData.value?.items) && cartData.value.items.length > 0 && cartData.value.totalAmount != null) {
-    return cartData.value.totalAmount;
+  const apiItems = cartData.value?.items;
+  if (Array.isArray(apiItems) && apiItems.length > 0 && cartData.value?.totalAmount != null) {
+    return Number(cartData.value.totalAmount);
   }
-  return displayCartList.value.reduce((sum, item) => {
-    const qty = Number(item?.quantity) || 0;
-    const price = Number(item?.subtotalAmount ?? item?.unitPrice ?? item?.price ?? item?.totalPrice ?? 0) || 0;
-    return sum + (item?.subtotalAmount != null ? Number(item.subtotalAmount) : qty * price);
-  }, 0);
+  return displayCartList.value.reduce((sum, item) => sum + getItemLinePrice(item), 0);
 });
 
 // 优惠券列表(示例数据)
@@ -336,14 +342,22 @@ const updateFoodQuantity = (food, delta) => {
     const totalQuantity = nextItems.reduce((s, i) => s + (Number(i.quantity) || 0), 0);
     cartData.value = { ...cartData.value, items: nextItems, totalAmount, totalQuantity };
   }
-  // 增加数量且商品数量 >= 1 时调用 /store/order/cart/update
-  if (delta > 0 && nextQty >= 1 && tableId.value) {
-    const params = {
-      cuisineId: id,
-      quantity: nextQty,
-      tableId: tableId.value
+  // 有数量变化且桌号存在时调接口:购物车没有当前商品或数量从 0 增加到 1(刚清空后重加)则 add,否则 update
+  if (tableId.value && delta !== 0) {
+    const needAdd = delta > 0 && (idx < 0 || nextQty === 1);
+    if (needAdd) {
+      PostOrderCartAdd({
+        cuisineId: id,
+        quantity: nextQty,
+        tableId: tableId.value
+      }).catch((err) => console.error('加入购物车失败:', err));
+    } else {
+      PostOrderCartUpdate({
+        cuisineId: id,
+        quantity: nextQty,
+        tableId: tableId.value
+      }).catch((err) => console.error('更新购物车失败:', err));
     }
-    PostOrderCartUpdate(params).catch((err) => console.error('更新购物车失败:', err));
   }
 };