builder = $this->repository->newQuery(); } /** * 筛选 * @param array $rule * @return mixed */ public function filter(array $rule) { new Filter($this->builder,$rule); } public function count($text,\Closure $query = null, $dateField = 'created_at'){ $this->parseAggregate(__FUNCTION__,$text,'*',$query,$dateField); } public function max($text, $field, \Closure $query = null, $dateField = 'created_at'){ $this->parseAggregate(__FUNCTION__,$text,$field,$query,$dateField); } public function min($text, $field, \Closure $query = null, $dateField = 'created_at'){ $this->parseAggregate(__FUNCTION__,$text,$field,$query,$dateField); } public function sum($text, $field, \Closure $query = null, $dateField = 'created_at'){ $this->parseAggregate(__FUNCTION__,$text,$field,$query,$dateField); } public function avg($text, $field, \Closure $query = null, $dateField = 'created_at'){ $this->parseAggregate(__FUNCTION__,$text,$field,$query,$dateField); } protected function parseAggregate($method,$text, $field, \Closure $query = null, $dateField = 'created_at'){ $data = []; if($this->echart instanceof LineChart){ foreach (array_column($this->echart->xAxisData,'value') as $item) { $data[] = $this->aggregate($method,$field,$query,$dateField,$item); } }else{ $data = $this->aggregate($method,$field,$query,$dateField,$this->echart->getDateFilterValue()); } $this->echart->data($text,$data); } protected function aggregate($method,$field,\Closure $query = null,$dateField= 'created_at',$dateValue=null){ $builder = clone $this->builder; if($query){ call_user_func($query,$builder); } if($dateValue){ switch ($dateValue) { case 'yesterday': $builder->whereBetween($dateField,[Carbon::yesterday()->format("Y-m-d 00:00:00"),Carbon::yesterday()->format("Y-m-d 23:59:59")]); break; case 'today': $builder->whereBetween($dateField,[Carbon::today()->format("Y-m-d 00:00:00"),Carbon::today()->format("Y-m-d 23:59:59")]); break; case 'week': $start = Carbon::now()->startOfWeek()->toDateString(); $end = Carbon::now()->endOfWeek()->toDateString(); $builder->whereBetween($dateField,[$start,$end]); break; case 'month': $builder->whereBetween($dateField,[Carbon::now()->startOfMonth()->format("Y-m-d 00:00:00"),Carbon::now()->endOfMonth()->format("Y-m-d 23:59:59")]); break; case 'year': $builder->whereBetween($dateField,[Carbon::now()->startOfYear()->format("Y-m-d 00:00:00"),Carbon::now()->endOfYear()->format("Y-m-d 23:59:59")]); break; default: $builder->whereBetween($dateField,$dateValue); } } return $builder->$method($field); } }