feat: 新增退款相关功能及状态显示

- 在订单详情页新增退款状态显示,包括"已退款"和"退款中"
- 新增退款目的地页面,用户可查看退款信息
- 更新应用版本号至1.0.58
- 更新依赖edu-core至v1.0.13
- 修改部分组件样式和逻辑,优化用户体验
This commit is contained in:
2026-05-09 11:13:51 +08:00
parent 69aa5cda40
commit de92a851b7
14 changed files with 223 additions and 40 deletions

View File

@@ -2,8 +2,9 @@ let baseUrl = "";
let socketUrl = "";
if (process.env.NODE_ENV === 'development') {
// 开发环境
baseUrl = "http://192.168.110.100:9200/pb/"; // 张川川
// baseUrl = "https://api.nuttyreading.com/"; //线上正式
// baseUrl = "http://192.168.110.100:9200/pb/"; // 张川川
baseUrl = "https://api.nuttyreading.com/"; //线上正式
// baseUrl = "http://192.168.110.131:9200/pb/"; // 王亚男
} else if (process.env.NODE_ENV === 'production') {
// baseUrl = "http://192.168.110.100:9200/pb/"; // 张川川
baseUrl = "https://api.nuttyreading.com/"; //线上正式

View File

@@ -61,6 +61,9 @@ Vue.component('common-video', commonVideo);
import CommonCourseVideo from 'edu-core/components/course-video'
Vue.component('CommonCourseVideo', CommonCourseVideo);
import CommonRefundDestination from 'edu-core/components/order/refund-destination.vue'
Vue.component('common-refund-destination', CommonRefundDestination);
import commonGoodsList from '@/pages/component/commonComponents/goodsList.vue'
Vue.component('common-goods-list', commonGoodsList);
import commonCurriculumList from '@/pages/component/commonComponents/curriculum.vue'

View File

@@ -2,9 +2,9 @@
"name" : "心灵空间",
"appid" : "__UNI__BBBDFD2",
"description" : "心灵空间",
"versionName" : "1.0.55",
"versionName" : "1.0.58",
"sassImplementationName" : "node-sass",
"versionCode" : 1055,
"versionCode" : 1058,
"transformPx" : false,
/* 5+App */
"app-plus" : {

12
package-lock.json generated
View File

@@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "MIT",
"dependencies": {
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.12",
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.13",
"jquery": "^3.7.1",
"tcplayer.js": "^5.1.0"
},
@@ -17,12 +17,6 @@
"postcss-px-to-viewport": "^1.1.1"
}
},
"../edu-core": {
"version": "1.0.11",
"extraneous": true,
"license": "ISC",
"devDependencies": {}
},
"node_modules/babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
@@ -74,8 +68,8 @@
"integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
},
"node_modules/edu-core": {
"version": "1.0.12",
"resolved": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#ea1dca213de69ac5a01a44a352ab33024edd2577",
"version": "1.0.13",
"resolved": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#b5ece8b8abfeba98428f6e2191efae3312b5036f",
"license": "ISC"
},
"node_modules/es5-shim": {

View File

@@ -14,7 +14,7 @@
},
"homepage": "https://github.com/dcloudio/hello-uniapp#readme",
"dependencies": {
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.12",
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.13",
"jquery": "^3.7.1",
"tcplayer.js": "^5.1.0"
},

View File

@@ -194,6 +194,18 @@
}
}
},
{
"path": "pages/detail/refundDestination",
"style": {
"navigationBarTitleText": "钱款去向",
"enablePullDownRefresh": false,
"app-plus": {
"bounce": "none",
"titleNView": false,
"popGesture": "none"
}
}
},
{
"path": "pages/my/index",
"style": {

View File

@@ -180,9 +180,9 @@ export default {
gotoDetail(v) {
this.$emit("hancleClick", v);
},
onHandleClickBuy() {
onHandleClickBuy(e) {
this.$emit("selectGoodsData", this.selectGoodsData);
this.$emit("onHandleClickBuy");
this.$emit("onHandleClickBuy", e);
},
},
onBackPress() {
@@ -362,4 +362,8 @@ export default {
color: #ff1f00;
font-weight: bold;
}
.title_list {
margin-bottom: 20rpx;
}
</style>

View File

@@ -1,5 +1,5 @@
<template>
<view style="background-color: #fff; width: 100%">
<view style="background-color: #fff; width: 100%; padding: 0 20rpx;">
<u-tabs
lineWidth="30"
lineColor="#294a97"

View File

@@ -69,6 +69,12 @@
<text
class="orderState orderState5"
v-if="orderContet.orderStatus == 5">已超时</text>
<text
class="orderState orderState6"
v-if="orderContet.orderStatus == 6">已退款</text>
<text
class="orderState orderState7"
v-if="orderContet.orderStatus == 7">退款中</text>
</view>
<view class="order_block">
@@ -857,14 +863,15 @@ export default {
text: "继续付款",
});
}
if (this.orderContet.orderStatus == 0) {
this.customButton.push({
width: "160rpx",
text: "取消订单",
color: "#333",
backgroundColor: "#f0f0f0",
});
}
// soulspace注释取消订单按钮
// if (this.orderContet.orderStatus == 0) {
// this.customButton.push({
// width: "160rpx",
// text: "取消订单",
// color: "#333",
// backgroundColor: "#f0f0f0",
// });
// }
if (this.orderContet.orderStatus == 0) {
this.titleStat = "待支付";
} else if (this.orderContet.orderStatus == 1) {
@@ -873,6 +880,10 @@ export default {
this.titleStat = "待收到";
} else if (this.orderContet.orderStatus == 3) {
this.titleStat = "已完成";
} else if (this.orderContet.orderStatus == 6) {
this.titleStat = "已退款";
} else if (this.orderContet.orderStatus == 7) {
this.titleStat = "退款中";
}
if (
this.orderContet.orderStatus >= 2 &&
@@ -915,9 +926,27 @@ export default {
},
});
},
checkPayTimeout(payItem) {
const createTime = payItem && payItem.createTime;
if (!createTime) return true;
const createdAt = new Date(String(createTime).replace(/-/g, "/")).getTime();
if (!createdAt) return true;
const expired = Date.now() - createdAt > 10 * 60 * 1000;
if (expired) {
uni.showModal({
title: "提示",
content: "订单已超时,不能继续支付,请重新下单",
confirmText: "知道了",
showCancel: false,
});
return false;
}
return true;
},
// 支付
goPay(payItem) {
if (!this.checkPayTimeout(payItem)) return;
if (payItem.paymentMethod == 2) {
console.log("阿里支付");
setPay(
@@ -1054,6 +1083,12 @@ view,uni-view {
.orderState5 {
background-color: #787878;
}
.orderState6 {
background-color: #f56c6c;
}
.orderState7 {
background-color: #f56c6c;
}
.guoqi {
font-size: 28rpx;
align-items: center;

View File

@@ -0,0 +1,27 @@
<template>
<view class="page-wrap">
<public-module></public-module>
<common-refund-destination :order-id="orderId" :http="$http" />
</view>
</template>
<script>
export default {
data() {
return {
orderId: "",
};
},
onLoad(options) {
if (options && options.orderId != null) {
this.orderId = options.orderId;
}
},
};
</script>
<style scoped>
.page-wrap {
min-height: 100vh;
}
</style>

View File

@@ -455,7 +455,12 @@
},
//点击下单按钮
onHandleClickBuy(e) {
if(this.buttonType==0){ //如果是加入购物车
if (e && e.content && e.content.text === "购物车") {
this.onHandleClick();
return;
}
const clickType = typeof (e && e.index) === "number" ? e.index : this.buttonType;
if(clickType==0){ //如果是加入购物车
console.log('剩余', this.selectGoodsData.productStock)
if(this.selectGoodsData.productStock==0){
uni.showToast({

View File

@@ -2,7 +2,7 @@
<view class="commonPageBox commonDetailPage">
<z-nav-bar title="我的订单" :backState="2000"></z-nav-bar>
<view class="cateList flexbox">
<common-sticky itemStyle="width:20%; height: 68rpx;font-size:24rpx;" :list="ordersTabs" label="name"
<common-sticky itemStyle="height: 68rpx;font-size:24rpx; padding: 0 20rpx;" :list="ordersTabs" label="name"
:currentCateIndex="currentCateIndex" @handleselectCate="ordersTabCLi"></common-sticky>
</view>
@@ -42,6 +42,8 @@
<text class="orderstatus" v-show="slotProps.row.orderStatus == 3">交易成功</text>
<text class="orderstatus" v-show="slotProps.row.orderStatus == 4">交易失败</text>
<text class="orderstatus" v-show="slotProps.row.orderStatus == 5">已过期</text>
<text class="orderstatus" v-show="slotProps.row.orderStatus == 6">已退款</text>
<text class="orderstatus" v-show="slotProps.row.orderStatus == 7">退款中</text>
</view>
</view>
@@ -248,8 +250,9 @@
</view>
<view class="operation_box boxShadow" v-if="slotProps.row.isShowMore == true">
<view v-if="slotProps.row.orderStatus == 0"
@click.stop="canceOrder(slotProps.row)">取消订单</view>
<!-- soulspace注释取消订单入口 -->
<!-- <view v-if="slotProps.row.orderStatus == 0"
@click.stop="canceOrder(slotProps.row)">取消订单</view> -->
</view>
<!-- @click.stop="openMore(slotProps.row, slotProps.rowIndex)" 更多 -->
<view class="btns flexbox" style="margin-top: 10rpx">
@@ -264,7 +267,10 @@
@click.stop="seeExpressDetail(slotProps.row)">查看物流</view>
<view class="orderstatusbtn" v-if="slotProps.row.orderStatus == 2"
@click.stop="OverOrder(slotProps.row)">确认收到</view>
<view class="orderstatusbtn" v-if="slotProps.row.orderStatus == 3">申请售后</view>
<view class="orderstatusbtn" v-if="slotProps.row.orderStatus == 6 || slotProps.row.orderStatus == 7"
@click.stop="goRefundDestination(slotProps.row)">钱款去向</view>
<view class="orderstatusbtn" v-if="slotProps.row.refundableStatus === true"
@click.stop="confirmApplyRefund(slotProps.row)">申请退款</view>
</view>
</view>
<view style="border-bottom: 2rpx solid #e9e9e9; height: 50rpx"
@@ -300,10 +306,12 @@
come: "3",
isShowTab: false,
isLoadingHide: false,
moreList: [{
name: "取消订单",
key: "false",
}, ],
// soulspace注释取消订单菜单
// moreList: [{
// name: "取消订单",
// key: "false",
// }, ],
moreList: [],
currentCateIndex: 0,
pagination: {
page: 1, //页码
@@ -347,6 +355,16 @@
value: 3,
badge: {},
},
{
name: "已退款",
value: 6,
badge: {},
},
{
name: "退款中",
value: 7,
badge: {},
},
],
selectOrderInfo: {},
ordersListTab: 1,
@@ -437,6 +455,48 @@
val.orderSn,
});
},
goRefundDestination(row) {
uni.navigateTo({
url: `/pages/detail/refundDestination?orderId=${row.orderId}`,
});
},
confirmApplyRefund(row) {
uni.showModal({
title: "申请退款",
content: "请确认是否提交退款申请?",
confirmText: "确认提交",
cancelText: "取消",
success: (res) => {
if (res.confirm) {
this.submitOrderRefund(row);
}
},
});
},
submitOrderRefund(orderRow) {
this.$http.request({
url: "book/buyOrder/refundOrder",
method: "POST",
data: {
orderId: orderRow.orderId,
},
header: {
"Content-Type": "application/json",
},
}).then((res) => {
if (res.code === 0) {
this.$commonJS.showToast("申请退款成功");
this.newestpage = 1;
this.pagination.page = 1;
this.newList = [];
this.getBookList(this.ordersListTab, false);
return;
}
this.$commonJS.showToast(res.errMsg || "申请退款失败");
}).catch(() => {
this.$commonJS.showToast("申请退款失败");
});
},
//初始化获取数据
getBookList(flag, refreshflag) {
this.isLoadingHide = false;
@@ -461,6 +521,8 @@
// * 3已完成
// * 4: 交易失败
// * 5: 已过期
// * 6: 已退款
// * 7: 退款中
that.map = res.data;
that.ordersTabs.map((e) => {
@@ -489,7 +551,7 @@
var params = {
userId: this.userInfo.id,
come: this.come,
orderStatus: flag == -1 ? "" : flag, //传null为全部订单状态 0-未付款 1-待发出 2-待收到 3-交易成功 4-交易失败 5-过期
orderStatus: flag == -1 ? "" : flag, //传null为全部订单状态 0-未付款 1-待发出 2-待收到 3-交易成功 4-交易失败 5-过期 6-已退款 7-退款中
...this.pagination
}
this.$http.request({
@@ -522,8 +584,26 @@
});
this.axiosStatus = 1
},
checkPayTimeout(payItem) {
const createTime = payItem && payItem.createTime;
if (!createTime) return true;
const createdAt = new Date(String(createTime).replace(/-/g, "/")).getTime();
if (!createdAt) return true;
const expired = Date.now() - createdAt > 10 * 60 * 1000;
if (expired) {
uni.showModal({
title: "提示",
content: "订单已超时,不能继续支付,请重新下单",
confirmText: "知道了",
showCancel: false,
});
return false;
}
return true;
},
// 支付
goPay(payItem) {
if (!this.checkPayTimeout(payItem)) return;
if (payItem.paymentMethod == 2) {
console.log("阿里支付");
setPay({
@@ -982,9 +1062,9 @@
width: 100%;
}
/deep/.u-tabs__wrapper__nav__item {
padding: 0 !important;
}
// /deep/.u-tabs__wrapper__nav__item {
// padding: 0 !important;
// }
.order_box {
padding: 20rpx;
}

View File

@@ -37,8 +37,7 @@
<view class="label_content AC_List">
<view style=" display: flex; align-items: center; justify-content: space-between;">
<view class="left">
<view class="title" v-if="slotProps.row.orderType=='购买商品'&&slotProps.row.productName">{{ slotProps.row.orderType }} <br/> {{ slotProps.row.productName }}</view>
<view class="title" v-else>{{ slotProps.row.orderType }}</view>
<view class="title">{{ slotProps.row.productName || slotProps.row.orderType}}</view>
</view>
<view class="right Hot">
<text v-if="slotProps.row.changeAmount > 0">+</text>
@@ -211,6 +210,12 @@ export default {
.AC_List {
overflow: hidden;
.title,
.AC_note,
.AC_mark {
word-break: break-word;
overflow-wrap: break-word;
}
.left {
width: calc(100% - 140rpx) !important;
font-weight: 700;
@@ -230,6 +235,19 @@ export default {
font-weight: 700;
color: #333;
}
> view:first-child {
.left {
flex: 1;
min-width: 0;
width: auto !important;
float: none;
}
.right {
flex-shrink: 0;
float: none;
width: auto !important;
}
}
.AC_title {
font-size: 32rpx;

View File

@@ -362,4 +362,8 @@ button::after {
// border-bottom: 0.5px solid #dadbde;
}
}
}
uni-text {
white-space: normal;
}