feat(refund): 添加退款列表

This commit is contained in:
woody 2025-07-05 15:23:16 +08:00
parent 741bd8656d
commit 196a4c0909
7 changed files with 552 additions and 32 deletions

View File

@ -22,3 +22,11 @@ export const yearAwards = params =>
// 结余查询
export const getMemberBalance = () =>
http.get('/member/api/member-structure/az-framework')
// 退款明细列表
export const getRefundList = params =>
http.get('/sale/api/my-order/refund-list', { params })
// 退款列表接口(别名)
export const refundList = params =>
http.get('/sale/api/my-order/refund-list', { params })

View File

@ -1,64 +1,83 @@
const http = uni.$u.http
//支付配置
export const payConfig = (params) => http.get('/pay/config', { params })
export const payConfig = params => http.get('/pay/config', { params })
//京东银行列表
export const jdBankList = (params) => http.get('/pay/jd-fast/list', { params })
export const jdBankList = params => http.get('/pay/jd-fast/list', { params })
//汇付银行列表
export const hfBankList = (params) => http.get('/pay/ada-fast/list', { params })
export const hfBankList = params => http.get('/pay/ada-fast/list', { params })
//通联银行列表
export const tlBankList = (params) => http.get('/pay/all-in-fast/list', { params })
export const tlBankList = params =>
http.get('/pay/all-in-fast/list', { params })
//查询订单明细
export const orderInfo = (params) => http.post('/sale/api/order/query-order', params)
export const orderInfo = params =>
http.post('/sale/api/order/query-order', params)
//查询订单消费明细
export const spendDetails = (params) => http.post('/sale/api/order/query-spend-details', params)
export const spendDetails = params =>
http.post('/sale/api/order/query-spend-details', params)
//京东绑卡短信
export const bindJd = (params) => http.post('/pay/jd-fast/bind', params)
export const bindJd = params => http.post('/pay/jd-fast/bind', params)
//通联绑卡短信
export const bindTl = (params) => http.post('/pay/all-in-fast/bind', params)
export const bindTl = params => http.post('/pay/all-in-fast/bind', params)
//汇付绑卡短信
export const bindHf = (params) => http.post('/pay/ada-fast/bind', params)
export const bindHf = params => http.post('/pay/ada-fast/bind', params)
//京东绑卡
export const bindJdConfirm = (params) => http.post('/pay/jd-fast/bind-confirm', params)
export const bindJdConfirm = params =>
http.post('/pay/jd-fast/bind-confirm', params)
//通联绑卡
export const bindTlConfirm = (params) => http.post('/pay/all-in-fast/bind-confirm', params)
export const bindTlConfirm = params =>
http.post('/pay/all-in-fast/bind-confirm', params)
//汇付绑卡
export const bindHfConfirm = (params) => http.post('/pay/ada-fast/bind-confirm', params)
export const bindHfConfirm = params =>
http.post('/pay/ada-fast/bind-confirm', params)
//银行卡支付获取验证码
export const unifiedorder = (params) => http.post('/pay/unifiedorder', params)
export const unifiedorder = params => http.post('/pay/unifiedorder', params)
//汇付银行卡确认
export const payConfirmHf = (params) => http.post('/pay/ada-fast/pay-confirm', params)
export const payConfirmHf = params =>
http.post('/pay/ada-fast/pay-confirm', params)
//京东银行卡确认
export const payConfirmJd = (params) => http.post('/pay/jd-fast/pay-confirm', params)
export const payConfirmJd = params =>
http.post('/pay/jd-fast/pay-confirm', params)
//通联银行卡确认
export const payConfirmTl = (params) => http.post('/pay/all-in-fast/pay-confirm', params)
export const payConfirmTl = params =>
http.post('/pay/all-in-fast/pay-confirm', params)
//支付状态
export const payStatus = (params) => http.get('/pay/status', { params })
export const payStatus = params => http.get('/pay/status', { params })
//幂等性
export const generate = (params) => http.get('/system/api/idempotent/generate', { params })
export const generate = params =>
http.get('/system/api/idempotent/generate', { params })
//支付注册订单
export const payRegOrder = (params) => http.post('/sale/api/order/pay-reg-order', params)
export const payRegOrder = params =>
http.post('/sale/api/order/pay-reg-order', params)
//支付其他订单
export const payOthOrder = (params) => http.post('/sale/api/order/pay-oth-order', params)
export const payOthOrder = params =>
http.post('/sale/api/order/pay-oth-order', params)
//宝付确认支付h5
export const baoFuPay = (params) => http.post('/pay/baofu-code/order', params)
export const baoFuPay = params => http.post('/pay/baofu-code/order', params)
//汇付确认支付h5
export const huiFuPay = (params) => http.post('/pay/ada-code/order', params)
export const huiFuPay = params => http.post('/pay/ada-code/order', params)
//在线预充值
export const preCharge = (params) => http.get('/member/api/recharge/preCharge', { params })
export const preCharge = params =>
http.get('/member/api/recharge/preCharge', { params })
//海粉注册信息
export const fansOrder = (params) => http.get('/member/api/member/fans-order/'+params)
export const fansOrder = params =>
http.get('/member/api/member/fans-order/' + params)
//抽奖下单
export const payDrawGift = (params) => http.post('/activity/api/draw/pay-draw-num', params)
export const payDrawGift = params =>
http.post('/activity/api/draw/pay-draw-num', params)
//提货下单
export const payPickOrder = (params) => http.post('/activity/api/pick/order', params)
export const payPickOrder = params =>
http.post('/activity/api/pick/order', params)
//植树查看账户
export const deductionAccount = (params) => http.post('activity/api/sa-tree-order/deductionAccount', params)
export const deductionAccount = params =>
http.post('activity/api/sa-tree-order/deductionAccount', params)
//植树活动
export const shoppingTree = (params) => http.post('activity/api/sa-tree-order/shoppingTree', params)
export const shoppingTree = params =>
http.post('activity/api/sa-tree-order/shoppingTree', params)
//解绑银行卡
export const unBind = (params) => http.post('/pay/ada-fast/un-bind', params)
export const unBind = params => http.post('/pay/ada-fast/un-bind', params)
//查询注册信息
export const registerInfo = (params) => http.get('/member/api/member/register-order/' + params,)
export const registerInfo = params =>
http.get('/member/api/member/register-order/' + params)

View File

@ -20,7 +20,7 @@ module.exports = vm => {
//#ifdef DEV_SERVER
console.log('DEV_SERVER')
config.baseURL = 'https://t-app.beida666.com/prod-api'
config.baseURL = 'http://192.168.0.101:8080'
//#endif
//#ifdef QA_SERVER

View File

@ -442,6 +442,14 @@
"enablePullDownRefresh": false
}
},
{
"path": "pages/refund/detail",
"style": {
"navigationBarTitleText": "退款列表",
"navigationBarBackgroundColor": "#fff",
"enablePullDownRefresh": true
}
},
{
"path": "pages/mine/balance/transfer",
"style": {

477
pages/refund/detail.vue Normal file
View File

@ -0,0 +1,477 @@
<template>
<view class="refund-container">
<!-- 导航栏 -->
<u-navbar
title="退款列表"
:border-bottom="false"
:background="{ backgroundColor: '#005bac' }"
title-color="#fff"
/>
<view class="tips">
<u-icon name="info-circle" color="#005bac" size="20"></u-icon>
<text class="tips-text">如有疑问请联系客服</text>
</view>
<!-- <view class="date-filter">
<view class="date-picker-container">
<view class="date-input-wrapper" @click="showStartDatePicker = true">
<text>{{ startDate || '开始时间' }}</text>
</view>
<text class="separator"></text>
<view class="date-input-wrapper" @click="showEndDatePicker = true">
<text>{{ endDate || '结束时间' }}</text>
</view>
</view>
<button class="search-button" @click="handleSearch">
<u-icon name="search" color="#ffffff" size="20" />
</button>
</view> -->
<!-- 退款列表 -->
<view class="refund-list">
<u-list @scrolltolower="loadMore" :show-scrollbar="false">
<u-list-item v-for="(item, index) in refundList" :key="index">
<view class="refund-item">
<view class="refund-header">
<view class="order-info">
<text class="order-number"
>订单编号{{ item.businessCode }}</text
>
<text class="member-code">会员编号{{ item.memberCode }}</text>
</view>
<view
class="refund-status"
:class="getStatusClass(item.refundStatus)"
>
{{ getStatusText(item.refundStatus) }}
</view>
</view>
<view class="refund-content">
<view class="refund-amount">
<text class="amount-label">退款金额</text>
<text class="amount-value">¥{{ item.refundMoney }}</text>
</view>
<view class="refund-time">
<text class="time-label">退款时间</text>
<text class="time-value">{{
formatDate(item.finishTime)
}}</text>
</view>
</view>
</view>
</u-list-item>
</u-list>
<!-- 加载更多 -->
<u-loadmore :status="loadStatus" />
<!-- 空状态 -->
<u-empty
mode="data"
v-if="refundList.length === 0 && !loading"
text="暂无退款记录"
></u-empty>
</view>
<u-datetime-picker
:show="showStartDatePicker"
v-model="startDate"
mode="date"
@confirm="onStartDateConfirm"
@cancel="showStartDatePicker = false"
style="flex: 0"
></u-datetime-picker>
<u-datetime-picker
:show="showEndDatePicker"
v-model="endDate"
mode="date"
@confirm="onEndDateConfirm"
@cancel="showEndDatePicker = false"
style="flex: 0"
></u-datetime-picker>
</view>
</template>
<script>
import { getRefundList } from '@/config/mine'
import dayjs from '../../uni_modules/uview-ui/libs/util/dayjs.js'
export default {
name: 'RefundDetail',
data() {
return {
//
startDate: '',
endDate: '',
showStartDatePicker: false,
showEndDatePicker: false,
maxDate: new Date().getTime(),
//
refundList: [],
loading: false,
loadStatus: 'loadmore',
//
currentPage: 1,
pageSize: 10,
hasMore: true,
//
statusMap: {
0: '退款申请中',
1: '退款中',
2: '已退款',
3: '退款失败',
},
}
},
onLoad() {
this.loadRefundList()
},
onPullDownRefresh() {
this.refreshList()
},
methods: {
// 退
async loadRefundList(isLoadMore = false) {
if (this.loading) return
this.loading = true
this.loadStatus = 'loading'
try {
const params = {
pageNum: this.currentPage,
pageSize: this.pageSize,
startDate: this.startDate,
endDate: this.endDate,
}
const res = await getRefundList(params)
if (res.code === 200) {
const newList = res.rows || []
if (isLoadMore) {
this.refundList = [...this.refundList, ...newList]
} else {
this.refundList = newList
}
//
this.hasMore = newList.length === this.pageSize
this.loadStatus = this.hasMore ? 'loadmore' : 'nomore'
if (this.hasMore) {
this.currentPage++
}
} else {
this.$u.toast(res.message || '加载失败')
this.loadStatus = 'loadmore'
}
} catch (error) {
console.error('加载退款列表失败:', error)
this.$u.toast('加载失败,请重试')
this.loadStatus = 'loadmore'
} finally {
this.loading = false
uni.stopPullDownRefresh()
}
},
//
loadMore() {
if (this.hasMore && !this.loading) {
this.loadRefundList(true)
}
},
//
refreshList() {
this.currentPage = 1
this.hasMore = true
this.loadRefundList()
},
//
handleSearch() {
if (this.startDate && this.endDate && this.startDate > this.endDate) {
this.$u.toast('开始日期不能大于结束日期')
return
}
this.refreshList()
},
//
handleReset() {
this.startDate = ''
this.endDate = ''
this.refreshList()
},
onStartDateConfirm(e) {
this.startDate = this.formatDate(new Date(e.value))
this.startDateValue = e.value
this.showStartDatePicker = false
},
onEndDateConfirm(e) {
this.endDate = this.formatDate(new Date(e.value))
this.endDateValue = e.value
this.showEndDatePicker = false
},
//
formatDate(dateString) {
if (!dateString) return ''
return dayjs(dateString).format('YYYY-MM-DD HH:mm:ss')
},
//
getStatusText(status) {
console.log(status)
return this.statusMap[status] || '未知状态'
},
//
getStatusClass(status) {
const classMap = {
0: 'status-pending',
1: 'status-failed',
2: 'status-success',
3: 'status-cancelled',
}
return classMap[status] || 'status-default'
},
},
}
</script>
<style lang="scss" scoped>
.refund-container {
min-height: 100vh;
background-color: #f5f5f5;
}
.tips {
display: flex;
align-items: center;
justify-content: center;
background-color: #f8f9fa;
margin: 16rpx 30rpx;
padding: 12rpx 20rpx;
border-radius: 4rpx;
border-left: 3rpx solid #005bac;
.tips-text {
font-size: 22rpx;
color: #005bac;
font-weight: 400;
margin-left: 8rpx;
line-height: 1.5;
}
}
.filter-section {
background-color: #fff;
padding: 20rpx 30rpx;
margin-bottom: 20rpx;
.date-filter {
display: flex;
align-items: center;
margin-bottom: 20rpx;
.date-item {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx;
border: 1px solid #e4e4e4;
border-radius: 8rpx;
background-color: #fafafa;
.date-label {
font-size: 28rpx;
color: #666;
}
.date-value {
font-size: 28rpx;
color: #333;
margin-left: 10rpx;
}
}
.date-separator {
padding: 0 20rpx;
font-size: 28rpx;
color: #666;
}
}
.filter-actions {
display: flex;
justify-content: center;
gap: 20rpx;
}
}
.refund-list {
padding: 10rpx 30rpx 0;
}
.refund-item {
background-color: #fff;
border-radius: 12rpx;
padding: 30rpx;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
.refund-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 20rpx;
.order-info {
flex: 1;
.order-number {
display: block;
font-size: 28rpx;
color: #333;
font-weight: 500;
margin-bottom: 8rpx;
}
.member-code {
font-size: 24rpx;
color: #666;
}
}
.refund-status {
padding: 8rpx 16rpx;
border-radius: 20rpx;
font-size: 24rpx;
font-weight: 500;
&.status-pending {
background-color: #fff7e6;
color: #fa8c16;
}
&.status-success {
background-color: #f6ffed;
color: #52c41a;
}
&.status-failed {
background-color: #fff2f0;
color: #ff4d4f;
}
&.status-cancelled {
background-color: #f5f5f5;
color: #8c8c8c;
}
&.status-default {
background-color: #f5f5f5;
color: #666;
}
}
}
.refund-content {
display: flex;
justify-content: space-between;
align-items: center;
.refund-amount,
.refund-time {
display: flex;
flex-direction: column;
align-items: flex-start;
.amount-label,
.time-label {
font-size: 24rpx;
color: #666;
margin-bottom: 8rpx;
}
.amount-value {
font-size: 32rpx;
color: #005bac;
font-weight: 600;
}
.time-value {
font-size: 28rpx;
color: #333;
}
}
.refund-time {
align-items: flex-end;
}
}
}
//
@media (max-width: 750rpx) {
.filter-section {
.date-filter {
flex-direction: column;
gap: 20rpx;
.date-separator {
display: none;
}
}
}
}
.date-filter {
display: flex;
align-items: center;
padding: 15px 10px;
background-color: #ffffff;
.date-picker-container {
flex: 1;
display: flex;
align-items: center;
background-color: #f2f2f2;
border-radius: 8px;
padding: 4px;
.date-input-wrapper {
flex: 1;
text-align: center;
padding: 6px 0;
font-size: 14px;
color: #333;
}
.separator {
color: #999;
margin: 0 5px;
}
}
.search-button {
width: 44px;
height: 36px;
margin-left: 10px;
background-color: #007aff;
color: white;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
padding: 0;
line-height: 1;
border: none;
&:after {
border: none;
}
}
}
</style>

View File

@ -61,6 +61,13 @@ export default {
path: '/pages/selfService/realName/realName',
id: '9',
},
{
name: '订单退款明细',
url: '../../static/images/refund-icon.svg',
path: '/pages/refund/detail',
id: '9',
alwaysShow: true,
},
],
theselfHeader: [],
userInfo: '',
@ -102,7 +109,7 @@ export default {
})
const theselfHeader = []
this.selfServiceList.forEach(element => {
if (element.ifshow == 0) {
if (element.ifshow == 0 || element.alwaysShow) {
theselfHeader.push(element)
}
})

View File

@ -0,0 +1 @@
<svg t="1751697878770" class="icon" viewBox="0 0 1105 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6062" width="256" height="256"><path d="M395.815385 303.419077 490.692923 303.419077C495.655385 319.409231 501.720615 331.539692 517.159385 357.454769L598.803692 497.585231 680.487385 358.006154C695.926154 332.091077 702.542769 318.306462 706.953846 303.419077L802.382769 303.419077C795.214769 312.792615 773.159385 344.221538 763.234462 360.211692L687.104 481.595077 717.981538 481.595077C742.793846 481.595077 757.720615 480.492308 775.916308 477.184L775.916308 540.081231C757.169231 536.772923 742.242462 535.670154 717.981538 535.670154L653.430154 535.670154 635.234462 564.342154 635.234462 580.332308 716.878769 580.332308C741.691077 580.332308 755.515077 579.229538 774.813538 575.921231L774.813538 638.818462C756.066462 635.510154 741.139692 634.407385 716.878769 634.407385L635.234462 634.407385 635.234462 671.940923C635.234462 703.369846 636.337231 720.462769 639.645538 742.557538L558.001231 742.557538C560.758154 721.014154 562.412308 698.958769 562.412308 671.940923L562.412308 634.407385 479.113846 634.407385C454.301538 634.407385 439.926154 635.510154 421.179077 638.818462L421.179077 575.921231C440.477538 579.229538 453.750154 580.332308 479.113846 580.332308L562.412308 580.332308 562.412308 563.790769 544.216615 535.670154 480.216615 535.670154C454.852923 535.670154 441.028923 536.772923 422.281846 540.081231L422.281846 477.184C440.477538 480.492308 454.852923 481.595077 480.216615 481.595077L511.094154 481.595077 434.412308 360.211692C418.422154 335.399385 404.086154 313.895385 395.815385 303.419077ZM591.990154 1024C440.162462 1024 304.167385 957.518769 210.432 852.558769L272.699077 804.076308C351.901538 890.643692 465.447385 945.230769 591.990154 945.230769 831.251692 945.230769 1025.220923 751.261538 1025.220923 512 1025.220923 272.738462 831.251692 78.769231 591.990154 78.769231 396.8 78.769231 232.172308 208.029538 178.057846 385.536L243.436308 316.534154C257.378462 301.843692 279.630769 301.489231 293.139692 315.746462 306.609231 330.003692 306.254769 353.476923 292.312615 368.167385L166.124308 501.326769C156.396308 511.606154 142.651077 514.402462 130.638769 510.582154 116.224 513.654154 101.021538 507.313231 93.262769 493.016615L5.12 330.948923C-4.608 313.028923 1.142154 290.146462 18.038154 279.788308 34.894769 269.469538 56.438154 275.613538 66.166154 293.494154L102.872615 360.999385C167.345231 151.985231 361.826462 0 591.990154 0 874.771692 0 1103.990154 229.218462 1103.990154 512 1103.990154 794.781538 874.771692 1024 591.990154 1024Z" fill="#f52a10" p-id="6063"></path></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB