diff --git a/application/admin/behavior/OrderDispatchLog.php b/application/admin/behavior/OrderDispatchLog.php index 110b5fc..26c103e 100644 --- a/application/admin/behavior/OrderDispatchLog.php +++ b/application/admin/behavior/OrderDispatchLog.php @@ -30,6 +30,7 @@ class OrderDispatchLog 'status' => $dispatch->status, 'status_text' => $statusList[$dispatch->status], 'remark' => $remark, + 'images' => $dispatch->record_images??'', 'admin_user' => $dispatch->admin_user??'系统', ]; \app\admin\model\OrderDispatchLog::create($data); diff --git a/application/admin/controller/Ajax.php b/application/admin/controller/Ajax.php index 9b603d6..01c0b7a 100755 --- a/application/admin/controller/Ajax.php +++ b/application/admin/controller/Ajax.php @@ -304,7 +304,7 @@ class Ajax extends Backend $where['level'] = 3; } } - $provincelist = Db::name('areas')->where($where)->field('id as value,name')->select(); + $provincelist = Db::name('areas')->where($where)->field('code as value,name')->select(); $this->success('', '', $provincelist); } diff --git a/application/admin/controller/AutoDispatchLogic.php b/application/admin/controller/AutoDispatchLogic.php index e769791..9bbf842 100644 --- a/application/admin/controller/AutoDispatchLogic.php +++ b/application/admin/controller/AutoDispatchLogic.php @@ -41,6 +41,7 @@ class AutoDispatchLogic $worker = (new Worker())->where('id', $worker_id)->find(); $insert ['worker_name'] = $worker['name']; $insert ['worker_tel'] = $worker['tel']; + $insert['follow'] = 1; $orderDispatch = new OrderDispatch(); $res = $orderDispatch->allowField(true)->save($insert); $order->status = \app\admin\model\Order::STATUS_DISPATCHED; diff --git a/application/admin/controller/Order.php b/application/admin/controller/Order.php index 75f2511..b1978f4 100644 --- a/application/admin/controller/Order.php +++ b/application/admin/controller/Order.php @@ -808,7 +808,30 @@ class Order extends Backend } $this->request->get([config('paginate.var_page') => $page]); $filter = (array)json_decode($filter, true); + + + + $province_id = $filter['province_id']??null; + $city_id = $filter['city_id']??null; + $area_id = $filter['city_id']??null; + unset($filter['city_id']); + unset($filter['province_id']); + unset($filter['area_id']); + + if(!empty($area_id)){ + $filter['area_id'] = $area_id; + }else{ + if(!empty($city_id)){ + $filter['area_id'] = $city_id; + }else{ + if(!empty($province_id)){ + $filter['area_id'] = $province_id; + } + } + } + $op = (array)json_decode($op, true); + $op['area_id'] = 'LIKE%'; $filter = $filter ? $filter : []; $where = []; $alias = []; @@ -873,6 +896,15 @@ class Order extends Backend case 'NOT LIKE %...%': $where[] = [$k, trim(str_replace('%...%', '', $sym)), "%{$v}%"]; break; + // ✅ 新增:右匹配(like%) + case 'LIKE%': + $where[] = [$k, 'LIKE', "{$v}%"]; + break; + + // ✅ 新增:左匹配(%like) + case '%LIKE': + $where[] = [$k, 'LIKE', "%{$v}"]; + break; case '>': case '>=': case '<': diff --git a/application/admin/controller/orders/Auditorder.php b/application/admin/controller/orders/Auditorder.php index c9e8b66..ceddbab 100644 --- a/application/admin/controller/orders/Auditorder.php +++ b/application/admin/controller/orders/Auditorder.php @@ -65,7 +65,7 @@ class Auditorder extends Backend $list = $this->model ->scope('tab',Order::TAB_AUDIT) ->alias('order') - ->with(['auditadmin']) + ->with(['auditadmin','workerman']) ->where($where) ->order($sort, $order) ->paginate($limit); diff --git a/application/admin/controller/orders/Dispatch2.php b/application/admin/controller/orders/Dispatch2.php index ddc1b46..ad68d05 100644 --- a/application/admin/controller/orders/Dispatch2.php +++ b/application/admin/controller/orders/Dispatch2.php @@ -69,16 +69,12 @@ class Dispatch2 extends Backend return $this->selectpage(); } list($where, $sort, $order, $offset, $limit) = $this->buildparams(); -// $filter = (array)json_decode(input()['filter'] ?? '', true); -// $type = $filter['dispatch_type'] ?? false; -// dd($where,$filter); $list = $this->model ->with(['orderb','lastRecord']) ->auth($this->auth) - ->where($where); - - $list = $list->order($sort, $order) + ->where($where) + ->order($sort, $order) ->paginate($limit); foreach ($list as &$row) { @@ -90,17 +86,24 @@ class Dispatch2 extends Backend $row->btn_record = in_array($row->status, $this->model->btnActiveStatusList('btn_record')) && $this->auth->check('orders/dispatchrecord/add'); if(!in_array($row->status, $this->model->btnActiveStatusList('btn_record')) ){ + //正常情况,执行不到这里来,不用担心循环执行问题 $row->follow = 2; OrderDispatch::where('id',$row->id)->update(['follow'=>2]); } if($row->btn_record){ - if($row->follow == 0 ){ + if($row->btn_record != 2){ $row->btn_record = true; }else{ $row->btn_record = false; } + /*if($row->follow == 0 ){ + $row->btn_record = true; + }else{ + $row->btn_record = false; + }*/ + // if($row->type == 2) // { // $row->btn_record = false; @@ -130,6 +133,7 @@ class Dispatch2 extends Backend } } + $result = array("total" => $list->total(), "rows" => $list->items()); return json($result); @@ -494,6 +498,7 @@ class Dispatch2 extends Backend } + /** * 生成查询所需要的条件,排序方式 * @param mixed $searchfields 快速查询的字段 @@ -519,7 +524,28 @@ class Dispatch2 extends Backend } $this->request->get([config('paginate.var_page') => $page]); $filter = (array)json_decode($filter, true); + + $province_id = $filter['province_id']??null; + $city_id = $filter['city_id']??null; + $area_id = $filter['city_id']??null; + unset($filter['city_id']); + unset($filter['province_id']); + unset($filter['area_id']); + + if(!empty($area_id)){ + $filter['orderb.area_id'] = $area_id; + }else{ + if(!empty($city_id)){ + $filter['orderb.area_id'] = $city_id; + }else{ + if(!empty($province_id)){ + $filter['orderb.area_id'] = $province_id; + } + } + } + $op = (array)json_decode($op, true); + $op['orderb.area_id'] = 'like%'; $filter = $filter ? $filter : []; $where = []; $alias = []; @@ -550,9 +576,6 @@ class Dispatch2 extends Backend $where[] = [implode("|", $searcharr), "LIKE", "%{$search}%"]; } $index = 0; - if (!isset($filter['type'])){ - $filter['type'] = 1; - } foreach ($filter as $k => $v) { if (!preg_match('/^[a-zA-Z0-9_\-\.]+$/', $k)) { continue; @@ -585,6 +608,16 @@ class Dispatch2 extends Backend case 'NOT LIKE %...%': $where[] = [$k, trim(str_replace('%...%', '', $sym)), "%{$v}%"]; break; + + // ✅ 新增:右匹配(like%) + case 'LIKE%': + $where[] = [$k, 'LIKE', "{$v}%"]; + break; + + // ✅ 新增:左匹配(%like) + case '%LIKE': + $where[] = [$k, 'LIKE', "%{$v}"]; + break; case '>': case '>=': case '<': diff --git a/application/admin/controller/orders/Dispatchrecord.php b/application/admin/controller/orders/Dispatchrecord.php index bd60cb5..e9ec383 100644 --- a/application/admin/controller/orders/Dispatchrecord.php +++ b/application/admin/controller/orders/Dispatchrecord.php @@ -126,10 +126,10 @@ class Dispatchrecord extends Backend $params['need_notice'] = 0; $params['status'] = 1; - if(!empty($params['rate'])){ //修改任务的状态 + /* if(!empty($params['rate'])){ //修改任务的状态 if($dispatch->status != $params['rate']){ $dispatch->status = $params['rate']; - $dispatch->save(); + $dispatch->save();*/ $groups = $this->auth->getGroups($this->auth->id); $groupName = ''; @@ -139,17 +139,18 @@ class Dispatchrecord extends Backend } $dispatch->admin_user = $groupName.':'. $this->auth->nickname; + $dispatch->record_images = $params['images']; $hookParams = [ 'dispatch' => $dispatch, - 'remark' => '人工跟进,备注内容:'.$params['remark'], + 'remark' => '跟进订单,跟进内容:'.$params['remark'], ]; Hook::listen('order_dispatch_change', $hookParams); - if($params['rate'] == 10){ + /* if($params['rate'] == 10){ $dispatch->got_time = date('Y-m-d H:i:s', time()); - } - } - } + }*/ + /* } + }*/ $dispatch->follow = 1; } $dispatch->record_count ++; diff --git a/application/admin/controller/orders/Revisitorder.php b/application/admin/controller/orders/Revisitorder.php index 969b267..1ace67e 100644 --- a/application/admin/controller/orders/Revisitorder.php +++ b/application/admin/controller/orders/Revisitorder.php @@ -167,6 +167,28 @@ class Revisitorder extends Backend $op['revisit_id'] = '='; } + + $province_id = $filter['province_id']??null; + $city_id = $filter['city_id']??null; + $area_id = $filter['city_id']??null; + unset($filter['city_id']); + unset($filter['province_id']); + unset($filter['area_id']); + + if(!empty($area_id)){ + $filter['area_id'] = $area_id; + }else{ + if(!empty($city_id)){ + $filter['area_id'] = $city_id; + }else{ + if(!empty($province_id)){ + $filter['area_id'] = $province_id; + } + } + } + $op['area_id'] = 'LIKE%'; + + /* if($returnvalue>0){ $op['aftersale_id'] = '>'; $op['status'] = '70'; @@ -237,6 +259,15 @@ class Revisitorder extends Backend case 'NOT LIKE %...%': $where[] = [$k, trim(str_replace('%...%', '', $sym)), "%{$v}%"]; break; + // ✅ 新增:右匹配(like%) + case 'LIKE%': + $where[] = [$k, 'LIKE', "{$v}%"]; + break; + + // ✅ 新增:左匹配(%like) + case '%LIKE': + $where[] = [$k, 'LIKE', "%{$v}"]; + break; case '>': case '>=': case '<': diff --git a/application/admin/controller/statistics/Dispatcher.php b/application/admin/controller/statistics/Dispatcher.php index a012811..44dd440 100644 --- a/application/admin/controller/statistics/Dispatcher.php +++ b/application/admin/controller/statistics/Dispatcher.php @@ -137,6 +137,8 @@ class Dispatcher extends Backend // 使用 IFNULL 确保结果为 null 时返回 0 "IFNULL(COUNT(CASE WHEN status = 60 THEN 1 END), 0) AS finish_num", //完成数 "IFNULL(COUNT(CASE WHEN status IN (".$orderValid.") THEN 1 END), 0) AS count_num", //总订单数 (排除取消 和草稿) + "IFNULL(COUNT(CASE WHEN is_overtime = 1 THEN 1 END), 0) AS overtime_num", //超时数 + "IFNULL(SUM(CASE WHEN status = 60 THEN total END), 0) AS total", //成效额 "IFNULL(SUM(CASE WHEN status = 60 THEN performance END), 0) AS performance", //业绩 "IFNULL(SUM(CASE WHEN status = 60 THEN (cost + material_cost) END), 0) AS cost_total", //总成本 @@ -196,6 +198,8 @@ class Dispatcher extends Backend $datum->performance_avg = $this->_calc($datum->performance,$datum->finish_num,2); //客单价 = 总成效额 / 完单数 $datum->total_avg = $this->_calc($datum->total,$datum->finish_num,2); + //超时率 + $datum->overtime_rate = $this->_calc($datum->overtime_num,$datum->count_num,4,true); if(!empty($datum->dispatch_admin_id)){ $datum->admin_user = Admin::where('id',$datum->dispatch_admin_id)->value('nickname')??'系统'; diff --git a/application/admin/controller/statistics/Worker.php b/application/admin/controller/statistics/Worker.php index b8600dc..e240d2e 100644 --- a/application/admin/controller/statistics/Worker.php +++ b/application/admin/controller/statistics/Worker.php @@ -301,8 +301,7 @@ class Worker extends Backend $datum->arrive_rate = $this->_calc($datum->arrive_count,$datum->get_count,4,true); //好评率 $datum->good_rate = $this->_calc($datum->good_count,$datum->finish_num,4,true); - - //及时联系率 + //及时联系率=(已预约上门数/已接单数)。 $datum->get_time_rate = $this->_calc($datum->get_js_count,$datum->get_count,4,true); @@ -354,7 +353,31 @@ class Worker extends Backend $this->request->get([config('paginate.var_page') => $page]); $filter = (array)json_decode($filter, true); unset($filter['daterange']); + + + + $province_id = $filter['province_id']??null; + $city_id = $filter['city_id']??null; + $area_id = $filter['city_id']??null; + unset($filter['city_id']); + unset($filter['province_id']); + unset($filter['area_id']); + + if(!empty($area_id)){ + $filter['fa_worker.area_id'] = $area_id; + }else{ + if(!empty($city_id)){ + $filter['fa_worker.area_id'] = $city_id; + }else{ + if(!empty($province_id)){ + $filter['fa_worker.area_id'] = $province_id; + } + } + } + $op = (array)json_decode($op, true); + $op['fa_worker.area_id'] = 'LIKE%'; + $filter = $filter ? $filter : []; $where = []; $alias = []; @@ -417,6 +440,15 @@ class Worker extends Backend case 'NOT LIKE %...%': $where[] = [$k, trim(str_replace('%...%', '', $sym)), "%{$v}%"]; break; + // ✅ 新增:右匹配(like%) + case 'LIKE%': + $where[] = [$k, 'LIKE', "{$v}%"]; + break; + + // ✅ 新增:左匹配(%like) + case '%LIKE': + $where[] = [$k, 'LIKE', "%{$v}"]; + break; case '>': case '>=': case '<': diff --git a/application/admin/controller/workers/Worker.php b/application/admin/controller/workers/Worker.php index 31a9da7..ed455b1 100644 --- a/application/admin/controller/workers/Worker.php +++ b/application/admin/controller/workers/Worker.php @@ -164,7 +164,7 @@ class Worker extends Backend $area = Area::getByCode($params['area_id']); if($area){ - $location = getLocation($area->merge_name); + $location = getLocation($area->merge_name.' '.$params['address']); if(!empty($location)){ $params['lng'] = $location['lng']; $params['lat'] = $location['lat']; diff --git a/application/admin/model/Order.php b/application/admin/model/Order.php index d656580..0aea1cd 100644 --- a/application/admin/model/Order.php +++ b/application/admin/model/Order.php @@ -262,4 +262,9 @@ class Order extends Model return $query; } + + public function workerman(){ + return $this->belongsTo(Worker::class,'worker_id',); + } + } diff --git a/application/admin/view/common/area_select.html b/application/admin/view/common/area_select.html new file mode 100644 index 0000000..a5148c3 --- /dev/null +++ b/application/admin/view/common/area_select.html @@ -0,0 +1,14 @@ + diff --git a/application/admin/view/order/index.html b/application/admin/view/order/index.html index 1279402..7b56e16 100644 --- a/application/admin/view/order/index.html +++ b/application/admin/view/order/index.html @@ -125,3 +125,20 @@ } + + + + diff --git a/application/admin/view/orders/auditorder/edit.html b/application/admin/view/orders/auditorder/edit.html index ac0e306..bea7774 100755 --- a/application/admin/view/orders/auditorder/edit.html +++ b/application/admin/view/orders/auditorder/edit.html @@ -173,6 +173,40 @@ +