[''], 'allow' => [ 'contract', 'receivables', 'signing', 'addcustomer', 'addcontacts', 'recordnun', 'recordcustomer', 'examine', 'product', 'excelexport' ] ]; Hook::listen('check_auth', $action); $request = Request::instance(); $a = strtolower($request->action()); if (!in_array($a, $action['permission'])) { parent::_initialize(); } if (!checkPerByAction('bi', 'ranking', 'read')) { header('Content-Type:application/json; charset=utf-8'); exit(json_encode(['code' => 102, 'error' => '无权操作'])); } } /** * 合同金额排行 * @param * @return * @author Michael_xu */ public function contract($param = '') { if($param['excel_type']!=1){ $param = $this->param; } if (!empty($param['start_time'])) $param['start_time'] =$param['start_time'] . ' 00:00:00'; if (!empty($param['end_time'])) $param['end_time'] = $param['end_time'] . ' 23:59:59'; $whereArr = $this->com($param, 'contract'); $whereArr['check_status'] = 2; //导出使用 if (!empty($param['excel_type'])) { $data=$this->handel( new \app\bi\model\Contract, $whereArr, ['field' => 'SUM(`money`)', 'alias' => 'money', 'default' => '0.00'], $param['excel_type'] ); return $data; } return $this->handel( new \app\bi\model\Contract, $whereArr, ['field' => 'SUM(`money`)', 'alias' => 'money', 'default' => '0.00'] ); } /** * 回款金额排序 * @return */ public function receivables($param = '') { if($param['excel_type']!=1){ $param = $this->param; } if (!empty($param['start_time'])) $param['start_time'] = $param['start_time'] . ' 00:00:00'; if (!empty($param['end_time'])) $param['end_time'] = $param['end_time'] . ' 23:59:59'; $whereArr = $this->com($param, 'receivables'); $whereArr['check_status'] = 2; //导出使用 if (!empty($param['excel_type'])) { $data=$this->handel( new \app\bi\model\Receivables, $whereArr, ['field' => 'SUM(`money`)', 'alias' => 'money', 'default' => '0.00'], $param['excel_type'] ); return $data; } return $this->handel( new \app\bi\model\Receivables, $whereArr, ['field' => 'SUM(`money`)', 'alias' => 'money', 'default' => '0.00'] ); } /** * 签约合同排序 * @return */ public function signing($param = '') { if($param['excel_type']!=1){ $param = $this->param; } if (!empty($param['start_time'])) $param['start_time'] = $param['start_time'] . ' 00:00:00'; if (!empty($param['end_time'])) $param['end_time'] = $param['end_time'] . ' 23:59:59'; $whereArr = $this->com($param, 'contract'); // $whereArr['check_status'] = 2; //导出使用 if (!empty($param['excel_type'])) { $data= $this->handel( new ContractModel, $whereArr, ['field' => 'COUNT(*)', 'alias' => 'count', 'default' => 0], $param['excel_type'] ); return $data; } return $this->handel( new ContractModel, $whereArr, ['field' => 'COUNT(*)', 'alias' => 'count', 'default' => 0] ); } /** * 新增客户排序 * @return */ public function addCustomer($param = '') { if($param['excel_type']!=1){ $param = $this->param; } if (!empty($param['start_time'])) $param['start_time'] = $param['start_time'] . ' 00:00:00'; if (!empty($param['end_time'])) $param['end_time'] = $param['end_time'] . ' 23:59:59'; $whereArr = $this->com($param, 'customer'); $poolWhere = $this->getWhereByPool(); $poolId = db('crm_customer')->alias('customer')->where($poolWhere)->column('customer_id'); if (!empty($poolId)) $whereArr['customer_id'] = ['notin', $poolId]; //导出使用 if (!empty($param['excel_type'])) return $this->handel( new \app\bi\model\Customer, $whereArr, ['field' => 'COUNT(*)', 'alias' => 'count', 'default' => 0], $param['excel_type'] ); return $this->handel( new \app\bi\model\Customer, $whereArr, ['field' => 'COUNT(*)', 'alias' => 'count', 'default' => 0] ); } /** * 新增联系人排序 * @return */ public function addContacts() { $param = $this->param; if (!empty($param['start_time'])) $param['start_time'] = $param['start_time'] . ' 00:00:00'; if (!empty($param['end_time'])) $param['end_time'] = $param['end_time'] . ' 23:59:59'; $whereArr = $this->com($param, 'contacts'); //导出使用 if (!empty($param['excel_type'])) return $this->handel( new \app\bi\model\Contacts, $whereArr, ['field' => 'COUNT(*)', 'alias' => 'count', 'default' => 0], $param['excel_type'] ); return $this->handel( new \app\bi\model\Contacts, $whereArr, ['field' => 'COUNT(*)', 'alias' => 'count', 'default' => 0] ); } /** * 跟进次数排行 * * @param string $param * @return array|\think\response\Json * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function recordNun($param = '') { if($param['excel_type']!=1){ $param = $this->param; } if (!empty($param['start_time'])) $param['start_time'] = $param['start_time'] . ' 00:00:00'; if (!empty($param['end_time'])) $param['end_time'] = $param['end_time'] . ' 23:59:59'; $whereArr = $this->com($param, 'record'); # 权限内的员工列表 $userData = []; $userList = db('admin_user')->alias('user') ->field(['user.id', 'user.realname AS user_name', 'structure.name AS structure_name']) ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id') ->whereIn('user.id', $whereArr['create_user_id'][1])->select(); foreach ($userList AS $key => $value) { $userData[$value['id']]['user_name'] = $value['user_name']; $userData[$value['id']]['structure_name'] = $value['structure_name']; } # 跟进记录列表 $data = []; $recordWhere['type'] = 1; $recordWhere['activity_type'] = 2; $recordWhere['create_user_id'] = ['in', $whereArr['create_user_id'][1]]; $recordWhere['create_time'] = ['between', [$whereArr['create_time'][1][0], $whereArr['create_time'][1][1]]]; $recordList = db('crm_activity')->field(['count(*) as count', 'create_user_id'])->where($recordWhere) ->group('create_user_id')->order('count', 'desc')->select(); foreach ($recordList AS $key => $value) { $data[] = [ 'count' => $value['count'], 'user_name' => $userData[$value['create_user_id']]['user_name'], 'structure_name' => $userData[$value['create_user_id']]['structure_name'] ]; } //导出使用 if (!empty($param['excel_type'])) return $data; return resultArray(['data' => $data]); } /** * 跟进客户数排行 * * @param string $param * @return mixed|\think\response\Json * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function recordCustomer($param = '') { if($param['excel_type']!=1){ $param = $this->param; } if (!empty($param['start_time'])) $param['start_time'] = $param['start_time'] . ' 00:00:00'; if (!empty($param['end_time'])) $param['end_time'] =$param['end_time'] . ' 23:59:59'; $whereArr = $this->com($param, 'record'); # 权限内的员工列表 $userData = []; $userList = db('admin_user')->alias('user') ->field(['user.id', 'user.realname AS user_name', 'structure.name AS structure_name']) ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id') ->whereIn('user.id', $whereArr['create_user_id'][1])->select(); foreach ($userList AS $key => $value) { $userData[$value['id']]['user_name'] = $value['user_name']; $userData[$value['id']]['structure_name'] = $value['structure_name']; } # 跟进记录列表 $data = []; $recordWhere['type'] = 1; $recordWhere['activity_type'] = 2; $recordWhere['create_user_id'] = ['in', $whereArr['create_user_id'][1]]; $recordWhere['create_time'] = ['between', [$whereArr['create_time'][1][0], $whereArr['create_time'][1][1]]]; $recordList = db('crm_activity')->field(['create_user_id', 'activity_type_id'])->where($recordWhere) ->group('create_user_id, activity_type_id')->select(); foreach ($recordList AS $key => $value) { if (empty($data[$value['create_user_id']]['user_name'])) { $data[$value['create_user_id']]['user_name'] = $userData[$value['create_user_id']]['user_name']; $data[$value['create_user_id']]['structure_name'] = $userData[$value['create_user_id']]['structure_name']; $data[$value['create_user_id']]['count'] = 1; } else { $data[$value['create_user_id']]['count'] = $data[$value['create_user_id']]['count'] + 1; } } $data = $this->sortCommon($data, 'count', 'desc'); //导出使用 if (!empty($param['excel_type'])) return $data; return resultArray(['data' => $data]); } /** * 出差次数排行 * @return */ public function examine($param = '') { if($param['excel_type']!=1){ $param = $this->param; } if (!empty($param['start_time'])) $param['start_time'] = $param['start_time'] . ' 00:00:00'; if (!empty($param['end_time'])) $param['end_time'] = $param['end_time'] . ' 23:59:59'; $whereArr = $this->com($param, 'record'); $whereArr['category_id'] = 3; // 审批类型,3出差 $whereArr['check_status'] = 2; //导出使用 if (!empty($param['excel_type'])) return $this->handel( new \app\bi\model\Examine, $whereArr, ['field' => 'COUNT(*)', 'alias' => 'count', 'default' => 0], $param['excel_type'], 'create_user_id' ); return $this->handel( new \app\bi\model\Examine, $whereArr, ['field' => 'COUNT(*)', 'alias' => 'count', 'default' => 0], '', 'create_user_id' ); } /** * 产品销量排行 * @return */ public function product($param = '') { $userModel = new \app\admin\model\User(); $productModel = new \app\bi\model\Product(); if($param['excel_type']!=1){ $param = $this->param; } if (!empty($param['start_time'])) $param['start_time'] = $param['start_time'] . ' 00:00:00'; if (!empty($param['end_time'])) $param['end_time'] = $param['end_time'] . ' 23:59:59'; $list = $productModel->getSortByProduct($param); $list = array_column($list, null, 'owner_user_id'); $whereArr = $this->com($param, 'contract'); $data = []; foreach ($whereArr['owner_user_id'][1] as $val) { $user = $userModel->getUserById($val); $item = []; $item['num'] = !empty($list[$val]['num']) ? (int)$list[$val]['num'] : 0; $item['user_name'] = $user['realname']; $item['structure_name'] = $user['structure_name']; $data[] = $item; } # 排序 if (!empty($data)) $data = $this->sortCommon($data, 'num', 'desc'); //导出使用 if (!empty($param['excel_type'])) return $data; return resultArray(['data' => $data]); } /** * 查询条件 * @return */ private function com($param, $type = '') { $userModel = new \app\admin\model\User(); $adminModel = new \app\admin\model\Admin(); $perUserIds = $userModel->getUserByPer('bi', 'ranking', 'read'); //权限范围内userIds $whereData = $adminModel->getWhere($param, '', $perUserIds); //统计条件 $userIds = $whereData['userIds']; $between_time = $whereData['between_time']; if ($type == 'contract') { $where_time = 'order_date'; } elseif (in_array($type, ['record', 'customer', 'contacts'])) { $where_time = 'create_time'; } elseif ($type == 'receivables') { $where_time = 'return_time'; } else { $where_time = 'start_time'; } //时间戳:新增客户排行 if ($type == 'contract' || $type == 'receivables') { $whereArr[$where_time] = array('between', array(date('Y-m-d', $between_time[0]), date('Y-m-d', $between_time[1]))); } else { $whereArr[$where_time] = array('between', array($between_time[0], $between_time[1])); } if (in_array($type, ['customer', 'contract', 'receivables', 'contacts'])) { $whereArr['owner_user_id'] = ['IN', $userIds]; } else { $whereArr['create_user_id'] = ['IN', $userIds]; } return $whereArr; } /** * 查询统计数据 * * @param model $model * @param array $whereArr * @return void * @author Ymob * @datetime 2019-11-25 11:11:59 */ private function handel($model, $whereArr, $field, $excel_type = '', $user_field = 'owner_user_id') { $userModel = new \app\admin\model\User(); $sql = $model->field([ $user_field, $field['field'] => $field['alias'] ]) ->where($whereArr) ->group($user_field) ->fetchSql() ->select(); $list = queryCache($sql); $list = array_column($list, null, $user_field); $data = []; foreach ($whereArr[$user_field][1] as $val) { $user = $userModel->getUserById($val); $item = []; $item[$field['alias']] = $list[$val][$field['alias']] ?: $field['default']; $item['user_name'] = $user['realname']; $item['structure_name'] = $user['structure_name']; $data[] = $item; } array_multisort($data, SORT_DESC, array_column($data, $field['alias'])); if (!empty($excel_type)) return $data; return resultArray(['data' => $data]); } /** * 导出 * @param $type * @param $types */ public function excelExport() { $param = $this->param; $excel_type = $param['excel_type']; $type = []; $type['excel_types'] = $param['excel_types']; switch ($param['excel_types']) { case 'contract': $list = $this->contract($param); $param['type'] = '合同金额排行'; break; case 'receivablesRanKingExport': $list = $this->receivables($param); $param['type'] = '回款金额排行'; break; case 'signing': $list = $this->signing($param); $param['type'] = '签约合同排行'; break; case 'product': $list = $this->product($param); $param['type'] = '产品销量排行'; break; case 'addCustomer': $list = $this->addCustomer($param); $param['type'] = '新增客户数排行'; break; case 'addContacts': $list = $this->addContacts($param); $param['type'] = '新增联系人数排行'; break; case 'recordNun': $list = $this->recordNun($param); $param['type'] = '跟进次数排行'; break; case 'recordCustomer': $list = $this->recordCustomer($param); $param['type'] = '跟进客户数排行'; break; case 'examine': $list = $this->examine($param); $param['type'] = '出差次数排行'; break; } if(empty($list)){ return resultArray(['data'=>'数据不存在']); } $excelLogic = new ExcelLogic(); foreach ($list as $key => $v) { $list[$key]['id'] = $key + 1; } $data = $excelLogic->rankingExcle($param, $list); return $data; } /** * [客户公海条件] * @author Michael_xu * @param * @return */ public function getWhereByPool() { $configModel = new \app\crm\model\ConfigData(); $configInfo = $configModel->getData(); $config = $configInfo['config'] ? : 0; $follow_day = $configInfo['follow_day'] ? : 0; $deal_day = $configInfo['deal_day'] ? : 0; $whereData = []; //启用 if ($config == 1) { //默认公海条件(没有负责人或已经到期) $data['follow_time'] = time()-$follow_day*86400; $data['deal_time'] = time()-$deal_day*86400; $data['deal_status'] = '未成交'; if ($follow_day < $deal_day) { $whereData = function($query) use ($data){ $query->where(['customer.owner_user_id'=>0]) ->whereOr(function ($query) use ($data) { $query->where(function ($query) use ($data) { $query->where(['customer.update_time' => array('elt',$data['follow_time'])]) ->whereOr(['customer.deal_time' => array('elt',$data['deal_time'])]); }) ->where(['customer.is_lock' => 0]) ->where(['customer.deal_status' => ['neq','已成交']]); }); }; } else { $whereData = function($query) use ($data){ $query->where(['customer.owner_user_id'=>0]) ->whereOr(function ($query) use ($data) { $query->where(function ($query) use ($data) { $query->where(['customer.deal_time' => array('elt',$data['deal_time'])]); }) ->where(['customer.is_lock' => 0]) ->where(['customer.deal_status' => ['neq','已成交']]); }); }; } } else { $whereData['customer.owner_user_id'] = 0; } return $whereData ? : ''; } }