You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
7.5 KiB

  1. <template>
  2. <view class="order-detail-page">
  3. <!-- 订单内容区域 -->
  4. <view class="order-detail-content">
  5. <!-- 服务地址组件 -->
  6. <service-address :address="orderDetail.address"></service-address>
  7. <!-- 服务宠物组件 -->
  8. <service-pets :pets="orderDetail.pets"></service-pets>
  9. <!-- 服务项目及费用组件 -->
  10. <service-items :items="orderDetail.items" :totalAmount="orderDetail.totalAmount"
  11. :discount="orderDetail.discount" :finalAmount="orderDetail.finalAmount"></service-items>
  12. <!-- 服务备注组件 -->
  13. <service-remarks :remarks="orderDetail.remarks"></service-remarks>
  14. <!-- 其他信息组件 -->
  15. <order-info :orderInfo="orderDetail.orderInfo"></order-info>
  16. </view>
  17. <!-- 底部按钮区域 -->
  18. <view class="order-detail-footer">
  19. <view class="footer-btn cancel-btn" v-if="orderDetail.status === '1'" @click="$refs.cancelOrderPopup.open()">
  20. <text>取消订单</text>
  21. </view>
  22. <view class="footer-btn pay-btn" v-if="orderDetail.status === '1'" @click="goToPay">
  23. <text>去付款</text>
  24. </view>
  25. <!-- <view class="footer-btn modify-btn" v-if="orderDetail.status != 0 && orderDetail.status != 3" @click="modifyOrder">
  26. <text>修改订单</text>
  27. </view> -->
  28. <view class="footer-btn review-btn" v-if="orderDetail.status === 4" @click="goToReview">
  29. <text>评价订单</text>
  30. </view>
  31. <view class="footer-btn contact-btn">
  32. <text>联系客服</text>
  33. </view>
  34. </view>
  35. <!-- 取消订单弹窗 -->
  36. <cancel-order-popup
  37. ref="cancelOrderPopup"
  38. @cancel="handleCancelOrder"
  39. ></cancel-order-popup>
  40. <!-- 客服组件 -->
  41. <Kefu></Kefu>
  42. </view>
  43. </template>
  44. <script>
  45. import Kefu from '@/pages/common/kefu.vue'
  46. import ServiceAddress from '@/pages_order/components/order/ServiceAddress.vue'
  47. import ServicePets from '@/pages_order/components/order/ServicePets.vue'
  48. import ServiceItems from '@/pages_order/components/order/ServiceItems.vue'
  49. import ServiceRemarks from '@/pages_order/components/order/ServiceRemarks.vue'
  50. import OrderInfo from '@/pages_order/components/order/OrderInfo.vue'
  51. import CancelOrderPopup from '@/pages_order/components/order/CancelOrderPopup.vue'
  52. import { getOrderList } from "@/api/system/user.js"
  53. import { getOpenIdKey } from '@/utils/auth'
  54. import { getOrderDetail } from '@/api/order/order.js'
  55. import { getOrderServiceText, getProductNameText } from '@/utils/serviceTime.js'
  56. // 服务时间段映射
  57. const timeSlotMap = {
  58. 'MORNING': '上午',
  59. 'AFTERNOON': '下午',
  60. 'EVENING': '晚上'
  61. }
  62. export default {
  63. components: {
  64. Kefu,
  65. ServiceAddress,
  66. ServicePets,
  67. ServiceItems,
  68. ServiceRemarks,
  69. OrderInfo,
  70. CancelOrderPopup
  71. },
  72. data() {
  73. return {
  74. orderId: null,
  75. orderDetail: {},
  76. };
  77. },
  78. onLoad(options) {
  79. if (options.id) {
  80. this.orderId = options.id;
  81. this.getOrderDetail();
  82. }
  83. },
  84. methods: {
  85. // 获取订单详情
  86. getOrderDetail() {
  87. const params = {
  88. openId: getOpenIdKey(),
  89. orderId: this.orderId
  90. };
  91. getOrderDetail(params).then(res => {
  92. if (res) {
  93. // 处理接口返回的数据
  94. const data = res;
  95. data.petVOList.forEach(pet => {
  96. pet.orderServiceText = getOrderServiceText(pet.id, data.orderServiceList) // 日期
  97. pet.productNameText = getProductNameText(pet.id, data.orderItemList, data.orderServiceList) // 服务
  98. })
  99. // 构建符合组件渲染需要的数据结构
  100. this.orderDetail = {
  101. // 地址信息
  102. address: {
  103. address: data.receiverProvince + data.receiverCity + data.receiverDistrict + data.receiverDetailAddress,
  104. contact: data.receiverName + ' ' + data.receiverPhone
  105. },
  106. // 宠物信息
  107. pets: data.petVOList ? data.petVOList.map(pet => {
  108. return {
  109. id: pet.id,
  110. name: pet.name,
  111. avatar: pet.photo,
  112. gender: pet.gender,
  113. serviceDays: pet.orderServiceText ? pet.orderServiceText.length : 0,
  114. serviceDates: pet.orderServiceText || [],
  115. services: pet.productNameText || []
  116. };
  117. }) : [],
  118. // 服务项目列表
  119. items: data.orderItemList.map((item, index) => {
  120. // 解析商品附加数据
  121. let spData = {};
  122. try {
  123. spData = JSON.parse(item.spData || '{}');
  124. } catch (e) {
  125. console.error('解析商品附加数据失败', e);
  126. }
  127. return {
  128. id: index + 1,
  129. name: item.productName,
  130. price: item.salePrice,
  131. quantity: item.quantity,
  132. customServices: []
  133. };
  134. }),
  135. // 费用信息
  136. totalAmount: data.totalAmount,
  137. discount: data.totalAmount - data.payAmount,
  138. finalAmount: data.payAmount,
  139. // 订单状态
  140. status: data.status.toString(),
  141. // 备注信息
  142. remarks: {
  143. keyHandoverMethod: '存于快递柜',
  144. isAdvanceFamiliar: true,
  145. priceInfo: `价格${data.payAmount}`,
  146. serviceContent: '服务内容: 伴宠师将按照约定时间上门照顾宠物',
  147. serviceCondition: '服务保障: 购买此服务后,平台将安排伴宠师与您确认服务细节',
  148. notes: data.note || ''
  149. },
  150. // 其他信息
  151. orderInfo: {
  152. orderNumber: data.orderSn,
  153. orderTime: data.createTime,
  154. paymentTime: data.paymentTime
  155. }
  156. };
  157. // 如果有服务信息,处理服务日期和时间段
  158. if (data.orderServiceList && data.orderServiceList.length > 0) {
  159. // 处理服务日期和时间段
  160. const serviceDate = data.orderServiceList[0].serviceDate;
  161. const serviceTime = data.orderServiceList[0].expectServiceTime;
  162. // 更新服务项目描述
  163. if (this.orderDetail.items.length > 0) {
  164. this.orderDetail.items[0].serviceDate = serviceDate;
  165. this.orderDetail.items[0].serviceTime = timeSlotMap[serviceTime] || serviceTime;
  166. }
  167. }
  168. }
  169. }).catch(err => {
  170. console.error('获取订单详情失败', err);
  171. });
  172. },
  173. // 去付款
  174. goToPay() {
  175. uni.navigateTo({
  176. url: `/pages/details/order?id=${this.orderId}`
  177. });
  178. },
  179. // 去评价
  180. goToReview() {
  181. uni.navigateTo({
  182. url: `/pages_order/order/orderReview?id=${this.orderId}`
  183. });
  184. },
  185. // 处理取消订单
  186. handleCancelOrder() {
  187. // 待实现取消订单逻辑
  188. },
  189. // 修改订单
  190. modifyOrder() {
  191. // 跳转到服务选择页面,并传递订单ID参数
  192. uni.navigateTo({
  193. url: `/pages_order/order/orderModify?orderId=${this.orderId}`
  194. });
  195. }
  196. }
  197. }
  198. </script>
  199. <style lang="scss" scoped>
  200. .order-detail-page {
  201. background-color: #f5f5f5;
  202. min-height: 100vh;
  203. display: flex;
  204. flex-direction: column;
  205. }
  206. .order-detail-content {
  207. flex: 1;
  208. padding: 20rpx;
  209. }
  210. .order-detail-footer {
  211. display: flex;
  212. justify-content: flex-end;
  213. align-items: center;
  214. padding: 20rpx 30rpx;
  215. background-color: #FFFFFF;
  216. border-top: 1px solid #EEEEEE;
  217. .footer-btn {
  218. padding: 16rpx 30rpx;
  219. border-radius: 30rpx;
  220. font-size: 26rpx;
  221. margin-left: 20rpx;
  222. }
  223. .cancel-btn {
  224. background-color: #FFFFFF;
  225. color: #666;
  226. border: 1px solid #DDDDDD;
  227. }
  228. .pay-btn {
  229. background-color: #FFAA48;
  230. color: #FFFFFF;
  231. }
  232. .modify-btn {
  233. background-color: #FFAA48;
  234. color: #FFFFFF;
  235. }
  236. .review-btn {
  237. background-color: #FFAA48;
  238. color: #FFFFFF;
  239. }
  240. .contact-btn {
  241. background-color: #FFFFFF;
  242. color: #666;
  243. border: 1px solid #DDDDDD;
  244. }
  245. }
  246. </style>