diff --git a/pages/newOrder/address.vue b/pages/newOrder/address.vue index a0b805d..cf625ad 100644 --- a/pages/newOrder/address.vue +++ b/pages/newOrder/address.vue @@ -28,7 +28,7 @@ - @@ -75,7 +75,10 @@ district:'', detailAddress:"", openId:"", - isDefault:0 + isDefault:0, + latitude:"", + longitude:"", + selectAddress:"" }, multiArray: [], cityList:[], @@ -106,7 +109,9 @@ district, detailAddress, openId, - isDefault + isDefault, + latitude, + longitude, } = res; this.addressInfo = { name, @@ -117,7 +122,10 @@ district, detailAddress, openId, - isDefault + isDefault, + latitude, + longitude, + selectAddress: `${province}${city}${district}`, }; }else{ this.$modal.showToast('获取地址详情失败') @@ -187,6 +195,8 @@ city:params.city, district:params.district, detailAddress:params.detailAddress, + latitude:params.latitude, + longitude:params.longitude, } this.loading=false uni.redirectTo({ @@ -208,6 +218,8 @@ city:params.city, district:params.district, detailAddress:params.detailAddress, + latitude:params.latitude, + longitude:params.longitude, } this.loading=false uni.redirectTo({ diff --git a/pages/newOrder/addressList.vue b/pages/newOrder/addressList.vue index 8f943de..153c4bc 100644 --- a/pages/newOrder/addressList.vue +++ b/pages/newOrder/addressList.vue @@ -123,6 +123,24 @@ this.deleteId=''; }, useAddress(params){ + // 检查地址是否有经纬度信息 + if(!params.latitude || !params.longitude) { + uni.showModal({ + title: '提示', + content: '该地址缺少位置信息,请先编辑地址完善位置信息', + showCancel: true, + cancelText: '取消', + confirmText: '去编辑', + success: (res) => { + if (res.confirm) { + // 用户点击确定,跳转到编辑地址页面 + this.editAddress(params); + } + } + }); + return; + } + this.$globalData.newOrderData.currentAddress={ id:params.id, name:params.name, @@ -130,6 +148,8 @@ province:params.province, city:params.city, detailAddress:params.detailAddress, + latitude:params.latitude, + longitude:params.longitude, } let len = getCurrentPages().length; this.loading=false diff --git a/pages/personalCenter/addressInfo.vue b/pages/personalCenter/addressInfo.vue index 9acd9b7..8a749ce 100644 --- a/pages/personalCenter/addressInfo.vue +++ b/pages/personalCenter/addressInfo.vue @@ -75,6 +75,9 @@ detailAddress:"", openId:"", isDefault:0, + latitude:"", + longitude:"", + selectAddress:"" }, multiArray: [], cityList:[], @@ -106,6 +109,8 @@ detailAddress, openId, isDefault, + latitude, + longitude, } = res; this.addressInfo = { name, @@ -117,6 +122,9 @@ detailAddress, openId, isDefault, + latitude, + longitude, + selectAddress: `${province}${city}${district}`, }; }else{ this.$modal.showToast('获取地址详情失败') diff --git a/pages_order/components/order/ServiceItems.vue b/pages_order/components/order/ServiceItems.vue index d9014c6..2e8806c 100644 --- a/pages_order/components/order/ServiceItems.vue +++ b/pages_order/components/order/ServiceItems.vue @@ -8,12 +8,18 @@ - {{item.id}} - {{item.name}} + {{item.day}} + | + + {{ item.itemsText[0] }} + + {{ item.itemsText[0] }}+{{ item.itemsText[item.itemsText.length - 1] }}{{ item.itemsText.length }}项 + + ¥{{item.price.toFixed(2)}} - + {{ expandedItems.includes(index) ? '∧' : '∨' }} @@ -23,22 +29,24 @@ - - - - - - - {{item.pet}} - - - - - - {{service.name}} - ¥{{service.price.toFixed(2)}} × {{service.quantity}} 次 - - + + + + + + + + {{pet.name}} + + + + + + {{t.productName}} + ¥{{ t.salePrice && t.salePrice.toFixed(2) }} × {{t.quantity}} 次 + + + @@ -119,7 +127,7 @@ } .card-title { - font-size: 32rpx; + font-size: 30rpx; font-weight: bold; color: #333; margin-bottom: 20rpx; @@ -153,14 +161,14 @@ .item-id { font-size: 24rpx; - color: #999; margin-right: 10rpx; } .item-name { - font-size: 28rpx; + font-size: 24rpx; color: #333; flex: 1; + display: flex; } .item-price-action { @@ -170,7 +178,6 @@ .item-price { font-size: 28rpx; - color: #FF5252; font-weight: bold; } } @@ -207,34 +214,69 @@ // 详细信息区域 .detail-area { - padding: 15rpx; animation: fadeIn 0.3s ease; - background-color: #F8F8F8; - border-radius: 10rpx; - margin-top: 10rpx; + display: flex; + flex-direction: column; + gap: 10rpx; + .detail-area-item{ + background-color: #F8F8F8; + border-radius: 10rpx; + margin-top: 10rpx; + padding: 15rpx; + } + .item-pet { + font-size: 28rpx; + color: #333; + margin-bottom: 20rpx; + display: flex; + align-items: center; + + .pet-avatar { + width: 80rpx; + height: 80rpx; + border-radius: 50%; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + border-radius: 50%; + } + } + + text { + font-weight: 500; + font-size: 32rpx; + } + } + + .custom-services-list { + .custom-service-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 15rpx 0; + border-bottom: 1px solid #F0F0F0; + + &:last-child { + border-bottom: none; + } + + .service-name { + font-size: 28rpx; + color: #333; + font-weight: 400; + } + + .service-price { + font-size: 28rpx; + color: #999; + font-weight: 400; + } + } + } } - .item-pet { - font-size: 24rpx; - color: #666; - margin-bottom: 10rpx; - display: flex; - align-items: center; - - .pet-avatar { - width: 40rpx; - height: 40rpx; - border-radius: 50%; - overflow: hidden; - margin-right: 10rpx; - border: 1px solid #EEEEEE; - - image { - width: 100%; - height: 100%; - } - } - } .custom-services { padding: 10rpx 0 10rpx 20rpx; diff --git a/pages_order/components/order/ServicePets.vue b/pages_order/components/order/ServicePets.vue index 6282fcd..26d0355 100644 --- a/pages_order/components/order/ServicePets.vue +++ b/pages_order/components/order/ServicePets.vue @@ -18,7 +18,10 @@ sex - {{pet.services.join(',')}}: {{pet.serviceDates.join(',')}} + {{pet.serviceDates.join(',')}} + + + 共 {{ pet.serviceDates.length }} @@ -65,10 +68,16 @@ } .pets-list { + flex-direction: column; + display: flex; + gap: 20rpx; .pet-item { display: flex; align-items: center; margin-bottom: 20rpx; + background-color: #f7f7f7; + padding: 20rpx; + border-radius: 20rpx; &:last-child { margin-bottom: 0; @@ -76,8 +85,8 @@ .pet-avatar { position: relative; - width: 80rpx; - height: 80rpx; + width: 100rpx; + height: 100rpx; margin-right: 20rpx; image { @@ -115,6 +124,17 @@ margin-top: 4rpx; } } + + .count{ + margin-left: auto; + margin-right: 20rpx; + font-size: 26rpx; + color: #999; + text{ + font-size: 34rpx; + color: #333; + } + } } } \ No newline at end of file diff --git a/pages_order/order/orderDetail.vue b/pages_order/order/orderDetail.vue index b72458d..ec98668 100644 --- a/pages_order/order/orderDetail.vue +++ b/pages_order/order/orderDetail.vue @@ -62,7 +62,7 @@ import { getOpenIdKey } from '@/utils/auth' import { getOrderDetail } from '@/api/order/order.js' import { getOrderServiceText, getProductNameText } from '@/utils/serviceTime.js' - + import dayjs from '@/utils/lib/dayjs.min.js' // 服务时间段映射 const timeSlotMap = { 'MORNING': '上午', @@ -83,7 +83,8 @@ data() { return { orderId: null, - orderDetail: {}, + orderDetail: {},//格式化后的数据 + detail : {},//未格式化的数据 }; }, onLoad(options) { @@ -110,6 +111,70 @@ pet.productNameText = getProductNameText(pet.id, data.orderItemList, data.orderServiceList) // 服务 }) + + //=====================服务项目以及费用的计算开始===================== + + let items = [] + + //1、找出有哪些日期 + let days = [...new Set(data.orderServiceList.map(item => item.serviceDate))] + + + days.forEach(day => { + + let price = 0; + + let itemsText = [] + + //2、找出每个日期对应的服务对象 + let dayItems = data.orderServiceList.filter(item => item.serviceDate === day) + + //3、找出每个服务对象对应的宠物 + let pets = data.petVOList.filter(item => dayItems.some(dayItem => dayItem.petId === item.id)) + + //深度拷贝pets + pets = JSON.parse(JSON.stringify(pets)) + + //4、将每个服务对象添加进对应的宠物 + pets.forEach(pet => { + pet.serviceList = dayItems.filter(item => item.petId === pet.id) + + let itemList = [] + + //5、将每个服务对象中添加对应的项目 + pet.serviceList.forEach(item => { + itemList.push(...(data.orderItemList.filter(n => n.orderServiceId == item.id))) + }) + + itemList.forEach(p => { + price += p.salePrice + + itemsText = [...new Set([...itemsText, p.productName])] + }) + + pet.itemList = itemList + }) + + //6、将每个宠物添加进items + items.push({ + price, + pets, + day, + itemsText, + }) + }) + + + //根据日期排序 + items = items.sort((a, b) => dayjs(a.day).valueOf() - dayjs(b.day).valueOf()) + + console.log(items); + + + //=====================服务项目以及费用的计算结束===================== + + + // 构建符合组件渲染需要的数据结构 this.orderDetail = { // 地址信息 @@ -132,50 +197,7 @@ }) : [], // 服务项目列表 - items: data.orderItemList.map((item, index) => { - // 解析商品附加数据 - let spData = {}; - try { - spData = JSON.parse(item.spData || '{}'); - } catch (e) { - console.error('解析商品附加数据失败', e); - } - - // 获取对应的宠物信息 - const pet = data.petVOList && data.petVOList[index] ? { - name: data.petVOList[index].name, - avatar: data.petVOList[index].photo - } : null; - - // 生成模拟的定制服务数据 - const customServices = [ - // { - // name: '基础护理', - // price: 50, - // quantity: 2 - // }, - // { - // name: '美容服务', - // price: 100, - // quantity: 1 - // }, - // { - // name: '特殊护理', - // price: 80, - // quantity: 1 - // } - ]; - - return { - id: index + 1, - name: item.productName, - price: item.salePrice, - quantity: item.quantity, - pet: pet ? pet.name : null, - petAvatar: pet ? pet.avatar : null, - customServices: customServices - }; - }), + items, // 费用信息 totalAmount: data.totalAmount, diff --git a/pages_order/order/orderList.vue b/pages_order/order/orderList.vue index f2c4878..73e2f7f 100644 --- a/pages_order/order/orderList.vue +++ b/pages_order/order/orderList.vue @@ -45,14 +45,14 @@ - {{ pet.productNameText.join(',') }} | 共{{ pet.orderServiceText.length }}天 {{ pet.orderServiceText.join(',') }} + {{ handleText(pet.productNameText) }} | 共{{ pet.orderServiceText.length }}天 {{ handleText(pet.orderServiceText) }} 下单时间: {{order.createTime}} - + 伴宠师: {{order.companionName}} (点击查看伴宠师详情) @@ -203,7 +203,7 @@ this.hasMore = true; this.getOrderList(); }, - + // 下拉刷新 refresh() { this.refreshing = true; @@ -329,8 +329,11 @@ this.orderList.forEach(item => { item.petVOList.forEach(pet => { + + pet.orderServiceText = getOrderServiceText(pet.id, item.orderServiceList || []) || [] pet.productNameText = getProductNameText(pet.id, item.orderItemList, item.orderServiceList || []) || [] + }) }) @@ -344,6 +347,10 @@ this.loading = false; }); }, + + handleText(list){ + return list && (list.length > 2 ? `${list[0]}...${list[list.length - 1]}` : list.join(',')) + }, // 处理再来一单 handleReorder(order) { @@ -467,6 +474,7 @@ width: 80rpx; height: 80rpx; margin-right: 20rpx; + flex-shrink: 0; image { width: 100%;