ufutx.dma/app/Http/Controllers/H5/PartnerWithdrawalsController.php
2026-03-04 14:42:40 +08:00

171 lines
6.5 KiB
PHP

<?php
namespace App\Http\Controllers\H5;
use App\Events\WithdrawalsApplyEvent;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Jobs\AddErrorLog;
use App\Models\Partner;
use App\Models\PartnerAccount;
use App\Models\PartnerCommission;
use App\Models\PartnerWallet;
use App\Models\PartnerWithdrawal;
use App\Validators\WithdrawalsValidator;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class PartnerWithdrawalsController extends Controller
{
//
use ResponseJson;
private WithdrawalsValidator $validator;
private Partner $partner;
private $user;
public function __construct(Partner $partner, WithdrawalsValidator $validator)
{
$this->partner = $partner;
$this->validator = $validator;
$user = auth('api')->user();
if (!$user)return $this->jsonResponse(2,'未登录');
$this->user = $user;
}
public function apply(Request $request)
{
try {
$user_id = $this->user->id;
// 数据验证
$this->validator->scene('apply')->validate($request->all());
// 获取要申请的佣金记录详情
$commissionIds = $request->input('commission_ids');
$commissions = PartnerCommission::whereIn('id',$commissionIds)
->whereIn('status',[1,3,4])
->select(['id','amount'])
->where('user_id', $user_id)
->get();
if (count($commissionIds) !== count($commissions)) {
throw new \Exception('所选记录状态不正确,请确认后再次申请');
}
DB::beginTransaction();
$total_amount = $commissions->sum('amount');
// 更新用户钱包余额和提现中金额
$wallet = PartnerWallet::where('user_id', $user_id)->firstOrFail();
if ($wallet->balance < $total_amount){
throw new \Exception('可提现余额不足');
}
$wallet->update([
'balance' => DB::raw("balance - $total_amount"),
'withdrawn_amount' => DB::raw("withdrawn_amount + $total_amount"),
]);
// 创建提现申请
$withdraw = PartnerWithdrawal::create([
'user_id' => $user_id,
'amount' => $total_amount,
'bill_pic' => $request->input('bill_pic'),
'info' => [
'bank_of_deposit' => $request->input('bank_of_deposit'),
'bank_name' => $request->input('withdrawals_name'),
'bank_num' => $request->input('withdrawals_num'),
'type' => $request->input('withdrawals_type'),
],
'remark' => $request->input('remark'),
'status' => 0 // 提现状态为待审核
]);
// 变更佣金申请状态
PartnerCommission::whereIn('id',$commissionIds)->update([
'withdrawal_id'=>$withdraw->id,
'status' => 2
]);
//绑定提现记录
$withdraw->commissions()->attach($commissionIds);
DB::commit();
//发送通知
WithdrawalsApplyEvent::dispatch($withdraw);
return $this->success('ok',$withdraw);
} catch (ModelNotFoundException) {
DB::rollBack();
return $this->jsonResponse(1, '获取用户钱包失败');
} catch (\Exception $e) {
DB::rollBack();
return $this->jsonResponse(1, $e->getMessage());
}
}
public function deleteWithdraw(Request $request,$id){
try {
DB::beginTransaction();
$detail = PartnerCommission::find($id);
$withdrawal_id = $detail->withdrawal_id;
if(in_array($detail->status,[0,5])){
return $this->failure('记录不可操作');
}
PartnerWithdrawal::where('id',$detail->withdrawal_id)->update(['amount' => DB::raw("amount - $detail->amount"),]);
PartnerCommission::where('id',$id)->update(['withdrawal_id'=>null,'status'=>1]);
if($detail->status == 2){
PartnerWallet::where('user_id', $this->user->id)->update([
'balance' => DB::raw("balance + $detail->amount"),
'withdrawn_amount' => DB::raw("withdrawn_amount - $detail->amount")
]);
}
//如果没有了都删除
$exists_withdraw = PartnerCommission::where('withdrawal_id',$withdrawal_id)->exists();
if(!$exists_withdraw){
PartnerWithdrawal::where('id',$withdrawal_id)->delete();
}
DB::commit();
return $this->success('ok');
}catch (\Exception $e) {
DB::rollBack();
AddErrorLog::dispatch('deleteWithdraw file:'.$e->getFile().' line:'.$e->getLine().' message:'.$e->getMessage())->onQueue('health');
return $this->failure('删除失败');
}
}
public function getAccount(Request $request){
try {
$type = $request->input('type',0);
$list = PartnerAccount::where('user_id',$this->user->id)->where('type',$type)->get();
return $this->success('ok',$list);
}catch (\Exception $e) {
AddErrorLog::dispatch('getAccount file:'.$e->getFile().' line:'.$e->getLine().' message:'.$e->getMessage())->onQueue('health');
return $this->failure('获取失败');
}
}
public function updateWithdraw(Request $request,$id){
try {
$detail = PartnerWithdrawal::findOrFail($id);
$bill_pic = $request->input('bill_pic');
$detail->bill_pic = $bill_pic;
$detail->save();
return $this->success('ok');
}catch (\Exception $e) {
AddErrorLog::dispatch('uploadBillPic file:'.$e->getFile().' line:'.$e->getLine().' message:'.$e->getMessage())->onQueue('health');
return $this->failure('上传失败');
}
}
public function getWithdraws(Request $request)
{
$withdrawals = PartnerWithdrawal::where('user_id', $this->user->id)
->orderByDesc('id')
->paginate();
$withdrawals->each(function ($withdrawal) {
$withdrawal->rollback_amount = bcsub($withdrawal->amount, $withdrawal->send_amount, 2);
});
return $this->success('ok', $withdrawals);
}
}