// +---------------------------------------------------------------------- namespace plugin\saiadmin\basic; use plugin\saiadmin\app\cache\UserInfoCache; use plugin\saiadmin\exception\ApiException; use think\facade\Db; /** * 逻辑层基础类 * @package app\service * @method static where($data) think-orm的where方法 * @method static find($id) think-orm的find方法 * @method static findOrEmpty($id) think-orm的findOrEmpty方法 * @method static hidden($data) think-orm的hidden方法 * @method static order($data) think-orm的order方法 * @method static save($data) think-orm的save方法 * @method static create($data) think-orm的create方法 * @method static saveAll($data) think-orm的saveAll方法 * @method static update($data, $where, $allow = []) think-orm的update方法 * @method static select() think-orm的select方法 * @method static count($data) think-orm的count方法 * @method static max($data) think-orm的max方法 * @method static min($data) think-orm的min方法 * @method static sum($data) think-orm的sum方法 * @method static avg($data) think-orm的avg方法 */ class BaseLogic { /** * @var object 模型注入 */ protected $model; /** * @var object 管理员信息 */ protected $adminInfo; /** * 排序字段 * @var string */ protected string $orderField = ''; /** * 排序方式 * @var string */ protected string $orderType = 'ASC'; /** * 初始化 * @param $user * @return void */ public function init($user): void { $this->adminInfo = $user; } /** * 设置排序字段 * @param $field * @return void */ public function setOrderField($field): void { $this->orderField = $field; } /** * 设置排序方式 * @param $type * @return void */ public function setOrderType($type): void { $this->orderType = $type; } /** * 数据库事务操作 * @param callable $closure * @param bool $isTran * @return mixed */ public function transaction(callable $closure, bool $isTran = true): mixed { return $isTran ? Db::transaction($closure) : $closure(); } /** * 添加数据 * @param $data * @return mixed */ public function add($data): mixed { $this->model->save($data); return $this->model->getKey(); } /** * 修改数据 * @param $id * @param $data * @return mixed */ public function edit($id, $data): mixed { $model = $this->model->findOrEmpty($id); if ($model->isEmpty()) { throw new ApiException('数据不存在'); } return $model->save($data); } /** * 读取数据 * @param $id * @return mixed */ public function read($id): mixed { $model = $this->model->findOrEmpty($id); if ($model->isEmpty()) { throw new ApiException('数据不存在'); } return $model; } /** * 删除数据 * @param $ids */ public function destroy($ids) { $this->model->destroy($ids); } /** * 搜索器搜索 * @param array $searchWhere * @return mixed */ public function search(array $searchWhere = []): mixed { $withSearch = array_keys($searchWhere); $data = $searchWhere; foreach ($withSearch as $k => $v) { if ($data[$v] === '') { unset($data[$v]); unset($withSearch[$k]); } } return $this->model->withSearch($withSearch, $data); } /** * 根据权限搜索器 * @param array $searchWhere * @param array $withSearch 搜索器 * @return mixed */ public function searchByAuth(array $searchWhere = []): mixed { $withSearch = array_keys($searchWhere); $data = $searchWhere; foreach ($withSearch as $k => $v) { if ($data[$v] === '') { unset($data[$v]); unset($withSearch[$k]); } } $userAuthCache = new UserInfoCache(getCurrentInfo()['id']); $userInfo = $userAuthCache->getUserInfo(); // Todo 如果角色权限,超过跳过权限限制 $roleIds = array_column($userInfo['roleList'], 'id'); if(in_array(1, $roleIds)){ return $data; } // Todo 1、游戏权限 $authGameList = $userInfo['deptList']['game_list']; if($authGameList != '*'){ $authGameIds = explode(',', $authGameList); if(!empty($data['game_id'])){ $inputGameIds = is_array($data['game_id']) ? $data['game_id'] : explode(',', $data['game_id']); $data['game_id'] = array_values(array_intersect($inputGameIds, $authGameIds)); // 如果传入了game_id,则取权限交集 }else{ // 如果没传入game_id,则取权限 $data['game_id'] = $authGameIds; } } // Todo 2、广告数据权限 $userId = $userInfo['id']; $deptId = $userInfo['deptList']['id']; // 广告权限,自己 or 全部 $authAdPermission = $userInfo['ad_permission']; if($authAdPermission){ if($authAdPermission==1){ // Todo 1、仅自己 $data['auth_id'] = [$userId]; } elseif($authAdPermission==2) { // Todo 2、自己部门 $underUserIds = Db::connect('db_system')->table('sa_system_user')->where('dept_id', 'in', $deptId)->column('id'); if(!empty($data['auth_id'])) { // 如果传入了负责人ID,则取交集 $data['auth_id'] = array_values(array_intersect( $data['auth_id'], array_values($underUserIds))); }else{ // 如果没有传入负责人ID, 则取当前用户以及下面组员 $data['auth_id'] = array_values($underUserIds); } } } // 看指定游戏的自然量 $authNormalGameList = $userInfo['normal_game_list']; // 可看自然量的游戏 if($authNormalGameList!='*' && $authNormalGameList!='-1' && !empty($data['game_id'])){ // 则取auth_normal_game_list交集 $data['normal_game_id'] = array_values(array_intersect(explode(',', $authNormalGameList), $data['game_id'])); } return $data; } // Todo 公共 where 子句 protected function getCommonWhereRaw($params): string { $eqParams = ["user_name", "media_id", "site_id", "agent_id", "vt", "server_id", "server_name"]; $inParams = ["game_id", "auth_id"]; $betweenParams = ["tdate"]; $timeParams = ["reg_time", "pay_time", "login_time"]; $DateTimeParams = ["create_time"]; // Todo And条件 $whereRaw = " 1=1 "; foreach ($params as $key => $value){ if (in_array($key, $eqParams)) { $whereRaw .= " AND `{$key}`='{$value}'"; } elseif (in_array($key, $inParams) && !empty($value)) { $value = is_string($value) ? explode(',', $value) : $value; $whereRaw .= " AND `{$key}` IN ('".implode("','", $value)."')"; } elseif (in_array($key, $betweenParams) && !empty($value)) { $whereRaw .= " AND `{$key}` BETWEEN '{$value[0]}' AND '{$value[1]}'"; } elseif (in_array($key, $DateTimeParams) && !empty($value)) { $value[0] = $value[0] .' 00:00:00'; $value[1] = $value[1] .' 23:59:59'; $whereRaw .= " AND `{$key}` BETWEEN '{$value[0]}' AND '{$value[1]}'"; } elseif (in_array($key, $timeParams) && !empty($value)) { $value[0] = strtotime($value[0] .' 00:00:00'); $value[1] = strtotime($value[1] .' 23:59:59'); $whereRaw .= " AND `{$key}` BETWEEN '{$value[0]}' AND '{$value[1]}'"; } } // Todo 自然量走 Or 条件 $whereOr = []; if(!empty($params['normal_game_id'])){ foreach ($params['normal_game_id'] as $gameId){ $whereOr[] = "(game_id = {$gameId} AND auth_id=0)"; } } $whereOr = $whereOr ? implode(' OR ', $whereOr) : ""; return $whereRaw . ($whereOr ? " OR {$whereOr}" : ""); } /** * 分页查询数据 * @param $query * @return mixed */ public function getList($query): mixed { $saiType = request()->input('saiType', 'list'); $page = request()->input('page', 1); $limit = request()->input('limit', 10); $orderBy = request()->input('orderBy', ''); $orderType = request()->input('orderType', $this->orderType); if(empty($orderBy)) { $orderBy = $this->orderField !== '' ? $this->orderField : $this->model->getPk(); } $query->order($orderBy, $orderType); if ($saiType === 'all') { return $query->select()->toArray(); } return $query->paginate($limit, false, ['page' => $page])->toArray(); } /** * 获取全部数据 * @param $query * @return mixed */ public function getAll($query): mixed { $orderBy = request()->input('orderBy', ''); $orderType = request()->input('orderType', $this->orderType); if(empty($orderBy)) { $orderBy = $this->orderField !== '' ? $this->orderField : $this->model->getPk(); } $query->order($orderBy, $orderType); return $query->select()->toArray(); } /** * 转换列表列 * @param $data * @param $fields * @return mixed */ public function trandformListColumn($data, $fields=['site', 'agent', 'game', 'auth', 'author', 'media', 'pay_channel', 'game_pay_channel', 'ip']){ if(in_array('site', $fields)){ $agentSiteList = Db::connect('db_advert')->table('agent_site')->field('id,name')->select()->toArray(); $agentSiteList = array_column($agentSiteList, 'name', 'id'); } if(in_array('agent', $fields)){ $agentList = Db::connect('db_advert')->table('agent_list')->field('id,name')->select()->toArray(); $agentList = array_column($agentList, 'name', 'id'); } if(in_array('game', $fields)){ $gameList = Db::connect('db_center')->table('pf_game')->field('id,name,os,ios_appid')->select()->toArray(); $gameList = array_column($gameList, null, 'id'); } if(in_array('auth', $fields)){ $authList = Db::connect('db_system')->table('sa_system_user')->field('id,username')->select()->toArray(); $authList = array_column($authList, 'username', 'id'); } if(in_array('author', $fields)){ $authorList = Db::connect('db_system')->table('sa_system_user')->field('id,username')->select()->toArray(); $authorList = array_column($authorList, 'username', 'id'); } if(in_array('media', $fields)){ $mediaList = Db::connect('db_advert')->table('media_list')->field('id,name')->select()->toArray(); $mediaList = array_column($mediaList, 'name', 'id'); } if(in_array('pay_channel', $fields)){ $payChannelList = Db::connect('db_center')->table('pay_channel')->field('id,name')->where('status',1)->select()->toArray(); $payChannelList = array_column($payChannelList, 'name', 'id'); } if(in_array('game_pay_channel', $fields)){ $gamePayChannelList = Db::connect('db_center')->table('pay_channel')->field('id,name')->where('status',1)->select()->toArray(); $gamePayChannelList = array_column($gamePayChannelList, 'name', 'id'); } foreach ($data as $key => $value) { if(!empty($agentSiteList) ){ $data[$key]['site_name'] = $agentSiteList[$value['site_id']] ?? ''; } if(!empty($agentList) ){ $data[$key]['agent_name'] =$agentList[$value['agent_id']] ?? ''; } if(!empty($gameList) ){ $data[$key]['game_name'] = $gameList[$value['game_id']]['name'] ?? ''; $data[$key]['game_os'] = $gameList[$value['game_id']]['os'] ?? ''; $data[$key]['ios_appid'] = $gameList[$value['game_id']]['ios_appid'] ?? ''; } if(!empty($authList) ){ $data[$key]['auth_name'] = $authList[$value['auth_id']] ?? ''; } if(!empty($authorList) ){ $data[$key]['author_name'] = $authorList[$value['author_id']] ?? ''; } if(!empty($mediaList) ){ $data[$key]['media_name'] = $mediaList[$value['media_id']] ?? ''; } if(!empty($payChannelList) ){ $data[$key]['pay_channel_name'] = $payChannelList[$value['pay_channel_id']] ?? ''; } if(!empty($gamePayChannelList)){ $data[$key]['alipay_wap_name'] = $gamePayChannelList[$value['alipay_wap']] ?? '-'; $data[$key]['inapp_name'] = $gamePayChannelList[$value['inapp']] ?? '-'; $data[$key]['wechat_wap_name'] = $gamePayChannelList[$value['wechat_wap']] ?? '-'; $data[$key]['wechat_scan_name'] = $gamePayChannelList[$value['wechat_scan']] ?? '-'; $data[$key]['wechat_jsapi_name'] = $gamePayChannelList[$value['wechat_jsapi']] ?? '-'; } if(in_array('ip', $fields)){ $data[$key]['ip'] = getIpLocation($value['ip']) ?? ''; } } return $data; } /** * 获取上传的导入文件 * @param $file * @return string */ public function getImport($file): string { $full_dir = runtime_path() . '/resource/'; if (!is_dir($full_dir)) { mkdir($full_dir, 0777, true); } $ext = $file->getUploadExtension() ?: null; $full_path = $full_dir. md5(time()). '.'. $ext; $file->move($full_path); return $full_path; } /** * 方法调用 * @param $name * @param $arguments * @return mixed */ public function __call($name, $arguments) { // TODO: Implement __call() method. return call_user_func_array([$this->model, $name], $arguments); } // 渠道分析、运营分析生成的whereSql public function generateWhereSql($params): string { $whereSql = ""; // 游戏id if (!empty($params['game_id'])) { if (is_array($params['game_id'])) { $whereSql .= " AND game_id IN(" . implode(',', $params['game_id']) . ")"; } else { $whereSql .= " AND game_id = {$params['game_id']}"; } } // 媒体id if (!empty($params['media_id'])) { $whereSql .= " AND media_id = {$params['media_id']}"; } // 渠道id if (!empty($params['agent_id'])) { $whereSql .= " AND agent_id = {$params['agent_id']}"; } // 广告位id if (!empty($params['site_id'])) { if (is_array($params['site_id'])) { $whereSql .= " AND site_id IN(" . implode(',', $params['site_id']) . ")"; } else { $whereSql .= " AND site_id = {$params['site_id']}"; } } // 负责人 if (!empty($params['auth_id'])) { if (is_array($params['auth_id'])) { $whereSql .= " AND auth_id IN(" . implode(',', $params['auth_id']) . ")"; } else { $whereSql .= " AND auth_id = {$params['auth_id']}"; } } // 注册日期 if (!empty($params['reg_date']) ?? null) { $whereSql .= " AND tdate BETWEEN '{$params['reg_date'][0]}' AND '{$params['reg_date'][1]}'"; } // 自然量ID, auth_id=0为自然量 if(!empty($params['normal_game_id'])){ for($i=0;$i