fix: 提现展示并校验可提现余额

排除处理中提现金额,防止重复提现超过总额。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-11 00:47:43 +08:00
parent 75527ae81d
commit ced61dfc65
+57 -33
View File
@@ -20,10 +20,13 @@
</view>
<view class="merchant-side">
<view class="merchant-balance">¥{{ formatMoney(item.balance) }}</view>
<view class="merchant-meta" v-if="Number(item.pendingAmount || 0) > 0">
处理中提现:¥{{ formatMoney(item.pendingAmount) }},可提现:¥{{ formatMoney(item.availableBalance) }}
</view>
<view class="summary-actions">
<el-button size="small" :loading="balanceQuery[item.accNo]" @click="queryBalance(item)">查询余额</el-button>
<el-button type="warning" size="small" icon="el-icon-wallet"
:disabled="Number(item.balance || 0) <= 0"
:disabled="Number(item.availableBalance || 0) <= 0"
@click="openWithdrawDialog(item)">提现</el-button>
</view>
</view>
@@ -53,8 +56,15 @@
<el-form-item label="当前余额">
<view class="withdraw-balance">¥{{ formatMoney(withdrawDialog.form.balance) }}</view>
</el-form-item>
<el-form-item label="处理中提现" v-if="Number(withdrawDialog.form.pendingAmount || 0) > 0">
<view class="withdraw-company">¥{{ formatMoney(withdrawDialog.form.pendingAmount) }}</view>
</el-form-item>
<el-form-item label="可提现余额">
<view class="withdraw-balance">¥{{ formatMoney(withdrawDialog.form.availableBalance) }}</view>
</el-form-item>
<el-form-item label="提现金额" required>
<el-input-number v-model="withdrawDialog.form.amount" :min="0" :precision="2" :step="100"
:max="Number(withdrawDialog.form.availableBalance || 0)"
controls-position="right" style="width: 100%;"></el-input-number>
</el-form-item>
<el-form-item label="说明">
@@ -109,6 +119,8 @@ export default {
accNo: item.accNo,
merchantName: item.label,
balance: 0,
pendingAmount: 0,
availableBalance: 0,
updateTime: ""
})),
table1: {
@@ -197,6 +209,8 @@ export default {
merchantId: "",
merchantName: "",
balance: 0,
pendingAmount: 0,
availableBalance: 0,
amount: 0,
description: ""
}
@@ -250,10 +264,17 @@ export default {
}, {});
that.balanceInfoList = merchantOptions.map(item => {
const current = serverMap[item.accNo] || {};
const balance = Number(current.balance || 0);
const pendingAmount = Number(current.pendingAmount || 0);
const availableBalance = current.availableBalance !== undefined && current.availableBalance !== null
? Number(current.availableBalance || 0)
: Math.max(0, balance - pendingAmount);
return {
accNo: item.accNo,
merchantName: current.merchantName || item.label,
balance: Number(current.balance || 0),
balance,
pendingAmount,
availableBalance,
updateTime: current.updateTime || ""
};
});
@@ -279,14 +300,22 @@ export default {
}
},
openWithdrawDialog(item) {
if (Number(item.balance || 0) <= 0) {
vk.toast("当前企业余额小于等于0,无法提现");
const availableBalance = Number(item.availableBalance || 0);
if (availableBalance <= 0) {
const pendingAmount = Number(item.pendingAmount || 0);
vk.toast(
pendingAmount > 0
? `可提现余额不足(处理中提现¥${that.formatMoney(pendingAmount)}已占用)`
: "当前企业余额小于等于0,无法提现"
);
return;
}
that.withdrawDialog.form = {
merchantId: item.accNo,
merchantName: item.merchantName,
balance: Number(item.balance || 0),
pendingAmount: Number(item.pendingAmount || 0),
availableBalance,
amount: 0,
description: ""
};
@@ -309,38 +338,25 @@ export default {
return;
}
try {
const res = await vk.request({
method: "POST",
url: "http://jjx-union-pay.gxwebsoft.com/api/union-pay-jjx/getActionLog",
header: {
"content-type": "application/json; charset=utf-8"
},
const res = await vk.callFunction({
url: "admin/finance/balance/sys/getActionLog",
data: {
accNo,
reqDate,
reqJournalNo
},
timeout: 60000
reqJournalNo,
logId: row && row._id ? row._id : ""
}
});
const code = Number(res && res.code);
const success = res && (
code === 0 ||
code === 200 ||
res.success === true ||
(typeof res.code === "undefined" && !res.msg && !res.message)
const status = that.getActionStatusValue(res) || (
res && res.data && res.data.status !== undefined && res.data.status !== null
? Number(res.data.status)
: ""
);
if (!success) {
throw new Error(
(res && (res.msg || res.message)) ||
(res && res.content && (res.content.msg || res.content.message)) ||
"查询状态失败"
);
}
const status = that.getActionStatusValue(res);
const statusText = that.formatStatus(status);
const statusText = that.formatStatus(status) || (res && res.data && res.data.statusText) || "";
if (status !== "" && row && row._id) {
row.status = status;
}
await that.getBalanceSummary();
vk.toast(statusText || "未识别到状态");
console.log("getActionLog", res);
} catch (err) {
@@ -348,7 +364,7 @@ export default {
}
},
async submitWithdraw() {
const { amount, description, merchantId, balance } = that.withdrawDialog.form;
const { amount, description, merchantId, availableBalance, pendingAmount } = that.withdrawDialog.form;
if (!merchantId) {
vk.toast("提现账号不能为空");
return;
@@ -357,12 +373,20 @@ export default {
vk.toast("提现金额必须大于0");
return;
}
if (Number(balance || 0) <= 0) {
vk.toast("当前企业余额小于等于0,无法提现");
if (Number(availableBalance || 0) <= 0) {
vk.toast(
Number(pendingAmount || 0) > 0
? `可提现余额不足(处理中提现¥${that.formatMoney(pendingAmount)}已占用)`
: "当前企业余额小于等于0,无法提现"
);
return;
}
if (Number(amount) > Number(balance || 0)) {
vk.toast("提现金额不能大于当前企业余额");
if (Number(amount) > Number(availableBalance || 0)) {
vk.toast(
Number(pendingAmount || 0) > 0
? `提现金额不能大于可提现余额¥${that.formatMoney(availableBalance)}(已排除处理中提现)`
: "提现金额不能大于当前企业余额"
);
return;
}
that.withdrawDialog.loading = true;