1.新增获取充值/提现配置接口/api/finance/depositWithdrawConfig

2.优化充值和提现方式
This commit is contained in:
2026-04-23 10:15:01 +08:00
parent 0f28c0fd2a
commit aa1299c018
55 changed files with 901 additions and 750 deletions

View File

@@ -1,29 +0,0 @@
<?php
namespace app\admin\controller\order;
use app\common\library\game\DepositChannel;
/**
* 渠道充值订单仅列出已注册且启用的支付渠道pay_channel产生的充值单
*/
class DepositChannelOrder extends DepositOrder
{
/**
* @param list<array<mixed>> $where
*/
protected function appendDepositOrderIndexWhere(array &$where, string $mainShort): void
{
if ($mainShort === '') {
return;
}
$effective = DepositChannel::effectiveRowsFromDb();
$codes = DepositChannel::enabledPayChannelCodes($effective);
if ($codes === []) {
$where[] = [$mainShort . '.pay_channel', '=', '__no_pay_channel__'];
return;
}
$where[] = [$mainShort . '.pay_channel', 'in', $codes];
}
}

View File

@@ -24,7 +24,7 @@ class WithdrawOrder extends Backend
protected bool $modelSceneValidate = true;
protected string|array $quickSearchField = ['id', 'order_no', 'remark'];
protected string|array $quickSearchField = ['id', 'order_no', 'idempotency_key', 'receive_type', 'receive_account', 'remark'];
protected string|array $defaultSortField = ['id' => 'desc'];
@@ -119,16 +119,16 @@ class WithdrawOrder extends Backend
$newAmount = $this->decimalParam($request->post('amount'), '0');
$newFee = $this->decimalParam($request->post('fee'), '0');
if (bccomp($newAmount, '0', 4) <= 0) {
if (bccomp($newAmount, '0', 2) <= 0) {
return $this->error('申请金额必须大于 0');
}
if (bccomp($newFee, '0', 4) < 0) {
if (bccomp($newFee, '0', 2) < 0) {
return $this->error('手续费不能为负');
}
if (bccomp($newFee, $newAmount, 4) > 0) {
if (bccomp($newFee, $newAmount, 2) > 0) {
return $this->error('手续费不能大于申请金额');
}
$newActual = bcsub($newAmount, $newFee, 4);
$newActual = bcsub($newAmount, $newFee, 2);
$remarkRaw = $request->post('remark');
$remark = is_string($remarkRaw) ? trim($remarkRaw) : '';
@@ -149,8 +149,8 @@ class WithdrawOrder extends Backend
if ($userId <= 0) {
return $this->error('订单缺少用户信息');
}
$oldAmount = bcadd(strval($order['amount'] ?? '0'), '0', 4);
$diff = bcsub($newAmount, $oldAmount, 4);
$oldAmount = bcadd(strval($order['amount'] ?? '0'), '0', 2);
$diff = bcsub($newAmount, $oldAmount, 2);
$now = time();
$adminId = $this->intParam($this->auth->id ?? 0);
@@ -168,7 +168,7 @@ class WithdrawOrder extends Backend
Db::startTrans();
try {
// 金额调整差额处理
$cmp = bccomp($diff, '0', 4);
$cmp = bccomp($diff, '0', 2);
if ($cmp > 0) {
// 新金额更大:再冻结用户 diff
$userRow = Db::name('user')->where('id', $userId)->find();
@@ -176,12 +176,12 @@ class WithdrawOrder extends Backend
Db::rollback();
return $this->error('关联用户不存在');
}
$beforeCoin = bcadd(strval($userRow['coin'] ?? '0'), '0', 4);
if (bccomp($beforeCoin, $diff, 4) < 0) {
$beforeCoin = bcadd(strval($userRow['coin'] ?? '0'), '0', 2);
if (bccomp($beforeCoin, $diff, 2) < 0) {
Db::rollback();
return $this->error('用户余额不足以补扣调整差额');
}
$afterCoin = bcsub($beforeCoin, $diff, 4);
$afterCoin = bcsub($beforeCoin, $diff, 2);
Db::name('user')->where('id', $userId)->update([
'coin' => $afterCoin,
'total_withdraw_coin' => Db::raw('total_withdraw_coin + ' . $diff),
@@ -205,14 +205,14 @@ class WithdrawOrder extends Backend
]);
} elseif ($cmp < 0) {
// 新金额更小:退回差额
$abs = bcsub('0', $diff, 4);
$abs = bcsub('0', $diff, 2);
$userRow = Db::name('user')->where('id', $userId)->find();
if (!$userRow) {
Db::rollback();
return $this->error('关联用户不存在');
}
$beforeCoin = bcadd(strval($userRow['coin'] ?? '0'), '0', 4);
$afterCoin = bcadd($beforeCoin, $abs, 4);
$beforeCoin = bcadd(strval($userRow['coin'] ?? '0'), '0', 2);
$afterCoin = bcadd($beforeCoin, $abs, 2);
Db::name('user')->where('id', $userId)->update([
'coin' => $afterCoin,
'total_withdraw_coin' => Db::raw('total_withdraw_coin - ' . $abs),
@@ -301,7 +301,7 @@ class WithdrawOrder extends Backend
if ($userId <= 0) {
return $this->error('订单缺少用户信息');
}
$amount = bcadd(strval($order['amount'] ?? '0'), '0', 4);
$amount = bcadd(strval($order['amount'] ?? '0'), '0', 2);
$channelIdRaw = $order['channel_id'] ?? null;
$channelId = ($channelIdRaw === null || $channelIdRaw === '')
? null
@@ -318,8 +318,8 @@ class WithdrawOrder extends Backend
Db::rollback();
return $this->error('关联用户不存在');
}
$beforeCoin = bcadd(strval($userRow['coin'] ?? '0'), '0', 4);
$afterCoin = bcadd($beforeCoin, $amount, 4);
$beforeCoin = bcadd(strval($userRow['coin'] ?? '0'), '0', 2);
$afterCoin = bcadd($beforeCoin, $amount, 2);
Db::name('user')->where('id', $userId)->update([
'coin' => $afterCoin,
'total_withdraw_coin' => Db::raw('total_withdraw_coin - ' . $amount),
@@ -413,9 +413,9 @@ class WithdrawOrder extends Backend
private function decimalParam($raw, string $default): string
{
if ($raw === null || $raw === '' || !is_numeric(strval($raw))) {
return bcadd($default, '0', 4);
return bcadd($default, '0', 2);
}
return bcadd(strval($raw), '0', 4);
return bcadd(strval($raw), '0', 2);
}
private function adminDisplayName(): string
@@ -432,14 +432,14 @@ class WithdrawOrder extends Backend
}
/**
* 把 4 位小数金额压缩成最多 2 位小数用于展示(不影响落库精度)
* 把 2 位小数金额压缩成最多 2 位小数用于展示(不影响落库精度)
*/
private function shortAmount(string $amount): string
{
if (!is_numeric($amount)) {
return $amount;
}
$normalized = bcadd($amount, '0', 4);
$normalized = bcadd($amount, '0', 2);
$negative = false;
if (str_starts_with($normalized, '-')) {
$negative = true;