ufutx.dma/app/Http/Controllers/Admin/OrderCommissionController.php

269 lines
9.3 KiB
PHP
Raw Normal View History

2026-03-04 14:42:40 +08:00
<?php
namespace App\Http\Controllers\Admin;
use App\Events\OperationLoggedEvent;
use App\Events\OrderCommissionSetedEvent;
use App\Exports\PartnerWithdrawExport;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Jobs\AddErrorLog;
use App\Models\Coach;
use App\Models\CustomerServiceUser;
use App\Models\MainCoach;
use App\Models\Order;
use App\Models\OrderCommission;
use App\Models\Partner;
use App\Models\PartnerWithdrawal;
use App\Models\ServiceUser;
use App\Validators\CommissionValidator;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
use Maatwebsite\Excel\Facades\Excel;
class OrderCommissionController extends Controller
{
use ResponseJson;
private Order $order;
private CommissionValidator $validator;
public function __construct(Order $order, CommissionValidator $commissionValidator)
{
$this->order = $order;
$this->validator = $commissionValidator;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
$order = $this->order->findOrFail($request->get('order_id'));
$list = OrderCommission::with('service_user:id,name,mobile,user_id','user:id,avatar')
->where('order_id', $order->id)
->get();
return $this->success('ok', $list);
}
public function getList(Request $request)
{
try {
$role = $request->get('role');
$id = $request->get('id');
$page_size = $request->get('page_size',15);
$serviceUser = match ($role) {
"1" => new MainCoach(),
"2" => new Coach(),
"3" => new CustomerServiceUser(),
"4" => new Partner(),
"5" => new ServiceUser(),
default => throw new Exception('操作类型错误'),
};
$serviceUser = $serviceUser->findOrFail($id);
$partner = $serviceUser->{$role !="4" ? 'partner' : ''} ?? $serviceUser;
$list = OrderCommission::with(['offline_order:id,order_id,name,mobile','main_order:id,trade_no'])->where('user_id',$partner->user_id)
->orderByDesc('id')
->paginate(perPage: $page_size);
//数据格式处理
$list->each(function ($order_commission){
$order_commission->name = $order_commission->offline_order->name;
$order_commission->mobile = $order_commission->offline_order->mobile;
$order_commission->trade_no = $order_commission->main_order->trade_no;
unset($order_commission->offline_order);
unset($order_commission->main_order);
});
return $this->success('ok',$list);
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'用户信息不存在');
}catch (Exception $e){
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
//数据验证
$data = $request->only(['order_id','role','user_id','commission_type','commission_val','send_event','delay']);
$this->validator->scene('create')->validate($data);
//获取对应订单
$order = $this->order->findOrFail($data['order_id']);
if ($order->status !='NOTSTART'){
throw new Exception('此订单已开始服务,不可创建分佣方案');
}
//计算佣金
$data = $this->getCommissionData($data,$order);
$commission = OrderCommission::create($data);
//发送通知
OrderCommissionSetedEvent::dispatch($commission);
//操作记录
OperationLoggedEvent::dispatch("给订单: $order->id 创建了新的分佣方案:$commission->id");
return $this->success('ok',$commission);
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'订单不存在');
} catch (Exception|ValidationException $e) {
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse|\Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
try {
//数据验证
$data = $request->only(['role', 'user_id', 'commission_type', 'commission_val','send_event','delay']);
$this->validator->scene('update')->validate($data);
//获取分佣详情
$commission = OrderCommission::with('main_order')->findOrFail($id);
if ($commission->status !=0){
throw new Exception('此分佣已入账,不可更改');
}
//计算佣金
$data = $this->getCommissionData($data,$commission->main_order,$id);
//更新分佣
$commission->update($data);
//操作记录
OperationLoggedEvent::dispatch("更新了订单: $commission->main_order->id 的分佣方案:$commission->id");
return $this->success('ok');
} catch (ModelNotFoundException){
return $this->jsonResponse(1,'未找到此分佣记录');
}catch (Exception|ValidationException $e) {
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse|\Illuminate\Http\Response
*/
public function destroy($id)
{
try {
//获取分佣详情
$commission = OrderCommission::findOrFail($id);
if ($commission->status !=0)throw new Exception('此分佣已入账,不可更改');
$commission->delete();
//操作记录
OperationLoggedEvent::dispatch("删除了订单: {$commission->main_order->id} 的分佣方案:$id");
return $this->success('ok');
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'未找到此分佣记录');
}catch (Exception $e){
return $this->jsonResponse(1,$e->getMessage());
}
}
private function getCommissionData($data,$order,$id = null)
{
// 计算佣金
if ($data['commission_type'] == 1) {
// 比例分佣
$commission_percentage = bcdiv($data['commission_val'], 100,4);
$data['commission_amount'] = bcmul($order->price, $commission_percentage,2);
} else {
// 固定金额
$data['commission_amount'] = bcmul($data['commission_val'],1,2);
}
//获取当前订单已设置的分佣方案总金额
$commissions_total_amount = $order->commission()
->when($id,function ($query) use ($id) {
$query->where('id','!=',$id);
})
->sum('commission_amount');
//验证订单剩余金额是否足够本次分佣方案
$residue_amount = bcsub($order->price,$commissions_total_amount,2);
if ($data['commission_amount'] >$residue_amount){
throw new Exception('订单剩余金额不足以本次分佣方案');
}
//根据角色获取延迟
// $data['send_event'] = 'order_started';
// $delay_arr = [0,7,3,3,3];//1推荐人7天2教练3天3副教练3天4客服3天
// $delay = $delay_arr[$data['role']];
// $data['delay'] = $delay;
return $data;
}
public function getPartnerWithdraw(Request $request){
try {
$user_id = $request->get('user_id');
$bill = $request->get('bill');
$is_export = $request->get('is_export');
$query = PartnerWithdrawal::query();
if($bill == 1){
$query->whereNotNull('bill_pic');
}elseif($bill == 2){
$query->whereNull('bill_pic');
}
$query->where('user_id',$user_id);
if($is_export){
$list = $query->get();
return Excel::download(new PartnerWithdrawExport($list), '订单统计.xlsx');
}
$list = $query->paginate();
return $this->success('ok',$list);
}catch (\Exception $e){
AddErrorLog::dispatch('getPartnerWithdraw file:'.$e->getFile().' line:'.$e->getLine().' message:'.$e->getMessage())->onQueue('health');
return $this->failure('获取失败');
}
}
}