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('获取失败'); } } }