Prechádzať zdrojové kódy

feat: 选择地址绑定订单接口联调

liangan 1 mesiac pred
rodič
commit
e93baee696

+ 9 - 0
src/api/order.ts

@@ -74,3 +74,12 @@ export function orderPink(data: any) {
 export function orderCancel(data: any) {
   return http.post<any>(`${pre}/app/order/cancel?id=${data.id}`)
 }
+
+/**
+ * 订单绑定地址
+ * @param data { orderId: number, addressId: number }
+ * @returns
+ */
+export function bindingAddress(data: any) {
+  return http.put<any>(`${pre}/app/order/binding/address`, data)
+}

+ 4 - 0
src/locale/bn.json

@@ -33,6 +33,10 @@
   "addressBook.delete.button": "মুছুন",
   "addressBook.tag.default": "ডিফল্ট",
   "addressBook.button.add": "নতুন ঠিকানা যোগ করুন",
+  "addressBook.select.binding": "ঠিকানা বাইন্ড করা হচ্ছে...",
+  "addressBook.select.success": "ঠিকানা সফলভাবে বাইন্ড হয়েছে!",
+  "addressBook.select.failed": "ঠিকানা বাইন্ড করতে ব্যর্থ। অনুগ্রহ করে আবার চেষ্টা করুন।",
+  "addressBook.select.networkError": "নেটওয়ার্ক ত্রুটি। অনুগ্রহ করে আপনার সংযোগ পরীক্ষা করে আবার চেষ্টা করুন।",
   "myProfile.title": "আমার প্রোফাইল",
   "myProfile.avatar": "অবতার",
   "myProfile.userId": "ইউজার আইডি",

+ 4 - 0
src/locale/en.json

@@ -33,6 +33,10 @@
   "addressBook.delete.button": "Delete",
   "addressBook.tag.default": "default",
   "addressBook.button.add": "Add New Address",
+  "addressBook.select.binding": "Binding address...",
+  "addressBook.select.success": "Address bound successfully!",
+  "addressBook.select.failed": "Failed to bind address. Please try again.",
+  "addressBook.select.networkError": "Network error. Please check your connection and try again.",
   "myProfile.title": "My Profile",
   "myProfile.avatar": "Avatar",
   "myProfile.userId": "User ID",

+ 4 - 0
src/locale/zh-Hans.json

@@ -33,6 +33,10 @@
   "addressBook.delete.button": "删除",
   "addressBook.tag.default": "默认",
   "addressBook.button.add": "添加新地址",
+  "addressBook.select.binding": "正在绑定地址...",
+  "addressBook.select.success": "地址绑定成功!",
+  "addressBook.select.failed": "绑定地址失败,请重试。",
+  "addressBook.select.networkError": "网络错误,请检查网络连接后重试。",
   "myProfile.title": "个人资料",
   "myProfile.avatar": "头像",
   "myProfile.userId": "用户ID",

+ 55 - 5
src/pages/mine/addressBook.vue

@@ -14,17 +14,18 @@
 import { onPageScroll, onReachBottom } from '@dcloudio/uni-app'
 import useZPaging from 'z-paging/components/z-paging/js/hooks/useZPaging.js'
 import { addressDel, addressList } from '@/api/mine'
+import { bindingAddress } from '@/api/order'
 import { t } from '@/locale'
-import { toPage } from '@/utils/page'
+import { getPageParams, goBack, toPage } from '@/utils/page'
 import { toast } from '@/utils/toast'
 
 defineOptions({
   name: 'AddressBook', // 地址簿
 })
 
-const userInfo = computed(() => {
-  return getUserInfoHook()
-})
+// 页面参数
+const pageParams = ref<any>({})
+const isSelectMode = computed(() => pageParams.value.selectMode === true)
 
 // z-paging
 const paging = ref(null)
@@ -45,11 +46,53 @@ async function queryList(pageNo: number, pageSize: number) {
   }
 }
 
+// 处理地址项点击
+function handleAddressClick(item: any) {
+  if (isSelectMode.value) {
+    // 选择模式:选择地址并绑定到订单
+    selectAddressForOrder(item)
+  }
+  else {
+    // 普通模式:编辑地址
+    editAddress(item.id)
+  }
+}
+
 // 编辑地址
 function editAddress(id: any) {
   toPage('/pages/mine/addressBookOperate', { id })
 }
 
+// 选择地址并绑定到订单
+async function selectAddressForOrder(address: any) {
+  try {
+    uni.showLoading({
+      title: t('addressBook.select.binding'),
+    })
+
+    const res = await bindingAddress({
+      orderId: pageParams.value.orderId,
+      addressId: address.id,
+    })
+
+    if (res.code === '200') {
+      toast.success(t('addressBook.select.success'))
+      // 返回上一页
+      goBack()
+    }
+    else {
+      toast.error(res.message || t('addressBook.select.failed'))
+    }
+  }
+  catch (error: any) {
+    console.error('Bind address error:', error)
+    toast.error(t('addressBook.select.networkError'))
+  }
+  finally {
+    uni.hideLoading()
+  }
+}
+
 // 删除地址
 async function deleteAddress(id: any) {
   try {
@@ -87,13 +130,20 @@ function handleAction(action: string, item: any) {
     })
   }
 }
+onShow(() => {
+  paging.value.reload(true)
+})
+// 页面加载时获取参数
+onLoad((options) => {
+  pageParams.value = getPageParams(options)
+})
 </script>
 
 <template>
   <z-paging ref="paging" v-model="dataList" use-page-scroll @query="queryList">
     <view class="py-20rpx">
       <wd-swipe-action v-for="item in dataList" :key="item.id">
-        <view class="flex items-center justify-between bg-white px-22rpx py-18rpx" @click="editAddress(item.id)">
+        <view class="flex items-center justify-between bg-white px-22rpx py-18rpx" @click="handleAddressClick(item)">
           <view class="flex-1">
             <view class="mb-20rpx flex items-center justify-between text-24rpx">
               <view>

+ 42 - 3
src/pages/myOrders/orderDetail.vue

@@ -10,11 +10,12 @@
 
 <script lang="ts" setup>
 import { getConfigByCode } from '@/api/common'
-import { orderCancel, orderDetail, orderPink, orderStatusEnum } from '@/api/order'
+import { bindingAddress, orderCancel, orderDetail, orderPink, orderStatusEnum } from '@/api/order'
 import DialogBox from '@/components/DialogBox/DialogBox.vue'
 import { DialogUtils } from '@/components/DialogBox/utils'
+import { t } from '@/locale'
 import { formatNumber } from '@/utils'
-import { getPageParams } from '@/utils/page'
+import { getPageParams, toPage } from '@/utils/page'
 import { toast } from '@/utils/toast'
 
 defineOptions({
@@ -98,6 +99,44 @@ onShow(() => {
   getDetail()
 })
 
+// 跳转到地址簿选择地址
+function selectAddress() {
+  toPage('/pages/mine/addressBook', {
+    selectMode: true,
+    orderId: id.value,
+  })
+}
+
+// 绑定地址到订单
+async function bindAddressToOrder(addressId: number) {
+  try {
+    uni.showLoading({
+      title: t('addressBook.select.binding'),
+    })
+
+    const res = await bindingAddress({
+      orderId: id.value,
+      addressId,
+    })
+
+    if (res.code === '200') {
+      toast.success(t('addressBook.select.success'))
+      // 刷新订单详情
+      getDetail()
+    }
+    else {
+      toast.error(res.message || t('addressBook.select.failed'))
+    }
+  }
+  catch (error: any) {
+    console.error('Bind address error:', error)
+    toast.error(t('addressBook.select.networkError'))
+  }
+  finally {
+    uni.hideLoading()
+  }
+}
+
 // 显示取消订单确认对话框
 function showCancelOrderDialog() {
   Object.assign(dialogConfig.value, DialogUtils.info(
@@ -208,7 +247,7 @@ function handleDialogClose() {
       <view v-if="detail?.storePink?.status === 2 && detail?.storePink?.lId === 1" class="mb-20rpx bg-white px-24rpx py-20rpx">
         <!-- 无地址 -->
         <template v-if="!detail.orderAddressVO">
-          <view class="flex items-center justify-between">
+          <view class="flex items-center justify-between" @click="selectAddress">
             <view class="text-28rpx text-[var(--wot-color-theme)]">
               Please provide your shipping address
             </view>