Files
lucky_shop/pages_tool/order/refund_detail.vue
ZF sun 2d8846c64c feat: 新增多语言文案、优化导航及工具函数,修复部分业务逻辑
1. 新增多语言资源文件,覆盖文章、预约日期、会员信息、优惠券、表单、购物车、积分商城、分销、AI聊天等多个模块
2. 优化底部导航组件,使用多语言配置替代硬编码文案
3. 重构工具函数,新增从后端数据提取多语言文案的工具方法
4. 修复邀请好友页面的保存提示文案,替换为多语言版本
5. 修复商品SKU组件的提示文案,使用多语言配置
6. 重构AI聊天页面的帮助文档和回复模板,使用多语言配置
7. 优化空状态组件,支持多语言默认文案
8. 修复跳转逻辑,补全参数传递
9. 新增本地开发环境配置
2026-06-25 18:15:31 +08:00

273 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view :style="themeColor">
<scroll-view scroll-y="true" class="detail-container" :class="{ 'safe-area': isIphoneX }" v-if="detail">
<view v-show="action == ''">
<view class="status-wrap">
<view class="status-name">{{ detail.refund_status_name }}</view>
<view class="refund-explain" v-if="detail.refund_status == 1">
<view class="font-size-goods-tag color-tip">{{ $lang('statusTip.merchantReject') }}</view>
<view class="font-size-goods-tag color-tip">{{ $lang('statusTip.merchantAgree') }}</view>
<!-- <view class="font-size-goods-tag color-tip">如果商家逾期未处理,平台将自动通过申请并退款给你</view> -->
</view>
<view class="refund-explain" v-if="detail.refund_status == 5">
<view class="font-size-goods-tag color-tip">{{ $lang('statusTip.merchantConfirmReceive') }}</view>
<view class="font-size-goods-tag color-tip">{{ $lang('statusTip.merchantRejectReceive') }}</view>
</view>
</view>
<view class="history-wrap" @click="switchAction('consultrecord')">
<view>{{ $lang('consultRecord') }}</view>
<text class="iconfont icon-right"></text>
</view>
<view class="refund-address-wrap" v-if="detail.refund_status == 4">
<view class="header">{{ $lang('returnAddress.title') }}</view>
<view>
<text>{{ $lang('returnAddress.receiver') }}{{ detail.shop_contacts }}</text>
</view>
<view>
<text>{{ $lang('returnAddress.contact') }}{{ detail.shop_mobile }}</text>
</view>
<view>
<text class="address">{{ $lang('returnAddress.address') }}{{ detail.shop_address }}</text>
<view class="copy" @click="$util.copy(detail.shop_address)">{{ $lang('returnAddress.copy') }}</view>
</view>
</view>
<view class="refund-info">
<view class="header">{{ $lang('refundInfo.title') }}</view>
<view class="body">
<!-- 商品信息 -->
<view class="goods-wrap">
<view class="goods-img" @click="refundDetail(detail)">
<image :src="$util.img(detail.sku_image, { size: 'mid' })" @error="imageError()" mode="aspectFill" :lazy-load="true" show-menu-by-longpress></image>
</view>
<view class="goods-info">
<view class="goods-name" @click="refundDetail(detail)">{{ detail.sku_name }}</view>
</view>
</view>
<!-- 退款信息 -->
<view class="info">
<view class="cell">{{ $lang('refundInfo.refundMethod') }}{{ detail.refund_type == 1 ? $lang('refundInfo.refundOnly') : $lang('refundInfo.refundReturn') }}</view>
<view class="cell" v-if="detail.refund_status == 3">{{ $lang('refundInfo.refundChannel') }}{{ detail.refund_money_type == 1 ? $lang('refundInfo.originalRefund') : detail.refund_money_type == 2 ? $lang('refundInfo.offlineRefund') : $lang('refundInfo.balanceRefund') }}</view>
<view class="cell">{{ $lang('refundInfo.refundReason') }}{{ detail.refund_reason }}</view>
<view class="cell" v-if="detail.refund_status == 3 && detail.refund_real_money>0">{{ $lang('refundInfo.refundAmount') }}{{ $lang('common.currencySymbol') }}{{ detail.refund_real_money }}</view>
<view class="cell" v-else-if="detail.refund_apply_money>0">{{ $lang('refundInfo.refundAmount') }}{{ $lang('common.currencySymbol') }}{{ detail.refund_apply_money }}</view>
<view class="cell">{{ $lang('refundInfo.refundNo') }}{{ detail.refund_no }}</view>
<view class="cell">{{ $lang('refundInfo.applyTime') }}{{ $util.timeStampTurnTime(detail.refund_action_time) }}</view>
<view class="cell" v-if="detail.refund_time">{{ $lang('refundInfo.refundTime') }}{{ $util.timeStampTurnTime(detail.refund_time) }}</view>
<view class="cell" v-if="detail.refund_remark != ''">{{ $lang('refundInfo.refundRemark') }}{{ detail.refund_remark }}</view>
<view class="cell" v-if="detail.use_point>0">{{ $lang('refundInfo.refundPoint') }}{{ detail.use_point }}</view>
</view>
</view>
</view>
<view class="action" :class="{ 'bottom-safe-area': isIphoneX }" v-if="detail.refund_action.length">
<view class="order-box-btn" v-for="(actionItem, actionIndex) in detail.refund_action" :key="actionIndex" @click="refundAction(actionItem.event)">
{{ actionItem.title }}
</view>
</view>
</view>
<view v-show="action == 'returngoods'">
<view class="return-goods-container">
<view class="form-wrap">
<view class="item">
<view class="label">{{ $lang('returnGoods.expressCompany') }}</view>
<view class="cont">
<input
type="text"
:placeholder="$lang('returnGoods.expressCompanyPlaceholder')"
class="input"
placeholder-class="input-placeholder color-tip"
v-model="formData.refund_delivery_name"
/>
</view>
</view>
<view class="item">
<view class="label">{{ $lang('returnGoods.expressNo') }}</view>
<view class="cont">
<input
type="text"
:placeholder="$lang('returnGoods.expressNoPlaceholder')"
class="input"
placeholder-class="input-placeholder color-tip"
v-model="formData.refund_delivery_no"
/>
</view>
</view>
<view class="item">
<view class="label">{{ $lang('returnGoods.expressRemark') }}</view>
<view class="cont">
<textarea
placeholder-class="color-tip font-size-tag"
:auto-height="true"
class="textarea"
:placeholder="$lang('returnGoods.expressRemarkPlaceholder')"
v-model="formData.refund_delivery_remark"
/>
</view>
</view>
</view>
<button type="primary" class="sub-btn" @click="refurnGoods">{{ $lang('common.submit') }}</button>
</view>
</view>
<view v-show="action == 'consultrecord'">
<view class="record-wrap">
<view class="record-item" :class="logItem.action_way == 1 ? 'buyer' : ''" v-for="(logItem, logIndex) in detail.refund_log_list" :key="logIndex">
<view class="cont">
<view class="head">
<text>{{ logItem.action_way == 1 ? $lang('record.buyer') : $lang('record.seller') }}</text>
<text class="time">{{ $util.timeStampTurnTime(logItem.action_time) }}</text>
</view>
<view class="body">
<view class="refund-action">{{ logItem.action }}</view>
<view class="desc" v-if="logItem.desc != ''">{{ logItem.desc }}</view>
</view>
</view>
</view>
<view class="empty-box"></view>
</view>
<view class="history-bottom" :class="{ 'bottom-safe-area': isIphoneX }">
<!-- <ns-contact :niushop="{order_id: detail.order_id}">
<view>
<text class="iconfont icon-ziyuan"></text>
<text>联系客服</text>
</view>
</ns-contact> -->
<view @click="switchAction('')">{{ $lang('record.backToDetail') }}</view>
</view>
</view>
</scroll-view>
<loading-cover ref="loadingCover"></loading-cover>
</view>
</template>
<script>
import refundMethod from './public/js/refundMethod.js';
import validate from 'common/js/validate.js';
export default {
data() {
return {
order_goods_id: '',
detail: {
refund_action: []
},
isIphoneX: false,
action: '',
formData: {
refund_delivery_name: '',
refund_delivery_no: '',
refund_delivery_remark: ''
},
isSub: false
};
},
mixins: [refundMethod],
onLoad(option) {
if (option.order_goods_id) this.order_goods_id = option.order_goods_id;
if (option.action) this.action = option.action;
this.isIphoneX = this.$util.uniappIsIPhoneX();
},
onShow() {
if (this.storeToken) {
this.getRefundDetail();
} else {
this.$util.redirectTo(this.$util.LOGIN_PAGE_URL, { back: '/pages_tool/order/refund_detail?order_goods_id=' + this.order_goods_id });
}
},
methods: {
getRefundDetail() {
this.$api.sendRequest({
url: '/api/orderrefund/detail',
data: {
order_goods_id: this.order_goods_id
},
success: res => {
if (res.code >= 0) {
this.detail = res.data;
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
} else {
this.$util.showToast({ title: this.$lang('toast.noRefundInfo') });
setTimeout(() => {
this.$util.redirectTo('/pages_order/list');
}, 1000);
}
},
fail: res => {
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
}
});
},
refundAction(event) {
switch (event) {
case 'orderRefundCancel':
this.cancleRefund(this.detail.order_goods_id, res => {
if (res.code >= 0) {
this.$util.showToast({ title: this.$lang('toast.cancelSuccess') });
setTimeout(() => {
this.$util.redirectTo('/pages_order/list');
}, 1000);
}
});
break;
case 'orderRefundDelivery':
this.action = 'returngoods';
break;
case 'orderRefundAsk':
this.$util.redirectTo('/pages_tool/order/refund', { order_goods_id: this.detail.order_goods_id });
break;
}
},
refurnGoods() {
var rule = [
{ name: 'refund_delivery_name', checkType: 'required', errorMsg: this.$lang('validate.pleaseInputExpressCompany') },
{ name: 'refund_delivery_no', checkType: 'required', errorMsg: this.$lang('validate.pleaseInputExpressNo') }
];
this.formData.order_goods_id = this.order_goods_id;
var checkRes = validate.check(this.formData, rule);
if (checkRes) {
if (this.isSub) return;
this.isSub = true;
this.$api.sendRequest({
url: '/api/orderrefund/delivery',
data: this.formData,
success: res => {
if (res.code == 0) {
this.action = '';
this.getRefundDetail();
} else {
this.$util.showToast({ title: res.message });
}
}
});
} else {
this.$util.showToast({ title: validate.error });
return false;
}
},
/**
* 切换操作
*/
switchAction(action) {
this.action = action;
},
imageError() {
this.detail.sku_image = this.$util.getDefaultImage().goods;
this.$forceUpdate();
},
refundDetail(e) {
this.$util.redirectTo('/pages_goods/detail', {
goods_id: e.goods_id
});
}
}
};
</script>
<style lang="scss">
@import './public/css/refund_detail.scss';
</style>