user(); if ($user->payOrders()->count()) return $this->failure("该服务暂不支持多次购买"); $order_arr = [ 'user_id' => $user->id, 'price' => $service->price, 'type' => 'SERVICE', 'type_id' => $service_id, 'pay_status' => 'UNPAID', 'trade_no' => CommonService::getTradeNO(), 'name' => $request->input('name'), 'mobile' => $request->input('mobile'), 'desc' => $service->title, 'is_hook' => 0, 'invite_name' => $request->input('invite_name'), 'invite_mobile' => $request->input('invite_mobile'), ]; if ($service->price) { $callback = config('app.url') . '/api/notify/orders/' . $order_arr['trade_no']; $config = WechatService::mpPay($order_arr['trade_no'], $user->wechat->openid, $service->price, $service->title, $callback); } else { $order_arr['pay_status'] = 'PAID'; $order_arr['is_hook'] = 1; } $order = Order::create($order_arr); $order->config = $config; //todo 通知 if ($order->price == 0) $this->sendNotice($order); return $this->success('ok', $order); } public function notifyOrder($trade_no) { $order = Order::where('trade_no', $trade_no)->first(); if (empty($order)) throw new \Exception("订单不存在"); if ($order->is_hook) return true; //查询订单 // $result = false; $result = WechatService::mpPaid($trade_no); if (empty($result)) {//成功 DB::beginTransaction(); Order::where("id", $order->id)->update(['pay_status' => 'PAID', 'is_hook' => 1]); //生成聊天组 $order->group()->create(['name' => $order->user->name . '服务群']); GroupUser::firstOrCreate(['user_id' => $order->user_id, 'group_id' => $order->group->id]); DB::commit(); //订阅通知通知 $this->sendNotice($order); } else {//失败 Order::where("id", $order->id)->update(['err_msg' => $result]); } return true; } public function sendNotice($order) { $params = [ 'touser' => $order->user->openid, 'template_id' => config('wechat.sub_tpls.pay_success'), 'page' => '/pages/users/myOrder', 'miniprogram_state' => 'formal', "lang" => "zh_CN", 'data' => [ 'thing1' => ["value" => $order->desc], 'character_string3' => ["value" => $order->trade_no], 'time2' => ["value" => $order->created_at->toDatetimeString()], 'thing4' => ["value" => '点击查看详情'] ] ]; // SendTemplateNotice::dispatch($params)->onQueue('health'); } public function orders() { $orders = Order::with('service:id,title,pic,subtitle')->where('user_id', auth()->id())->where('pay_status', 'PAID')->orderByDesc('id')->simplePaginate(); return $this->success('OK', $orders); } public function order(Request $request, $order_id) { $order = Order::find($order_id); return $this->success('OK', $order); } public function bindUser(Request $request, $order_id) { try { $data = $request->all(); //数据验证 $validator = new OfflineOrderValidator(); $validator->scene('bindUser')->validate($data); //获取订单信息 $order = Order::query()->find($order_id); if ($order->user_id != 0) { throw new \Exception('无法绑定。此订单此前已被绑定。'); } if ($order->mobile != $data['mobile']) { throw new \Exception('手机号不匹配'); } if ($order->mobile != $data['name']) { throw new \Exception('姓名不匹配'); } //绑定 $user = auth()->user(); $order->user_id = $user->id; $order->save(); return $this->success('绑定成功'); } catch (\Exception $e) { return $this->jsonResponse(1, $e->getMessage()); } } public function getOrderLog(Request $request) { try { $order = Order::where('user_id', auth()->id())->orderByDesc('id')->first(); $list = OrderOperateLog::where('order_id', $order->id)->orderBy('created_at', 'desc')->get(); return $this->success('ok', $list); } catch (\Exception $e) { return $this->jsonResponse(1, $e->getMessage()); } } public function updateServerStatus(Request $request) { $user = auth()->user(); $service_status = $request->input('service_status'); $orderModel = new Order(); $orderModel->updateServerStatus($user, $service_status); //确认收货才发送消息 if ($service_status == "FINISHED") { $order = Order::getPayOrder($user->id); $chatService = new ChatService(); $chatService->sendImMsgUserToUser($order->id, '确认收货', "用户" . ($order->name ?? "") . '已确认收货,请客服设置餐单', 'https://image.fulllinkai.com/202403/29/dea3e0c27107cdf178635d2a41199e5e.png', config('app.url') . '/work/#/h5/appEditUserMenu', [ServiceRole::CUSTOMER]); $chatService->sendImMsgUserToUser($order->id, '系统通知', '请所有服务人员与用户[' . $order->name . ']进行第一次视频通话', 'https://image.fulllinkai.com/202403/29/dea3e0c27107cdf178635d2a41199e5e.png', '', [ServiceRole::MAIN_COACH, ServiceRole::COACH, ServiceRole::CUSTOMER]); // 待办事项-主教练 $theme = "请邀请所有服务人员进行「用户" . $order->name . "」服务的第一次「视频通话」,并将相关视频链接转发给“友福服务”"; TaskService::AddTask(0, 0, $theme, [1], $order->id); // 待办事项-客服 $theme = "请标记「用户" . $order->name . "」的方案开始并确认方案开始时间"; if (empty($order->status)) { TaskService::AddTask(0, 0, $theme, [3], $order->id); } DmaProcessLog::addUserProcessLog($order->user_id ?? 0, $order->id ?? 0, 1, "user_take_delivery", "用户确认收货", auth()->user()->id ?? 0, 0); } return $this->success("ok"); } }