| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- <?php
- namespace App\Module\Transfer\Validators;
- use App\Module\Fund\Services\FundService;
- use App\Module\Transfer\Models\TransferApp;
- use UCore\Validator;
- /**
- * 转账余额验证器
- * 验证用户余额是否充足以支付转出金额
- */
- class TransferBalanceValidator extends Validator
- {
- /**
- * 验证用户余额是否充足
- *
- * @param mixed $value 转出金额
- * @param array $data 验证数据
- * @return bool
- */
- public function validate(mixed $value, array $data): bool
- {
- // 检查必需的参数
- if (!isset($data['user_id']) || !isset($data['transfer_app_id'])) {
- $this->addError('缺少必需的用户ID或应用ID参数', 'amount');
- return false;
- }
- $userId = $data['user_id'];
- $transferAppId = $data['transfer_app_id'];
- $amount = (float) $value;
- // 验证金额是否为正数
- if ($amount <= 0) {
- $this->addError('转出金额必须大于0', 'amount');
- return false;
- }
- try {
- // 获取转账应用配置
- $transferApp = TransferApp::find($transferAppId);
- if (!$transferApp) {
- $this->addError('转账应用不存在', 'transfer_app_id');
- return false;
- }
- // 检查应用是否启用
- if (!$transferApp->is_enabled) {
- $this->addError('转账应用已禁用', 'transfer_app_id');
- return false;
- }
- // 检查是否允许转出
- if (!$transferApp->allow_transfer_out) {
- $this->addError('该应用不允许转出操作', 'transfer_app_id');
- return false;
- }
- // 获取用户资金服务
- $fundService = new FundService($userId, $transferApp->fund_id);
- // 检查用户账户是否存在
- if (!$fundService->getAccount()) {
- $this->addError('用户资金账户不存在', 'user_id');
- return false;
- }
- // 获取用户当前余额
- $userBalance = $fundService->balance();
- // 验证余额是否充足
- if ($userBalance < $amount) {
- $this->addError("余额不足,当前余额:{$userBalance},需要金额:{$amount}", 'amount');
- return false;
- }
- // 将转账应用对象设置到验证器中,供后续使用
- if (property_exists($this->validation, 'transfer_app')) {
- $this->validation->transfer_app = $transferApp;
- }
- return true;
- } catch (\Exception $e) {
- $this->addError('余额验证失败:' . $e->getMessage(), 'amount');
- return false;
- }
- }
- }
|