2, ]; protected $statusArr = ['禁用', '启用', '未激活']; protected $dateFormat = 'Y-m-d'; protected $type = [ 'create_time' => 'timestamp', 'update_time' => 'timestamp', ]; /** * 导入字段 * * @var array * @author Ymob * @datetime 2019-10-25 15:35:25 */ public static $import_field_list = [ [ 'field' => 'username', 'name' => '手机号(登录名)', 'form_type' => 'mobile', 'is_null' => 1, 'is_unique' => 1 ], [ 'field' => 'password', 'name' => '密码', 'form_type' => 'text', 'is_null' => 1, ], [ 'field' => 'realname', 'name' => '姓名', 'form_type' => 'text', 'is_null' => 1, ], [ 'field' => 'sex', 'name' => '性别', 'form_type' => 'select', 'setting' => ['男', '女'], 'is_null' => 0, ], [ 'field' => 'email', 'name' => '邮箱', 'form_type' => 'email', 'is_null' => 0, ], [ 'field' => 'post', 'name' => '岗位', 'form_type' => 'text', 'is_null' => 0, ], [ 'field' => 'department', 'name' => '部门', 'form_type' => 'text', 'is_null' => 1, ] ]; /** * 获取用户所属所有用户组 * @param array $param [description] */ public function groups() { return $this->belongsToMany('group', 'admin_access', 'group_id', 'user_id'); } public function structureList($structure_id, $str) { $str_ids = structureList($structure_id, $str); return $str_ids; } /** * [getDataList 列表] * @AuthorHTL * @param [string] $map [查询条件] * @param [number] $page [当前页数] * @param [number] $limit [每页数量] * @return [description] */ public function getDataList($request) { $structure_status = $request['isNeedChild']; unset($request['isNeedChild']); $request = $this->fmtRequest($request); $fieldarray = ['search', 'group_id', 'structure_id', 'status', 'type', 'page', 'limit', 'pageType']; $map = $request['map'] ?: []; if (isset($map['search']) && $map['search']) { $map['user.username|user.realname'] = ['like', '%' . $map['search'] . '%']; } unset($map['search']); //角色员工 if ($map['group_id']) { $group_user_ids = db('admin_access')->where(['group_id' => $map['group_id']])->column('user_id'); if ($map['group_id'] == 1 && !$group_user_ids) { $group_user_ids = ['1']; } $map['user.id'] = array('in', $group_user_ids); } $exp = new \think\db\Expression('field(user.status,1,2,0)'); // 默认除去超级管理员 // $map['user.id'] = array('neq', 1); if ($map['structure_id']) { //获取部门下员工列表 if ($structure_status == 1) { $str_ids = structureList($map['structure_id'], ''); $new_str_ids = rtrim($str_ids, ','); $map['user.structure_id'] = ['in', $new_str_ids]; //$map['structure_id']; } else { $map['user.structure_id'] = ['in', $map['structure_id']]; } } $structureData = db('admin_structure')->where('id', $map['structure_id'])->value('owner_user_id'); unset($map['structure_id']); if ($map['status'] || $map['group_id']) { if ($map['status'] != 3) { $map['user.status'] = ($map['status'] !== 'all') ? ($map['status'] ?: ['gt', 0]) : ['egt', 0]; } else { $map['user.create_time'] = ['gt', time() - 86400 * 7]; } } else { $map['user.status'] = 0; } unset($map['status']); $map['user.type'] = 1; if (isset($map['type'])) $map['user.type'] == ($map['type'] == '0') ? 0 : 1; //过滤字段 foreach ($fieldarray as $value) { unset($map[$value]); } //获取列表 $dataCount = db('admin_user') ->alias('user') ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') // ->join('HrmUserDet hud','hud.user_id = user.id','LEFT') ->where($map) ->count(); $list = db('admin_user') ->alias('user') ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') // ->join('HrmUserDet hud','hud.user_id = user.id','LEFT') ->limit(($request['page'] - 1) * $request['limit'], $request['limit']) ->where($map) ->field('user.id,user.username,user.img,user.thumb_img,user.realname,user.num,user.email,user.mobile,user.sex,user.structure_id,user.post,user.status,user.parent_id,user.type,user.create_time,structure.name as s_name') ->order($exp) ->order('user.id asc') ->select(); foreach ($list as $k => $v) { //直属上级 $list[$k]['status_name'] = $v['status'] == '1' ? '启用' : '禁用'; $parentInfo = []; $parentInfo = $this->getUserById($v['parent_id']); $list[$k]['parent_name'] = $v['parent_id'] ? $parentInfo['realname'] : ''; $list[$k]['status_name'] = $v['status'] ? $this->statusArr[$v['status']] : '停用'; //角色 $groupsArr = $this->get($v['id'])->groups; $groups = []; $groupids = []; foreach ($groupsArr as $key => $val) { $groups[] = $val['title']; $groupids[] = $val['id']; } $list[$k]['groups'] = $groups ? implode(',', $groups) : ''; $list[$k]['groupids'] = $groupids ? implode(',', $groupids) : ''; $list[$k]['img'] = $v['img'] ? getFullPath($v['img']) : ''; $list[$k]['thumb_img'] = $v['thumb_img'] ? getFullPath($v['thumb_img']) : ''; $list[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : ''; $list[$k]['s_name'] = !empty($v['s_name']) ? $v['s_name'] : ''; $list[$k]['structure_id'] = !empty($v['structure_id']) ? $v['structure_id'] : ''; if ($v['id'] == 1) { $list[$k]['userIdentity'] = 0; } elseif ($v['id'] == $structureData) { $list[$k]['userIdentity'] = 1; } else { $list[$k]['userIdentity'] = 2; } } //二位数组排序 $last_names = array_column($list, 'userIdentity'); array_multisort($last_names, SORT_ASC, $list); $data = []; $data['list'] = $list; $data['dataCount'] = $dataCount; return $data; } /* *根据字符串展示参与人 use by work */ public function getDataByStr($idstr) { $idArr = stringToArray($idstr); if (!$idArr) { return []; } $list = $this->field('id,username,realname,thumb_img')->where(['id' => ['in', $idArr]])->select(); foreach ($list as $key => $value) { $list[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : ''; } return $list; } /** * [getDataById 根据主键获取详情] * @param string $id [主键] * @return */ public function getDataById($id = '') { $data = Db::name('AdminUser')->find($id); if (!$data) { $this->error = '暂无此数据'; return false; } unset($data['password']); unset($data['authkey']); if ($data['structure_id']) { $structureDet = Db::name('AdminStructure')->field('id,name')->where('id = ' . $data['structure_id'] . '')->find(); $data['structure_name'] = $structureDet['name']; } else { $data['structure_name'] = '暂无'; } if ($data['parent_id']) { $parentDet = Db::name('AdminUser')->field('id,realname')->where('id = ' . $data['parent_id'] . '')->find(); $data['parent_name'] = $parentDet['realname']; } else { $data['parent_name'] = '暂无'; } $data['thumb_img'] = getFullPath($data['thumb_img']); $data['img'] = getFullPath($data['img']); //$data['groups'] = $this->get($id)->groups(); return $data; } /** * 创建用户 * @param array $param [description] */ public function createData($param) { // 非导入数据 if (request()->action() == 'import') { $temp = []; foreach (self::$import_field_list as $key => $val) { $temp[$val['field']] = $param[$val['field']]; } $param = $temp; $department=explode('/',$param['department']); $pid=1; foreach ($department as $k => $v){ $structure=db('admin_structure')->where('name',$v)->find(); if(empty($structure)){ $id=db('admin_structure')->insertGetId(['name'=>$v,'pid'=>$pid]); $pid=$id; }else{ $pid=$structure['id']; } } $param['structure_id'] = $pid; $nameData = db('admin_user')->where('realname', 'like', '%' . $param['realname'] . '%')->column('realname'); if (in_array($param['realname'], $nameData)) { for ($j = 1; $j < 100; $j++) { $name = $param['realname'] . '-' . $j; if (in_array($name, $nameData)) { continue; } else { $name = $param['realname'] . '-' . $j; break; } } $param['realname'] = $name; } // if(db('admin_user')->where('realname',$param['realname'])->find()){ // $this->error = '姓名已存在'; // return false; // } } else { if (empty($param['group_id']) || !is_array($param['group_id'])) { $this->error = '请至少勾选一个用户组'; return false; } } $userId=$param['userId']; unset($param['userId']); // 验证 $validate = validate($this->name); if (!$validate->check($param)) { $this->error = $validate->getError(); return false; } if (db('admin_user')->where('username', $param['username'])->find()) { $this->error = '手机号已存在'; return false; } $syncModel = new \app\admin\model\Sync(); $this->startTrans(); try { $salt = substr(md5(time()), 0, 4); $param['salt'] = $salt; if (!$param['password']) { $password = $param['username']; } else { $password = $param['password']; } $param['password'] = user_md5($password, $salt, $param['username']); $param['type'] = 1; $param['mobile'] = $param['username']; $this->data($param)->allowField(true)->isUpdate(false)->save(); $user_id = (int)$this->getLastInsId(); //员工档案 $data['user_id'] = $param['user_id']; unset($param['user_id']); $data['user_id'] = $user_id; $data['mobile'] = $param['username']; $data['email'] = $param['email'] ?: ''; $data['sex'] = $param['sex'] ?: ''; $data['create_time'] = time(); Db::name('HrmUserDet')->insert($data); $userGroups = []; foreach ($param['group_id'] as $k => $v) { $userGroup['user_id'] = $user_id; $userGroup['group_id'] = $v; $userGroups[] = $userGroup; } if ($userGroups) { Db::name('admin_access')->insertAll($userGroups); } $this->commit(); $param['user_id'] = $data['user_id']; $resSync = $syncModel->syncData($param); # 添加记录 if (request()->action() != 'import') { SystemActionLog($userId, 'admin_user', 'employee', $user_id, 'save', $param['realname'], '', '', '新增用户:' . $param['realname']); } return true; } catch (\Exception $e) { $this->rollback(); $this->error = '添加失败'; return false; } } //导入成为正式用户 public function beusers($request) { if ($request['userlist'] && is_array($request['userlist'])) { $flag = true; foreach ($request['userlist'] as $value) { $userInfo = Db::name('AdminUser')->where('id = ' . $value . '')->find(); $userDet = Db::name('HrmUserDet')->where('user_id = ' . $value . '')->find(); $temp['status'] = 1; $temp['type'] = 1; $temp['username'] = $userDet['mobile']; $salt = substr(md5(time()), 0, 4); $temp['salt'] = $salt; $password = $userDet['mobile']; $temp['password'] = user_md5($password, $salt, $temp['username']); $flag = $flag && Db::name('AdminUser')->where('id =' . $value)->update($temp); } if ($flag) { return true; } else { $this->error = '操作失败'; return false; } } else { $this->error = '参数错误'; return false; } } /** * 通过id修改用户 * @param array */ public function updateDataById($param, $id) { if ($param['user_id']) { //修改个人信息 $data['email'] = $param['email']; $data['sex'] = $param['sex']; // $data['mobile'] = $param['username']; $userInfo = db('admin_user')->where(['username' => $param['username'], 'id' => ['neq', $param['user_id']]])->find(); if ($userInfo) { $this->error = '手机号已存在'; return false; } $nameData = db('admin_user')->where(['realname' => ['like', '%' . $param['realname'] . '%']])->column('realname'); if (in_array($param['realname'], $nameData)) { for ($j = 1; $j < 100; $j++) { $name = $param['realname'] . '-' . $j; if (in_array($name, $nameData)) { continue; } else { $name = $param['realname'] . '-' . $j; break; } } $param['realname'] = $name; } Db::name('HrmUserDet')->where(['user_id' => $param['user_id']])->update($data); $data['realname'] = $param['realname']; $data['post'] = $param['post']; $flag = $this->where(['id' => $param['user_id']])->update($data); if ($flag == 0 || $flag == 1) { SystemActionLog($param['user_id'], 'admin_user', 'employee', $param['user_id'], 'update', $param['realname'], '', '', '编辑了:' . $param['realname']); return true; } else { $this->error = '保存失败'; return false; } } else { // 不能操作超级管理员 if ($id == 1) { $this->error = '非法操作,不能编辑超级管理员'; return false; } $checkData = $this->get($id); $userInfo = $checkData->data; if (!$checkData) { $this->error = '暂无此数据'; return false; } if(request()->action() == 'import'){ // $param['realname'] = $checkData['realname']; $nameData = db('admin_user')->where('realname', 'like', '%' . $param['realname'] . '%')->column('realname'); if (in_array($param['realname'], $nameData)) { for ($j = 1; $j < 100; $j++) { $name = $param['realname'] . '-' . $j; if (in_array($name, $nameData)) { continue; } else { $name = $param['realname'] . '-' . $j; break; } } $param['realname'] = $name; } $department=explode('/',$param['department']); $pid=1; foreach ($department as $k => $v){ $structure=db('admin_structure')->where('name',$v)->find(); if(empty($structure)){ $id=db('admin_structure')->insertGetId(['name'=>$v,'pid'=>$pid]); $pid=$id; }else{ $pid=$structure['id']; } } $param['structure_id'] = $pid; $param['userId']=!empty($param['create_user_id'])?:$param['owner_user_id']; unset($param['owner_user_id']); unset($param['create_user_id']); } if (request()->action() != 'import') { if (empty($param['group_id'])) { $this->error = '请至少勾选一个用户组'; return false; } } $subUserId = getSubUserId(true, 0, $id); if ((int)$param['parent_id'] == (int)$id) { $this->error = '直属上级不能是自己'; return false; } if ((int)$param['parent_id'] !== 1 && in_array($param['parent_id'], $subUserId)) { $this->error = '直属上级不能是自己或下属'; return false; } if (db('admin_user')->where(['id' => ['neq', $id], 'username' => $param['username']])->find()) { $this->error = '手机号已存在'; return false; } $this->startTrans(); try { $accessModel = model('Access'); if ($param['group_id']) { //角色员工关系处理 $accessModel->userGroup($id, $param['group_id'], 'update'); } if (!empty($param['password'])) { $salt = $userInfo['salt']; $param['password'] = user_md5($param['password'], $salt, $param['username']); } $this->allowField(true)->save($param, ['id' => $id]); $this->commit(); Cache::rm('user_info' . $id); SystemActionLog($param['userId'], 'admin_user', 'employee', $id, 'update', $userInfo['realname'], '', '', '编辑了:' . $userInfo['realname']); // $data['mobile'] = $param['username']; $data['email'] = $param['email']; $data['sex'] = $param['sex']; $data['update_time'] = time(); $flagg = Db::name('HrmUserDet')->where('user_id = ' . $id)->update($data); return true; } catch (\Exception $e) { $this->rollback(); $this->error = '编辑失败'; return false; } } } /** * [login 登录] * @AuthorHTL * @DateTime * @param [string] $u_username [账号] * @param [string] $u_pwd [密码] * @param [string] $verifyCode [验证码] * @param Boolean $isRemember [是否记住密码] * @param Boolean $type [是否重复登录] * @param array $paramArr * @return [type] [description] */ public function login($username, $password, $verifyCode = '', $isRemember = false, $type = false, $authKey = '', $paramArr = []) { if ($paramArr['dingCode']) { $dingtalkModel = new \app\admin\model\Dingtalk(); $username = $dingtalkModel->sign($paramArr['dingCode']); if (!$username) { $this->error = $dingtalkModel->getError();; return false; } } else { if (!$password) { $this->error = '密码不能为空'; return false; } } if (config('IDENTIFYING_CODE') && !$type) { if (!$verifyCode) { $this->error = '验证码不能为空'; return false; } $captcha = new HonrayVerify(config('captcha')); if (!$captcha->check($verifyCode)) { $this->error = '验证码错误'; return false; } } $map['username'] = $username; $map['type'] = 1; $userInfo = $this->where($map)->find(); if (!$userInfo) { $this->error = '帐号不存在'; return false; } // 登录记录 $login_record = new LoginRecord(); $login_record->user_id = $userInfo['id']; // 三次出错,十五分钟禁止登录 if (!$login_record->verify()) { $this->error = $login_record->error; return false; } $userInfo['thumb_img'] = $userInfo['thumb_img'] ? getFullPath($userInfo['thumb_img']) : ''; if (user_md5($password, $userInfo['salt'], $userInfo['username']) !== $userInfo['password'] && !$paramArr['dingCode']) { $this->error = '账号或密码错误!'; $login_record->createRecord(LoginRecord::TYPE_PWD_ERROR); return false; } if ($userInfo['status'] === 0) { $this->error = '帐号已被禁用'; $login_record->createRecord(LoginRecord::TYPE_USER_BANNED); return false; } $platform = $paramArr['platform'] ? '_' . $paramArr['platform'] : ''; //请求平台(mobile,ding) $login_record->createRecord($platform, LoginRecord::TYPE_SUCCESS); // 获取菜单和权限 $dataList = $this->getMenuAndRule($userInfo['id']); if ($isRemember || $type) { $secret['username'] = $username; $secret['password'] = $password; $data['rememberKey'] = encrypt($secret); } //登录有效时间 $cacheConfig = config('cache'); $loginExpire = !empty($cacheConfig['expire']) ? $cacheConfig['expire'] : 86400 * 30; // 保存缓存 session_start(); $info['userInfo'] = $userInfo; $info['sessionId'] = session_id(); $authKey = user_md5($userInfo['username'] . $userInfo['password'] . $info['sessionId'], $userInfo['salt']); // $info['_AUTH_LIST_'] = $dataList['rulesList']; $info['authKey'] = $authKey; //删除旧缓存 if (Cache::get('Auth_' . $userInfo['authkey'] . $platform)) { Cache::rm('Auth_' . $userInfo['authkey'] . $platform); } Cache::set('Auth_' . $authKey . $platform, $info, $loginExpire); unset($userInfo['authkey']); // 返回信息 $data['authKey'] = $authKey; $data['sessionId'] = $info['sessionId']; $data['userInfo'] = $userInfo; $data['authList'] = $dataList['authList']; $data['menusList'] = $dataList['menusList']; $data['loginExpire'] = $loginExpire; //保存authKey信息 $userData = []; $wxuser_id = Session::get('wxuser_id'); if ($wxuser_id) { $data['authKey'] = 'wxwork'; $userData['wxwork_id'] = $wxuser_id; } else { $userData['authkey'] = $authKey; $userData['authkey_time'] = time() + $loginExpire; } //把状态未激活至为启用 if ($userInfo['status'] == 2) { $userData['status'] = 1; } $this->where(['id' => $userInfo['id']])->update($userData); return $data; } /** * 修改密码 * @param array $param [description] */ public function updatePaw($userInfo, $old_pwd, $new_pwd,$userId) { if (!$old_pwd) { $this->error = '请输入旧密码'; return false; } if (!$new_pwd) { $this->error = '请输入新密码'; return false; } if ($new_pwd == $old_pwd) { $this->error = '新旧密码不能一致'; return false; } //登录有效时间 $cacheConfig = config('cache'); $loginExpire = $cacheConfig['expire'] ?: 86400 * 3; $password = $this->where('id', $userInfo['id'])->value('password'); if (user_md5($old_pwd, $userInfo['salt'], $userInfo['username']) != $password) { $this->error = '原密码错误'; return false; } if (user_md5($new_pwd, $userInfo['salt'], $userInfo['username']) == $password) { $this->error = '密码没改变'; return false; } if ($this->where('id', $userInfo['id'])->setField('password', user_md5($new_pwd, $userInfo['salt'], $userInfo['username']))) { $syncData = []; $syncModel = new \app\admin\model\Sync(); $syncData['user_id'] = $userInfo['id']; $syncData['salt'] = $userInfo['salt']; $syncData['password'] = user_md5($new_pwd, $userInfo['salt'], $userInfo['username']); $resSync = $syncModel->syncData($syncData); $userInfo = $this->where('id', $userInfo['id'])->find(); # 添加记录 SystemActionLog($userId, 'admin_user', 'employee', $userInfo['id'], 'update', $userInfo['realname'], '', '', '重置了密码:' . $userInfo['realname']); // 重新设置缓存 session_start(); $cache['userInfo'] = $userInfo; $cache['authKey'] = user_md5($userInfo['username'] . $userInfo['password'] . session_id(), $userInfo['salt']); cache('Auth_' . $cache['authKey'], null); cache('Auth_' . $cache['authKey'], $cache, $loginExpire); return $cache['authKey'];//把auth_key传回给前端 } $this->error = '修改失败'; return false; } //根据IDs批量设置密码 public function updatePwdById($param) { $syncModel = new \app\admin\model\Sync(); $flag = true; if($param['user_id']!=1 && empty(!in_array(1,$param['id']))){ $this->error = '修改失败,无修改超级管理员权限'; return false; } foreach ($param['id'] as $value) { $password = ''; $userInfo = db('admin_user')->where(['id' => $value])->find(); $salt = substr(md5(time()), 0, 4); $temp['salt'] = $salt; $temp['password'] = $password = user_md5($param['password'], $salt, $userInfo['username']); $flag = $flag && Db::name('AdminUser')->where('id =' . $value)->update($temp); $syncData = []; $syncData['user_id'] = $value; $syncData['salt'] = $salt; $syncData['password'] = $password; $resSync = $syncModel->syncData($syncData); } if ($flag) { foreach ($param['id'] as $v) { $userInfo = db('admin_user')->where(['id' => $v])->find(); # 添加记录 SystemActionLog($param['user_id'], 'admin_user', 'employee', $v, 'update', $userInfo['realname'], '', '', '重置了密码:' . $userInfo['realname']); } return $flag; } else { $this->error = '修改失败,请稍后重试'; return false; } } /** * 获取菜单和权限 protected * * @param $u_id * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getMenuAndRule($u_id) { $menusList = []; $ruleMap = []; $adminTypes = adminGroupTypes($u_id); if (in_array(1, $adminTypes)) { $map['status'] = 1; $menusList = Db::name('admin_menu')->where($map)->order('sort asc')->select(); } else { $groups = $this->get($u_id)->groups; $ruleIds = []; foreach ($groups as $k => $v) { if (stringToArray($v['rules'])) { $ruleIds = array_merge($ruleIds, stringToArray($v['rules'])); } } $ruleIds = array_unique($ruleIds); $ruleMap['id'] = array('in', $ruleIds); $ruleMap['status'] = 1; } $newRuleIds = []; // 重新设置ruleIds,除去部分已删除或禁用的权限。 $rules = Db::name('admin_rule')->where($ruleMap)->select(); // $ruless = Db::name('admin_rule')->where($ruleMap)->where(['level'=>2,'pid'=>0])->column('name'); foreach ($rules as $k => $v) { $newRuleIds[] = $v['id']; $rules[$k]['name'] = strtolower($v['name']); if ($v['name'] == 'market') { $rules[$k]['name'] = 'activityForm'; } if($v['name'] == 'warehouseProduct'){ $rules[$k]['name'] = 'warehouseProduct'; } } // p($rules);die(); //菜单管理(弃用) // $menuMap['status'] = 1; // $menuMap['rule_id'] = array('in',$newRuleIds); // $menusList = Db::name('admin_menu')->where($menuMap)->order('sort asc')->select(); $ret = []; //处理菜单成树状 $tree = new \com\Tree(); //处理规则成树状 $rulesList = $tree->list_to_tree($rules, 'id', 'pid', 'child', 0, true, array('pid')); //权限数组 $authList = rulesListToArray($rulesList, $newRuleIds); //应用控制 $adminConfig = db('admin_config')->where(['pid' => 0, 'status' => 1])->column('module'); $adminConfig = $adminConfig ? array_merge($adminConfig, ['bi', 'admin']) : ['bi', 'admin']; # 通讯录 if (in_array('book', $adminConfig) && !empty($authList['oa']['addresslist']['index'])) { $authList['oa']['book']['index'] = true; } # 商业智能权限细化 if ($authList['bi']) { if (!in_array('taskExamine', $adminConfig) && !in_array('crm', $adminConfig)) { unset($authList['bi']); } else { foreach ($authList['bi'] as $key => $val) { if (!in_array('taskExamine', $adminConfig)) { unset($authList['bi']['oa']); } if (!in_array('crm', $adminConfig)) { unset($authList['bi']['customer']); unset($authList['bi']['business']); unset($authList['bi']['product']); unset($authList['bi']['achievement']); unset($authList['bi']['contract']); unset($authList['bi']['portrait']); unset($authList['bi']['ranking']); } } } } else { unset($authList['bi']); } # 任务审批 if (in_array('taskExamine', $adminConfig)) { $authList['oa']['taskExamine'] = (object)[]; } # 项目 if (in_array('work', $adminConfig)) { $authList['project']['projectLabelManage']['projectLabelAdd'] = !empty($authList['work']['work']['save']); $authList['project']['projectLabelManage']['projectLabelDelete'] = !empty($authList['work']['work']['save']); $authList['project']['projectLabelManage']['projectLabelUpdate'] = !empty($authList['work']['work']['save']); $authList['project']['projectManage']['save'] = !empty($authList['work']['work']['save']); } # 日志 if (in_array('log', $adminConfig)) { $authList['oa']['log'] = (object)[]; } # 日历 if (in_array('calendar', $adminConfig)) { $authList['oa']['calendar'] = (object)[]; } # 进销存 // if (in_array('jxc', $adminConfig)) { // $authList['jxc']['field'] = (object)[]; // $authList['jxc']['params'] = (object)[]; // } # 公海权限 $structureId = db('admin_user')->where('id', $u_id)->value('structure_id'); $poolStatus = db('crm_customer_pool')->where('status', 1)->where(function ($requery) use ($u_id, $structureId, $adminTypes) { if (!in_array(1, $adminTypes)) $requery->whereLike('admin_user_ids', '%,' . $u_id . ',%'); if (!in_array(1, $adminTypes)) $requery->whereOr('user_ids', 'like', '%,' . $u_id . ',%'); if (!in_array(1, $adminTypes)) $requery->whereOr('department_ids', 'like', '%,' . $structureId . ',%'); })->value('pool_id'); if (!empty($poolStatus)) $authList['crm']['pool'] = ['index' => true]; $ret['authList'] = $this->resetAuthorityFiled($authList); $res['manage'] = $rules; return $ret; } /** * todo 应前端要求修改部分权限字段,与java的权限字段保持一致。 * * @param $authList * @return mixed */ private function resetAuthorityFiled($authList) { # 客户 if (isset($authList['crm']['customer']['deal_status'])) { $authList['crm']['customer']['dealStatus'] = $authList['crm']['customer']['deal_status']; unset($authList['crm']['customer']['deal_status']); } if (isset($authList['crm']['customer']['nearby'])) { $authList['crm']['customer']['nearbyCustomer'] = $authList['crm']['customer']['nearby']; unset($authList['crm']['customer']['nearby']); } # 公海权限 $authList['crm']['customer']['pool'] = !empty($authList['crm']['pool']['index']);; # 跟进记录 $authList['crm']['followRecord'] = $authList['crm']['activity']; # 合同 if (isset($authList['crm']['contract']['discard'])) { $authList['crm']['contract']['discard'] = false; } # 发票 if (isset($authList['crm']['invoice']['setinvoice'])) { $authList['crm']['invoice']['updateInvoiceStatus'] = $authList['crm']['invoice']['setinvoice']; $authList['crm']['invoice']['resetInvoiceStatus'] = $authList['crm']['invoice']['resetinvoicestatus']; unset($authList['crm']['invoice']['resetinvoicestatus']); } # 市场活动 if (isset($authList['crm']['marketing']['updatestatus'])) { $authList['crm']['marketing']['updateStatus'] = $authList['crm']['marketing']['updatestatus']; unset($authList['crm']['marketing']['updatestatus']); } # 发票抬头权限 if (!empty($authList['crm']['invoice']['index'])) { $authList['crm']['invoiceTitle']['index'] = true; } unset($authList['work']['work']); unset($authList['work']['task']); unset($authList['work']['taskclass']); # admin:system if (!empty($authList['admin']['system']['index'])) { $authList['admin']['system']['read'] = $authList['admin']['system']['index']; unset($authList['admin']['system']['index']); } if (!empty($authList['admin']['system']['save'])) { $authList['admin']['system']['update'] = $authList['admin']['system']['save']; } # admin:configSet if (!empty($authList['admin']['configset']['index'])) { $authList['admin']['configSet']['read'] = $authList['admin']['configset']['index']; } if (!empty($authList['admin']['configset']['update'])) { $authList['admin']['configSet']['update'] = $authList['admin']['configset']['update']; } unset($authList['admin']['configset']); # admin:users if (!empty($authList['admin']['users']['index'])) { $authList['admin']['users']['read'] = $authList['admin']['users']['index']; unset($authList['admin']['users']['index']); } if (!empty($authList['admin']['users']['enables'])) { $authList['admin']['users']['userEnables'] = $authList['admin']['users']['enables']; unset($authList['admin']['users']['enables']); } if (!empty($authList['admin']['users']['save'])) { $authList['admin']['users']['userSave'] = $authList['admin']['users']['save']; unset($authList['admin']['users']['save']); } if (!empty($authList['admin']['users']['update'])) { $authList['admin']['users']['userUpdate'] = $authList['admin']['users']['update']; unset($authList['admin']['users']['update']); } if (!empty($authList['admin']['users']['structures_save'])) { $authList['admin']['users']['deptSave'] = $authList['admin']['users']['structures_save']; unset($authList['admin']['users']['structures_save']); } if (!empty($authList['admin']['users']['structures_update'])) { $authList['admin']['users']['deptUpdate'] = $authList['admin']['users']['structures_update']; unset($authList['admin']['users']['structures_update']); } if (!empty($authList['admin']['users']['structures_delete'])) { $authList['admin']['users']['deptDelete'] = $authList['admin']['users']['structures_delete']; unset($authList['admin']['users']['structures_delete']); } # admin:group 角色权限管理 if (!empty($authList['admin']['groups'])) { $authList['admin']['permission'] = $authList['admin']['groups']; unset($authList['admin']['groups']); } # admin:examine_flow if (!empty($authList['admin']['examine_flow'])) { $authList['admin']['examineFlow'] = $authList['admin']['examine_flow']; unset($authList['admin']['examine_flow']); } # admin:printing if (!empty($authList['admin']['crm']['printing'])) { $authList['admin']['crm']['print'] = $authList['admin']['crm']['printing']; unset($authList['admin']['crm']['printing']); } # admin:work if (!empty($authList['admin']['work']['work'])) { $authList['admin']['work']['update'] = $authList['admin']['work']['work']; unset($authList['admin']['work']['work']); } # admin:log if (isset($authList['admin']['adminlog']['loginlog'])) { $authList['admin']['adminLog']['loginLog'] = $authList['admin']['adminlog']['loginlog']; unset($authList['admin']['adminlog']['loginlog']); } if (isset($authList['admin']['adminlog']['actionrecord'])) { $authList['admin']['adminLog']['actionRecord'] = $authList['admin']['adminlog']['actionrecord']; unset($authList['admin']['adminlog']['actionrecord']); } if (isset($authList['admin']['adminlog']['systemlog'])) { $authList['admin']['adminLog']['systemLog'] = $authList['admin']['adminlog']['systemlog']; unset($authList['admin']['adminlog']['systemlog']); } unset($authList['admin']['adminlog']); # admin:initialize if (!empty($authList['admin']['initialize'])) { $authList['admin']['init']['initData'] = $authList['admin']['initialize']['update']; $authList['admin']['init']['index'] = $authList['admin']['initialize']['index']; unset($authList['admin']['initialize']); } # admin if (!empty($authList['admin'])) { $authList['manage'] = $authList['admin']; $adminAuth = [ 'configSet.read', 'crm.achievement', 'crm.field', 'crm.pool', 'crm.setting', 'examineFlow.index', 'init.initData', 'oa.examine', 'system.read', 'users.read', 'work.update', 'permission.update' ]; foreach ($authList['manage'] as $key1 => $value1) { foreach ($value1 as $key2 => $value2) { if (in_array($key1 . '.' . $key2, $adminAuth)) { $authList['manage']['other_rule'] = [ 'setwelcome' => true, 'setworklogrule' => true, 'welcome' => true, 'worklogrule' => true ]; } } } } if (empty($authList['manage']['other_rule'])) unset($authList['manage']); unset($authList['admin']); # 通讯录 $authList['email'] = (object)[]; $authList['hrm'] = (object)[]; // $authList['jxc'] = (object)[]; # jxc // $authList['manage']['jxc']['field'] = true; // $authList['manage']['jxc']['params'] = true; $authList['knowledge'] = (object)[]; return $authList; } /** * 获取权限结构数组 * @param */ public function getRulesList($uid) { $ruleMap = []; $adminTypes = adminGroupTypes($uid); if (in_array(1, $adminTypes)) { $map['status'] = 1; } else { $groups = $this->get($uid)->groups; $ruleIds = []; foreach ($groups as $k => $v) { if (stringToArray($v['rules'])) { $ruleIds = array_merge($ruleIds, stringToArray($v['rules'])); } } $ruleIds = array_unique($ruleIds); $ruleMap['id'] = array('in', $ruleIds); $ruleMap['status'] = 1; } $newRuleIds = []; // 重新设置ruleIds,除去部分已删除或禁用的权限。 $rules = Db::name('admin_rule')->where($ruleMap)->select(); foreach ($rules as $k => $v) { $newRuleIds[] = $v['id']; $rules[$k]['name'] = strtolower($v['name']); } //处理规则成树状 $tree = new \com\Tree(); $rulesList = $tree->list_to_tree($rules, 'id', 'pid', 'child', 0, true, array('pid')); $rulesList = rulesDeal($rulesList); return $rulesList ?: []; } /** * 获取用户所属角色(用户组) * @param */ public function getGroupTypeByAction($uid, $m, $c, $a) { //根据$m,$c,$a 获取对应的$a 的rule_id $rulesList = $this->getRulesList($uid); if (!in_array($m . '-' . $c . '-' . $a, $rulesList)) { return false; } $mRuleId = db('admin_rule')->where(['name' => $m, 'level' => 1])->value('id'); $cRuleId = db('admin_rule')->where(['name' => $c, 'level' => 2, 'pid' => $mRuleId])->value('id'); $aRuleId = db('admin_rule')->where(['name' => $a, 'level' => 3, 'pid' => $cRuleId])->value('id'); //获取用户组 $groups = $this->get($uid)->groups; if (!$groups) { return false; } $groupTypes = []; foreach ($groups as $g) { if (in_array($aRuleId, explode(',', trim($g['rules'], ',')))) { $groupTypes[] = $g['type']; } } return $groupTypes ?: []; } /** * 获取有此权限的角色 * @param */ public function getAllUserByAction($m, $c, $a) { $mRuleId = db('admin_rule')->where(['name' => $m, 'level' => 1])->value('id'); $cRuleId = db('admin_rule')->where(['name' => $c, 'level' => 2, 'pid' => $mRuleId])->value('id'); $aRuleId = db('admin_rule')->where(['name' => $a, 'level' => 3, 'pid' => $cRuleId])->value('id'); $groups = db('admin_group')->where(['rules' => ['in', $aRuleId]])->column('id'); $userIds = db('admin_access')->where(['group_id' => ['in', $groups]])->column('user_id'); if (!$userIds) { //查询管理员 $userIds = db('admin_user')->where(['id' => 1])->column('id'); } return $userIds; } /** * 根据部门获取部门的userId * @param $strId 部门ID * @param $type 2时包含所有下属部门 */ public function getSubUserByStr($structure_id, $type = 1) { // p($structure_id);die; $allStrIds = (array)$structure_id; if ($type == 2) { $structureModel = new \app\admin\model\Structure(); foreach ($allStrIds as $v) { $allSubStrIds = []; $allSubStrIds = $structureModel->getAllChild($v); if ($allSubStrIds) { $allStrIds = array_merge($allStrIds, $allSubStrIds); //全部关联部门(包含下属部门) } } } $userIds = db('admin_user')->where(['structure_id' => ['in', $allStrIds]])->column('id'); return $userIds ?: []; } /** * [getUserById 根据主键获取详情] * @param * @return */ public function getUserById($id = '') { $data = Db::name('AdminUser') ->alias('user') ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') ->where(['user.id' => $id]) ->field([ 'user.id', 'username', 'img', 'thumb_img', 'realname', 'parent_id', 'structure.name' => 'structure_name', 'structure.id' => 'structure_id' ]) // ->cache('user_info' . $id, null, 'user_info') ->find(); $data['img'] = $data['img'] ? getFullPath($data['img']) : ''; $data['thumb_img'] = $data['thumb_img'] ? getFullPath($data['thumb_img']) : ''; return $data ?: []; } /** * [getUserNameById 根据主键获取详情] * @param * @return */ public function getUserNameById($id = '') { $data = $this->where(['id' => $id])->value('realname'); return $data ?: '查看详情'; } /** * [getUserNameByArr 根据主键获取详情] * @param * @return */ public function getUserNameByArr($ids = []) { if (!is_array($ids)) { $idArr[] = $ids; } else { $idArr = $ids; } $data = $this->where(['id' => array('in', $idArr)])->column('realname'); return $data ?: []; } /** * [getAdminId 获取管理员ID] * @param * @return */ public function getAdminId() { $adminGroupUser = db('admin_access')->where(['group_id' => 1])->column('user_id'); $userIDs = $adminGroupUser ? array_merge($adminGroupUser, [1]) : [1]; return $userIDs ?: [1]; } /** * [getUserByIdArr 根据ID数组获取列表] * @param * @return */ public function getUserByIdArr($ids = []) { $list = $this ->alias('user') ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') ->where(['user.id' => ['in', $ids]])->field('user.id,username,img,thumb_img,realname,parent_id,structure.name as structure_name,structure.id as structure_id')->select(); return $list ?: []; } /** * [getUserByPer 获取权限范围的user_id] * @param * @return */ public function getUserByPer($m = '', $c = '', $a = '') { $request = Request::instance(); $header = $request->header(); $authKey = $header['authkey']; $m = $m ? strtolower($m) : strtolower($request->module()); $c = $c ? strtolower($c) : strtolower($request->controller()); $a = $a ? strtolower($a) : strtolower($request->action()); $cache = cache('Auth_' . $authKey); if (!$cache) { return false; } $userInfo = $cache['userInfo']; //用户所属用户组类别(数组) $groupTypes = $this->getGroupTypeByAction($userInfo['id'], $m, $c, $a); //数组去重 $groupTypes = $groupTypes ? array_unique($groupTypes) : []; //用户组类别(1本人,2本人及下属,3本部门,4本部门及下属部门,5全部) $adminIds = $this->getAdminId(); $userIds = []; if (in_array($userInfo['id'], $adminIds)) { $userIds = getSubUserId(true, 1); } else { if (!$groupTypes) { return []; } if (in_array(5, $groupTypes)) { $userIds = getSubUserId(true, 1); } else { foreach ($groupTypes as $v) { if ($v == 1) { $userIds = [$userInfo['id']]; } elseif ($v == 2) { $userIds = getSubUserId(); } elseif ($v == 3) { $userIds = $this->getSubUserByStr($userInfo['structure_id']); } elseif ($v == 4) { $userIds = $this->getSubUserByStr($userInfo['structure_id'], 2); } } } } return $userIds ?: []; } /* *根据部门ID获取员工列表 * */ public function getUserListByStructureId($structure_id = '') { $map = array(); if ($structure_id) { $map['structure_id'] = $structure_id; } $list = Db::name('AdminUser')->field('id as user_id,realname,post,structure_id')->where($map)->select(); return $list ?: []; } /* *根据字符串返回数组 * */ public function getListByStr($str) { $idArr = stringToArray($str); $list = db('admin_user')->field('id,username,realname,thumb_img')->where(['id' => ['in', $idArr]])->select(); return $list; } /* *读写权限 * */ public function rwPre($user_id, $ro_user_id, $rw_user_id, $action = 'read') { if ($action == 'update') { if (!in_array($user_id, stringToArray($rw_user_id))) { return false; } } else { if (!in_array($user_id, stringToArray($ro_user_id))) { return false; } } return true; } /** * [getUserThree 员工第三方扩展信息] * @param key 分类 * @return [array] * @author Michael_xu */ public function getUserThree($key, $user_id) { $resValue = db('admin_user_threeparty')->where(['key' => $key, 'user_id' => $user_id])->value('value'); return $resValue ?: ''; } /** * 获取当前登录用户信息 * * @param string $key 默认返回所有信息 * @return mixed * @author Ymob * @datetime 2019-10-22 14:38:07 */ public static function userInfo($key = '') { $request = Request::instance(); $header = $request->header(); $authKey = $header['authkey']; $sessionId = $header['sessionid']; $paramArr = $request->param(); $platform = $paramArr['platform'] ? '_' . $paramArr['platform'] : ''; //请求平台(mobile,ding) $cache = cache('Auth_' . $authKey . $platform); if ($cache) { if ($key) { return $cache['userInfo'][$key]; } else { return $cache['userInfo']; } } else { return false; } } /** * 判断用户是否拥有 某(些) 角色 * * @param array $group_list * @param integer $user_id * @return bool * @author Ymob * @datetime 2019-10-25 15:50:48 */ public static function checkUserGroup($group_list = [], $user_id = 0) { $user_id = $user_id ?: self::userInfo('id'); if (empty($group_list)) return !!Access::where(['user_id' => $user_id, 'group_id' => ['IN', $group_list]])->value('user_id'); } /** * 顶部菜单栏显示 * @param $param * @return array */ public function sortList($param) { $list = Db::name('admin_sort')->where('user_id', $param['user_id'])->field('value')->find(); $list = unserialize($list['value']); return $list ?: []; } /** * 修改顶部菜单显示 * @param $param */ public function updateSort($param) { $list = Db::name('admin_sort')->where('user_id', $param['user_id'])->field('value')->select(); if ($list) { $data = Db::name('admin_sort')->where('user_id', $param['user_id'])->update(['value' => serialize($param['value'])]); } else { $data = Db::name('admin_sort')->insert(['user_id' => $param['user_id'], 'value' => serialize($param['value'])]); } return $data; } /** * 复制员工角色 * * @param $param * @return bool */ public function copyRole($param) { $userIds = !empty($param['user_id']) ? $param['user_id'] : []; $structureIds = !empty($param['structure_id']) ? $param['structure_id'] : []; $groupIds = !empty($param['group_id']) ? $param['group_id'] : []; if($param['userId']!=1 && empty(!in_array(1,$userIds))){ $this->error = '修改失败,无复制超级管理员权限'; return false; } # 员工与角色关联数据 $userGroup = []; # 查询部门下的员工ID if (!empty($structureIds)) { $userIds = Db::name('admin_user')->whereIn('structure_id', $param['structure_id'])->column('id'); $userIds = array_unique((array)$userIds); } Db::startTrans(); try { # 删除员工角色关联数据 Db::name('admin_access')->whereIn('user_id', $userIds)->delete(); # 重新设置员工角色 foreach ($userIds as $key => $value) { # 默认跳过超级管理员 if ($value == 1) continue; foreach ($groupIds as $k => $v) { $userGroup[] = [ 'user_id' => $value, 'group_id' => $v ]; } } if (!empty($userGroup)) Db::name('admin_access')->insertAll($userGroup); Db::commit(); foreach ($userIds as $key => $value) { $userInfo = Db::name('admin_user')->where('id', $value)->find(); SystemActionLog($param['userId'], 'admin_user', 'employee', $value, 'update', $userInfo['realname'], '', '', '编辑员工角色:' . $userInfo['realname']); } return true; } catch (\Exception $e) { Db::rollback(); return false; } } /** * 重设部门 * @param array $ids 用户id * @param $param 部门id * * @author alvin guogaobo * @version 1.0 版本号 * @since 2021/4/24 0024 14:05 * */ public function setUserDept($ids = [], $param) { if (empty($ids)) { $this->error = '参数错误'; return false; } $data=[]; foreach ($ids as $v) { $res['id'] = $v; $res['structure_id'] = $param['structure_id']; $data[] = $res; } $flag=$this->isUpdate(true)->saveAll($data); if ($flag!==false) { return 1; } else { $this->error = '修改失败,请稍后重试'; return false; } } /** * 员工分类总数 * @author alvin guogaobo * @version 1.0 版本号 * @since 2021/4/24 0024 14:42 */ public function countNumOfUser() { //全部 // $data['allUserCount']=$this->count(); // //未激活 // $data['inactiveCount']=$this->where('status',2)->count(); // //激活 // $data['activateCount']=$this->where('status',1)->count(); // //停用 // $data['disableCount']=$this->where('status',0)->count(); // //新增 // $data['addNewlyCount']=$this->where('create_time','gt',strtotime('-1 week'))->count(); $time = strtotime('-1 week'); $list = db('admin_user')->field([ 'count(id) as allUserCount, count(case status when 2 then id else null end) as inactiveCount, count(case status when 1 then id else null end) as activateCount, count(case status when 0 then id else null end) as disableCount, count(case when create_time >' . $time . ' then id else null end) as addNewlyCount ' ])->select(); $data = []; $data['list'] = $list; return $data; } }