diff --git a/application/admin/controller/orders/Dispatch.php b/application/admin/controller/orders/Dispatch.php index d0ad64f..0e521d7 100644 --- a/application/admin/controller/orders/Dispatch.php +++ b/application/admin/controller/orders/Dispatch.php @@ -74,7 +74,7 @@ class Dispatch extends Backend $row->btn_edit = (in_array($row->status, $this->model->btnActiveStatusList('btn_edit'))) ? true : false; $row->btn_cancel = (in_array($row->status, $this->model->btnActiveStatusList('btn_cancel'))) ? true : false; $row->btn_abnormal = (in_array($row->status, $this->model->btnActiveStatusList('btn_abnormal'))) ? true : false; - // $row->btn_income = (in_array($row->status, $this->model->btnActiveStatusList('btn_income')) && in_array($row->order->status, $orderModel->incomeBtnStatus())) ? true : false; + // $row->btn_income = (in_array($row->status, $this->model->btnActiveStatusList('btn_income')) && in_array($row->order->status, $orderModel->incomeBtnStatus())) ? true : false; } $result = array("total" => $list->total(), "rows" => $list->items()); @@ -99,26 +99,30 @@ class Dispatch extends Backend $this->error(__('No results were found')); } - $items = Db::name('item') - ->where('status',1) - ->field(['id','title','key_word','pid']) - ->order('pid','asc') - ->order('sort','desc') + $items = Db::name('item') + ->where('status', 1) + ->field(['id', 'title', 'key_word', 'pid']) + ->order('pid', 'asc') + ->order('sort', 'desc') ->select(); $tree = $this->buildTree($items); $formattedTree = $this->formatTree($tree); $area_name = model('area')->getNameByCode($order->area_id); - $order->area_name = str_replace(',','/',$area_name); + $order->area_name = str_replace(',', '/', $area_name); $this->view->assign('items', $formattedTree); $this->view->assign('row', $order); return $this->view->fetch(); } $params = $this->request->post('row/a'); +// $this->success(); if (empty($params)) { - $this->error(__('Parameter %s can not be empty', '')); + $params = $this->request->post(); + if (empty($params)) { + $this->error(__('Parameter %s can not be empty', '')); + } } $params = $this->preExcludeFields($params); @@ -134,8 +138,8 @@ class Dispatch extends Backend $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate; $this->model->validateFailException()->validate($validate); } - $order = model('order')->where('id',$params['order_id'])->find(); - if (!$order){ + $order = model('order')->where('id', $params['order_id'])->find(); + if (!$order) { $this->error(__('No results were found')); } $insert = [ @@ -148,7 +152,7 @@ class Dispatch extends Backend 'is_receipt' => $order['receive_type'] == 1 ]; - $worker = model('worker')->where('id',$params['worker_id'])->find(); + $worker = model('worker')->where('id', $params['worker_id'])->find(); $insert ['worker_name'] = $worker->name; $insert ['worker_tel'] = $worker->tel; @@ -168,8 +172,8 @@ class Dispatch extends Backend //dispatch log $hookParams2 = [ - 'dispatch' => $this->model->get($this->model->id), - 'remark' => '手动派单,操作人:'.$this->auth->nickname, + 'dispatch' => $this->model->get($this->model->id), + 'remark' => '手动派单,操作人:' . $this->auth->nickname, ]; Hook::listen('order_dispatch_change', $hookParams2); @@ -296,16 +300,27 @@ class Dispatch extends Backend private function getWorkers($workers) { - foreach ($workers as $worker){ + foreach ($workers as $worker) { $worker->dist = '100m'; } return $workers; } - public function map(){ + public function map() + { // 配置信息 $config = get_addon_config('address'); - $this->view->assign('mapkey',$config); + $order_id = request()->get('order_id'); + $order = (new Order())->where('id', $order_id)->select(); + $order = $order[0] ?? false; + if (!$order) { + abort(404); + } + $center = [ + $order->lng, $order->lat + ]; + $this->view->assign('mapkey', $config); + $this->view->assign('center', $center); return $this->fetch(); } diff --git a/application/admin/controller/workers/Worker.php b/application/admin/controller/workers/Worker.php index 7fd53be..3f59616 100644 --- a/application/admin/controller/workers/Worker.php +++ b/application/admin/controller/workers/Worker.php @@ -308,26 +308,78 @@ class Worker extends Backend public function dispatchMapList() { $order_id = request()->get('order_id'); - if ($order_id) { - $order = (new Order())->where('id',$order_id)->select(); + $search = request()->get('search'); + list($where, $sort, $order, $offset, $limit) = $this->buildparams(); + $order = (new Order())->where('id',$order_id)->field(['id','lng','lat'])->select(); - if (!empty($order)) { - $order = $order[0]; - } - - $worker_info = Db::query("SELECT id,name, tel, distance,star,lng, lat -FROM ( - SELECT id, `name`, tel, lng, lat,star, - ST_Distance_Sphere( - point(lng, lat), - point(?, ?) - ) AS distance - FROM fa_worker -) AS t -WHERE distance < 50000 -ORDER BY distance;",[$order->lng,$order->lat]); - dd($worker_info); + if (!empty($order)) { + $order = $order[0]; } + + $worker_distance = Db::query("SELECT id +FROM ( +SELECT id, + ST_Distance_Sphere( + point(lng, lat), + point(?, ?) + ) AS distance +FROM fa_worker where status = 1 +) AS t +WHERE distance < 50000 +ORDER BY distance;",[$order->lng,$order->lat]); + + $worker_ids = array_column($worker_distance,'id'); + + $build = model('worker') + ->where('status', 1) + ->whereIn('id', $worker_ids); + + + if ($search){ + $build->where(function ($q)use($search){ + $q->where('name','like','%'.$search.'%') + ->whereor('tel','like','%'.$search.'%'); + }); + } + + $build->withCount(['myorder' => function ($query) { + $query->where('status', Order::STATUS_FINISHED); + return 'finish_order'; + },]) + ->withCount(['myorder' => function ($query) { + $query->where('status', '<', Order::STATUS_FINISHED) + ->where('status', '>=', Order::STATUS_DRAFT); + return 'doing_order'; + }]) + ->field( + ['id', 'name', 'tel', 'area_id', 'lng', 'lat','ST_Distance_Sphere( + point(lng, lat), + point('.$order->lng.','.$order->lat.') + ) AS distance'] + )->order('distance'); + $list = $build + ->paginate($limit); + + $data = []; + + foreach ($list->items() as $item){ + $data [] = [ + 'id' => $item->id, + 'name' => $item->name, + 'tel' => $item->tel, + 'lat' => $item->lat, + 'lng' => $item->lng, + 'distance' => $item->distance, + 'doing_order' => $item->doing_order, + 'finish_order' => $item->finish_order, + 'star' => $item->star, + ]; + } + + $result = array("total" => $list->total(), "rows" => $data,'order' => $order); + + return $result; + } } diff --git a/application/admin/view/orders/dispatch/map.html b/application/admin/view/orders/dispatch/map.html index 3d0fa62..041aa05 100644 --- a/application/admin/view/orders/dispatch/map.html +++ b/application/admin/view/orders/dispatch/map.html @@ -12,59 +12,54 @@ font-size: 14px; line-height: 1.6; } + .worker-search-bar { + display: flex; + gap: 8px; /* 输入框和按钮的间距 */ + margin-bottom: 10px; + } + + .worker-input { + flex: 1; + padding: 6px 10px; + font-size: 14px; + border: 1px solid #ccc; + border-radius: 4px; + line-height: 14px; + } + + .worker-btn { + padding: 6px 12px; + font-size: 14px; + background-color: #007bff; + color: #fff; + border: 1px solid #007bff; + border-radius: 4px; + cursor: pointer; + line-height: 14px; + } + + .worker-btn:hover { + background-color: #0056b3; + border-color: #0056b3; + } + .worker-card{ + background-color: #c9c5c542; + margin-bottom: 10px; + box-shadow: 0 2px 6px rgba(12, 72, 128, .1); + border-radius: 5px; + }
-