'account@pam', ); public $has_many = array( 'roles' => 'hasrole:replace', ); public $subSdf = array( 'default' => array( 'pam_account:account@pam' => array('*'), ), 'delete' => array( 'pam_account:account@pam' => array('*'), 'roles' => array('*'), ), ); private $templateColumn = array( '*:用户名*' => 'login_name', '*:姓名*' => 'name', '*:手机号码*' => 'mobile', '*:密码*' => 'login_password', '*:工号' => 'op_no', '*:工作角色(以|间隔)' => 'role', '*:仓库编码(以|间隔)' => 'branch', '*:运营组织(以|间隔)' => 'org_id', '*:启用' => 'status', '*:备注' => 'memo', '*:邮箱*' => 'email', ); /** * pre_recycle * @param mixed $data 数据 * @return mixed 返回值 */ public function pre_recycle($data) { $obj_pam = app::get('pam')->model('account'); $falg = true; $users = kernel::single('desktop_user'); foreach ($data as $val) { if ($users->user_id == $val['user_id']) { $this->recycle_msg = app::get('desktop')->_('自己不能删除自己'); $falg = false; break; } else { if ($val['user_id'] == 1) { $this->recycle_msg = app::get('desktop')->_('子账号不能删除超级管理员'); $falg = false; break; } } } $this->app->model('user_logs')->deleteUser($data); return $falg; } /** * pre_restore * @param mixed $data 数据 * @param mixed $restore_type restore_type * @return mixed 返回值 */ public function pre_restore(&$data, $restore_type = 'add') { if (!($this->check_name($data['pam_account']['login_name']))) { $data['need_delete'] = true; return true; } else { if ($restore_type == 'add') { $new_name = $data['pam_account']['login_name'] . '_1'; while ($this->check_name($new_name)) { $new_name = $new_name . '_1'; } $data['pam_account']['login_name'] = $new_name; $data['need_delete'] = true; return true; } if ($restore_type == 'none') { $data['need_delete'] = false; return true; } } } /** * editUser * @param mixed $data 数据 * @return mixed 返回值 */ public function editUser(&$data) { if ($data['userpass']) { // 编辑用户时,如果传入了 is_hash256,使用传入的值;否则使用新加密方式(1) $is_hash256 = 1; // 默认使用新加密方式 if (isset($data['pam_account']['is_hash256'])) { // 如果传入了 is_hash256,使用传入的值 $is_hash256 = intval($data['pam_account']['is_hash256']); } // 使用指定的加密方式生成新密码 $data[':account@pam']['login_password'] = pam_encrypt::get_encrypted_password(trim($data['userpass']), pam_account::get_account_type($this->app->app_id), $is_hash256); } /* else{ $data[':account@pam']['login_password'] = trim($data['oldpass']); } */ $data['pam_account']['account_type'] = pam_account::get_account_type($this->app->app_id); //$data['pam_account']['createtime'] = time(); if (isset($data['email'])) { $data['email'] = trim($data['email']); } $data['mobile'] = trim($data['mobile']); return parent::save($data); } ### ##检查用户名 /** * 检查_name * @param mixed $login_name login_name * @return mixed 返回验证结果 */ public function check_name($login_name) { $pam = app::get('pam')->model('account'); $account_type = pam_account::get_account_type($this->app->app_id); $aData = $pam->getList('*', array('login_name' => $login_name, 'account_type' => $account_type)); $result = $aData[0]['account_id']; if ($result) { return true; } else { return false; } } ###更新登陆信息 /** * 更新_admin * @param mixed $user_id ID * @return mixed 返回值 */ public function update_admin($user_id) { $aUser = $this->dump($user_id, '*'); $sdf[':account@pam']['account_id'] = $user_id; $sdf['lastlogin'] = time(); $sdf['logincount'] = $aUser['logincount'] + 1; $this->save($sdf); } ##检查 /** * 验证 * @param mixed $aData 数据 * @param mixed $msg msg * @return mixed 返回验证结果 */ public function validate($aData, &$msg) { if ($aData['pam_account']['login_name'] == '' || $aData['pam_account']['login_password'] == '' || $aData['name'] == '') { $msg = app::get('desktop')->_('必填项不能为空'); return false; } $userLib = kernel::single('desktop_user'); if (!$userLib->checkUserPassWordLength('',$aData['pam_account']['login_password'], $error_msg)) { $msg = app::get('desktop')->_($error_msg); return false; } if (!$userLib->validPassWord($aData['pam_account']['login_password'], $error_msg)) { $msg = app::get('desktop')->_($error_msg); return false; } if (!$userLib->checkPassword($aData['pam_account']['login_password'], $error_msg)) { $msg = app::get('desktop')->_($error_msg); return false; } if ($aData['pam_account']['login_password'] != $_POST['re_password']) { $msg = app::get('desktop')->_('两次密码输入不一致'); return false; } if (strlen($aData['mobile']) != '11' || !is_numeric($aData['mobile'])) { $msg = app::get('desktop')->_('手机号码格式不正确'); return false; } $result = $this->check_name($aData['pam_account']['login_name']); if ($result) { $msg = app::get('desktop')->_('该用户名已存在'); return false; } return true; } //获取工作组细分 /** * detail_per * @param mixed $check_id ID * @param mixed $user_id ID * @return mixed 返回值 */ public function detail_per($check_id, $user_id) { $roles = $this->app->model('roles'); $menus = $this->app->model('menus'); $aPermission = array(); if (!$check_id) { echo '';exit; } foreach ($check_id as $val) { $result = $roles->dump($val); $data = unserialize($result['workground']); foreach ((array) $data as $row) { $aPermission[] = $row; } } $aPermission = array_unique($aPermission); if (!$aPermission) { echo '';exit; } $html = ''; $addonmethod = array(); foreach ((array) $aPermission as $val) { $sdf = $menus->dump(array('menu_type' => 'permission', 'permission' => $val)); $addon = unserialize($sdf['addon']); if ($addon['show'] && $addon['save']) { //如果存在控制 if (!in_array($addon['show'], $addonmethod)) { $access = explode(':', $addon['show']); $classname = $access[0]; $method = $access[1]; $obj = kernel::single($classname); $html .= $obj->$method($user_id); } $addonmethod[] = $addon['show']; } else { echo ''; } } return $html; } //保存工作组细分 /** * 保存_per * @param mixed $aData 数据 * @return mixed 返回操作结果 */ public function save_per($aData) { $workgrounds = $aData['role']; $menus = $this->app->model('menus'); $roles = $this->app->model('roles'); $aPermission = []; foreach ($workgrounds as $val) { $result = $roles->dump($val); $data = unserialize($result['workground']); foreach ((array) $data as $row) { $aPermission[] = $row; } } $aPermission = array_unique($aPermission); if ($aPermission) { $addonmethod = array(); foreach ((array) $aPermission as $key => $val) { $sdf = $menus->dump(array('menu_type' => 'permission', 'permission' => $val)); $addon = unserialize($sdf['addon']); if ($addon['show'] && $addon['save']) { //如果存在控制 if (!in_array($addon['save'], $addonmethod)) { $access = explode(':', $addon['save']); $classname = $access[0]; $method = $access[1]; $obj = kernel::single($classname); $obj->$method($aData['user_id'], $aData); } $addonmethod[] = $addon['save']; } } } } //获取工作组细分 /** * detail_per_group * @param mixed $check_id ID * @param mixed $user_id ID * @return mixed 返回值 */ public function detail_per_group($check_id, $user_id) { $roles = $this->app->model('roles'); $menus = $this->app->model('menus'); $aPermission = array(); if (!$check_id) { return []; } foreach ($check_id as $val) { $result = $roles->dump($val); $data = unserialize($result['workground']); foreach ((array) $data as $row) { $aPermission[] = $row; } } $aPermission = array_unique($aPermission); if (!$aPermission) { return []; } $addonmethod = array(); foreach ((array) $aPermission as $val) { $sdf = $menus->dump(array('menu_type' => 'permission', 'permission' => $val)); $addon = unserialize($sdf['addon']); if ($addon['show'] && $addon['save']) { //如果存在控制 if (!in_array($addon['show'], $addonmethod)) { $access = explode(':', $addon['show']); $classname = $access[0]; $method = $access[1]; $obj = kernel::single($classname); $info = $obj->$method($user_id); if ($addon['show'] == 'ome_roles:show_branch') { $html['branch'] = $info; } elseif ($addon['show'] == 'ome_roles:show_o2o_branch') { $html['o2o_branch'] = $info; #o2o门店线下仓库 } else { $html['order'] = $info; } } $addonmethod[] = $addon['show']; } else { //echo ''; } } return $html; } /** * * 彻底删除管理员的同时,清除相关的角色权限关联信息 * @param int $userid */ public function suf_delete($userid) { $hasRoleObj = app::get('desktop')->model('hasrole'); $hasRoleObj->delete(array('user_id' => $userid)); return true; } public function modifier_mobile($col, $list, $row) { $is_encrypt = kernel::single('ome_security_hash')->check_encrypt($col); if (!$is_encrypt) return $col; $id = $row['user_id']; $encryptCol = kernel::single('ome_view_helper2')->modifier_ciphertext($col,'member','name'); $return =<<{$encryptCol} HTML; return $col?$return:$col; } /** * modifier_name * @param mixed $col col * @param mixed $list list * @param mixed $row row * @return mixed 返回值 */ public function modifier_name($col, $list, $row) { if ($this->is_export_data) { return $col; } $is_encrypt = kernel::single('ome_security_hash')->check_encrypt($col); if (!$is_encrypt) return $col; $id = $row['user_id']; $encryptCol = kernel::single('ome_view_helper2')->modifier_ciphertext($col,'member','name'); $return =<<{$encryptCol} HTML; return $col?$return:$col; } /** * modifier_user_id * @param mixed $col col * @param mixed $list list * @param mixed $row row * @return mixed 返回值 */ public function modifier_user_id($col, $list, $row) { $rowAc = app::get('pam')->model('account')->db_dump(['account_id'=>$col], 'login_name'); $col = $rowAc['login_name']; $is_encrypt = kernel::single('ome_security_hash')->check_encrypt($col); if (!$is_encrypt) return $col; $id = $row['user_id']; $encryptCol = kernel::single('ome_view_helper2')->modifier_ciphertext($col,'member','name'); $return =<<{$encryptCol} HTML; return $col?$return:$col; } /** * 搜索Options * @return mixed 返回值 */ public function searchOptions() { $parentOptions = parent::searchOptions(); $childOptions = array( 'login_name' => app::get('ome')->_('用户名'), 'name' => app::get('ome')->_('姓名'), ); return $Options = array_merge($parentOptions, $childOptions); } /** * _filter * @param mixed $filter filter * @param mixed $tableAlias tableAlias * @param mixed $baseWhere baseWhere * @return mixed 返回值 */ public function _filter($filter, $tableAlias = null, $baseWhere = null) { $where = array(); //pam_account表 用户名 if (isset($filter['login_name'])) { $mdl_pam_account = app::get('pam')->model('account'); $rs_pam_account = $mdl_pam_account->dump(array("login_name" => addslashes($filter['login_name']))); if (!empty($rs_pam_account)) { $where[] = "user_id=" . $rs_pam_account["account_id"]; } else { $where[] = "user_id=-1"; } unset($filter['login_name']); } if (isset($filter['name'])) { $where[] = "name='" . addslashes($filter['name']) . "'"; unset($filter['name']); } //desktop_users表 姓名 $sWhere = parent::_filter($filter, $tableAlias, $baseWhere); if (!empty($where)) { $sWhere .= " AND " . implode(" and ", $where); } return $sWhere; } /** * 保存_operation_permission * @param mixed $params 参数 * @return mixed 返回操作结果 */ public function save_operation_permission($params) { if (!$params['user_id'] || !$params['org_id']) { return false; } $operationOpsObj = app::get('ome')->model('operation_ops'); //删除原权限 $operationOpsObj->delete(array('op_id' => $params['user_id'])); foreach ($params['org_id'] as $org_id) { //保存现有 $addOperPer = array( 'org_id' => $org_id, 'op_id' => $params['user_id'], ); $operationOpsObj->insert($addOperPer); } } /** * 获取TemplateColumn * @return mixed 返回结果 */ public function getTemplateColumn() { $title = array(); foreach (array_keys($this->templateColumn) as $v) { $title[] = kernel::single('base_charset')->utf2local($v); } return $title; } /** * prepared_import_csv * @return mixed 返回值 */ public function prepared_import_csv() { $this->ioObj->cacheTime = time(); } /** * prepared_import_csv_row * @param mixed $row row * @param mixed $title title * @param mixed $tmpl tmpl * @param mixed $mark mark * @param mixed $newObjFlag newObjFlag * @param mixed $msg msg * @return mixed 返回值 */ public function prepared_import_csv_row($row, &$title, &$tmpl, &$mark, &$newObjFlag, &$msg) { if (empty($row)) { return false; } foreach ($row as $k => $v) { $encode = mb_detect_encoding($v, array("ASCII", 'UTF-8', "GB2312", "GBK", 'BIG5')); if ('UTF-8' != $encode) { $v = mb_convert_encoding($v, 'UTF-8', $encode); } $row[$k] = $v; } if (substr($row[0], 0, 1) == '*') { $this->nums = 1; $this->allLoginName = array(); $this->import_data = array(); $title = array_flip($row); foreach ($this->templateColumn as $k => $val) { if (!isset($title[$k])) { $msg['error'] = '请使用正确的模板'; return false; } } return false; } if (empty($title)) { $msg['error'] = "请使用正确的模板格式!"; return false; } $arrData = array(); foreach ($this->templateColumn as $k => $val) { $arrData[$val] = trim($row[$title[$k]]); } if (isset($this->nums)) { $this->nums++; if ($this->nums > 5000) { $msg['error'] = "导入的数据量过大,请减少到5000条以下!"; return false; } } if (empty($arrData['login_name'])) { $msg['warning'][] = 'Line ' . $this->nums . ':用户名不能为空!'; return false; } // 判断账号是否存在 $account_id = null; $account = app::get('pam')->model('account')->db_dump(['login_name' => $arrData['login_name']], 'login_name,account_id'); if ($account) { $user = app::get('desktop')->model('users')->db_dump(['user_id' => $account['account_id']], 'user_id,super'); if ($user && $user['super'] == '1') { $msg['warning'][] = 'Line ' . $this->nums . ':超级管理员不能导入!'; return false; } $account_id = $account['account_id']; } if (empty($arrData['name'])) { $msg['warning'][] = 'Line ' . $this->nums . ':姓名不能为空!'; return false; } if (empty($arrData['login_password']) && !$account_id) { $msg['warning'][] = 'Line ' . $this->nums . ':密码不能为空!'; return false; } if (in_array($arrData['login_name'], $this->allLoginName)) { $msg['warning'][] = 'Line ' . $this->nums . ':用户名重复!'; return false; } $this->allLoginName[$this->nums] = $arrData['login_name']; if (strlen($arrData['mobile']) != '11' || !is_numeric($arrData['mobile'])) { $msg['warning'][] = 'Line ' . $this->nums . ':手机号码格式不正确!'; return false; } $roleId = array(); $rolesId = array(); if ($arrData['role']) { $roleName = explode('|', $arrData['role']); $rolesData = app::get('desktop')->model('roles')->getList('role_id', array('role_name' => $roleName)); if (empty($rolesData)) { $msg['warning'][] = 'Line ' . $this->nums . ':工作角色没有找到!'; return false; } foreach ($rolesData as $roles) { $roleId[] = $roles['role_id']; $rolesId[] = $roles; } } $branchId = array(); $selected_store_bn = ''; if ($arrData['branch']) { $branchBn = explode('|', $arrData['branch']); $branchData = app::get('ome')->model('branch')->getList('branch_id,b_type,branch_bn', array('branch_bn' => $branchBn, 'check_permission' => 'false')); if (empty($branchData)) { $msg['warning'][] = 'Line ' . $this->nums . ':仓库未找到!'; return false; } foreach ($branchData as $val) { if ($val['b_type'] == '2') { $selected_store_bn = $val['branch_bn']; } else { $branchId[] = $val['branch_id']; } } } $orgId = []; if($arrData['org_id']) { $orgName = explode('|', $arrData['org_id']); $orgData = app::get('ome')->model('operation_organization')->getList('org_id', ['name'=>$orgName]); if (empty($orgData)) { $msg['warning'][] = 'Line ' . $this->nums . ':组织未找到!'; return false; } $orgId = array_column($orgData, 'org_id'); } $accountType = pam_account::get_account_type('desktop'); $sdf = array( 'pam_account' => array( 'login_name' => $arrData['login_name'], 'login_password' => pam_encrypt::get_encrypted_password($arrData['login_password'], $accountType), 'account_type' => $accountType, 'create_time' => time(), 'account_id' => $account_id, ), 'op_no' => $arrData['op_no'], 'memo' => $arrData['memo'], 'mobile' => $arrData['mobile'], 'email' => $arrData['email'], 'name' => $arrData['name'], 'status' => $arrData['status'] == '否' ? '0' : '1', 'role' => $roleId, 'roles' => $rolesId, 'selected_store_bn' => $selected_store_bn, 'branch' => $branchId, 'org_id' => $orgId, ); $this->import_data[] = $sdf; $mark = 'contents'; return true; } /** * prepared_import_csv_obj * @param mixed $data 数据 * @param mixed $mark mark * @param mixed $tmpl tmpl * @param mixed $msg msg * @return mixed 返回值 */ public function prepared_import_csv_obj($data, $mark, $tmpl, &$msg = '') { // $shop = app::get('pam')->model('account')->db_dump(array('login_name' => $this->allLoginName), 'login_name'); // if ($shop) { // $key = array_search($shop['login_name'], $this->allLoginName); // $msg['error'] = 'Line ' . $key . ':用户名已经存在!'; // return false; // } return null; } /** * finish_import_csv * @return mixed 返回值 */ public function finish_import_csv() { $oQueue = app::get('base')->model('queue'); $queueData = array( 'queue_title' => '操作人员信息导入', 'start_time' => time(), 'params' => array( 'sdfdata' => $this->import_data, ), 'worker' => 'desktop_mdl_users.import_run', ); $oQueue->save($queueData); $oQueue->flush(); } /** * import_run * @param mixed $cursor_id ID * @param mixed $params 参数 * @param mixed $errormsg errormsg * @return mixed 返回值 */ public function import_run($cursor_id, $params, $errormsg) { $imData = $params['sdfdata']; foreach ($imData as $opData) { try { $account_id = $opData['pam_account']['account_id']; if ($account_id) { // 不允许更新账号及密码 $opData['pam_account'] = ['account_id' => $account_id]; // 更新账号 if ($this->editUser($opData)) { $this->save_per($opData); if ($opData['org_id']) { $this->save_operation_permission($opData); } app::get('desktop')->model('user_logs')->userEdit($opData); // IDAAS同步账号 - 更新 $user_data = $this->dump($account_id, '*', array(':account@pam' => array('*'))); if ($user_data) { kernel::single('desktop_user_auth')->sync_account(array( 'account_id' => $account_id, 'login_name' => $user_data['account']['login_name'], 'login_password' => $user_data['account']['login_password'], ), 'update'); } } } else { // 创建账号 if ($this->save($opData)) { foreach (kernel::servicelist('desktop_useradd') as $key => $service) { if ($service instanceof desktop_interface_useradd) { $service->useradd($opData); } } $this->save_per($opData); $this->save_operation_permission($opData); app::get('desktop')->model('user_logs')->addUser($opData); // IDAAS同步账号 - 新增 $user_data = $this->dump($opData['pam_account']['account_id'], '*', array(':account@pam' => array('*'))); if ($user_data) { kernel::single('desktop_user_auth')->sync_account(array( 'account_id' => $opData['pam_account']['account_id'], 'login_name' => $user_data['account']['login_name'], 'login_password' => $user_data['account']['login_password'], ), 'add'); } } } } catch (Exception $e) {} } return false; } function fgetlist_csv( &$data,$filter,$offset,$exportType = 1 ) { $fields = $filter['export_fields']; unset($filter['export_fields']); $params = array( 'fields' => $fields, 'filter' => $filter, 'has_detail' => false, 'curr_sheet' => 1, ); $exportLib = kernel::single('desktop_finder_export'); $data = $exportLib->work(__CLASS__,$params); return false; } }