update(["is_privacy" => $data["is_privacy"]]); } // 创建订单 $tradeNo = CommonService::getTradeNO(); $order = Order::create([ 'user_id' => $user_id, 'type' => 'SERVICE', 'type_id' => 1, 'price' => $data['price'], 'pay_status' => 'PAID', 'trade_no' => $tradeNo, 'name' => $data['name'], 'area_code' => $data['area_code'] ?? 86, "status" => Order::NOTSTART_STATUS, "service_status" => "NOINFO", // 'mobile' => aesDecryptCBC($data['mobile']), 'mobile' => ctype_digit($data['mobile']) ? $data['mobile'] : aesDecryptCBC($data['mobile']), 'agency_id' => $data['agency_id'] ?? null, 'desc' => '友福健康服务', 'is_hook' => 1, "payment_id" => $data["payment_id"] ?? 1, "check_pay_status" => $data["check_pay_status"] ?? 0, "check_pay_img" => $data["check_pay_img"] ?? null, "sign_type" => (isset($data["check_pay_status"]) && $data["check_pay_status"] == 1) ? 1 : 0, ]); $contract_no = 0; if (isset($data['contract_no']) && !empty($data['contract_no'])) { $contract_no = $data['contract_no']; } if ($contract_no == 0 && !empty($order->mobile)) { $contract_no = $order->mobile; } // 创建线下订单 $offline_order = OfflineOrder::create([ 'order_id' => $order->id, 'name' => $order->name, 'area_code' => $data['area_code'] ?? 86, 'mobile' => $order->mobile, 'contract_no' => $contract_no, 'pay_type' => $data['pay_type'] ?? 1, 'bank_name' => $data['bank_name'] ?? null, 'bank_num' => $data['bank_num'] ?? null, 'agency_id' => $data['agency_id'] ?? null, 'price' => $order->price ?? 0, "operate_user_id" => auth()->id(), "operate_user_name" => auth()->user()->name, ]); //创建群记录 $chat_id = $data['chat_id'] ?? null; Group::create(['name' => $order->name . '服务群', 'order_id' => $order->id, 'chat_id' => $chat_id]); if (config('app.env') == 'production') { //生成用户绑定二维码 $scene = 'order_id=' . $order->id; $page = 'pages/offlineOrder/bindUser'; $qrcode = WechatService::getMPQrcode($scene, $page); //更新线下订单信息 $offline_order->bind_qrcode = $qrcode; $offline_order->save(); } $this->insertRoleData($chat_id, $order->id); DB::commit(); return $offline_order; } public function getOrderList($keywords = '', $status = '', $agency_id = '', $page_size = 15) { $orders = OfflineOrder::with([ 'main_order' => function ($order) { $order->with([ 'service_role' => function ($serviceRole) { $serviceRole->with(['serviceUser:user_id,name,mobile'])->select('order_id', 'role_id', 'user_id'); } ]); }, "main_order.user:id,name,mobile,avatar,is_privacy", 'agency:id,name,mobile', 'order_commission' => function ($commission) { $commission->with(['service_user:user_id,name,mobile'])->select('id', 'order_id', 'role', 'user_id'); }, 'agreement:order_id,number,sign_date,quota_id', 'agreement.quotaInfo:id,agency_id,collaborator_id,num', 'agreement.quotaInfo.collaboratorInfo:id,avatar,name,mobile', 'agreement.quotaInfo.agencyInfo:id,grade,pro_id,city_id,province,city' ]) ->when($keywords, function ($query) use ($keywords) { $query->where(function ($query) use ($keywords) { $query->where('name', 'like', '%' . $keywords . '%')->orWhere('mobile', 'like', '%' . $keywords . '%'); }); }) ->when(!empty($status), function ($query) use ($status) { $query->whereHas('main_order', function ($query) use ($status) { $query->where('status', $status); }); }) // ->when($agency_id,function ($query) use ($agency_id) { // $query->where('agency_id',$agency_id); // }) ->when($agency_id, function ($query) use ($agency_id) { return $query->whereHas('agreement.quotaInfo', function ($q) use ($agency_id) { $q->where('agency_id', $agency_id); }); }) ->orderByDesc('id'); $is_export = request()->input('is_export'); if ($is_export) { $orders = $orders->get(); return $orders; } $orders = $orders->paginate($page_size); return $orders; } /** * 更新线下订单 * @param array $data * @return void * @throws \Exception */ public function updateOfflineOrder(array $data, $order_id) { //获取订单状态 $offline_order = OfflineOrder::with('main_order')->findOrFail($order_id); if ($offline_order->main_order->status != 'NOTSTART') throw new \Exception('订单已开始服务,不可修改'); // 计算佣金 // $commission_type = $data['subcommission_type']; // $commission_val = $data['subcommission_val']; // $data['commission_amount'] = $this->getCommissionAmount($commission_type,$commission_val,$offline_order->price); try { DB::beginTransaction(); //更新线下订单 $offline_order->update($data); //更新对应主订单 $order_data = [ 'name' => $offline_order->name, 'mobile' => $offline_order->mobile, 'price' => $offline_order->price, 'agency_id' => $offline_order->agency_id, ]; $offline_order->main_order()->update($order_data); DB::commit(); return $offline_order; } catch (\Exception $exception) { DB::rollBack(); throw new \Exception($exception->getMessage(), $exception->getCode()); } } private function getCommissionAmount($type, $val, $price) { // 计算佣金 if ($type === 1) { // 比例分佣 $commission_percentage = bcdiv($val, 100, 4); $commission_amount = bcmul($price, $commission_percentage, 2); } else { // 固定金额 $commission_amount = $val; } return $commission_amount; } /** * 查看是否存在角色数据,存在则绑定角色 * @param $chat_id * @param $order_id */ public function insertRoleData($chat_id, $order_id, $service_user_id = null) { if ($service_user_id) { $service_user = ServiceUser::where("user_id", $service_user_id)->first(); } else { //查看是否绑定企业微信 $work_wechat_user = session('work_wechat_user'); $work_user_id = $work_wechat_user['raw']['userid'] ?? 0; $service_user = ServiceUser::where("work_user_id", $work_user_id)->first(); } if ($service_user) { $roleIds = ServiceUserBindRole::where('chat_id', $chat_id) ->where('user_id', $service_user->user_id) ->select('role_id') ->get()->toArray(); //如果存在数据,则绑定订单 if ($roleIds) { foreach ($roleIds as $value) { $ServiceRoleOrder = new ServiceRoleOrder(); $ServiceRoleUser = new ServiceRoleUser(); $ServiceRoleOrder->insertRoleOrder($value['role_id'], $service_user, $order_id); $ServiceRoleUser->insertRoleUserData($service_user, $value['role_id']); } } } } public function AutoServiceJoinGroup($imChatId, $groupId, $orderId, $userId) { Log::info("自动分配用户订单角色"); // 主教练id $mainCoachRoleId = 1; $mainCoachUserId = $this->getOrderService($userId, $mainCoachRoleId); Log::info("主教练用户id:" . $mainCoachUserId); if ($mainCoachUserId) { $this->joinServiceGroup($imChatId, $groupId, $orderId, $mainCoachRoleId, $mainCoachUserId); } // 客服 $customerRoleId = 3; $customerUserId = $this->getOrderService($userId, $customerRoleId); Log::info("客服用户id:" . $customerUserId); if ($customerUserId) { $this->joinServiceGroup($imChatId, $groupId, $orderId, $customerRoleId, $customerUserId); } } public function joinServiceGroup($imChatId, $groupId, $orderId, $roleId, $userId) { DB::beginTransaction(); try { // 订单绑定服务人员 $roleOrder = ServiceRoleOrder::where(["order_id" => $orderId, "user_id" => $userId, "role_id" => $roleId])->first(); if (empty($roleOrder)) { ServiceRoleOrder::create([ "order_id" => $orderId, "user_id" => $userId, "role_id" => $roleId ]); } // 服务人员加入群聊 $groupUser = GroupUser::where(["user_id" => $userId, "group_id" => $groupId])->first(); if (empty($groupUser)) { $roleName = ServiceRole::where("id", $roleId)->value("name"); GroupUser::create([ "user_id" => $userId, "group_id" => $groupId, "status" => 0, "type" => 0, "role_id" => $roleId, "role_name" => $roleName, ]); } $group_info = Group::where('id', $groupId)->first(); $owner_ac_cid = make_wangyiyun_accid($group_info->owner_id); // 加入im群聊 $user_accid = make_wangyiyun_accid($userId); $imTeam = new Team(config('chat.im.app_id'), appSecrt: config('chat.im.app_secret')); $imTeam->add($imChatId, $owner_ac_cid, [$user_accid], 0, '邀请进群'); // 修改群角色 $map = []; $map['role'] = [$roleId]; $options = ['custom' => json_encode($map)]; $imTeam->updateTeamNick($imChatId, $owner_ac_cid, $user_accid, $options); DB::commit(); } catch (Exception $e) { DB::rollBack(); Log::error($e->getMessage()); } } /** * 获取服务人员id(轮训) * @param mixed $userId * @param mixed $roleId * @return void */ public function getOrderService($userId, $roleId): int { $userIds = []; switch ($roleId) { case 1: if ($userId == 3740 || $userId == 6) return 1; $userIds = [218, 178, 175, 176]; // $userIds = [153, 152, 11043, 1]; // 测试 break; case 3: if ($userId == 3740 || $userId == 6) return 7; $userIds = [181, 177, 184]; // $userIds = [7, 3306]; // 测试 break; } $serviceUserId = $this->getLastServiceUserId($roleId, $userIds); return $serviceUserId; } public function getLastServiceUserId($roleId, $userIds): int { $serviceUserId = 0; if ($roleId != 1 && $roleId != 3) return $serviceUserId; if (count($userIds) == 0) return $serviceUserId; $serviceRoleOrder = ServiceRoleOrder::where("role_id", $roleId)->whereIn("user_id", $userIds)->orderByDesc("id")->first(); if (!$serviceRoleOrder) return $serviceUserId; $serviceUserId = $this->findIndex($userIds, $serviceRoleOrder->user_id); return $serviceUserId; } public function findIndex($userIds, $userId): int { Log::info("查询服务人员id"); Log::info(json_encode($userIds)); Log::info($userId); if (!in_array($userId, $userIds)) return $userIds[0]; foreach ($userIds as $key => $item) { if ($item == $userId) { if ($key == count($userIds) - 1) return $userIds[0]; return $userIds[$key + 1]; } } return $userIds[0]; } }