<!-- 售后详情 --> <template> <s-layout :title="t('order.after_sales_details')" :navbar="!isEmpty(state.info) && state.loading ? 'inner' : 'normal'"> <view class="content_box" v-if="!isEmpty(state.info) && state.loading"> <!-- 步骤条 --> <view class="steps-box ss-flex" :style="[ { marginTop: '-' + Number(statusBarHeight + 88) + 'rpx', paddingTop: Number(statusBarHeight + 88) + 'rpx', }, ]"> <view class="ss-flex"> <view class="steps-item" v-for="(item, index) in state.list" :key="index"> <view class="ss-flex"> <text class="sicon-circleclose" v-if="state.list.length - 1 === index && [61, 62, 63].includes(state.info.status)" /> <text class="sicon-circlecheck" v-else :class="state.active >= index ? 'activity-color' : 'info-color'" /> <view v-if="state.list.length - 1 !== index" class="line" :class="state.active >= index ? 'activity-bg' : 'info-bg'" /> </view> <view class="steps-item-title" :class="state.active >= index ? 'activity-color' : 'info-color'"> {{ item.title }} </view> </view> </view> </view> <!-- 服务状态 --> <view class="status-box ss-flex ss-col-center ss-row-between ss-m-x-20" @tap="sheep.$router.go('/pages/order/aftersale/log', { id: state.id })"> <view class=""> <view class="status-text"> {{ formatAfterSaleStatusDescription(state.info) }} </view> <view class="status-time"> {{ sheep.$helper.timeFormat(state.info.updateTime, 'yyyy-mm-dd hh:MM:ss') }} </view> </view> <text class="ss-iconfont _icon-forward" style="color: #666" /> </view> <!-- 退款金额 --> <view class="aftersale-content ss-m-y-20"> <view class="aftersale-item ss-flex ss-col-center"> <view class="item-title">{{ t('order.total_refund') }}:</view> <view class="item-content"> ¥{{ fen2yuan(state.info.refundPriceTotal) }} </view> </view> <view class="aftersale-item ss-flex ss-col-center"> <view class="item-title">{{ t('order.refund_amount') }}:</view> <view class="item-content">¥{{ fen2yuan(state.info.refundPrice) }}</view> </view> <view class="aftersale-item ss-flex ss-col-center"> <view class="item-title"> {{ t('order.refund_commission') }}:</view> <view class="item-content">¥{{ points2point(state.info.refundIntegral) }}</view> </view> <view class="aftersale-item ss-flex ss-col-center"> <view class="item-title"> {{ t('order.refund_points') }}:</view> <view class="item-content">¥{{ points2point(state.info.refundConsumptionPoints) }}</view> </view> </view> <!-- 服务商品 --> <view class="order-shop"> <s-goods-item :price="state.info.refundPriceTotal" :img="state.info.picUrl" :title="state.info.spuName" :titleWidth="480" :skuText="state.info.properties.map((property) => property.valueName).join(' ')" :num="state.info.count" /> </view> <!-- 服务内容 --> <view class="aftersale-content"> <view class="aftersale-item ss-flex ss-col-center"> <view class="item-title">{{ t('order.service_order_number') }}:</view> <view class="item-content ss-m-r-16">{{ state.info.no }}</view> <button class="ss-reset-button copy-btn" @tap="onCopy"> {{ t('order.copy') }} </button> </view> <view class="aftersale-item ss-flex ss-col-center"> <view class="item-title">{{ t('order.application_time') }}:</view> <view class="item-content"> {{ sheep.$helper.timeFormat(state.info.createTime, 'yyyy-mm-dd hh:MM:ss') }} </view> </view> <view class="aftersale-item ss-flex ss-col-center"> <view class="item-title">{{ t('order.after_sales_type') }}:</view> <view class="item-content">{{ state.info.way === 10 ? t('order.refund_only') : t('order.refund_and_return') }}</view> </view> <view class="aftersale-item ss-flex ss-col-center"> <view class="item-title">{{ t('order.application_reason') }}:</view> <view class="item-content">{{ state.info.applyReason }}</view> </view> <view class="aftersale-item ss-flex ss-col-center"> <view class="item-title">{{ t('order.related_description') }}:</view> <view class="item-content">{{ state.info.applyDescription }}</view> </view> </view> </view> <!-- 操作区 --> <s-empty v-if="isEmpty(state.info) && state.loading" icon="/static/order-empty.png" :text="t('order.no_after_sales_details')" /> <su-fixed bottom placeholder bg="bg-white" v-if="!isEmpty(state.info)"> <view class="foot_box"> <button class="ss-reset-button btn" v-if="state.info.buttons?.includes('cancel')" @tap="onApply(state.info.id)"> {{ t('order.cancel_request') }} </button> <button class="ss-reset-button btn" v-if="state.info.buttons?.includes('delivery')" @tap="sheep.$router.go('/pages/order/aftersale/return-delivery', { id: state.info.id })"> {{ t('order.fill_return') }} </button> <!-- <button class="ss-reset-button contcat-btn btn" @tap="sheep.$router.go('/pages/chat/index')"> 联系客服 </button> --> </view> </su-fixed> </s-layout> </template> <script setup> import sheep from '@/sheep'; import { onLoad } from '@dcloudio/uni-app'; import { reactive, computed, watch } from 'vue'; import { isEmpty } from 'lodash'; import { showAuthModal } from '@/sheep/hooks/useModal'; import { fen2yuan, points2point, formatAfterSaleStatusDescription, handleAfterSaleButtons } from '@/sheep/hooks/useGoods'; import AfterSaleApi from '@/sheep/api/trade/afterSale'; import { t } from '@/locale'; const userInfo = sheep.$store('user').userInfo; const statusBarHeight = sheep.$platform.device.statusBarHeight * 2; const headerBg = sheep.$url.css('/static/img/shop/order/order_bg.png'); const state = reactive({ id: 0, // 售后编号 info: {}, // 收货信息 loading: false, active: 0, // 在 list 的激活位置 list: [{ title: t('order.submit_application'), }, { title: t('order.processing'), }, { title: t('order.completed') }], // 时间轴 }); function onApply(id) { uni.showModal({ title: t('setting.prompt'), content: t('order.confirm_cancel_request'), success: async function(res) { if (!res.confirm) { return; } const { code } = await AfterSaleApi.cancelAfterSale(id); if (code === 0) { await getDetail(id); } }, }); } // 复制 const onCopy = () => { sheep.$helper.copyText(state.info.no); }; async function getDetail(id) { state.loading = true; const { code, data } = await AfterSaleApi.getAfterSale(id); if (code !== 0) { state.info = null; return; } state.info = data; handleAfterSaleButtons(state.info); // 处理时间轴 if ([10].includes(state.info.status)) { state.active = 0; } else if ([20, 30, 40].includes(state.info.status)) { state.active = 1; } else if ([50].includes(state.info.status)) { state.active = 2; } else if ([61, 62, 63].includes(state.info.status)) { state.active = 2; } } const isLogin = computed(() => sheep.$store('user').isLogin); // 监听到在这个页面登陆,并刷新页面 watch( () => isLogin.value, (newVal) => { if (newVal) { window.location.reload() } } ); onLoad((options) => { //如果没登陆就进来则有可能是在微信消息推送进来的 提示登陆 if (!isLogin.value) { showAuthModal(); sheep.$helper.toast(t('order.not_logged_in',{user:options.username}), 3000); } else { // 如果 if (options.username) { // 如果登陆了但不是该订单的账号,提示有问题 console.log(JSON.parse(uni.getStorageSync("user-store")).userInfo.username) if (options.username != JSON.parse(uni.getStorageSync("user-store")).userInfo.username) { sheep.$helper.toast(t('order.account_switch_needed',{user1:JSON.parse(uni.getStorageSync("user-store")).userInfo.username,user2:options.username}),3000); } } } if (!options.id) { sheep.$helper.toast(t('order.missing_order_info')); return } state.id = options.id; getDetail(options.id); }); </script> <style lang="scss" scoped> // 步骤条 .steps-box { width: 100%; height: 190rpx; background: v-bind(headerBg) no-repeat, linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient)); background-size: 750rpx 100%; padding-left: 72rpx; .steps-item { .sicon-circleclose { font-size: 24rpx; color: #fff; } .sicon-circlecheck { font-size: 24rpx; } .steps-item-title { font-size: 24rpx; font-weight: 400; margin-top: 16rpx; margin-left: -36rpx; width: 100rpx; text-align: center; } } } .activity-color { color: #fff; } .info-color { color: rgba(#fff, 0.4); } .activity-bg { background: #fff; } .info-bg { background: rgba(#fff, 0.4); } .line { width: 270rpx; height: 4rpx; } // 服务状态 .status-box { position: relative; z-index: 3; background-color: #fff; border-radius: 20rpx 20rpx 0px 0px; padding: 20rpx; margin-top: -20rpx; .status-text { font-size: 28rpx; font-weight: 500; color: rgba(51, 51, 51, 1); margin-bottom: 20rpx; } .status-time { font-size: 24rpx; font-weight: 400; color: rgba(153, 153, 153, 1); } } .aftersale-info{ margin: 20rpx; } // 退款金额 .aftersale-money { background-color: #fff; height: 98rpx; padding: 0 20rpx; .aftersale-money--title { font-size: 28rpx; font-weight: 500; color: rgba(51, 51, 51, 1); } .aftersale-money--num { font-size: 28rpx; font-family: OPPOSANS; font-weight: 500; color: #ff3000; } } // order-shop .order-shop { padding: 20rpx; background-color: #fff; margin: 0 20rpx 20rpx 20rpx; } // 服务内容 .aftersale-content { background-color: #fff; padding: 20rpx; margin-left: 20rpx; margin-right: 20rpx; .aftersale-item { height: 60rpx; .copy-btn { background: #eeeeee; color: #333; border-radius: 20rpx; width: 75rpx; height: 40rpx; font-size: 22rpx; } .item-title { color: #999; font-size: 28rpx; } .item-content { color: #333; font-size: 28rpx; } } } // 底部功能 .foot_box { height: 100rpx; background-color: #fff; display: flex; align-items: center; justify-content: flex-end; .btn { // width: 160rpx; padding:0 10rpx; line-height: 60rpx; background: rgba(238, 238, 238, 1); border-radius: 30rpx; padding: 0; margin-right: 20rpx; font-size: 26rpx; font-weight: 400; color: rgba(51, 51, 51, 1); } } </style>