Browse Source

feat: 更新订单状态显示和页面功能优化

- 修改订单状态显示逻辑,增加状态文本映射
- 调整订单列表页的滚动和刷新功能
- 更新服务介绍页面标题和导航栏样式
- 优化产品名称和订单服务项的显示顺序
- 增加订单详情页的列表反转功能
- 调整新订单页面的服务数量上限
master
前端-胡立永 2 months ago
parent
commit
7764b6ef79
8 changed files with 136 additions and 120 deletions
  1. +9
    -10
      pages.json
  2. +8
    -8
      pages/index.vue
  3. +1
    -1
      pages/newOrder/serviceNew2.vue
  4. +1
    -1
      pages_order/components/order/ServiceItems.vue
  5. +2
    -0
      pages_order/order/orderDetail.vue
  6. +111
    -98
      pages_order/order/orderList.vue
  7. +2
    -2
      utils/getUrl.js
  8. +2
    -0
      utils/serviceTime.js

+ 9
- 10
pages.json View File

@ -98,13 +98,11 @@
}, {
"path": "pages/details/feed",
"style": {
"navigationBarTitleText": "专业喂养",
"navigationBarTitleText": "服务介绍",
"navigationBarBackgroundColor": "#FFBF60",
"enablePullDownRefresh": false,
"navigationBarTextStyle": "white"
}
}, {
"path": "pages/common/kefu",
"style": {
@ -372,7 +370,7 @@
"style": {
"navigationBarTitleText": "订单列表",
"navigationBarBackgroundColor": "#FFBF60",
"enablePullDownRefresh": false,
"enablePullDownRefresh": true,
"navigationBarTextStyle": "white"
}
},
@ -438,14 +436,15 @@
"pagePath": "pages/details/feed",
"iconPath": "./static/images/tabBar/cat.png",
"selectedIconPath": "./static/images/tabBar/cat_.png",
"text": "喂养"
"text": "服务介绍"
},
// {
// "pagePath": "pages/details/walk",
// "iconPath": "./static/images/tabBar/dog.png",
// "selectedIconPath": "./static/images/tabBar/dog_.png",
// "text": "遛狗"
// },
{
"pagePath": "pages/details/walk",
"iconPath": "./static/images/tabBar/dog.png",
"selectedIconPath": "./static/images/tabBar/dog_.png",
"text": "遛狗"
}, {
"pagePath": "pages/personalCenter/index",
"iconPath": "./static/images/tabBar/mine.png",
"selectedIconPath": "./static/images/tabBar/mine_.png",


+ 8
- 8
pages/index.vue View File

@ -82,7 +82,7 @@
</uni-card>
</view>
<view class="coupon-list">
<!-- <view class="coupon-list">
<uni-card :is-shadow="false" padding=0 margin="10px">
<view class="coupon-title" slot="title">
<view class="coupon-title-left">
@ -133,7 +133,7 @@
</view>
</view>
</uni-card>
</view>
</view> -->
<view class="companion-list">
<uni-card :is-shadow="false" padding=0 margin="10px">
@ -637,13 +637,13 @@
longitude: this.position.longitude,
}
if(!data.latitude){
let res = await this.getLocation()
data.latitude = res.latitude
data.longitude = res.longitude
}
// if(!data.latitude){
// let res = await this.getLocation()
// data.latitude = res.latitude
// data.longitude = res.longitude
// }
getTeacherList(data).then(response => {
getTeacherList({}).then(response => {
if (response.code == 200) {
this.companionList = response.rows
this.calculateTeacherListDistance()


+ 1
- 1
pages/newOrder/serviceNew2.vue View File

@ -186,7 +186,7 @@
@change="customServiceCountChange"
step="1"
:min="0"
:max="3"
:max="10"
>
<view slot="minus" class="minus">
<u-icon name="minus-circle-fill" size="20" color="#FFBF60"></u-icon>


+ 1
- 1
pages_order/components/order/ServiceItems.vue View File

@ -11,10 +11,10 @@
<view class="item-id">{{item.day}}</view>
<text style="margin: 0 10rpx;">|</text>
<view class="item-name">
<text>{{ item.itemsText[0] }}</text>
<text v-if="item.itemsText.length >= 2">
{{ item.itemsText[0] }}+{{ item.itemsText[item.itemsText.length - 1] }}{{ item.itemsText.length }}
</text>
<text v-else>{{ item.itemsText[0] }}</text>
</view>
<view class="item-price-action">
<view class="item-price">¥{{item.price.toFixed(2)}}</view>


+ 2
- 0
pages_order/order/orderDetail.vue View File

@ -154,6 +154,8 @@
pet.serviceList.forEach(item => {
itemList.push(...(data.orderItemList.filter(n => n.orderServiceId == item.id)))
})
itemList = itemList.reverse();
itemList.forEach(p => {
price += p.salePrice * p.quantity


+ 111
- 98
pages_order/order/orderList.vue View File

@ -9,13 +9,13 @@
</view>
<!-- 订单列表 -->
<scroll-view scroll-y class="order-list-scroll" @scrolltolower="loadMore" @refresherrefresh="refresh"
:refresher-enabled="true" :refresher-triggered="refreshing">
<!-- <scroll-view scroll-y class="order-list-scroll" @scrolltolower="loadMore" @refresherrefresh="refresh"
:refresher-enabled="true" :refresher-triggered="refreshing"> -->
<view class="order-list">
<!-- 订单卡片 -->
<view class="order-card" v-for="(order, index) in orderList" :key="index">
<view class="order-header">
<text>{{ tabs[order.status + 1].name }}</text>
<text>{{ getOrderStatusText(order.status) }}</text>
<view class="order-status">
<text v-if="order.teacherId">指定伴宠师下单</text>
<text v-else>系统下单</text>
@ -45,7 +45,8 @@
</view>
</view>
<text class="pet-service">
{{ handleText(pet.productNameText) }} | {{ pet.orderServiceText.length }} {{ handleText(pet.orderServiceText) }}</text>
{{ handleText(pet.productNameText) }} | {{ pet.orderServiceText.length }}
{{ handleText(pet.orderServiceText) }}</text>
</view>
</view>
@ -100,15 +101,15 @@
<image src="/static/images/personal/no-data.png" mode="aspectFit" class="no-data-image"></image>
<text>暂无订单</text>
</view>
<!-- 首次加载状态 -->
<view class="initial-loading" v-if="orderList.length === 0 && loading">
<view class="loading-spinner large"></view>
<text>正在加载订单...</text>
</view>
</view>
</scroll-view>
<!-- </scroll-view> -->
<!-- 全屏加载遮罩 (仅首次加载显示) -->
<!-- <view class="loading-overlay" v-if="loading && page === 1 && orderList.length === 0 && isFirstLoad">
<view class="loading-content">
@ -125,7 +126,7 @@
<!-- 伴宠师选择弹窗 -->
<companion-select-popup ref="companionSelectPopup" />
<!-- 支付加载遮罩 -->
<view class="loading-overlay" v-if="isPaying">
<view class="loading-content">
@ -150,7 +151,10 @@
} from '@/utils/auth'
import CancelOrderPopup from '@/pages_order/components/order/CancelOrderPopup.vue'
import CompanionSelectPopup from '@/pages_order/components/order/CompanionSelectPopup.vue'
import { getOrderServiceText, getProductNameText } from '@/utils/serviceTime.js'
import {
getOrderServiceText,
getProductNameText
} from '@/utils/serviceTime.js'
export default {
components: {
Kefu,
@ -168,13 +172,17 @@
value: 0
},
{
name: '接单',
name: '接单',
value: 1
},
{
name: '服务中',
name: '已接单',
value: 2
},
{
name: '服务中',
value: 3
},
{
name: '已完成',
value: 3
@ -188,60 +196,75 @@
loading: false,
refreshing: false,
currentOrder: null,
isPaying : false,
isPaying: false,
requestId: 0, //
switchTabTimer: null, //
loadMoreTimer: null, //
isFirstLoad: true, //
// API
exampleData: [{
id: '1',
status: '0',
statusText: '待付款',
amount: '264',
pets: [{
name: '小咪',
avatar: '/static/images/personal/pet.png',
tag: '猫',
gender: '女生',
serviceTime: '专业喂养2天: 03-20,03-22'
},
{
name: '小汪',
avatar: '/static/images/personal/pet.png',
tag: '狗',
gender: '男生',
serviceTime: '专业喂养2天: 03-20,03-22'
}
],
orderTime: '2025-12-14 18:23:06',
companionName: '张三',
companionNote: '伴宠师名称暂不可见'
}]
};
}
},
onPullDownRefresh() {
this.refreshing()
},
onReachBottom() {
this.loadMore()
},
methods: {
//
switchTab(tabValue) {
if (this.currentTab === tabValue) return; //
this.currentTab = tabValue;
this.orderList = [];
this.page = 1;
this.hasMore = true;
this.isFirstLoad = false; //
//
if (this.switchTabTimer) {
clearTimeout(this.switchTabTimer);
}
//
this.switchTabTimer = setTimeout(() => {
this.getOrderList();
}, 100);
},
getOrderStatusText(status) {
// switch (status) {
// case 0:
// return '';
// case 1:
// return '';
// case 2:
// return '';
// case 3:
// return '';
// case 4:
// return '';
// case 5:
// return '';
// }
switch (status) {
case 0:
return '待付款';
case 1:
return '待接单';
case 2:
return '已接单';
case 3:
return '已完成';
case 4:
return '已关闭';
case 5:
return '无效订单';
case 11:
return '服务中';
}
},
//
refresh() {
this.refreshing = true;
@ -257,18 +280,18 @@
},
handleCancelOrder() {
this.refresh()
this.refresh()
},
//
loadMore() {
if (this.loading || !this.hasMore) return;
//
if (this.loadMoreTimer) {
clearTimeout(this.loadMoreTimer);
}
this.loadMoreTimer = setTimeout(() => {
this.page++;
this.getOrderList();
@ -321,7 +344,10 @@
},
//
goToReview({teacherId, orderId}) {
goToReview({
teacherId,
orderId
}) {
uni.navigateTo({
url: `/pages_order/order/orderReview?id=${teacherId}&orderId=${orderId}`
});
@ -331,7 +357,7 @@
getOrderList() {
if (this.loading) return Promise.reject();
this.loading = true;
// ID
const currentRequestId = ++this.requestId;
@ -339,32 +365,11 @@
const params = {
status: this.currentTab,
openId: getOpenIdKey(),
pageNumber: this.page,//pageNumber
pageNumber: this.page, //pageNumber
pageSize: this.size
};
// API
// return new Promise((resolve, reject) => {
// // API使API
// setTimeout(() => {
// try {
// // API
// if (this.page === 1) {
// this.orderList = [...this.exampleData];
// } else if (this.page < 3) {
// this.orderList = [...this.orderList, ...this.exampleData];
// } else {
// this.hasMore = false;
// }
// this.loading = false;
// resolve();
// } catch (err) {
// this.loading = false;
// reject(err);
// }
// }, 500);
// });
// API
return getOrderList(params).then(res => {
//
@ -372,7 +377,7 @@
console.log('忽略过期的请求结果');
return Promise.reject('过期的请求');
}
if (res.content) {
const newList = res.content || [];
if (this.page === 1) {
@ -381,19 +386,22 @@
this.orderList = [...this.orderList, ...newList];
}
this.hasMore = newList.length === this.size;
this.orderList.forEach(item => {
item.petVOList.forEach(pet => {
pet.orderServiceText = getOrderServiceText(pet.id, item.orderServiceList || []) || []
pet.productNameText = getProductNameText(pet.id, item.orderItemList, item.orderServiceList || []) || []
pet.orderServiceText = getOrderServiceText(pet.id, item
.orderServiceList || []) || []
pet.productNameText = getProductNameText(pet.id, item
.orderItemList, item.orderServiceList || []) || []
})
})
} else {
this.hasMore = false;
}
@ -407,8 +415,8 @@
}
});
},
handleText(list){
handleText(list) {
return list && (list.length > 2 ? `${list[0]}...${list[list.length - 1]}` : list.join(','))
},
@ -417,12 +425,12 @@
this.currentOrder = order;
this.$refs.companionSelectPopup.open();
},
//
modifyOrder(order) {
uni.navigateTo({
url: `/pages_order/order/orderModify?orderId=${order.orderId}`
});
uni.navigateTo({
url: `/pages_order/order/orderModify?orderId=${order.orderId}`
});
},
},
@ -430,7 +438,7 @@
//
this.getOrderList();
},
onUnload() {
//
if (this.switchTabTimer) {
@ -581,9 +589,9 @@
font-size: 24rpx;
color: #666;
margin-top: 4rpx;
overflow:hidden; //
text-overflow:ellipsis; //
white-space:nowrap; //
overflow: hidden; //
text-overflow: ellipsis; //
white-space: nowrap; //
}
}
}
@ -646,7 +654,7 @@
align-items: center;
justify-content: center;
}
.initial-loading {
text-align: center;
padding: 100rpx 0;
@ -657,7 +665,7 @@
align-items: center;
justify-content: center;
}
.loading-overlay {
position: fixed;
top: 0;
@ -670,7 +678,7 @@
justify-content: center;
z-index: 999;
}
.loading-content {
display: flex;
flex-direction: column;
@ -681,13 +689,13 @@
border-radius: 20rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
}
.loading-text {
color: #666;
font-size: 28rpx;
margin-top: 20rpx;
}
.loading-spinner {
width: 40rpx;
height: 40rpx;
@ -696,17 +704,22 @@
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 16rpx;
&.large {
width: 60rpx;
height: 60rpx;
border-width: 6rpx;
}
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.no-order {


+ 2
- 2
utils/getUrl.js View File

@ -1,7 +1,7 @@
let current ="develop";
let current ="trial";
const accountInfo = wx.getAccountInfoSync();
// current = accountInfo.miniProgram.envVersion;
current = accountInfo.miniProgram.envVersion;
const api={


+ 2
- 0
utils/serviceTime.js View File

@ -35,6 +35,8 @@ export function getProductNameText(petId, productList, orderServiceList) {
let list = (productList
.filter(product => orderService.filter(service => service.id == product.orderServiceId).length > 0)
.map(product => product.productName))
list = list.reverse();
return [...new Set(list)]
}


Loading…
Cancel
Save