feate:添加退款接口
Build and Deploy Vue3 / build (push) Successful in 1m19s
Build and Deploy Vue3 / deploy (push) Failing after 1m41s

This commit is contained in:
2026-01-05 15:19:48 +08:00
parent 5a93f4f8a8
commit fcebebd216
4 changed files with 201 additions and 622 deletions
+112 -5
View File
@@ -77,11 +77,21 @@
</template>
</el-table-column>
<el-table-column prop="Note" label="备注" min-width="200" show-overflow-tooltip />
<el-table-column prop="PaymentOrderId" label="支付订单ID" width="150" show-overflow-tooltip>
<template #default="{ row }">
{{ row.PaymentOrderId || '-' }}
</template>
</el-table-column>
<el-table-column label="创建时间" width="180">
<template #default="{ row }">
{{ formatDateTime(row.CreatedAt) }}
</template>
</el-table-column>
<el-table-column label="操作" width="100" fixed="right">
<template #default="{ row }">
<el-button type="warning" size="small" @click="handleRefund(row)">退款</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination-wrapper">
@@ -151,6 +161,10 @@
<template #prepend>¥</template>
</el-input>
</el-form-item>
<el-form-item label="支付平台订单id" prop="paymentOrderId">
<el-input v-model="recordForm.paymentOrderId" placeholder="请输入支付平台订单ID" />
</el-form-item>
<el-form-item label="备注" prop="note">
<el-input v-model="recordForm.note" type="textarea" :rows="3" placeholder="请输入备注" />
</el-form-item>
@@ -160,15 +174,38 @@
<el-button type="primary" @click="submitRecordForm">确定</el-button>
</template>
</el-dialog>
<!-- 退款对话框 -->
<el-dialog v-model="refundDialogVisible" title="退款" width="500px">
<el-form ref="refundFormRef" :model="refundForm" :rules="refundRules" label-width="120px">
<el-form-item label="余额记录ID">
<el-input :value="refundForm.history_id" disabled />
</el-form-item>
<el-form-item label="订单ID" prop="order_id">
<el-input v-model="refundForm.order_id" :min="0" style="width: 100%" placeholder="请输入订单ID" />
</el-form-item>
<el-form-item label="退款方式" prop="bandwidth">
<el-radio-group v-model="refundForm.bandwidth">
<el-radio :label="false">退回余额</el-radio>
<el-radio :label="true">提现</el-radio>
</el-radio-group>
<div class="form-tip">退回余额将退款金额添加到对应余额提现将退款金额提现</div>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="refundDialogVisible = false">取消</el-button>
<el-button type="warning" @click="submitRefundForm" :loading="refundLoading">确认退款</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, reactive, onMounted, computed } from 'vue'
import { ref, reactive, onMounted, computed, watch } from 'vue'
import { useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
import { Refresh } from '@element-plus/icons-vue'
import { getUserBalance, getUserBalanceRecord, editUserBalance, addUserConsumption, getUserBalanceCount, getUserList } from '@/api/admin/user'
import { getUserBalance, getUserBalanceRecord, editUserBalance, addUserConsumption, getUserBalanceCount, getUserList, refundBalance } from '@/api/admin/user'
const route = useRoute()
@@ -203,8 +240,11 @@ const userList = ref([])
// 对话框
const balanceDialogVisible = ref(false)
const recordDialogVisible = ref(false)
const refundDialogVisible = ref(false)
const balanceFormRef = ref(null)
const recordFormRef = ref(null)
const refundFormRef = ref(null)
const refundLoading = ref(false)
// 余额表单
const balanceForm = reactive({
@@ -231,7 +271,8 @@ const recordForm = reactive({
apply_balance: false,
price: 0,
state: 'add',
note: ''
note: '',
paymentOrderId: ''
})
const recordRules = {
@@ -243,6 +284,18 @@ const recordRules = {
note: [{ required: true, message: '请输入备注', trigger: 'blur' }]
}
// 退款表单
const refundForm = reactive({
history_id: 0,
order_id: 0,
bandwidth: false
})
const refundRules = {
order_id: [{ required: true, message: '请输入订单ID', trigger: 'blur' }],
bandwidth: [{ required: true, message: '请选择退款方式', trigger: 'change' }]
}
// 当前余额显示
const currentBalanceDisplay = computed(() => {
const balance = balanceList.value.find(b => userBalance[b.type]?.type === balanceForm.balance_type)
@@ -365,7 +418,7 @@ const fetchBalanceRecord = async () => {
const res = await getUserBalanceRecord(recordParams)
if (res.data.code === 200) {
recordList.value = res.data.data.data || []
recordTotal.value = res.data.data.all_count || 0
recordTotal.value = res.data.data.total || 0
} else {
ElMessage.error(res.data.message || '获取余额记录失败')
}
@@ -401,7 +454,8 @@ const handleAddRecord = (balanceType) => {
apply_balance: false,
price: 0,
state: 'add',
note: ''
note: '',
paymentOrderId: ''
})
recordDialogVisible.value = true
}
@@ -457,6 +511,40 @@ const handleRecordCurrentChange = () => {
fetchBalanceRecord()
}
// 退款
const handleRefund = (row) => {
Object.assign(refundForm, {
history_id: row.Id,
order_id: String(row.PaymentOrderId) || 0,
bandwidth: false
})
refundDialogVisible.value = true
}
// 提交退款
const submitRefundForm = () => {
refundFormRef.value?.validate(async (valid) => {
if (valid) {
refundLoading.value = true
try {
const res = await refundBalance(refundForm)
if (res.data.code === 200) {
ElMessage.success('退款成功')
refundDialogVisible.value = false
fetchUserBalance()
} else {
ElMessage.error(res.data.message || '退款失败')
}
} catch (error) {
console.error('退款错误:', error)
ElMessage.error('退款失败')
} finally {
refundLoading.value = false
}
}
})
}
// 初始化
onMounted(() => {
getUserListData()
@@ -466,6 +554,19 @@ onMounted(() => {
ElMessage.warning('缺少用户ID参数')
}
})
// 监听路由参数变化
watch(
() => route.query.user_id,
(newUserId) => {
if (newUserId && newUserId !== queryParams.user_id) {
queryParams.user_id = newUserId
recordParams.user_id = newUserId
fetchUserBalance()
}
},
{ immediate: true }
)
</script>
<style scoped>
@@ -684,6 +785,12 @@ onMounted(() => {
background: #fafafa;
}
.form-tip {
font-size: 12px;
color: #909399;
margin-top: 4px;
}
/* 响应式 */
@media (max-width: 1200px) {
.balance-cards {