Browse Source

refactor: 优化订单模块代码结构及功能实现

- 重构订单详情、订单列表及评价页面,提升代码可维护性
- 新增订单评价功能,支持用户对伴宠师进行评分和评论
- 优化服务细则展示,增加钥匙交接方式、价格说明等字段
- 调整日期处理逻辑,使用本地dayjs库替代外部依赖
- 修复订单列表页显示问题,优化宠物服务信息展示
master
前端-胡立永 2 weeks ago
parent
commit
6e4917cf10
13 changed files with 611 additions and 175 deletions
  1. +40
    -0
      api/order/order.js
  2. +14
    -0
      api/order/task.js
  3. +1
    -1
      pages/common/kefu.vue
  4. +112
    -15
      pages_order/components/order/ServiceItems.vue
  5. +3
    -3
      pages_order/components/order/ServicePets.vue
  6. +94
    -5
      pages_order/components/order/ServiceRemarks.vue
  7. +42
    -0
      pages_order/order/AppletComment.java
  8. +109
    -0
      pages_order/order/orderDetail.json
  9. +99
    -101
      pages_order/order/orderDetail.vue
  10. +34
    -7
      pages_order/order/orderList.vue
  11. +61
    -42
      pages_order/order/orderReview.vue
  12. +1
    -0
      utils/lib/dayjs.min.js
  13. +1
    -1
      utils/serviceTime.js

+ 40
- 0
api/order/order.js View File

@ -69,3 +69,43 @@ export const getTeacherServiceLogList = (params) => {
}) || []
})
}
// 查询订单列表
export const getOrderList = (params) => {
return request({
url: '/applet/mall/order/listByOpenid',
headers: {
isToken: true
},
method: "get",
params
})
}
// 查询订单详情
export const getOrderDetail = (params) => {
return request({
url: '/applet/mall/order/orderDetail',
headers: {
isToken: true
},
method: "get",
params
})
}
// 评价订单
export const orderEvaluate = (params) => {
return request({
url: '/applet/mall/order/orderEvaluate',
headers: {
isToken: true
},
method: "get",
params
})
}

+ 14
- 0
api/order/task.js View File

@ -0,0 +1,14 @@
import upload from '@/utils/upload'
import request from '@/utils/request'
// 查询伴宠师列表
export function getTeacherList(params) {
return request({
url: '/applet/mall/teacher/getTeacherList',
headers: {
"isToken": true
},
method: 'get',
params
})
}

+ 1
- 1
pages/common/kefu.vue View File

@ -38,7 +38,7 @@
}
</script>
<style lang="scss">
<style lang="scss" scoped>
.float-button {
position: fixed;
bottom: 150px;


+ 112
- 15
pages_order/components/order/ServiceItems.vue View File

@ -10,19 +10,34 @@
<view class="item-header">
<view class="item-id">{{item.id}}</view>
<view class="item-name">{{item.name}}</view>
<view class="item-price">¥{{item.price.toFixed(2)}}</view>
</view>
<!-- 宠物名称 -->
<view class="item-pet">
<text>{{item.pet}}</text>
<view class="item-price-action">
<view class="item-price">¥{{item.price.toFixed(2)}}</view>
<!-- 展开按钮 -->
<view class="expand-btn" @click="toggleExpand(index)" v-if="item.pet || (item.customServices && item.customServices.length > 0)">
<!-- <text>{{ expandedItems.includes(index) ? '收起' : '展开' }}</text> -->
<view class="expand-icon" :class="{'expanded': expandedItems.includes(index)}">
<text class="icon-arrow">{{ expandedItems.includes(index) ? '∧' : '∨' }}</text>
</view>
</view>
</view>
</view>
<!-- 定制服务 -->
<view class="custom-services" v-if="item.customServices && item.customServices.length > 0">
<view class="custom-service-item" v-for="(service, serviceIndex) in item.customServices" :key="serviceIndex">
<view class="service-name">- {{service.name}}</view>
<view class="service-price">¥{{service.price.toFixed(2)}} × {{service.quantity}} </view>
<!-- 详细信息区域 -->
<view class="detail-area" v-show="expandedItems.includes(index)">
<!-- 宠物名称和头像 -->
<view class="item-pet" v-if="item.pet">
<view class="pet-avatar">
<image :src="item.petAvatar || '/static/images/default-pet.png'" mode="aspectFill"></image>
</view>
<text>{{item.pet}}</text>
</view>
<!-- 定制服务 -->
<view class="custom-services" v-if="item.customServices && item.customServices.length > 0">
<view class="custom-service-item" v-for="(service, serviceIndex) in item.customServices" :key="serviceIndex">
<view class="service-name">{{service.name}}</view>
<view class="service-price">¥{{service.price.toFixed(2)}} × {{service.quantity}} </view>
</view>
</view>
</view>
</view>
@ -73,6 +88,23 @@
type: Number,
default: 0
}
},
data() {
return {
expandedItems: [] //
}
},
methods: {
toggleExpand(index) {
const position = this.expandedItems.indexOf(index);
if (position === -1) {
//
this.expandedItems.push(index);
} else {
//
this.expandedItems.splice(position, 1);
}
}
}
}
</script>
@ -131,17 +163,77 @@
flex: 1;
}
.item-price {
font-size: 28rpx;
color: #FF5252;
font-weight: bold;
.item-price-action {
display: flex;
align-items: center;
gap: 15rpx;
.item-price {
font-size: 28rpx;
color: #FF5252;
font-weight: bold;
}
}
}
//
.expand-btn {
display: flex;
align-items: center;
justify-content: center;
// padding: 6rpx 12rpx;
width: 40rpx;
height: 40rpx;
font-size: 24rpx;
color: #666;
background-color: #FFF5E6;
border-radius: 20rpx;
border: 1px solid #FFAA48;
.expand-icon {
// margin-left: 6rpx;
transition: transform 0.3s ease;
&.expanded {
transform: rotate(180deg);
}
.icon-arrow {
font-size: 24rpx;
color: #FFAA48;
}
}
}
//
.detail-area {
padding: 15rpx;
animation: fadeIn 0.3s ease;
background-color: #F8F8F8;
border-radius: 10rpx;
margin-top: 10rpx;
}
.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 {
@ -167,6 +259,11 @@
}
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.cost-summary {
margin-top: 30rpx;
padding-top: 20rpx;


+ 3
- 3
pages_order/components/order/ServicePets.vue View File

@ -7,9 +7,9 @@
<view class="pet-item" v-for="(pet, index) in pets" :key="index">
<view class="pet-avatar">
<image :src="pet.avatar || '/static/images/personal/pet.png'" mode="aspectFill"></image>
<view class="pet-tag" v-if="pet.tag">
<!-- <view class="pet-tag" v-if="pet.tag">
<text>{{pet.tag}}</text>
</view>
</view> -->
</view>
<view class="pet-details">
<view class="pet-name-gender" style="display: flex; align-items: center;">
@ -18,7 +18,7 @@
<image :src="pet.gender=='男生'?'/static/images/details/boy.svg':'/static/images/details/girl.svg'" style="width: 24rpx; height: 24rpx;" alt="sex"></image>
</view>
</view>
<text class="pet-service">专业喂养{{pet.serviceDays}}: {{pet.serviceDates.join(',')}}</text>
<text class="pet-service">{{pet.services.join(',')}}: {{pet.serviceDates.join(',')}}</text>
</view>
</view>
</view>


+ 94
- 5
pages_order/components/order/ServiceRemarks.vue View File

@ -1,22 +1,54 @@
<template>
<view class="service-remarks-card">
<view class="card-title">
<text>服务备注</text>
<text>服务细则</text>
</view>
<view class="remarks-content">
<view class="payment-method">
<!-- 钥匙交接方式 -->
<view class="remarks-item">
<text class="item-label">钥匙交接方式</text>
<text class="item-value">{{remarks.keyHandoverMethod || '存于快递柜'}}</text>
</view>
<!-- 是否提前熟悉 -->
<view class="remarks-item advance-familiar">
<text class="item-label">是否提前熟悉</text>
<view class="checkbox-container" v-if="remarks.isAdvanceFamiliar">
<uv-icon name="checkmark" color="#FFAA48" size="36"></uv-icon>
</view>
</view>
<!-- 价格说明 -->
<view class="price-info" v-if="remarks.priceInfo">
<text class="price-text">* {{remarks.priceInfo}}</text>
</view>
<!-- 服务内容说明 -->
<view class="service-description">
<view class="description-item" v-if="remarks.serviceContent">
<text class="description-text">* {{remarks.serviceContent}}</text>
</view>
<view class="description-item" v-if="remarks.serviceCondition">
<text class="description-text">* {{remarks.serviceCondition}}</text>
</view>
</view>
<!-- 付款方式 -->
<!-- <view class="payment-method" v-if="remarks.paymentMethod">
<text class="label">付款方式:</text>
<text class="value">{{remarks.paymentMethod}}</text>
</view>
</view> -->
<view class="urgent-flag" v-if="remarks.isUrgent">
<!-- 紧急预约 -->
<!-- <view class="urgent-flag" v-if="remarks.isUrgent">
<view class="urgent-icon">
<image src="/static/images/details/girl.svg" style="width: 32rpx; height: 32rpx;"></image>
</view>
<text class="urgent-text">是否紧急预约</text>
</view>
</view> -->
<!-- 备注 -->
<view class="notes-section" v-if="remarks.notes">
<text class="notes-text">{{remarks.notes}}</text>
</view>
@ -26,10 +58,18 @@
<script>
export default {
components: {
uvIcon: () => import('@/uni_modules/uv-icon/components/uv-icon/uv-icon.vue')
},
props: {
remarks: {
type: Object,
default: () => ({
keyHandoverMethod: '存于快递柜',
isAdvanceFamiliar: true,
priceInfo: '价格40元/次',
serviceContent: '服务内容: 购买此服务后,伴宠师将在您需要前,按照约定时间提前上门为您照顾宠物',
serviceCondition: '服务保障: 购买此服务后,平台支付在提前熟悉店,上门服务第一天前,充电由客服联系您预约一次',
paymentMethod: '',
isUrgent: false,
notes: ''
@ -68,6 +108,55 @@
}
.remarks-content {
.remarks-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
.item-label {
font-size: 28rpx;
color: #333;
}
.item-value {
font-size: 26rpx;
color: #666;
}
}
.advance-familiar {
.checkbox-container {
display: flex;
align-items: center;
justify-content: center;
}
}
.price-info {
margin: 20rpx 0;
.price-text {
font-size: 26rpx;
color: #FF9500;
line-height: 1.5;
}
}
.service-description {
margin-bottom: 20rpx;
.description-item {
margin-bottom: 10rpx;
.description-text {
font-size: 26rpx;
color: #666;
line-height: 1.5;
}
}
}
.payment-method {
display: flex;
align-items: center;


+ 42
- 0
pages_order/order/AppletComment.java View File

@ -0,0 +1,42 @@
package com.ruoyi.model.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 用户评价对象 applet_comment
*
* @author ruoyi
* @date 2025-03-28
*/
public class AppletComment extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 唯一标识 */
private Long id;
/** 评价内容 */
@Excel(name = "评价内容")
private String comment;
/** 满意度 */
@Excel(name = "满意度")
private Long satisfaction;
/** 关联评价人员ID */
@Excel(name = "关联评价人员ID")
private Long user1Id;
/** 关联服务人员ID */
@Excel(name = "关联服务人员ID")
private Long user2Id;
/** 删除标识 */
private Integer delFlag;
}

+ 109
- 0
pages_order/order/orderDetail.json View File

@ -0,0 +1,109 @@
{
"orderId": 6278884034316288,
"payId": 6278884034316289,
"orderSn": "250418-6278884034316288",
"memberId": 211,
"totalAmount": 71.25,
"payAmount": 71.25,
"status": 4,
"aftersaleStatus": 1,
"orderItemList": [{
"createBy": 211,
"createTime": "2025-04-18 22:26:50",
"updateBy": null,
"updateTime": null,
"id": 6278884043425792,
"orderId": 6278884034316288,
"orderServiceId": 6278884036069376,
"productId": 63,
"outProductId": "P001",
"skuId": 404,
"outSkuId": null,
"productSnapshotId": null,
"skuSnapshotId": null,
"pic": "https://catmdogf.oss-cn-shanghai.aliyuncs.com/2024/01/08ba3980c107c2472397b13ef9769257e1陪玩.png",
"productName": "专业遛狗",
"salePrice": 75.00,
"purchasePrice": null,
"quantity": 1,
"productCategoryId": 76,
"spData": "{\"时间\":\"60\"}"
}],
"orderServiceList": [{
"createBy": 211,
"createTime": "2025-04-18 22:26:50",
"updateBy": null,
"updateTime": null,
"id": 6278884036069376,
"orderId": 6278884034316288,
"pet": null,
"serviceFrequency": null,
"serviceDate": "2025-04-30",
"serviceTimeFirst": null,
"serviceTimeSecond": null,
"delFlag": 0,
"petId": 177,
"expectServiceTime": "MORNING",
"feedCount": null,
"petVo": {
"createBy": null,
"createTime": null,
"updateBy": null,
"updateTime": null,
"id": 177,
"name": "1",
"petType": "cat",
"gender": "男生",
"birthDate": "2025-04",
"remark": "",
"photo": "https://cdn.catmdogd.com/2025/04/188453a042e71a4617b02121d1d9a580c7t92DaD6zscoI266f52064207b09da62f45b9b38e5bf3.png",
"breed": "重点色短毛猫",
"bodyType": "小型(<10 KG)",
"personality": ["友善热情", "粘人乖巧"],
"vaccineStatus": "每年都免疫",
"sterilization": "已绝育",
"dewormingStatus": "未驱虫",
"doglicenseStatus": "",
"healthStatus": ["身体健康,无异常"],
"owner": "211"
},
"pets": null
}],
"service": null,
"note": null,
"deliverySn": null,
"createTime": "2025-04-18 22:26:49",
"paymentTime": null,
"receiverName": "1",
"receiverPhone": "13055015802",
"receiverProvince": "",
"receiverCity": "湖南省湘潭市雨湖区雨湖路272号湘潭市雨湖区人民政府",
"receiverDistrict": "",
"receiverDetailAddress": "1",
"timeToPay": null,
"staffId": null,
"petVOList": [{
"createBy": null,
"createTime": null,
"updateBy": null,
"updateTime": null,
"id": 177,
"name": "1",
"petType": "cat",
"gender": "男生",
"birthDate": "2025-04",
"remark": "",
"photo": "https://cdn.catmdogd.com/2025/04/188453a042e71a4617b02121d1d9a580c7t92DaD6zscoI266f52064207b09da62f45b9b38e5bf3.png",
"breed": "重点色短毛猫",
"bodyType": "小型(<10 KG)",
"personality": ["友善热情", "粘人乖巧"],
"vaccineStatus": "每年都免疫",
"sterilization": "已绝育",
"dewormingStatus": "未驱虫",
"doglicenseStatus": "",
"healthStatus": ["身体健康,无异常"],
"owner": "211"
}],
"teacherId": null,
"companionLevel": null
}

+ 99
- 101
pages_order/order/orderDetail.vue View File

@ -28,7 +28,7 @@
<view class="footer-btn pay-btn" v-if="orderDetail.status === '1'" @click="goToPay">
<text>去付款</text>
</view>
<view class="footer-btn review-btn" @click="goToReview">
<view class="footer-btn review-btn" v-if="orderDetail.status === 4" @click="goToReview">
<text>评价订单</text>
</view>
<view class="footer-btn contact-btn">
@ -57,6 +57,15 @@
import CancelOrderPopup from '@/pages_order/components/order/CancelOrderPopup.vue'
import { getOrderList } from "@/api/system/user.js"
import { getOpenIdKey } from '@/utils/auth'
import { getOrderDetail } from '@/api/order/order.js'
import { getOrderServiceText, getProductNameText } from '@/utils/serviceTime.js'
//
const timeSlotMap = {
'MORNING': '上午',
'AFTERNOON': '下午',
'EVENING': '晚上'
}
export default {
components: {
@ -71,97 +80,7 @@
data() {
return {
orderId: null,
orderDetail: {
status: '1', // 1-, 2-, 3-, 4-
address: {
address: '上海青浦区盈港路888号1-2号-东部公寓',
contact: '联系电话: 18629356678'
},
pets: [
{
name: '小咪',
avatar: '/static/images/personal/pet.png',
tag: '猫',
gender: '女生',
serviceDays: 2,
serviceDates: ['03-20', '03-22']
},
{
name: '小汪',
avatar: '/static/images/personal/pet.png',
tag: '狗',
gender: '男生',
serviceDays: 3,
serviceDates: ['03-20', '03-22', '03-25']
}
],
items: [
{
id: '07-07',
name: '专业喂养',
price: 75.00,
pet: '小咪',
quantity: 1
},
{
id: '07-08',
name: '专业喂养 + 定制服务1项',
price: 75.00,
pet: '小汪',
quantity: 1,
customServices: [
{
name: '专业喂养',
price: 75.00,
quantity: 1
},
{
name: '上门遛狗',
price: 40.00,
quantity: 1
}
]
},
{
id: '07-10',
name: '专业喂养 + 定制服务2项',
price: 95.00,
pet: '小汪',
quantity: 1,
customServices: [
{
name: '专业喂养',
price: 75.00,
quantity: 1
},
{
name: '上门遛狗',
price: 40.00,
quantity: 1
},
{
name: '梳毛',
price: 40.00,
quantity: 1
}
]
}
],
totalAmount: 290.00,
discount: 10.00,
memberDiscount: 20.00,
finalAmount: 260.00,
remarks: {
paymentMethod: '存于平台账户',
isUrgent: true,
notes: '* 到达05/2楼\n* 猫咪很胆小,请轻声说话,保持安静。猫粮放在门口柜子上,猫砂盆在卫生间。\n* 狗狗很活泼,喜欢玩球,球放在客厅的篮子里。'
},
orderInfo: {
orderNumber: 'fc241200396263',
orderTime: '2024-12-03 13:05:57',
paymentTime: '2024-12-03 13:06:06'
}
}
orderDetail: {},
};
},
onLoad(options) {
@ -173,25 +92,103 @@
methods: {
//
getOrderDetail() {
// API
//
/*
const params = {
openId: getOpenIdKey(),
orderId: this.orderId
};
getOrderDetail(params).then(res => {
if (res && res.code === 200) {
this.orderDetail = res.data;
if (res) {
//
const data = res;
data.petVOList.forEach(pet => {
pet.orderServiceText = getOrderServiceText(pet.id, data.orderServiceList) //
pet.productNameText = getProductNameText(pet.id, data.orderItemList, data.orderServiceList) //
})
//
this.orderDetail = {
//
address: {
address: data.receiverProvince + data.receiverCity + data.receiverDistrict + data.receiverDetailAddress,
contact: data.receiverName + ' ' + data.receiverPhone
},
//
pets: data.petVOList ? data.petVOList.map(pet => {
return {
id: pet.id,
name: pet.name,
avatar: pet.photo,
gender: pet.gender,
serviceDays: pet.orderServiceText ? pet.orderServiceText.length : 0,
serviceDates: pet.orderServiceText || [],
services: pet.productNameText || []
};
}) : [],
//
items: data.orderItemList.map((item, index) => {
//
let spData = {};
try {
spData = JSON.parse(item.spData || '{}');
} catch (e) {
console.error('解析商品附加数据失败', e);
}
return {
id: index + 1,
name: item.productName,
price: item.salePrice,
quantity: item.quantity,
customServices: []
};
}),
//
totalAmount: data.totalAmount,
discount: data.totalAmount - data.payAmount,
finalAmount: data.payAmount,
//
status: data.status.toString(),
//
remarks: {
keyHandoverMethod: '存于快递柜',
isAdvanceFamiliar: true,
priceInfo: `价格${data.payAmount}`,
serviceContent: '服务内容: 伴宠师将按照约定时间上门照顾宠物',
serviceCondition: '服务保障: 购买此服务后,平台将安排伴宠师与您确认服务细节',
notes: data.note || ''
},
//
orderInfo: {
orderNumber: data.orderSn,
orderTime: data.createTime,
paymentTime: data.paymentTime
}
};
//
if (data.orderServiceList && data.orderServiceList.length > 0) {
//
const serviceDate = data.orderServiceList[0].serviceDate;
const serviceTime = data.orderServiceList[0].expectServiceTime;
//
if (this.orderDetail.items.length > 0) {
this.orderDetail.items[0].serviceDate = serviceDate;
this.orderDetail.items[0].serviceTime = timeSlotMap[serviceTime] || serviceTime;
}
}
}
}).catch(err => {
console.error('获取订单详情失败', err);
});
*/
// 使
console.log('获取订单详情,ID:', this.orderId);
},
//
@ -210,6 +207,7 @@
//
handleCancelOrder() {
//
}
}
}


+ 34
- 7
pages_order/order/orderList.vue View File

@ -44,7 +44,8 @@
style="width: 24rpx; height: 24rpx;" alt="sex"></image>
</view>
</view>
<text class="pet-service">{{pet.serviceTime}}</text>
<text class="pet-service">
{{ pet.productNameText.join(',') }} | {{ pet.orderServiceText.length }} {{ pet.orderServiceText.join(',') }}</text>
</view>
</view>
@ -62,12 +63,15 @@
@click="$refs.cancelOrderPopup.open()">
<text>取消订单</text>
</view>
<view class="action-btn details-btn" @click="viewOrderDetails(order.id)">
<view class="action-btn details-btn" @click="viewOrderDetails(order.orderId)">
<text>查看详情</text>
</view>
<view class="action-btn pay-btn" v-if="order.status == 0" @click="goToPay(order.id)">
<view class="action-btn pay-btn" v-if="order.status == 0" @click="goToPay(order.orderId)">
<text>去付款</text>
</view>
<view class="action-btn pay-btn" v-if="order.status == 4" @click="goToReview(order)">
<text>去评价</text>
</view>
<view class="action-btn pay-btn" v-if="order.status == 3" @click="handleReorder(order)">
<text>再来一单</text>
</view>
@ -106,14 +110,17 @@
<script>
import Kefu from '@/pages/common/kefu.vue'
import {
getOrderList
// getOrderList
} from "@/api/system/user.js"
import {
getOrderList
} from "@/api/order/order.js"
import {
getOpenIdKey
} 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,
@ -227,6 +234,13 @@
});
},
//
goToReview({teacherId, orderId}) {
uni.navigateTo({
url: `/pages_order/order/orderReview?id=${teacherId}&orderId=${orderId}`
});
},
//
getOrderList() {
if (this.loading) return Promise.reject();
@ -236,8 +250,8 @@
const params = {
status: this.currentTab,
openId: getOpenIdKey(),
page: this.page,
size: this.size
pageNumber: this.page,//pageNumber
pageSize: this.size
};
@ -272,6 +286,16 @@
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 || []) || []
})
})
} else {
this.hasMore = false;
}
@ -431,6 +455,9 @@
font-size: 24rpx;
color: #666;
margin-top: 4rpx;
overflow:hidden; //
text-overflow:ellipsis; //
white-space:nowrap; //
}
}
}


+ 61
- 42
pages_order/order/orderReview.vue View File

@ -4,14 +4,14 @@
<view class="companion-info-card">
<view class="profile-header">
<view class="companion-avatar">
<image :src="companion.avatar" mode="aspectFill"></image>
<image :src="companion.avatar || '/static/images/personal/pet.png'" mode="aspectFill"></image>
</view>
<view class="companion-detail">
<view class="companion-name">
<text>{{companion.name}}</text>
<text>{{companion.name || '伴宠师'}}</text>
<image v-if="companion.gender" :src="companion.gender === '男生' ? '/static/images/details/boy.svg' : '/static/images/details/girl.svg'" class="gender-icon"></image>
<view class="companion-tag" v-if="companion.isOfficial">
<text>初级伴宠师</text>
<view class="companion-tag" v-if="companion.level">
<text>{{companion.level === 'junior' ? '初级伴宠师' : '高级伴宠师'}}</text>
</view>
</view>
</view>
@ -65,49 +65,68 @@
<script>
import { getOpenIdKey } from '@/utils/auth'
import { getTeacherDetail, orderEvaluate } from '@/api/order/order.js'
export default {
data() {
return {
orderId: null,
teacherId: null,
rating: 5,
reviewContent: '',
companion: {
name: '宠小二',
avatar: '/static/images/personal/pet.png',
isOfficial: true,
gender: '女生'
}
name: '',
avatar: '',
level: '',
gender: ''
},
orderInfo: null,
orderId : 0,
};
},
onLoad(options) {
if (options.id) {
this.orderId = options.id;
this.getOrderInfo();
this.teacherId = options.id;
this.orderId = options.orderId;
this.getCompanionInfo();
}
},
methods: {
//
getOrderInfo() {
// API
//
/*
//
getCompanionInfo() {
// API
const params = {
openId: getOpenIdKey(),
orderId: this.orderId
teacherId: this.teacherId
};
getOrderDetail(params).then(res => {
getTeacherDetail(params).then(res => {
if (res && res.code === 200) {
this.companion = res.data.companion;
const teacherData = res.data;
this.companion = {
name: teacherData.name || '伴宠师',
avatar: teacherData.avatar || '/static/images/personal/pet.png',
level: teacherData.level || 'junior',
gender: teacherData.gender || '女生'
};
} else {
// 使
this.companion = {
name: '宠小二',
avatar: '/static/images/personal/pet.png',
level: 'junior',
gender: '女生'
};
}
}).catch(err => {
console.error('获取订单详情失败', err);
console.error('获取伴宠师信息失败', err);
//
this.companion = {
name: '宠小二',
avatar: '/static/images/personal/pet.png',
level: 'junior',
gender: '女生'
};
});
*/
// 使
console.log('获取订单详情,ID:', this.orderId);
},
//
@ -133,34 +152,34 @@
return;
}
// API
//
/*
// AppletComment
const params = {
orderId : this.orderId,
openId: getOpenIdKey(),
orderId: this.orderId,
rating: this.rating,
content: this.reviewContent
comment: this.reviewContent, //
satisfaction: this.rating, //
user2Id: this.teacherId // IDID
};
submitOrderReview(params).then(res => {
//
orderEvaluate(params).then(res => {
if (res && res.code === 200) {
this.showSuccessAndBack();
} else {
uni.showToast({
title: '评价成功',
icon: 'success'
title: res.msg || '评价失败',
icon: 'none'
});
//
setTimeout(() => {
uni.navigateBack();
}, 1500);
}
}).catch(err => {
console.error('提交评价失败', err);
// 便
this.showSuccessAndBack();
});
*/
// 使
},
//
showSuccessAndBack() {
uni.showToast({
title: '评价成功',
icon: 'success'


+ 1
- 0
utils/lib/dayjs.min.js
File diff suppressed because it is too large
View File


+ 1
- 1
utils/serviceTime.js View File

@ -3,7 +3,7 @@
import dayjs from "dayjs";
import dayjs from "./lib/dayjs.min.js";


Loading…
Cancel
Save