- 转入 main_site_timeout 等不可冲正场景直接拒绝,避免假结案 - payment_records / settlement_adjustments 增加 partial unique 索引 - 坏账核销行锁 + meta 幂等回放;补差单记录 result_bill_id - 新增 FundOperationsHardeningTest 覆盖关键路径
46 lines
1.4 KiB
PHP
46 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Support;
|
|
|
|
use App\Models\AdminUser;
|
|
use App\Models\TransferOrder;
|
|
use App\Services\Wallet\LotteryTransferService;
|
|
|
|
/** 后台转账单可执行的对账/补单动作(列表与对账明细共用)。 */
|
|
final class AdminTransferOrderCapabilities
|
|
{
|
|
public static function canWriteWallet(?AdminUser $admin): bool
|
|
{
|
|
if ($admin === null) {
|
|
return false;
|
|
}
|
|
|
|
return $admin->hasPermissionCode('service.wallet.adjust')
|
|
|| $admin->hasPermissionCode('service.reconcile.manage')
|
|
|| $admin->hasPermissionCode('service.wallet.manage');
|
|
}
|
|
|
|
/**
|
|
* @return array{
|
|
* can_reverse: bool,
|
|
* can_complete_credit: bool,
|
|
* can_manually_process: bool
|
|
* }
|
|
*/
|
|
public static function forOrder(TransferOrder $order, ?AdminUser $admin, LotteryTransferService $transferService): array
|
|
{
|
|
$canWrite = self::canWriteWallet($admin);
|
|
|
|
return [
|
|
'can_reverse' => $canWrite && $transferService->isEligibleForReverse($order),
|
|
'can_complete_credit' => $canWrite
|
|
&& $order->direction === 'in'
|
|
&& $order->status === 'pending_reconcile'
|
|
&& $order->fail_reason === 'lottery_credit_failed'
|
|
&& trim((string) $order->external_ref_no) !== '',
|
|
'can_manually_process' => $canWrite
|
|
&& $transferService->isEligibleForManualProcess($order),
|
|
];
|
|
}
|
|
}
|