diff --git a/application/admin/controller/orders/Dispatch2.php b/application/admin/controller/orders/Dispatch2.php index e0d709b..397ea28 100644 --- a/application/admin/controller/orders/Dispatch2.php +++ b/application/admin/controller/orders/Dispatch2.php @@ -259,7 +259,16 @@ class Dispatch2 extends Backend $params['status'] = OrderDispatch::STATUS_FINISH; $params['finish_time'] = date('Y-m-d H:i:s'); $params['follow'] = 2; + + if($row->admin_id == 0){ + $params['admin_id'] = $this->auth->id; + $params['admin_user'] = $this->auth->admin_user; + $order->dispatch_admin_id = $this->auth->id; + $order->save(); + } + $result = $row->allowField(true)->save($params); + //修改订单状态 $OrderLogic = new OrderLogic(); $OrderLogic -> dispachFinishAfter($row,['role'=>1,'auth'=>$this->auth,'remark'=>'后台完成任务,操作人:'.$this->auth->nickname]); diff --git a/application/admin/controller/statistics/Dispatcher.php b/application/admin/controller/statistics/Dispatcher.php index 02da9ff..b09288b 100644 --- a/application/admin/controller/statistics/Dispatcher.php +++ b/application/admin/controller/statistics/Dispatcher.php @@ -82,18 +82,72 @@ class Dispatcher extends Backend "COUNT(CASE WHEN status IN (".$orderValid.") THEN 1 END) AS count_num", //总订单数 (排除取消 和草稿) "SUM(CASE WHEN status = 60 THEN total END) AS total", //成效额 "SUM(CASE WHEN status = 60 THEN total END) AS performance", //业绩 + + "SUM(CASE WHEN status = 60 THEN (cost + material_cost) END) AS cost_total", //总成本 + "SUM(CASE WHEN status = 60 THEN (refund_amount + worker_refund_amount) END) AS refund_total", //退款总数 "COUNT(CASE WHEN refund_amount > 0 OR worker_refund_amount > 0 THEN 1 END) AS refund_count", //退款订单数量 "AVG(CASE WHEN status > 10 THEN UNIX_TIMESTAMP(dispatch_time) - UNIX_TIMESTAMP(create_time) END) AS avg_time_diff", //派单时效 // "SUM(CASE WHEN status = 60 THEN (field1 + field2) END) AS performance", ]; - $data = $this->model - ->field($fields) - ->group('dispatch_admin_id') - ->select(); - dump($data);exit; + $builder = $this->model + ->field($fields); + //->where('dispatch_admin_id','>',0); + + if(!empty($filter['admin_id'])){ + $builder->where('dispatch_admin_id',$filter['admin_id']); + } + + if(!empty($filter['start_time']) && !empty($filter['end_time'])){ + $time_by = $filter['time_by'] ??1; + if($time_by == 1){ //按派单时间 + $time_field = 'dispatch_time'; + }else{ //按录单时间 + $time_field = 'create_time'; + } + $builder->whereBetween($time_field,$filter['start_time'],$filter['end_time']); + } + + //城市 + if(!empty($filter['area_id'])){ + $builder->where('area_id',$filter['area_id']); + } + //项目 + if(!empty($filter['item_id'])){ + $builder->where('item_id',$filter['item_id']); + } + $data = $builder->group('dispatch_admin_id')->select(); + + $newData = []; + + foreach ($data as $datum){ + //利润率 = 总业绩/总成效额 + $datum->performance_rate = $this->_calc($datum->performance,$datum->total); + //转化率 = 完单数 / 总订单数 + $datum->trans_rate = $this->_calc($datum->finish_num,$datum->count_num); + //变现值 = 总业绩 / 总订单数 + $datum->cash_value = $this->_calc($datum->performance,$datum->count_num,2); + //客单利润 = 总利润 / 完单数 + $datum->performance_avg = $this->_calc($datum->performance,$datum->finish_num,2); + //客单价 = 总成效额 / 完单数 + $datum->total_avg = $this->_calc($datum->total,$datum->finish_num,2); + + $newData[] = $datum->toArray(); + } + + dump($newData);exit; } + /** + * @param $a + * @param $b + * @param $scale + * @return int|string + */ + private function _calc($a,$b,$scale=4){ + return $b > 0 ? bcdiv($a,$b,$scale) : 0; + } + } diff --git a/application/admin/model/OrderDispatch.php b/application/admin/model/OrderDispatch.php index a1ce076..bc37604 100644 --- a/application/admin/model/OrderDispatch.php +++ b/application/admin/model/OrderDispatch.php @@ -184,7 +184,7 @@ class OrderDispatch extends Model public function scopeAuth($query, Auth $auth, string $admin_id_field='admin_id'){ if(!$auth->isSuperAdmin()){ - $query->where('fa_order_dispatch.'.$admin_id_field,$auth->id); + $query->whereIn('fa_order_dispatch.'.$admin_id_field,[$auth->id,0]); } return $query; } diff --git a/application/common/Logic/OrderLogic.php b/application/common/Logic/OrderLogic.php index 794dd65..8a379d6 100644 --- a/application/common/Logic/OrderLogic.php +++ b/application/common/Logic/OrderLogic.php @@ -116,7 +116,7 @@ class OrderLogic * @param Dispatch $dispatch * @return void */ - public function cancelOrderDispatch(OrderDispatch $dispatch,$auth=null,$remark='',$cancelOrder=true) + public function cancelOrderDispatch(OrderDispatch $dispatch,$auth=null,$remark='',$nocancelOrder=true) { //取消 $dispatch->allowField(true)->save(['status' => OrderDispatch::STATUS_CANCEL, 'follow'=>0,'remark' => $remark]); @@ -128,14 +128,14 @@ class OrderLogic Hook::listen('order_dispatch_change', $hookParams); - if($cancelOrder){ + if($nocancelOrder){ $order = Order::where('id',$dispatch->order_id)->where('status',Order::STATUS_DISPATCHED)->find(); if(empty($order)){ throw new Exception('未找到关联订单'); } //回退订单状态 $order->status = Order::STATUS_DISPATCHING; - + $order->save(); $params['order'] = $order; $params['role'] = 1; $params['auth'] = $auth;