Auth::id()]; // 备注 $data['remark'] = $params['remark'] ?? ''; // 用户地址 $address = Address::query()->where('user_id', $data['user_id'])->find($params['addressId']); !$address && self::error('地址信息错误'); $data['address'] = $address['address']; $data['real_address'] = $address['addressInfo']; $data['address_lat'] = $address['lat']; $data['address_lng'] = $address['lng']; $data['mobile'] = $address['mobile']; $data['adcode'] = $address['adcode']; $data['user_name'] = $address['user_name']; $data['area_id'] = 0; // 获取项目信息 $project = Project::query()->find($params['projectId']); $data['project_name'] = $project->title; $data['project_sub_title'] = $project->sub_title; $data['project_icon'] = $project->cover; // 优惠卷 // if ($params['couponId']) $data['coupon_id'] = $params['couponId']; // $coupon_record_model = new CouponRecord(); // 渠道 // $channel_model = new UserChannel(); // 用户渠道 // $input['channel_id'] = $channel_model->getChannelId($this->_user['id']); // 订单号 $order_id = $params['orderId'] ?? null; // 使用余额 $use_balance = $params['useBalance'] ?? 0; // 出行方式 $car_type = $params['carType'] ?? 0; // 技师 $coach_id = $params['coachId'] ?? null; if ($coach_id) { $coach_model = new User(); $coach_info = $coach_model->info($coach_id); !$coach_info && self::error('技师不存在'); !empty($coach_info) && $coach_info['is_work'] == 0 && self::error('该技师未上班'); !empty($coach_info) && ($coach_info['auth_status'] !== 2 || $coach_info['status'] !== 1) && self::error('该技师已下架'); } // 优惠卷ID $coupon_id = $params['couponId'] ?? 0; // 加钟订单 if ($order_id) { } else { // $address = $address_model->info($params['address_id']); // if(empty($address)){ // $this->errorMsg('请添加地址'); // } } $orderModel = new Order(); DB::beginTransaction(); try { $memberQuery = \App\Models\Member\User::query(); $member = $memberQuery->lockForUpdate()->find($data['user_id']); $orderPayInfo = $orderModel->buildPayInfo($data['user_id'], $params['projectId'], $use_balance, $coach_id, $car_type, $coupon_id, $order_id); //默认微信 $payType = $params['pay_type'] ?? 1; $use_balance && !round($orderPayInfo['pay_price'], 2) && ($payType = 0); // 订单状态 $orderStatus = 0; if ($use_balance && !round($orderPayInfo['pay_price'], 2)) { $orderStatus = 1; $orderPayInfo['pay_time'] = time(); } $orderData = array_merge($data, $orderPayInfo, [ 'order_sn' => $this->buildOrderSN(), 'pay_type' => $payType, 'status' => $orderStatus ]); //备注 // 'text' => $params['text'] ?: '', // 'car_type' => $car_type, // 'channel_id' => $params['channel_id'] ?: 0, //目的地地址 //加钟 // 'add_pid' => $order_id, // 'is_add' => $order_id ? 1 : 0, $orderData['coupon_price'] = $orderData['coupon_price'] * 100; $orderData['discount_price'] = $orderData['discount_price'] * 100; $orderData['material_price'] = $orderData['material_price'] * 100; $orderData['car_price'] = $orderData['car_price'] * 100; $orderData['pay_price'] = $orderData['pay_price'] * 100; $orderData['balance_price'] = $orderData['balance_price'] * 100; // 服务价格 $orderData['service_price'] = $orderData['service_price'] * 100; // 创建订单 $orderId = $orderModel->newQuery()->create($orderData)->id; // 变更用户余额 if ($use_balance && round($orderPayInfo['balance_price'], 2) > 0) { Benefit::query()->create([ 'user_id' => $data['user_id'], 'order_id' => $orderId, 'type' => 1, 'benefit' => round($orderPayInfo['balance_price'], 2) * -100, 'balance' => round($member['balance'], 2) * 100 ]); $member->decrement('balance', round($orderPayInfo['balance_price'], 2) * 100); } DB::commit(); return $orderId; } catch (\Exception $e) { DB::rollBack(); self::error($e->getMessage()); } } public function getOrderPage(array $data): array { $user_id = Auth::id(); $status = intval($data['status'] ?? 0); $where = ['user_id' => $user_id, 'user_del' => 0]; $statusRange = match ($status) { // 1 => [0, 1, 2, 3], // 2 => [4, 5], // 3 => [5], // 4 => [6, 7], // default => [0, 1, 2, 3, 4, 5, 6, 7] // 0:未支付 1:已支付(待接单) 2:已接单 3:已出发 4:已到达 5:开始服务(服务中) 6:服务结束 7:已撤离 8:已评价 9:取消订单(退款中) 10:已退款 // 对应景工UI 1 => [0], 2 => [1, 2, 3, 4, 5], 3 => [6, 7, 8], 4 => [7], 5 => [9, 10], default => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }; $orderPage = Order::query()->with('coach', function ($query) { $query->select('id', 'nickname', 'avatar'); })->where($where)->whereIn('status', $statusRange)->select($this->baseColumn)->latest()->paginate(10); return ['list' => $orderPage->items(), 'total' => $orderPage->total()]; } public function getOrder(int $order_id) { $user_id = Auth::id(); return Order::query()->with('coach', function ($query) { $query->select(['id', 'nickname', 'avatar']); })->with('grab.coach', function ($query) { $query->select(['id', 'nickname', 'avatar']); })->where('user_id', $user_id)->select([...$this->baseColumn, ...$this->infoColumn])->find($order_id); } /** * @throws ApiException */ public function updateOrder(array $data, int $id): void { $user_id = Auth::id(); $order_id = $id; $order = Order::query()->find($order_id); DB::beginTransaction(); try { if ($order->status === 0) { $useBalance = $data['useBalance'] ?? 0; // 用户地址 if (isset($data['addressId'])) { $address = Address::query()->where('user_id', $user_id)->find($data['addressId']); !$address && self::error('地址信息错误!'); $order['address'] = $address['address']; $order['real_address'] = $address['addressInfo']; $order['address_lat'] = $address['lat']; $order['address_lng'] = $address['lng']; $order['mobile'] = $address['mobile']; $order['adcode'] = $address['adcode']; $order['user_name'] = $address['user_name']; } $orderModel = new Order(); $orderPayInfo = $orderModel->buildPayInfo($user_id, $order['project_id'], $useBalance, $data['coachId'], $data['carType'] ?? 0, $data['couponId'] ?? 0); $order->service_price = $orderPayInfo['service_price'] * 100; $order->coupon_price = $orderPayInfo['coupon_price'] * 100; $order->discount_price = $orderPayInfo['discount_price'] * 100; $order->material_price = $orderPayInfo['material_price'] * 100; $order->car_price = $orderPayInfo['car_price'] * 100; $order->pay_price = $orderPayInfo['pay_price'] * 100; $order->balance_price = $orderPayInfo['balance_price'] * 100; // 技师 $order->coach_id = $orderPayInfo['coach_id']; // 优惠卷ID $order->coupon_id = $orderPayInfo['coupon_id']; // 使用余额 // $order->use_balance = $useBalance; // 变更用户余额 if ($useBalance && round($orderPayInfo['balance_price'], 2) > 0) { $memberQuery = \App\Models\Member\User::query(); $member = $memberQuery->lockForUpdate()->find($user_id); Benefit::query()->create([ 'user_id' => $user_id, 'order_id' => $order_id, 'type' => 1, 'benefit' => round($orderPayInfo['balance_price'], 2) * -100, 'balance' => round($member['balance'], 2) * 100 ]); $member->decrement('balance', round($orderPayInfo['balance_price'], 2) * 100); } //默认微信 $order->pay_type = $order['payType'] ?? 1; // 订单状态 if ($useBalance && !round($orderPayInfo['pay_price'], 2)) { $order->status = 1; $order->pay_time = time(); $order->pay_type = 0; } } else { $status = $data['status']; switch ($status) { // 结束订单 case 6: $order->status !== 5 && self::error('订单状态有误'); // 查询是否存在加钟订单 // 判断加钟服务是否完成 $order->user_end = 1; $order->end_time = time(); break; case 9: !in_array($order->status, [0, 1, 2, 3]) && self::error('订单状态有误'); break; } $order->status = $status; } $order->save(); DB::commit(); } catch (\Exception $e){ DB::rollBack(); Log::error($e->getMessage()); self::error($e->getMessage()); } } public function delOrder(int $order_id): void { $order = Order::query()->find($order_id); $order->user_del = 1; $order->save(); } /** * Notes : * Method : 确认下单 * @param array $params * @return array */ public function confirmOrder(array $params): array { $user_id = Auth::id(); $projectId = $params['projectId']; $coachId = $params['coachId'] ?? 0; // 查询地区项目 $projectSelect = ['title', 'sub_title', 'cover', 'price', 'init_price', 'total_sale', 'time_long', 'is_store', 'is_door']; $project = Project::query()->select($projectSelect)->find($projectId); // 查询用户余额 $balance = \App\Models\Member\User::query()->where('id', $user_id)->value('balance'); // 车费 // 判断技师是否收取车费 // $coach = User::query()->find($coachId); // 获取技师定位 $coachUser = null; if ($coachId) { $coachSelect = ['id', 'nickname', 'avatar']; $coachSiteSelect = ['latitude', 'longitude']; $coachUser = User::query()->where('id', $coachId)->select($coachSelect)->first(); $coachUser['site'] = Site::query()->select($coachSiteSelect)->where('coach_id', $coachId)->first(); } return [ 'balance' => $balance, 'project' => $project, 'coach' => $coachUser ]; } /** * Notes : * Method : 计算金额 * @param array $params * @return array */ public function computePrice(array $params): array { $user_id = Auth::id(); // 存在订单 $order_id = $params['orderId'] ?? 0; $use_balance = $params['useBalance'] ?? 0; $coach_id = $params['coachId'] ?? 0; $distance = $params['distance'] ?? 0; $car_type = $params['carType'] ?? 0; $coupon_id = $params['couponId'] ?? 0; $project_id = $params['projectId'] ?? 0; // $member = $memberQuery->find($user_id); $orderModel = new Order(); $orderPayInfo = $orderModel->buildPayInfo($user_id, $project_id, $use_balance, $coach_id, $car_type, $coupon_id, $order_id, $distance); return $orderPayInfo; } /** * Notes : * Method : 取消订单 * @throws ApiException */ public function cancelOrder(int $order_id) { $userId = Auth::id(); $order = Order::query()->find($order_id); !$order && self::error('无效订单!'); $member = \App\Models\Member\User::query()->lockForUpdate()->find($userId); $balance_price = $order['balance_price'] * 100; $pay_price = $order['pay_price'] * 100; $car_price = $order['car_price'] * 100; // $discount_price = $order['discount_price'] * 100; // $coupon_price = $order['coupon_price'] * 100; // $material_price = $order['material_price'] * 100; $service_price = $order['service_price'] * 100; // 退款金额 // $benefit = $balance_price + $pay_price + $car_price; DB::beginTransaction(); try { $benefitData = [ 'user_id' => $userId, 'order_id' => $order_id, 'type' => 2, 'remark' => '取消订单退款', 'benefit' => 0, 'balance' => $member['balance'] * 100 ]; // 订单状态 0:未支付 1:已支付(待接单) 2:已接单 3:已出发 4:已到达 5:开始服务(服务中) 6:服务结束 7:已撤离 8:已评价 9:取消订单(退款中) 10:已退款 switch ($order->status) { case 1: // 已支付 $benefit = $balance_price + $pay_price; $benefitData['benefit'] = $benefit; Benefit::query()->create($benefitData); $member->increment('balance', $benefit); break; case 2: // 已接单 $benefit = $balance_price + $pay_price; $benefitData['benefit'] = $benefit; Benefit::query()->create($benefitData); $member->increment('balance', $benefit); // 扣除20%服务费 $deduct_benefit = $service_price * 0.2; $benefitData['type'] = 3; $benefitData['remark'] = '技师已接单,取消订单扣除20%服务费'; $benefitData['benefit'] = $deduct_benefit; Benefit::query()->create($benefitData); $member->decrement('balance', $deduct_benefit); break; case 3: // 已出发 $benefit = $balance_price + $pay_price; $benefitData['benefit'] = $benefit; Benefit::query()->create($benefitData); $member->increment('balance', $benefit); // 扣除50%服务费 $deduct_benefit = $service_price * 0.5; $benefitData['type'] = 3; $benefitData['remark'] = '技师已出发,取消订单扣除50%服务费'; $benefitData['benefit'] = $deduct_benefit; Benefit::query()->create($benefitData); $member->decrement('balance', $deduct_benefit); // 扣除车费 if ($car_price) { $benefitData['type'] = 3; $benefitData['remark'] = '技师已出发,扣除交通费用'; $benefitData['benefit'] = $car_price; Benefit::query()->create($benefitData); $member->decrement('balance', $car_price); } break; default: self::error('订单状态错误!'); } $order->status = 10; $order->save(); DB::commit(); } catch (\Exception $e) { DB::rollBack(); self::error($e->getMessage()); } } public function qrCode(array $params) { $result = Builder::create() ->writer(new PngWriter()) ->data('https://www.baidu.com') ->size(300) ->margin(10) ->build(); return $result; } public function getGrabList(int $id): array { $orderGrabPage = OrderGrab::query()->with('coach', function ($query) { $query->select('id', 'nickname', 'avatar'); })->where('order_id', $id)->select(['id', 'coach_id', 'status', 'created_at'])->paginate(10); return ['list' => $orderGrabPage->items(), 'total' => $orderGrabPage->total()]; } /** * @throws ApiException */ public function setGrab(int $id, int $coach_id): void { DB::beginTransaction(); try { OrderGrab::query()->where('order_id', $id)->update(['status' => 0]); $grabCoach = OrderGrab::query()->where('order_id', $id)->where('coach_id', $coach_id)->first(); $grabCoach->status = 1; $grabCoach->save(); // $order = Order::query()->lockForUpdate()->find($id); // $order['coach_id'] && self::error('已选择技师'); // $order['coach_id'] = $coach_id; // $order->save(); DB::commit(); } catch (\Exception $e) { DB::rollBack(); self::error($e->getMessage()); } } }