diff --git a/src/locale/en.json b/src/locale/en.json index fe11350..b481b8e 100644 --- a/src/locale/en.json +++ b/src/locale/en.json @@ -222,6 +222,7 @@ "browse": { "brandTag": "CHEFLINK Selected", "moreRecipes": "More Recipes", + "nearbyEmpty": "No nearby data", "titleCuisine": "Nearby Cuisine", "titleRecipes": "Selected Recipes" }, diff --git a/src/locale/zh-Hans.json b/src/locale/zh-Hans.json index 3ef6c25..91b8363 100644 --- a/src/locale/zh-Hans.json +++ b/src/locale/zh-Hans.json @@ -222,7 +222,8 @@ "browse": { "brandTag": "CHEFLINK 严选", "moreRecipes": "更多食谱", - "titleCuisine": "附近的美食", + "nearbyEmpty": "附近暂无美食", + "titleCuisine": "附近美食", "titleRecipes": "选择食谱" }, "home": { diff --git a/src/manifest.json b/src/manifest.json index e8f2663..f352b99 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,8 +2,8 @@ "name" : "CHEFLINK delivery", "appid" : "__UNI__06509BE", "description" : "", - "versionName" : "3.2.3", - "versionCode" : 323, + "versionName" : "3.2.4", + "versionCode" : 324, "transformPx" : false, /* 5+App特有相关 */ "app-plus" : { diff --git a/src/pages-store/pages/order/checkout.vue b/src/pages-store/pages/order/checkout.vue index 0893b38..3bb359d 100644 --- a/src/pages-store/pages/order/checkout.vue +++ b/src/pages-store/pages/order/checkout.vue @@ -971,7 +971,7 @@ function handleGoSettle() { } }) - let data = { + const data: Record = { addressId: targetAddressId, phone: formData.value.phone, areaCode: contact.value.areaCode, @@ -982,8 +982,6 @@ function handleGoSettle() { deliveryType: deliveryTimeType.value, // 1-立即交付 2-预约交付 orderRemark: formData.value.orderRemark, receiveMethod: deliveryMethod.value === 0 ? 1 : 2, // 收货方式(1-派送 2-自取) - startScheduledTime: '', // - endScheduledTime: '', // needTableware: needTableware.value ? 1 : 2, // 餐具 1是 2否 } @@ -992,24 +990,21 @@ function handleGoSettle() { data.startScheduledTime = result.startTimestamp data.endScheduledTime = result.endTimestamp } else { - const startMap: Record = {} - const endMap: Record = {} - cartDataList.value.forEach((m: any) => { - const ap = merchantAppointmentMap.value[String(m.id)] - if (ap?.startTime && ap?.endTime) { - startMap[String(m.id)] = ap.startTime - endMap[String(m.id)] = ap.endTime - } - }) - data.merchantStartScheduledTimeMap = startMap - data.merchantEndScheduledTimeMap = endMap + const scheduled = buildScheduledTimePayload( + cartDataList.value as any[], + merchantAppointmentMap.value + ) + data.startScheduledTime = scheduled.startScheduledTime + data.endScheduledTime = scheduled.endScheduledTime + data.merchantStartScheduledTimeMap = scheduled.startMap + data.merchantEndScheduledTimeMap = scheduled.endMap } console.log('批量下单参数', data) appMerchantOrderCreateOrderCartBatchPost({ body: data }).then(res=> { console.log('批量下单成功', res) - resOrderIds.value = res.data.orderIds || [] + resOrderIds.value = res.data?.orderIds || res.data || [] // 如果是余额支付,弹出支付密码弹窗 if(payMethodOptions.value.payMethod === 2) { passwordInputRef.value?.showPasswordInput() @@ -1019,6 +1014,11 @@ function handleGoSettle() { } else { appMerchantOrderPayOrderBatch() } + }).catch((err: any) => { + uni.showToast({ + title: err?.msg || err?.message || '下单失败', + icon: 'none', + }) }) } else { // 如果是余额支付,弹出支付密码弹窗 @@ -1045,7 +1045,7 @@ function handleGoSettle() { } } - let data = { + const data: Record = { addressId: targetAddressId, phone: formData.value.phone, areaCode: contact.value.areaCode, @@ -1055,15 +1055,12 @@ function handleGoSettle() { deliveryType: deliveryTimeType.value, // 1-立即交付 2-预约交付 orderRemark: formData.value.orderRemark, receiveMethod: deliveryMethod.value === 0 ? 1 : 2, // 收货方式(1-派送 2-自取) - startScheduledTime: '', // - endScheduledTime: '', // tipDiscount: tipAmount, // 小费金额(美元),自取订单不需要小费 // weeklyDeliveryFee: isWeeklyDelivery.value ? 1 : 2, // 是否支付周配送费(1-是 2-否) needTableware: needTableware.value ? 1 : 2, // 餐具 1是 2否 } - // 如果是预约派送 - if(deliveryTimeType.value === 1) { + if (deliveryTimeType.value === 1) { const result = getTimeStamps(showDeliveryTime.value); data.startScheduledTime = result.startTimestamp data.endScheduledTime = result.endTimestamp @@ -1178,6 +1175,33 @@ function appMerchantOrderPayOrderBatch() { }) } +/** 从商户预约映射中提取创单所需的顶层预约时间(文档要求 deliveryType=2 必传) */ +function buildScheduledTimePayload( + merchants: Array<{ id?: string | number }>, + appointmentMap: Record +) { + const startMap: Record = {}; + const endMap: Record = {}; + let startScheduledTime: number | undefined; + let endScheduledTime: number | undefined; + + merchants.forEach((m) => { + const ap = appointmentMap[String(m.id)]; + if (!ap?.startTime || !ap?.endTime) return; + const merchantId = String(m.id); + const start = Number(ap.startTime); + const end = Number(ap.endTime); + startMap[merchantId] = start; + endMap[merchantId] = end; + if (startScheduledTime === undefined) { + startScheduledTime = start; + endScheduledTime = end; + } + }); + + return { startScheduledTime, endScheduledTime, startMap, endMap }; +} + function getTimeStamps(timeStr: string) { // 验证输入是否为空 if (!timeStr || typeof timeStr !== 'string') { diff --git a/src/pages-store/pages/store/index.vue b/src/pages-store/pages/store/index.vue index c386e67..c37734c 100644 --- a/src/pages-store/pages/store/index.vue +++ b/src/pages-store/pages/store/index.vue @@ -38,15 +38,28 @@ const storeShareTopStyle = computed(() => ({ top: `${configStore.statusBarHeight + uni.upx2px(16)}px`, })) -const storeBannerSrc = computed(() => { +const storeBannerImages = computed(() => { const raw = storeDetail.value?.shopImages if (typeof raw === 'string' && raw.trim()) { - return raw.split(',')[0].trim() + const list = raw.split(',').map((item) => item.trim()).filter(Boolean) + if (list.length > 0) return list } const logo = storeDetail.value?.logo - return typeof logo === 'string' ? logo : '' + return typeof logo === 'string' && logo.trim() ? [logo.trim()] : [] }) +const storeBannerCurrent = ref(0) +function onStoreBannerChange(e: { detail?: { current?: number } }) { + storeBannerCurrent.value = e.detail?.current ?? 0 +} + +watch( + () => storeDetail.value?.id, + () => { + storeBannerCurrent.value = 0 + }, +) + const deliveryNoticeTexts = computed(() => { const texts: string[] = [] if (+storeDetail.value?.deliveryService === 1 && deliveryMethod.value === 0) { @@ -672,13 +685,34 @@ function handleShare() { > - + + + + + + + {{ storeBannerCurrent + 1 }}/{{ storeBannerImages.length }} + ([]); -function appMerchantDishNearbyList() { - appMerchantDishNearbyListPost({ - params: { - pageNum: 1, - pageSize: 10, - }, +// 获取附近店铺 +const nearbyStoreList = ref([]); +const nearbyStoreLoaded = ref(false); +function getNearbyStoreList() { + nearbyStoreLoaded.value = false; + appMerchantNearbyListPost({ body: { - lat: String(userStore.userLocation.latitude ?? ''), - lng: String(userStore.userLocation.longitude ?? ''), - } - }).then(res=> { - console.log('菜品数据', res) - dishData.value = res.rows; + lat: userStore.userLocation.latitude, + lng: userStore.userLocation.longitude, + }, }) -} -function handleClickDish(item: any) { - navigateTo(`/pages-store/pages/store/index?id=${item.merchantId}`) + .then((res) => { + console.log("附近店铺", res); + nearbyStoreList.value = res.data || []; + }) + .catch(() => { + nearbyStoreList.value = []; + }) + .finally(() => { + nearbyStoreLoaded.value = true; + }); } -function getMerchantName(item: any) { - return item?.merchantVo?.merchantName || item?.merchantName||item?.dishName || '--' +function handleClickStore(item: any) { + navigateTo(`/pages-store/pages/store/index?id=${item.id}`); } -function getMerchantLogo(item: any) { - return item?.merchantVo?.logo || item?.logo || item?.dishImage?.split?.(',')?.[0] || item?.dishImage || '' +function getStoreName(item: any) { + return item?.merchantName || "--"; } -function getMerchantRate(item: any) { - const rating = Number(item?.merchantVo?.rating ?? item?.rating ?? 0) - return Number.isFinite(rating) && rating > 0 ? rating.toFixed(1) : '5.0' +function getStoreLogo(item: any) { + return item?.logo || ""; +} + +function getStoreRate(item: any) { + const rating = Number(item?.rating ?? 0); + return Number.isFinite(rating) && rating > 0 ? rating.toFixed(1) : "5.0"; } function getPreviewRecipeList() { @@ -161,17 +166,28 @@ defineExpose({ {{ t("pages.browse.titleCuisine") }} - + - + - {{ getMerchantName(item) }} - ★★★★★ {{ getMerchantRate(item) }} + {{ getStoreName(item) }} + ★★★★★ {{ getStoreRate(item) }} {{ t("pages.browse.brandTag") }} @@ -180,6 +196,15 @@ defineExpose({ + + + + + {{ t("pages.browse.nearbyEmpty") }} + @@ -335,4 +360,35 @@ defineExpose({ border-radius: 50%; background: #111; } + +.store-empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 220rpx; + padding: 48rpx 32rpx; + border-radius: 20rpx; + background: #f7f7f7; +} + +.store-empty__icon-wrap { + width: 96rpx; + height: 96rpx; + border-radius: 50%; + background: #ececec; +} + +.store-empty__icon { + font-size: 44rpx; + color: #b0b0b0; +} + +.store-empty__text { + margin-top: 24rpx; + font-size: 28rpx; + line-height: 40rpx; + color: #8a8a8a; + text-align: center; +}