<!-- 订单详情 --> <template> <s-layout title="订单详情" class="index-wrap" navbar="inner"> <!-- 订单状态 TODO --> <view class="state-box ss-flex-col ss-col-center ss-row-right" :style="[ { marginTop: '-' + Number(statusBarHeight + 88) + 'rpx', paddingTop: Number(statusBarHeight + 88) + 'rpx', }, ]" > <view class="ss-flex ss-m-t-32 ss-m-b-20"> <view class="ss-font-40">{{ state.orderInfo.phone.slice(-4) }}</view> </view> <view class="ss-font-26 ss-m-x-20 ss-m-b-70">{{ '取餐码' }}</view> </view> <!-- 收货地址 --> <view class="order-address-box" > <view class="ss-flex ss-col-center"> <text class="address-username"> {{ state.orderInfo.receiverName }} </text> <text class="address-phone">{{ state.orderInfo.phone }}</text> </view> <view class="address-detail"> {{ state.orderInfo.name }} {{ state.orderInfo.address }} </view> </view> <view class="detail-goods" :style="[{ marginTop: state.orderInfo.receiverAreaId > 0 ? '0' : '-40rpx' }]" > <!-- 订单信 --> </view> <!-- 订单信息 --> <view class="notice-box"> <view class="notice-box__content"> <view class="notice-item--center"> <view class="ss-flex ss-flex-1"> <text class="title">订单编号:</text> <text class="detail">{{ state.orderInfo.id }}</text> </view> <button class="ss-reset-button copy-btn" @tap="onCopy">复制</button> </view> <view class="notice-item"> <text class="title">下单时间:</text> <text class="detail"> {{ sheep.$helper.timeFormat(state.orderInfo.createTime, 'yyyy-mm-dd hh:MM:ss') }} </text> </view> <view class="notice-item" v-if="state.orderInfo.payTime"> <text class="title">支付时间:</text> <text class="detail"> {{ sheep.$helper.timeFormat(state.orderInfo.payTime, 'yyyy-mm-dd hh:MM:ss') }} </text> </view> <view class="notice-item" v-if="state.orderInfo.useTime"> <text class="title">用餐时间:</text> <text class="detail"> {{ sheep.$helper.timeFormat(state.orderInfo.useTime, 'yyyy-mm-dd hh:MM:ss') }} </text> </view> <view class="notice-item"> <text class="title">类型:</text> <text class="detail">{{ state.orderInfo.type==2?'外卖':'堂食' || '-' }}</text> </view> <view class="notice-item"> <text class="title">状态:</text> <text v-show="state.orderInfo.state==1">待支付</text> <text v-show="state.orderInfo.state==2">支付失败</text> <text v-show="state.orderInfo.state==3">支付超时 </text> <text v-show="state.orderInfo.state==4">待取餐 </text> <text v-show="state.orderInfo.state==5">已完成</text> <text v-show="state.orderInfo.state==6">已退款</text> <!-- <text class="detail">{{ state.orderInfo.state==2?'外卖':'堂食' || '-' }}</text> --> </view> </view> </view> <view v-for="(i,j) in state.orderInfo.goodsInfoList" :key="j" class="minmi" style="width: 100vw;background-color: #fff;" > <image class="imgPic" :src="i.goodsIcon" mode=""></image> <view class="rightContainer"> <view class="foodName"> {{i.goodsName}} </view> <view class="foodPrice"> <view class="priceflex"> <text class="zero">¥</text> {{i.priceVisable}} </view> <view class="shopCar iconfont-themeColor-write" v-show="i.num == 0" @tap="addcart(i)"> <text class="lg text-white cuIcon-add" ></text> </view> <view class="" v-if="i.num > 0" > <!-- <text class="lg text-white cuIcon-minus" @tap="addcart(i)" ></text> --> <!-- <uni-number-box :min="0" :max="100" :step="1" v-model="i.num" @tap="chengeCart(i)" /> --> <text>{{ i.num }}</text> </view> </view> </view> </view> <!-- 价格信息 --> <view class="order-price-box"> <view class="notice-item ss-flex ss-row-between"> <text class="title">商品总额</text> <view class="ss-flex"> <text class="detail">¥{{ state.orderInfo.priceVisable }}</text> </view> </view> <!-- <view class="notice-item all-rpice-item ss-flex ss-m-t-20"> <text class="title">{{ state.orderInfo.payStatus ? '已付款' : '需付款' }}</text> <text class="detail all-price">¥{{ state.orderInfo.price }}</text> </view> --> </view> <!-- 底部按钮 --> <!-- TODO: 查看物流、等待成团、评价完后返回页面没刷新页面 --> </s-layout> </template> <script setup> import sheep from '@/sheep'; import { onLoad } from '@dcloudio/uni-app'; import { reactive } from 'vue'; import { isEmpty } from 'lodash'; import { fen2yuan, formatOrderStatus, formatOrderStatusDescription, handleOrderButtons, } from '@/sheep/hooks/useGoods'; import OrderApi from '@/sheep/api/trade/order'; const statusBarHeight = sheep.$platform.device.statusBarHeight * 2; const headerBg = sheep.$url.css('/static/img/shop/order/order_bg.png'); const state = reactive({ orderInfo: {}, merchantTradeNo: '', // 商户订单号 comeinType: '', // 进入订单详情的来源类型 }); // 复制 const onCopy = () => { sheep.$helper.copyText(state.orderInfo.sn); }; // 去支付 function onPay(payOrderId) { sheep.$router.go('/pages/pay/index', { id: payOrderId, }); } // 查看商品 function onGoodsDetail(id) { sheep.$router.go('/pages/goods/index', { id, }); } // 取消订单 async function onCancel(orderId) { uni.showModal({ title: '提示', content: '确定要取消订单吗?', success: async function (res) { if (!res.confirm) { return; } const { code } = await OrderApi.cancelOrder(orderId); if (code === 0) { await getOrderDetail(orderId); } }, }); } // 查看物流 async function onExpress(id) { sheep.$router.go('/pages/order/express/log', { id, }); } // 确认收货 TODO 芋艿:待测试 async function onConfirm(orderId, ignore = false) { // 需开启确认收货组件 // todo: 芋艿:待接入微信 // 1.怎么检测是否开启了发货组件功能?如果没有开启的话就不能在这里return出去 // 2.如果开启了走mpConfirm方法,需要在App.vue的show方法中拿到确认收货结果 let isOpenBusinessView = true; if ( sheep.$platform.name === 'WechatMiniProgram' && !isEmpty(state.orderInfo.wechat_extra_data) && isOpenBusinessView && !ignore ) { mpConfirm(orderId); return; } // 正常的确认收货流程 const { code } = await OrderApi.receiveOrder(orderId); if (code === 0) { await getOrderDetail(orderId); } } // #ifdef MP-WEIXIN // 小程序确认收货组件 function mpConfirm(orderId) { if (!wx.openBusinessView) { sheep.$helper.toast(`请升级微信版本`); return; } wx.openBusinessView({ businessType: 'weappOrderConfirm', extraData: { merchant_trade_no: state.orderInfo.wechat_extra_data.merchant_trade_no, transaction_id: state.orderInfo.wechat_extra_data.transaction_id, }, success(response) { console.log('success:', response); if (response.errMsg === 'openBusinessView:ok') { if (response.extraData.status === 'success') { onConfirm(orderId, true); } } }, fail(error) { console.log('error:', error); }, complete(result) { console.log('result:', result); }, }); } // #endif // 评价 function onComment(id) { sheep.$router.go('/pages/goods/comment/add', { id }); } async function getOrderDetail(id) { // 对详情数据进行适配 let res; if (state.comeinType === 'wechat') { // TODO 芋艿:微信场景下 res = await OrderApi.getOrder(id, { merchant_trade_no: state.merchantTradeNo, }); } else { res = await OrderApi.getOrder(id); } if (res.code === 0) { state.orderInfo = res.data; handleOrderButtons(state.orderInfo); } else { sheep.$router.back(); } } onLoad(async (options) => { let id = 0; if (options.id) { id = options.id; } // TODO 芋艿:下面两个变量,后续接入 state.comeinType = options.comein_type; if (state.comeinType === 'wechat') { state.merchantTradeNo = options.merchant_trade_no; } await getOrderDetail(id); }); </script> <style lang="scss" scoped> .score-img { width: 36rpx; height: 36rpx; margin: 0 4rpx; } .apply-btn { width: 140rpx; height: 50rpx; border-radius: 25rpx; font-size: 24rpx; border: 2rpx solid #dcdcdc; line-height: normal; margin-left: 16rpx; } .state-box { color: rgba(#fff, 0.9); width: 100%; background: v-bind(headerBg) no-repeat, linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient)); background-size: 750rpx 100%; box-sizing: border-box; .state-img { width: 60rpx; height: 60rpx; margin-right: 20rpx; } } .order-address-box { background-color: #fff; border-radius: 10rpx; margin: -50rpx 20rpx 16rpx 20rpx; padding: 44rpx 34rpx 42rpx 20rpx; font-size: 30rpx; box-sizing: border-box; font-weight: 500; color: rgba(51, 51, 51, 1); .address-username { margin-right: 20rpx; } .address-detail { font-size: 26rpx; font-weight: 500; color: rgba(153, 153, 153, 1); margin-top: 20rpx; } } .detail-goods { border-radius: 10rpx; margin: 0 20rpx 20rpx 20rpx; .order-list { margin-bottom: 20rpx; background-color: #fff; .order-card { padding: 20rpx 0; .order-sku { font-size: 24rpx; font-weight: 400; color: rgba(153, 153, 153, 1); width: 450rpx; margin-bottom: 20rpx; .order-num { margin-right: 10rpx; } } .tag-btn { margin-left: 16rpx; font-size: 24rpx; height: 36rpx; color: var(--ui-BG-Main); border: 2rpx solid var(--ui-BG-Main); border-radius: 14rpx; padding: 0 4rpx; } } } } // 订单信息。 .notice-box { background: #fff; border-radius: 10rpx; margin: 0 20rpx 20rpx 20rpx; .notice-box__head { font-size: 30rpx; font-weight: 500; color: rgba(51, 51, 51, 1); line-height: 80rpx; border-bottom: 1rpx solid #dfdfdf; padding: 0 25rpx; } .notice-box__content { padding: 20rpx; .self-pickup-box { width: 100%; .self-pickup--img { width: 200rpx; height: 200rpx; margin: 40rpx 0; } } } .notice-item, .notice-item--center { display: flex; align-items: center; line-height: normal; margin-bottom: 24rpx; .title { font-size: 28rpx; color: #999; } .detail { font-size: 28rpx; color: #333; flex: 1; } } } .copy-btn { width: 100rpx; line-height: 50rpx; border-radius: 25rpx; padding: 0; background: rgba(238, 238, 238, 1); font-size: 22rpx; font-weight: 400; color: rgba(51, 51, 51, 1); } // 订单价格信息 .order-price-box { background-color: #fff; border-radius: 10rpx; padding: 20rpx; margin: 0 20rpx 20rpx 20rpx; .notice-item { line-height: 70rpx; .title { font-size: 28rpx; color: #999; } .detail { font-size: 28rpx; color: #333; font-family: OPPOSANS; } } .all-rpice-item { justify-content: flex-end; align-items: center; .title { font-size: 26rpx; font-weight: 500; color: #333333; line-height: normal; } .all-price { font-size: 26rpx; font-family: OPPOSANS; line-height: normal; color: $red; } } } // 底部 .footer-box { height: 100rpx; width: 100%; box-sizing: border-box; border-radius: 10rpx; padding-right: 20rpx; .cancel-btn { width: 160rpx; height: 60rpx; background: #eeeeee; border-radius: 30rpx; margin-right: 20rpx; font-size: 26rpx; font-weight: 400; color: #333333; } .pay-btn { width: 160rpx; height: 60rpx; font-size: 26rpx; border-radius: 30rpx; font-weight: 500; color: #fff; } } .minmi { display: flex; width: 592upx; margin-left: 25upx; padding-top: 51upx; .imgPic { width: 208upx; height: 167upx; border-radius: 10upx; margin-left: 20upx; } .rightContainer { display: flex; flex-direction: column; height: 167upx; box-sizing: border-box; justify-content: space-between; align-items: flex-start; padding-left: 18upx; padding-right: 18upx; padding-top: 18upx; // padding-bottom: 18upx; flex: 1; .foodName { font-weight: 700; font-size: 25upx; } .foodPrice { display: flex; justify-content: space-between; width: 375upx; color: #F9BE3E; .priceflex { display: flex; align-items: center; .zero { font-size: 15upx; } } .shopCar { background-color: #F9BE3E; border-radius: 45upx; width: 112upx; height: 45upx; font-size: 25upx; text-align: center; line-height: 46upx; } } } } </style>