'当前订单不存在!', 'err_data' => '数据错误!', 'delete_success' => '删除成功', 'delete_fail' => '删除失败!', 'reset_success' => '重置成功', 'reset_fail' => '重置失败!', 'over_success' => '结束成功', 'over_fail' => '结束失败!', 'receive_success' => '接单成功', 'receive_fail' => '接单失败!', 'start_success' => '开始服务成功', 'start_fail' => '开始服务失败!', ]; public function index(array $data) { $status = null; if (!empty($data['status']) && $data['status'] === '9') { $status = $data['status']; unset($data['status']); } $model = $this->queryCondition(Order::query(), $data, 'order_sn'); if (!empty($data['key'])) { $where = [ ['id', 'like', '%' . $data['key'] . '%'], ['user_nickname', 'like', '%' . $data['key'] . '%', 'or'], ['mobile', 'like', '%' . $data['key'] . '%', 'or'] ]; $ids = User::where($where)->pluck('id'); $model->whereIn('user_id', $ids); } if (!empty($status)) { $model->whereIn('status', ['1', '2', '3', '4', '6']); } $model->with(['project', 'user', 'artificer']); $list = $model->select('id', 'order_sn', 'price', 'project_id', 'type', 'user_id', 'create_time', 'pay_time', 'return_time', 'appoint_time', 'voucher_price', 'balance_price', 'pay_price', 'pay_type', 'tax_price', 'status', 'jiedan_js_id', 'jiedan_time', 'start_time', 'finish_time', 'province', 'city', 'district', 'address', 'lng', 'lat') ->orderBy('id', 'desc') ->paginate($data['pageSize']) ->toArray(); return $this->apiSuccess('', [ 'list' => $list['data'], 'total' => $list['total'] ]); } /** * 临时接单 * Notes : * Method : Interface receive * @param array $data */ public function receive(array $data) { $order_id = $data['id']; $order = Order::where('id', $order_id)->where('status','1')->first(); if($order){ $params = ['status' => '2','jiedan_time' => time(),'js_delete' => 2]; return $this->commonUpdate(Order::query(), $order_id, $params, $this->message['receive_success'], $this->message['receive_fail'], false); } $this->apiError($this->message['err_data'], 400); } /** * 开始服务 * Notes : * Method : Interface receive * @param array $data */ public function start(array $data) { $order_id = $data['id']; $order = Order::where('id', $order_id)->where('status','2')->first(); if($order){ $params = ['status' => '6','start_time' => time()]; return $this->commonUpdate(Order::query(), $order_id, $params, $this->message['start_success'], $this->message['start_fail'], false); } $this->apiError($this->message['err_data'], 400); } /** * 重置接单技师 * Method : Interface reset * @param array $data * @throws \App\Exceptions\ApiException */ public function reset(array $data) { DB::beginTransaction(); try { $order_id = $data['id']; $order = Order::where('id', $order_id)->lockForUpdate()->first(); !$order && $this->apiError($this->message['no_data']); !in_array($order->status, [1, 2]) && $this->apiError($this->message['reset_fail']); $artificer_id = $order->jiedan_js_id; // 存在指派技师 if ($artificer_id) { $grab = OrderGrab::where(['order_id' => $order_id, 'js_id' => $artificer_id])->lockForUpdate()->first(); if ($grab) { // 重置抢单表状态 $grab_data['status'] = 0; $this->commonUpdate(OrderGrab::query(), $grab->id, $grab_data, '', $this->message['reset_fail'], false); } } // 重置接单技师 $order_data['jiedan_js_id'] = 0; $order_data['status'] = '1'; $response = $this->commonUpdate(Order::query(), $order_id, $order_data, $this->message['reset_success'], $this->message['reset_fail'], false); DB::commit(); } catch (ApiException $e) { DB::rollback(); $this->apiError($e->getMessage(), $e->getCode()); } catch (Exception $e) { DB::rollback(); throw $e; } return $response; } public function delete(array $data) { $delete_id = $data['id']; $order = Order::find($delete_id); !$order && $this->apiError($this->message['no_data']); $order->status && $this->apiError($this->message['delete_fail']); return $this->commonIsDelete(Order::query(), [$delete_id], $this->message['delete_success'], $this->message['delete_fail']); } public function over(array $data) { DB::beginTransaction(); try { $order_id = $data['id']; $order = Order::where('id', $order_id)->lockForUpdate()->first(); !in_array($order->status, [2, 6]) && $this->apiError($this->message['over_fail']); $data = [ 'status' => 3, 'finish_time' => time() ]; $response = $this->commonUpdate(Order::query(), $order_id, $data, $this->message['over_success'], $this->message['over_fail']); DB::commit(); } catch (ApiException $e) { DB::rollback(); $this->apiError($e->getMessage(), $e->getCode()); } catch (Exception $e) { DB::rollback(); throw $e; } return $response; } public function grab(array $data) { $order_id = $data['id']; $order = Order::find($order_id)->toArray(); $list = OrderGrab::with('artificer.site')->where('order_id', $order_id)->oldest('create_time')->get()->toArray(); foreach ($list as &$item) { if ($item['artificer']['site']) $item['distance'] = get_distance([$order['lng'], $order['lat']], [$item['artificer']['site']['lng'], $item['artificer']['site']['lat']]); } return $this->apiSuccess('', ['list' => $list]); } public function vicinity(array $data) { // $code = 156370600; $order_id = $data['id']; $page = $data['page']; $pageSize = $data['pageSize']; $range_artificer_ids = []; // 第一步 按照城市编码获取技师定位数据 $order = Order::find($order_id); $site = ArtificerSite::with('time')->select('js_id', 'lng', 'lat')->get()->toArray(); // $site = ArtificerSite::with('time')->where('city_code', $code)->select('js_id', 'lng', 'lat')->get()->toArray(); $week = date('w', time()); $date = date('H:i'); foreach ($site as $item) { $distance = get_distance([$order->lng, $order->lat], [$item['lng'], $item['lat']]); $status = 0; if ($distance <= 60 && !in_array($item['js_id'], $range_artificer_ids)) { $times = $item && $item['time'] ? $item['time']['times'] : null; if (is_string($times)) $items = json_decode($times, true); if ($item['time'] && !empty($items) && is_array($items) && in_array($week, json_decode($item['time']['weeks']))) { // 开关类型 // $status = 1; // 时间段类型 foreach ($items as $vo) { if (strtotime($date) >= strtotime($vo['js_start_time']) && strtotime($date) <= strtotime($vo['js_end_time'])) { $status = 1; break; } } } $status && array_push($range_artificer_ids, $item['js_id']); } } // $artificer_ids = array_column($site,'js_id'); // 第二步 筛选开通项目技师 $auth_artificer_ids = ProjectRelevancy::whereIn('js_id', $range_artificer_ids)->where('project_id', $order->project_id)->where('status', '1')->pluck('js_id')->toArray(); $list = Artificer::with('site')->whereIn('id', $auth_artificer_ids)->where('js_status', '1')->get()->toArray(); // 第三步 循环排序距离 foreach ($list as &$item) { $item['distance'] = get_distance([$order->lng, $order->lat], [$item['site']['lng'], $item['site']['lat']]); } // 根据列进行排序 $distances = array_column($list, 'distance'); array_multisort($distances, SORT_ASC, $list); // 第四步 分页 $offset = ($page - 1) * $pageSize; // 开始截取的索引 $result = array_slice($list, $offset, $pageSize); return $this->apiSuccess('', ['list' => $result, 'total' => count($list)]); } public function new($data) { $where['status'] = '0'; $where['user_delete'] = 1; $where['js_delete'] = 1; $currentTime = time(); $orderNumber = 0; if (!empty($data['time'])) { $time = [ $data['time'] + 1, $currentTime ]; $orderNumber = Order::query()->where($where) ->whereBetween('create_time', $time) ->count('id'); } return $this->apiSuccess('', [ 'number' => $orderNumber, 'time' => $currentTime ]); } }