['id'], ]; } /*public function queryWhere() { $where = []; if(isset($this->params['time_range']) && $this->params['time_range']){ $startDateTime = strtotime($this->params['time_range'][0]); $endDateTime = strtotime($this->params['time_range'][1])+86400-1; $where[] = ['b.finished_time','BETWEEN',[$startDateTime,$endDateTime]]; } return $where; }*/ public function queryWhereTime() { //dd($this->params); if(isset($this->params['time_range']) && $this->params['time_range']){ $startDateTime = strtotime($this->params['time_range'][0]); $endDateTime = strtotime($this->params['time_range'][1])+86400-1; } else { $startDateTime = strtotime(date('Y-m-01',time())); $endDateTime = time(); } return [$startDateTime,$endDateTime]; } /** * 获取数据权限 * $this->adminInfo['data_rules'] * province city admin_id sale_group_id sale_id property_head_id */ public function queryDataWhere(){ $where = []; $data_rules = $this->adminInfo['data_rules']; if (isset($data_rules['sale_group_id']) && !empty($data_rules['sale_group_id'])) { $where[] = ['sale_group_id','in' ,$data_rules['sale_group_id']]; } if (isset($data_rules['sale_id']) && !empty($data_rules['sale_id'])) { $where[] = ['id','in' ,$data_rules['sale_id']]; } return $where; } /** * @notes 获取列表 * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author likeadmin * @date 2024/12/15 10:53 */ public function lists(): array { $list = Sale::with('saleGroupInfo')->where($this->searchWhere) ->where($this->queryDataWhere()) ->field(['id','sale_name','mobile','sale_group_id', Db::raw("'".($this->queryWhereTime()[0]??'')."' AS start_date"), Db::raw("'".($this->queryWhereTime()[1]??'')."' AS end_date"), ]) ->limit($this->limitOffset, $this->limitLength) ->select()->toArray(); $passes_counts = $this->passesCounts($list,$this->queryWhereTime())??[]; $property_counts = $this->propertyCounts($list,$this->queryWhereTime())??[]; $group_counts = $this->groupCounts($list,$this->queryWhereTime())??[]; // $this->passesMerits($passes_counts[$item['id']]??0) * $passes_counts[$item['id']]??0; // $this->propertyMerits($property_counts[$item['id']]??0) * $property_counts[$item['id']]??0; // * 0.05 foreach ($list as &$item) { $item['passes_counts'] = $passes_counts[$item['id']]??0; $item['passes_merits'] = $this->passesMerits($passes_counts[$item['id']]??0); $item['property_counts'] = $property_counts[$item['id']]??0; $item['property_merits'] = $this->propertyMerits($property_counts[$item['id']]??0); $item['group_counts'] = $group_counts[$item['id']]??0; $item['group_merits'] = $this->groupMerits($group_counts[$item['id']]??0); $item['all_merits'] = (float)$item['passes_merits'] + (float)$item['property_merits'] + (float)$item['group_merits']; } return $list; } /** * @notes 获取数量 * @return int * @author likeadmin * @date 2024/12/15 10:53 */ public function count(): int { return Sale::where($this->searchWhere)->where($this->queryDataWhere())->count(); } public function setExcelComplexFields(): array { $zh_cn_fields = [ '销售组','销售员', '销售手机号','工程师审核通过数量','入驻提成绩效','物业签约合计分数','物业提成绩效','拼团总流水','拼团提成绩效','总提成绩效' ,'开始日期','结束日期' ]; $data_fields = [function($row){ return $row['saleGroupInfo']['sale_name']??''; },'sale_name','mobile', 'passes_counts','passes_merits','property_counts','property_merits','group_counts','group_merits','all_merits' ,function($row){ return $row['start_date']?date('Y-m-d',$row['start_date']):''; },function($row){ return $row['end_date']?date('Y-m-d',$row['end_date']):''; } ]; return [ 'zh_cn_fields' => $zh_cn_fields, 'data_fields' => $data_fields ]; } public function passesCounts($list,$whereTime) { $sale_ids = array_column($list,'id'); $passes_counts = []; foreach ($sale_ids as $sale_id) { $worker_ids = MasterWorkerRegister::where('sale_id','>',0)->where('worker_id','>',0) ->where('sale_id',$sale_id) ->whereBetween('create_time',[$whereTime[0],$whereTime[1]]) ->column('worker_id'); foreach ($worker_ids as $worker_id) { !isset($passes_counts[$sale_id]) && $passes_counts[$sale_id] = 0; $passes_counts[$sale_id] += $this->requiredMasterWorker($worker_id)?1:0; } } //dd($passes_counts); return $passes_counts; } public function passesMerits($value) { switch (true){ case (60 <= $value && $value < 70): return 200; case (70 <= $value && $value < 80): return 400; case (80 <= $value && $value < 90): return 600; case (90 <= $value && $value < 100): return 800; case (100 <= $value ): return 1000; case ($value < 60): default: return 0; } } public function propertyCounts($list,$whereTime) { $sale_ids = array_column($list,'id'); $propertyHeads = PropertyHead::where('sale_id','>',0)->where('is_cooperate','=',1) ->where('sale_id','in',$sale_ids) ->whereBetween('create_time',[$whereTime[0],$whereTime[1]]) ->field([ 'sale_id', Db::raw("SUM(rating_value) AS rating_values") ]) ->group('sale_id') ->select()->toArray(); return array_column($propertyHeads,'rating_values','sale_id'); } public function propertyMerits($value) { switch (true){ case (60 <= $value && $value < 70): return 200; case (70 <= $value && $value < 80): return 400; case (80 <= $value && $value < 90): return 600; case (90 <= $value && $value < 100): return 800; case (100 <= $value ): return 1000; case ($value < 60): default: return 0; } } public function groupCounts($list,$whereTime) { $sale_ids = array_column($list,'id'); $groupCounts = []; foreach ($sale_ids as $sale_id) { $propertyHeadIds = PropertyHead::where('sale_id','>',0)->where('is_cooperate','=',1)->where('sale_id',$sale_id)->column('id')??[]; $groupOrderIds = GroupOrder::whereIn('property_head_id',$propertyHeadIds)->column('id')??[]; //->whereB('pay_time',1)-> $paid_amounts = GroupUserOrder::alias("a")->whereIn('a.group_order_id',$groupOrderIds) ->join('group_service_work b','a.id = b.group_user_order_id AND b.service_status = 3') ->where('a.status',1) ->whereBetween('a.pay_time',[$whereTime[0],$whereTime[1]]) ->sum('a.paid_amount'); $groupCounts[$sale_id] = $paid_amounts; } return $groupCounts; } public function groupMerits($value) { return bcmul($value, 0.05,2); } public function requiredMasterWorker($master_worker_id): bool { $masterWorker = MasterWorker::where('id',$master_worker_id)->findOrEmpty(); if(!$masterWorker->isEmpty()){ // 该工程师所有必须任务是否完成 $taskRequired = MasterWorkerLogic::taskRequired($master_worker_id,$masterWorker->identity_source); if($masterWorker->audit_state == 1 && $taskRequired){ return true; } } return false; } }