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