You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

468 lines
19 KiB

<?php
/*
* @copyright Leyun internet Technology(Shanghai)Co.,Ltd
* @license http://www.dzzoffice.com/licenses/license.txt
* @package DzzOffice
* @link http://www.dzzoffice.com
* @author zyx(zyx@dzz.cc)
*/
if (!defined('IN_DZZ')) {
exit('Access Denied');
}
$do = isset($_GET['do']) ? trim($_GET['do']) : '';
$isadmin = true;
if ($_G['adminid'] != 1) {
$isadmin = false;
if (!C::t('organization_admin')->fetch_orgids_by_uid($_G['uid'])) {
if($do == 'importing') exit(json_encode(array('error' => lang('orguser_import_user'))));
showmessage('orguser_import_user', dreferer());
}
}
require_once libfile('function/organization');
$navtitle = lang('user_import') . ' - ' . lang('appname');
if ($do == 'importing') {
$orgid = intval($_GET['orgid']);
if(!$orgid && !$isadmin) exit(json_encode(array('error' => '机构部门管理员需要选择导入机构才能导入')));
//判断邮箱是否存在
require_once libfile('function/user', '', 'user');
$email = trim($_GET['email']);
$_GET['username'] = addslashes(trim(stripslashes(trim($_GET['username']))));
$_GET['username'] = str_replace('...', '', getstr($_GET['username'], 30));
$_GET['password'] = empty($_GET['password']) ? trim($_GET['pswdefault']) : trim($_GET['password']);
$_GET['weixinid'] = addslashes(trim(stripslashes(trim($_GET['weixinid']))));
$_GET['mobile'] = addslashes(trim(stripslashes(trim($_GET['mobile']))));
if (empty($email) || empty($_GET['username'])) exit(json_encode(array('error' => lang('name_email_empty'))));
if (!isemail($email)) exit(json_encode(array('error' => 'email' . lang('format_error'))));
$isappend = intval($_GET['append']);
$sendmail = intval($_GET['sendmail']);
if(!$isadmin) $isappend = 1;
/*
if($sendmail){ //随机密码时重新设置密码为随机数;
$_GET['password']=random(8);
}*/
$exist = 0;
//检查用户是否已经存在
if (($user = C::t('user')->fetch_by_email($email)) || ($user = C::t('user')->fetch_by_username($_GET['username']))) {//用户已经存在时
$uid = $user['uid'];
$exist = 1;
if ($isfounder = C::t('user')->checkfounder($user)) $isappend = 1;//创始人不支持覆盖导入
if ($isappend) {//增量添加,如果原先没有nickname,增加
$appendfield = array();
if ($_GET['mobile'] && empty($user['phone'])) {
if (!preg_match("/^\d+$/", $_GET['mobile'])) {
exit(json_encode(array('error' => lang('phone_number_illegal'))));
}
if (C::t('user')->fetch_by_phone($_GET['mobile'])) {
exit(json_encode(array('error' => lang('user_phone_exist'))));
}
$appendfield['phone'] = $_GET['mobile'];
}
if ($_GET['weixinid'] && empty($user['weixinid'])) {
if (!preg_match("/^[a-zA-Z\d_]{5,}$/i", $_GET['weixinid'])) {
exit(json_encode(array('error' => lang('weixin_illegal'))));
}
if (C::t('user')->fetch_by_weixinid($_GET['weixinid'])) {
exit(json_encode(array('error' => lang('weixin_exist'))));
}
$appendfield['weixinid'] = $_GET['weixinid'];
}
if ($appendfield) C::t('user')->update($uid, $appendfield);
} else { //覆盖导入时,覆盖用户的姓名和密码
$salt = substr(uniqid(rand()), -6);
if (!check_username($_GET['username'])) exit(json_encode(array('error' => lang('user_name_sensitive'))));
$setarr = array('username' => $_GET['username'],
'password' => md5(md5($_GET['password']) . $salt),
'salt' => $salt
);
if ($_GET['mobile'] && $_GET['mobile'] != $user['phone']) {
if (!preg_match("/^\d+$/", $_GET['mobile'])) {
exit(json_encode(array('error' => lang('phone_number_illegal'))));
}
if (C::t('user')->fetch_by_phone($_GET['mobile'])) {
exit(json_encode(array('error' => lang('user_phone_exist'))));
}
$setarr['phone'] = $_GET['mobile'];
}
if ($_GET['weixinid'] && $_GET['weixinid'] != $user['weixinid']) {
if (!preg_match("/^[a-zA-Z\d_]{5,}$/i", $_GET['weixinid'])) {
exit(json_encode(array('error' => lang('weixin_illegal'))));
}
if (C::t('user')->fetch_by_weixinid($_GET['weixinid'])) {
exit(json_encode(array('error' => lang('weixin_exist'))));
}
$setarr['weixinid'] = $_GET['weixinid'];
}
C::t('user')->update($uid, $setarr);
if ($sendmail) { //发送密码到用户邮箱,延时发送
$email_password_message = lang('email_password_message', array(
'sitename' => $_G['setting']['sitename'],
'siteurl' => $_G['siteurl'],
'email' => $email,
'password' => $_GET['password']
));
if (!sendmail_cron("$email <$email>", lang('email_password_subject'), $email_password_message)) {
runlog('sendmail', "$email sendmail failed.");
}
}
}
} else { //新添用户
if (!check_username($_GET['username'])) exit(json_encode(array('error' => lang('user_name_sensitive'))));
$user = uc_add_user($_GET['username'], $_GET['password'], $email);
$uid = $user['uid'];
if ($uid < 1) exit(json_encode(array('error' => lang('import_failure'))));
$base = array(
'uid' => $uid,
'adminid' => 0,
'groupid' => 9,
'regdate' => TIMESTAMP,
'emailstatus' => 1,
);
if ($_GET['mobile']) {
if (!preg_match("/^\d+$/", $_GET['mobile'])) {
} elseif (C::t('user')->fetch_by_phone($_GET['mobile'])) {
} else {
$base['phone'] = $_GET['mobile'];
}
}
if ($_GET['weixinid']) {
if (!preg_match("/^[a-zA-Z\d_]{5,}$/i", $_GET['weixinid'])) {
} elseif (C::t('user')->fetch_by_weixinid($_GET['weixinid'])) {
} else {
$base['weixinid'] = $_GET['weixinid'];
}
}
C::t('user')->update($uid, $base);
if ($sendmail) { //发送密码到用户邮箱,延时发送
$email_password_message = lang('email_password_message', array(
'sitename' => $_G['setting']['sitename'],
'siteurl' => $_G['siteurl'],
'email' => $email,
'password' => $_GET['password']
));
if (!sendmail_cron("$email <$email>", lang('email_password_subject'), $email_password_message)) {
runlog('sendmail', "$email sendmail failed.");
}
}
}
//处理用户资料
$_GET['gender'] = trim($_GET['gender']);
$_GET['birth'] = trim($_GET['birth']);
$_GET['telephone'] = trim($_GET['telephone']);
//$_GET['mobile']=trim($_GET['mobile']);
if ($exist && $isappend) { //增量时
$oldprofile = C::t('user_profile')->fetch($uid);
$profile = array();
if (!empty($_GET['birth']) && empty($oldprofile['birthyear'])) {
$birth = strtotime($_GET['birth']);
if ($birth < TIMESTAMP && $birth > 0) {
$arr = getdate($birth);
$profile['birthyear'] = $arr['year'];
$profile['birthmonth'] = $arr['mon'];
$profile['birthday'] = $arr['mday'];
}
}
if (!empty($_GET['gender']) && empty($oldprofile['gender'])) {
if ($_GET['gender'] == lang('man')) $profile['gender'] = 1;
elseif ($_GET['gender'] == lang('woman')) $profile['gender'] = 2;
else $profile['gender'] = 0;
}
if (!empty($_GET['telephone']) && empty($oldprofile['telephone'])) {
$profile['telephone'] = $_GET['telephone'];
}
foreach ($_GET as $key => $value) {
if (!empty($_GET[$key]) && empty($oldprofile[$key])) {
if (checkprofile($key, $value)) $profile[$key] = $value;
}
}
if ($profile) {
$profile['uid'] = $uid;
C::t('user_profile')->insert($profile);
}
} else {
$profile = array();
if (!empty($_GET['birth'])) {
$birth = strtotime(trim($_GET['birth']));
if ($birth < TIMESTAMP && $birth > 0) {
$arr = getdate($birth);
$profile['birthyear'] = $arr['year'];
$profile['birthmonth'] = $arr['mon'];
$profile['birthday'] = $arr['mday'];
}
}
if (!empty($_GET['gender'])) {
if ($_GET['gender'] == lang('man')) $profile['gender'] = 1;
elseif ($_GET['gender'] == lang('woman')) $profile['gender'] = 2;
else $profile['gender'] = 0;
}
if (!empty($_GET['telephone'])) {
$profile['telephone'] = $_GET['telephone'];
}
foreach ($_GET as $key => $value) {
if (checkprofile($key, $value)) $profile[$key] = $value;
}
$profile['uid'] = $uid;
C::t('user_profile')->insert($profile);
//插入用户状态表
$status = array(
'uid' => $uid,
'regip' => '',
'lastip' => '',
'lastvisit' => TIMESTAMP,
'lastactivity' => TIMESTAMP,
'lastsendmail' => 0
);
C::t('user_status')->insert($status, false, true);
}
//处理部门和职位
$_GET['orgname'] = !empty($_GET['orgname']) ? explode('/', $_GET['orgname']) : array();
$_GET['job'] = !empty($_GET['job']) ? explode('/', $_GET['job']) : array();
//创建机构和部门
foreach ($_GET['orgname'] as $key => $orgname) {
if (empty($orgname)) continue;
if ($porgid = DB::result_first("select orgid from %t where forgid=%d and orgname=%s", array('organization', $orgid, $orgname))) {
$orgid = $porgid;
} else {
$setarr = array('forgid' => $orgid,
'orgname' => $orgname,
'fid' => 0,
'disp' => 100,
'indesk' => 0,
'dateline' => TIMESTAMP,
);
if ($porgid = C::t('organization')->insert_by_orgid($setarr)) {
$orgid = $porgid;
}
}
}
//用户加入机构
if ($isappend) {//增量导入时
C::t('organization_user')->insert_by_orgid($orgid, $uid);
} else {
C::t('organization_user')->delete_by_uid($uid, 0);
C::t('organization_user')->insert_by_orgid($orgid, $uid);
}
if ($orgid) {
foreach ($_GET['job'] as $key => $jobname) { //处理职位
$jobid = 0;
if ($pjobid = DB::result_first("select jobid from %t where orgid=%d and name=%s", array('organization_job', $orgid, $jobname))) {
$jobid = $pjobid;
} else {
$setarr = array('orgid' => $orgid,
'name' => $_GET['job'][$key],
'dateline' => TIMESTAMP,
'opuid' => $_G['uid']
);
if ($pjobid = C::t('organization_job')->insert($setarr, 1)) {
$jobid = $pjobid;
}
}
if ($jobid) {
if ($isappend) {//增量导入时
if (!DB::result_first("select COUNT(*) from %t where uid=%d and orgid=%d and jobid>0 ", array('organization_user', $uid, $orgid))) {
DB::update('organization_user', array('jobid' => $jobid), "uid='{$uid}' and orgid='{$orgid}'");
}
} else {//覆盖导入时
DB::update('organization_user', array('jobid' => $jobid), "uid='{$uid}' and orgid='{$orgid}'");
}
}
}
}
exit(json_encode(array('msg' => 'success')));
} elseif ($do == 'list') {
require_once DZZ_ROOT . './core/class/class_PHPExcel.php';
$inputFileName = $_G['setting']['attachdir'] . $_GET['file'];
if (!is_file($inputFileName)) {
showmessage('orguser_import_user_table', MOD_URL . '&op=import');
}
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);
//获取导入数据的字段
$h0 = array('username' => lang('compellation'), 'email' => lang('email'), 'nickname' => lang('username'), 'birth' => lang('date_birth'), 'gender' => lang('gender'), 'mobile' => lang('cellphone'), 'weixinid' => lang('weixin'), 'orgname' => lang('category_department'), 'job' => lang('department_position'), 'password' => lang('user_login_password'));
$h1 = getProfileForImport();
$h0 = array_merge($h0, $h1);
//获取可导入的用户资料
$h = array();
foreach ($sheetData[1] as $key => $value) {
$value = trim($value);
foreach ($h0 as $fieldid => $title) {
if ($title == $value) {
$h[$key] = $fieldid;
break;
}
}
}
if (!in_array('username', $h)) {
showmessage('lack_required_fields_name');
} elseif (!in_array('email', $h) && !in_array('username', $h)) {
showmessage('lack_required_fields_name_email');
}
if (!in_array('email', $h)) {
$h = array_merge(array('_' => 'email'), $h);
}
$list = array();
foreach ($sheetData as $key => $value) {
if ($key <= 1) continue;
$temp = array();
foreach ($value as $col => $val) {
if (trim($val) == '') continue;
if ($h[$col] == 'orgname') {
$temp[$h[$col]][] = $val;
} elseif ($h[$col] == 'job') {
$temp[$h[$col]][] = $val;
} elseif ($key1 == 'birth') {
$arr = explode('-', $value[$value1]);
if (count($arr) == 3) {
$temp[$key1] = dgmdate(strtotime($arr[2] . '-' . $arr[0] . '-' . $arr[1]), 'Y-m-d');
} else {
$temp[$key1] = $val;
}
} else {
if ($h[$col]) $temp[$h[$col]] = $val;
}
}
if (empty($temp['email'])) $temp['email'] = random(10, true) . '@163.com';
if (isset($list[$temp['email']])) {
foreach ($h as $key1 => $value1) {
if (!empty($temp[$key1])) {
$list[$temp['email']][$key1] = $temp[$key1];
}
}
} else {
if ($temp) $list[$temp['email']] = $temp;
}
}
$h = array_unique($h);
$orgpath = C::t('organization')->getPathByOrgid($orgid);
if (empty($orgpath)) $orgpath = lang('choose_import_agency_department');
//默认选中
$open = array();
$patharr = getPathByOrgid($orgid);
$arr = (array_keys($patharr));
array_pop($arr);
$count = count($arr);
if ($open[$arr[$count - 1]]) {
if (count($open[$arr[$count - 1]]) > $count) $open[$arr[count($arr) - 1]] = $arr;
} else {
$open[$arr[$count - 1]] = $arr;
}
$openarr = json_encode(array('orgid' => $open));
include template('import_list');
exit();
} else {
if (submitcheck('importfilesubmit')) {
if ($_FILES['importfile']['tmp_name']) {
$allowext = array('xls', 'xlsx');
$ext = strtolower(substr(strrchr($_FILES['importfile']['name'], '.'), 1, 10));
if (!in_array($ext, $allowext)) showmessage('orguser_import_xls_xlsx', dreferer());
if ($file = uploadtolocal($_FILES['importfile'], 'cache', '', array('xls', 'xlsx'))) {
$url = outputurl($_G['siteurl'] . MOD_URL . '&op=import&do=list&file=' . urlencode($file));
@header("Location: $url");
exit();
showmessage('orguser_import_user_message', outputurl($_G['siteurl'] . MOD_URL . '&op=import&do=list&file=' . urlencode($file)));
} else {
showmessage('orguser_import_tautology', dreferer());
}
} else {
showmessage('orguser_import_user_message_table', dreferer());
}
} else {
include template('import_guide');
exit();
}
}
function checkprofile($fieldid, &$value) {
global $_G;
if (empty($_G['cache']['profilesetting'])) {
loadcache('profilesetting');
}
$field = $_G['cache']['profilesetting'][$fieldid];
if (empty($field) || in_array($fieldid, array('department', 'realname', 'gender', 'birthyear', 'birthmonth', 'birthday', 'birth', 'constellation', 'zodiac', 'email', 'nickname', 'password', 'orgname', 'job', 'username'))) {
return false;
}
if ($field['choices']) {
$field['choices'] = explode("\n", $field['choices']);
}
if ($field['formtype'] == 'text' || $field['formtype'] == 'textarea') {
$value = getstr($value);
if ($field['size'] && strlen($value) > $field['size']) {
return false;
} else {
$field['validate'] = !empty($field['validate']) ? $field['validate'] : ($_G['profilevalidate'][$fieldid] ? $_G['profilevalidate'][$fieldid] : '');
if ($field['validate'] && !preg_match($field['validate'], $value)) {
return false;
}
}
} elseif ($field['formtype'] == 'checkbox' || $field['formtype'] == 'list') {
$arr = array();
$value = explode('\n', $value);
foreach ($value as $op) {
if (in_array(trim($op), trim($field['choices']))) {
$arr[] = trim($op);
}
}
$value = implode("\n", $arr);
if ($field['size'] && count($arr) > $field['size']) {
return false;
}
} elseif ($field['formtype'] == 'radio' || $field['formtype'] == 'select') {
if (!in_array($value, $field['choices'])) {
return false;
}
}
return true;
}
function getProfileForImport() {
global $_G;
if (empty($_G['cache']['profilesetting'])) {
loadcache('profilesetting');
}
$profilesetting = $_G['cache']['profilesetting'];
$ret = array();
foreach ($profilesetting as $key => $value) {
if (in_array($key, array('department', 'realname', 'gender', 'birthyear', 'birthmonth', 'birthday', 'constellation', 'zodiac'))) continue;
elseif ($value['formtype'] == 'file') continue;
elseif ($value['formtype'] == 'select' || $value['formtype'] == 'radio') {
$ret[$key] = $value['title']/*.($value['choices']?'('.preg_replace("/[\r\n]/i",'|',$value['choices']).')':'')*/
;
} elseif ($value['formtype'] == 'checkbox') {
$ret[$key] = $value['title']/*.($value['choices']?'('.preg_replace("/[\r\n]/i",'-',$value['choices']).')':'')*/
;
} else {
$ret[$key] = $value['title'];
}
}
return $ret;
}
?>