PageRenderTime 28ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/library/Model/User/User.php

https://github.com/polokk/tudu-web-1
PHP | 693 lines | 483 code | 101 blank | 109 comment | 115 complexity | afbb42bc1d9150caf5c571e1b7e24579 MD5 | raw file
  1. <?php
  2. /**
  3. * Model User User
  4. *
  5. * LICENSE
  6. *
  7. *
  8. * @category Model
  9. * @package Model_User
  10. * @author Oray-Yongfa
  11. * @copyright Copyright (c) 2009-2010 Shanghai Best Oray Information S&T CO., Ltd.
  12. * @link http://www.tudu.com/
  13. * @version $Id: User.php 2825 2013-04-15 09:55:11Z chenyongfa $
  14. */
  15. /**
  16. * @see Tudu_Dao_Manager
  17. */
  18. require_once 'Tudu/Dao/Manager.php';
  19. /**
  20. * @see Model_Abstract
  21. */
  22. require_once 'Model/Abstract.php';
  23. /**
  24. * @category Model
  25. * @package Model_User
  26. * @copyright Copyright (c) 2009-2010 Shanghai Best Oray Information S&T CO., Ltd.
  27. * @link http://www.tudu.com/
  28. */
  29. class Model_User_User extends Model_Abstract
  30. {
  31. const CODE_INVALID_ORGID = 101;
  32. const CODE_INVALID_UID = 102;
  33. const CODE_USER_NOTEXISTS = 103;
  34. const CODE_SAVE_FAILED = 104;
  35. const CODE_TOO_MUCH_USER = 105;
  36. const CODE_MISSING_UID = 106;
  37. const CODE_INVALID_PWD = 107;
  38. const CODE_INVALID_USERNAME = 108;
  39. const CODE_INVALID_DOMAINID = 109;
  40. const CODE_USER_EXISTS = 110;
  41. const CODE_NOT_ENOUGH_NDSPACE = 111;
  42. const CODE_INVALID_BIRTHDAY = 112;
  43. const CODE_INVALID_DEPTNAME = 113;
  44. const CODE_DEPT_PARENT_NOTEXISTS = 114;
  45. const CODE_DEPT_EXISTS = 115;
  46. const CODE_SAVE_DEPT_FAILED = 116;
  47. const CODE_MISSING_UNID = 117;
  48. const CODE_LESS_NDSPACE = 118;
  49. const CODE_NOT_MODIFY_PWD = 119;
  50. const CODE_DELETE_SUPER_ADMIN = 120;
  51. const CODE_INVALID_NDQUOTA = 121;
  52. const CODE_INVALID_EMAIL = 122;
  53. const CODE_EXCEED_MAX_NDSPACE = 123;
  54. /**
  55. * 创建用户
  56. */
  57. public function create(array $params)
  58. {
  59. $isImport = !empty($params['import']) ? true : false;
  60. // 组织ID必须有
  61. if (empty($params['orgid'])) {
  62. require_once 'Model/User/Exception.php';
  63. throw new Model_User_Exception('Missing or invalid value of parameter "orgid"', self::CODE_INVALID_ORGID);
  64. }
  65. $orgId = $params['orgid'];
  66. /* @var $daoOrg Dao_Md_Org_Org */
  67. $daoOrg = Tudu_Dao_Manager::getDao('Dao_Md_Org_Org', Tudu_Dao_Manager::DB_MD);
  68. /* @var $daoUser Dao_Md_User_User */
  69. $daoUser = Tudu_Dao_Manager::getDao('Dao_Md_User_User', Tudu_Dao_Manager::DB_MD);
  70. if ($isImport) {
  71. if (!empty($params['exist-parentid'])) {
  72. require_once 'Model/User/Exception.php';
  73. throw new Model_User_Exception('Parent dept is not exists', self::CODE_DEPT_PARENT_NOTEXISTS);
  74. }
  75. if (!empty($params['deptid']) && $params['deptid'] == '^new') {
  76. require_once 'Model/User/Exception.php';
  77. throw new Model_User_Exception('Create dept failed', self::CODE_SAVE_DEPT_FAILED);
  78. }
  79. }
  80. // 读取组织信息
  81. $org = $daoOrg->getOrg(array('orgid' => $orgId));
  82. if ($isImport) {
  83. $params['password'] = $org->defaultPassword;
  84. }
  85. // 组织用户是否已达到上限
  86. if ($org->maxUsers && $org->maxUsers <= $daoOrg->getUserCount($orgId)) {
  87. require_once 'Model/User/Exception.php';
  88. throw new Model_User_Exception('This organization is too much users', self::CODE_TOO_MUCH_USER);
  89. }
  90. // 用户名
  91. if (empty($params['userid'])) {
  92. require_once 'Model/User/Exception.php';
  93. throw new Model_User_Exception('Missing the value of parameter "userid"', self::CODE_MISSING_UID);
  94. }
  95. $userId = $params['userid'];
  96. $address = $userId . '@' . $orgId;
  97. $uniqueId = Dao_Md_User_User::getUniqueId($orgId, $userId);
  98. // 用户名格式验证
  99. if (!Oray_Function::isDomainStr($userId)) {
  100. require_once 'Model/User/Exception.php';
  101. throw new Model_User_Exception('Invalid value of parameter "userid"', self::CODE_INVALID_UID);
  102. }
  103. // 密码
  104. if (empty($params['password'])) {
  105. require_once 'Model/User/Exception.php';
  106. throw new Model_User_Exception('Missing or invalid value of parameter "password"', self::CODE_INVALID_PWD);
  107. }
  108. // 用户真实姓名
  109. if (empty($params['truename'])) {
  110. require_once 'Model/User/Exception.php';
  111. throw new Model_User_Exception('Missing or invalid value of parameter "truename"', self::CODE_INVALID_USERNAME);
  112. }
  113. // 邮箱格式有误
  114. if (!empty($params['email']) && !Oray_Function::isEmail($params['email'])) {
  115. require_once 'Model/User/Exception.php';
  116. throw new Model_User_Exception('Invalid value of parameter "email"', self::CODE_INVALID_EMAIL);
  117. }
  118. // 用户已存在
  119. if ($daoUser->existsUser($orgId, $userId)) {
  120. require_once 'Model/User/Exception.php';
  121. throw new Model_User_Exception('User is exists in this organization', self::CODE_USER_EXISTS);
  122. }
  123. // 准备用户参数
  124. $user = array(
  125. 'orgid' => $orgId,
  126. 'userid' => $userId,
  127. 'uniqueid' => $uniqueId,
  128. 'status' => isset($params['status']) ? (int) $params['status'] : 1,
  129. 'deptid' => isset($params['deptid']) ? $params['deptid'] : null,
  130. 'isshow' => !empty($params['isshow']) ? 1 : 0,
  131. 'ordernum' => isset($params['ordernum']) ? (int) $params['ordernum'] : 0,
  132. 'initpassword' => 1,
  133. 'lastupdatetime' => time()
  134. );
  135. $userInfo = array(
  136. 'orgid' => $orgId,
  137. 'userid' => $userId,
  138. 'truename' => $params['truename'],
  139. 'password' => $params['password'],
  140. 'gender' => (int) $params['gender']
  141. );
  142. if (isset($params['position'])) {
  143. $userInfo['position'] = $params['position'];
  144. }
  145. if (isset($params['tel'])) {
  146. $userInfo['tel'] = $params['tel'];
  147. }
  148. if (isset($params['mobile'])) {
  149. $userInfo['mobile'] = $params['mobile'];
  150. }
  151. if (isset($params['email'])) {
  152. $userInfo['email'] = $params['email'];
  153. }
  154. // 网盘空间
  155. if (!empty($params['maxndquota'])) {
  156. if ($params['maxndquota'] > 1000) {
  157. require_once 'Model/User/Exception.php';
  158. throw new Model_User_Exception('You can not set exceed 1000MB netdisk space', self::CODE_EXCEED_MAX_NDSPACE);
  159. }
  160. $user['maxndquota'] = (float) $params['maxndquota'] * 1000000;
  161. }
  162. // 无效的出生日期
  163. if (!empty($params['birthday'])) {
  164. if (false === $params['birthday']) {
  165. require_once 'Model/User/Exception.php';
  166. throw new Model_User_Exception('Missing or invalid value of parameter "birthday"', self::CODE_INVALID_BIRTHDAY);
  167. }
  168. $userInfo['birthday'] = $params['birthday'];
  169. }
  170. if (!Oray_Function::isByte($params['truename'])) {
  171. require_once 'Tudu/Pinyin.php';
  172. $userInfo['pinyin'] = Tudu_Pinyin::parse($params['truename'], true);
  173. }
  174. if (!empty($params['idnumber'])) {
  175. $userInfo['idnumber'] = $params['idnumber'];
  176. }
  177. if (!empty($params['nick'])) {
  178. $userInfo['nick'] = $params['nick'];
  179. }
  180. // 创建用户
  181. if (!$daoUser->createUser($user)) {
  182. require_once 'Model/User/Exception.php';
  183. throw new Model_User_Exception('Create user failed', self::CODE_SAVE_FAILED);
  184. }
  185. // 创建用户数据
  186. if (!$daoUser->createUserInfo($userInfo)) {
  187. require_once 'Model/User/Exception.php';
  188. throw new Model_User_Exception('Create user info failed', self::CODE_SAVE_FAILED);
  189. }
  190. // 群组
  191. /* @var $daoGroup Dao_Md_User_Group */
  192. $daoGroup = Tudu_Dao_Manager::getDao('Dao_Md_User_Group', Tudu_Dao_Manager::DB_MD);
  193. $groups = !empty($params['groupid']) ? $params['groupid'] : array();
  194. foreach ($groups as $groupId) {
  195. $daoGroup->addUser($orgId, $groupId, $userId);
  196. }
  197. /* @var $daoRole Dao_Md_User_Role */
  198. $daoRole = Tudu_Dao_Manager::getDao('Dao_Md_User_Role', Tudu_Dao_Manager::DB_MD);
  199. $roles = !empty($params['roleid']) ? $params['roleid'] : array();
  200. // 权限组
  201. foreach ($roles as $roleId) {
  202. $daoRole->addUsers($orgId, $roleId, $userId);
  203. }
  204. /* @var $daoCast Dao_Md_User_Cast */
  205. $daoCast = Tudu_Dao_Manager::getDao('Dao_Md_User_Cast', Tudu_Dao_Manager::DB_MD);
  206. $castDepts = !empty($params['castdept']) ? $params['castdept'] : array();
  207. $castUsers = !empty($params['castuser']) ? $params['castuser'] : array();
  208. // 添加不可见部门
  209. foreach ($castDepts as $deptId) {
  210. if (!trim($deptId) || $deptId == '^root') {
  211. continue ;
  212. }
  213. $daoCast->hideDepartment($orgId, $userId, $deptId);
  214. }
  215. // 添加不可见用户
  216. foreach ($castUsers as $uId) {
  217. if (!trim($uId) || $uId == $userId) {
  218. continue ;
  219. }
  220. $daoCast->hideUser($orgId, $userId, $uId);
  221. }
  222. $daoCast->updateDepartment($orgId, $userId, $user['deptid']);
  223. // 修改企业默认密码
  224. if ($org->defaultPassword != $params['password']) {
  225. $daoOrg->updateOrg($orgId, array('defaultpassword' => $params['password']));
  226. }
  227. // 发送通知,插入消息队列
  228. if (Tudu_Model::hasResource(Tudu_Model::RESOURCE_CONFIG)) {
  229. $config = Tudu_Model::getResource(Tudu_Model::RESOURCE_CONFIG);
  230. if ($config['httpsqs']) {
  231. $options = $config['httpsqs'];
  232. $httpsqs = new Oray_Httpsqs($options['host'], $options['port'], $options['charset'], $options['name']);
  233. $data = implode(' ', array(
  234. Dao_Md_Log_Oplog::MODULE_DEPT,
  235. Dao_Md_Log_Oplog::OPERATION_CREATE,
  236. 'user',
  237. implode(':', array($orgId, $address, $uniqueId, $params['truename']))
  238. ));
  239. $httpsqs->put($data);
  240. }
  241. }
  242. // 添加后台操作日志
  243. if (!empty($params['operator']) && !empty($params['clientip'])) {
  244. $params['local'] = empty($params['local']) ? null : $params['local'];
  245. $this->_createLog(
  246. Dao_Md_Log_Oplog::MODULE_USER,
  247. Dao_Md_Log_Oplog::OPERATION_CREATE,
  248. null,
  249. array('orgid' => $orgId, 'operator' => $params['operator'], 'clientip' => $params['clientip'], 'local' => $params['local']),
  250. implode(':', array($orgId, $address, $uniqueId)),
  251. array('truename' => $params['truename'], 'account' => $address)
  252. );
  253. }
  254. }
  255. /**
  256. * 更新用户
  257. */
  258. public function update(array $params)
  259. {
  260. // 组织ID必须有
  261. if (empty($params['orgid'])) {
  262. require_once 'Model/User/Exception.php';
  263. throw new Model_User_Exception('Missing or invalid value of parameter "orgid"', self::CODE_INVALID_ORGID);
  264. }
  265. $orgId = $params['orgid'];
  266. $edit = array(
  267. 'truename' => true,
  268. 'password' => true,
  269. 'dept' => true,
  270. 'status' => true,
  271. 'role' => true,
  272. 'group' => true,
  273. 'cast' => true,
  274. 'netdisk' => true,
  275. 'email' => true
  276. );
  277. if (!empty($params['edit'])) {
  278. $edit = $params['edit'];
  279. }
  280. /* @var $daoUser Dao_Md_User_User */
  281. $daoUser = Tudu_Dao_Manager::getDao('Dao_Md_User_User', Tudu_Dao_Manager::DB_MD);
  282. // 用户名
  283. if (empty($params['userid'])) {
  284. require_once 'Model/User/Exception.php';
  285. throw new Model_User_Exception('Missing the value of parameter "userid"', self::CODE_MISSING_UID);
  286. }
  287. $userId = $params['userid'];
  288. $user = $daoUser->getUser(array('orgid' => $orgId, 'userid' => $userId));
  289. $userIf = $daoUser->getUserInfo(array('orgid' => $orgId, 'userid' => $userId));
  290. // 用户不存在
  291. if (null === $user) {
  292. require_once 'Model/User/Exception.php';
  293. throw new Model_User_Exception('Missing the value of parameter "userid"', self::CODE_USER_NOTEXISTS);
  294. }
  295. // 用户真实姓名
  296. if ($edit['truename'] && empty($params['truename'])) {
  297. require_once 'Model/User/Exception.php';
  298. throw new Model_User_Exception('Missing or invalid value of parameter "truename"', self::CODE_INVALID_USERNAME);
  299. }
  300. // 邮箱格式有误
  301. if ($edit['email'] && !empty($params['email']) && !Oray_Function::isEmail($params['email'])) {
  302. require_once 'Model/User/Exception.php';
  303. throw new Model_User_Exception('Invalid value of parameter "email"', self::CODE_INVALID_EMAIL);
  304. }
  305. $userParam = array();
  306. $userInfo = array();
  307. if ($edit['status']) {
  308. $userParam['status'] = isset($params['status']) ? (int) $params['status'] : 1;
  309. }
  310. if ($edit['dept']) {
  311. $userParam['deptid'] = isset($params['deptid']) ? $params['deptid'] : null;
  312. }
  313. if (isset($params['ordernum'])) {
  314. $userParam['ordernum'] = (int) $params['ordernum'];
  315. }
  316. $userParam['lastupdatetime'] = time();
  317. if (isset($params['isshow'])) {
  318. $userParam['isshow'] = $params['isshow'];
  319. }
  320. if (isset($params['truename'])) {
  321. $userInfo['truename'] = $params['truename'];
  322. }
  323. if (isset($params['position'])) {
  324. $userInfo['position'] = $params['position'];
  325. }
  326. if (isset($params['gender'])) {
  327. $userInfo['gender'] = (int) $params['gender'];
  328. }
  329. if (isset($params['tel'])) {
  330. $userInfo['tel'] = $params['tel'];
  331. }
  332. if (isset($params['mobile'])) {
  333. $userInfo['mobile'] = $params['mobile'];
  334. }
  335. if (isset($params['email'])) {
  336. $userInfo['email'] = $params['email'];
  337. }
  338. /* @var $daoOrg Dao_Md_Org_Org */
  339. $daoOrg = Tudu_Dao_Manager::getDao('Dao_Md_Org_Org', Tudu_Dao_Manager::DB_MD);
  340. // 读取组织信息
  341. $org = $daoOrg->getOrg(array('orgid' => $orgId));
  342. // 网盘空间
  343. if ($edit['netdisk'] && !empty($params['maxndquota'])) {
  344. $ndQuota = (float) $params['maxndquota'] * 1000000;
  345. if ($ndQuota != $user->maxNdQuota) {
  346. if ($params['maxndquota'] > 1000) {
  347. require_once 'Model/User/Exception.php';
  348. throw new Model_User_Exception('You can not set exceed 1000MB netdisk space', self::CODE_EXCEED_MAX_NDSPACE);
  349. }
  350. /* @var $daoFolder Dao_Td_Netdisk_Folder */
  351. $daoFolder = Tudu_Dao_Manager::getDao('Dao_Td_Netdisk_Folder', Tudu_Dao_Manager::DB_TS);
  352. $folderRoot = $daoFolder->getFolder(array('uniqueid' => $user->uniqueId, 'folderid' => '^root'));
  353. if (null !== $folderRoot && $ndQuota < $folderRoot->folderSize) {
  354. require_once 'Model/User/Exception.php';
  355. throw new Model_User_Exception('This netdisk space can not less than the used netdisk space', self::CODE_LESS_NDSPACE);
  356. }
  357. // 更新用户网盘跟文件夹空间
  358. if (null !== $folderRoot) {
  359. $daoFolder->updateFolder($user->uniqueId, '^root', array('maxquota' => $ndQuota));
  360. }
  361. $userParam['maxndquota'] = $ndQuota;
  362. }
  363. }
  364. // 无效的出生日期
  365. if (!empty($params['birthday'])) {
  366. if (false === $params['birthday']) {
  367. require_once 'Model/User/Exception.php';
  368. throw new Model_User_Exception('Missing or invalid value of parameter "birthday"', self::CODE_INVALID_BIRTHDAY);
  369. }
  370. $userInfo['birthday'] = $params['birthday'];
  371. }
  372. if ($edit['truename'] && !Oray_Function::isByte($params['truename'])) {
  373. require_once 'Tudu/Pinyin.php';
  374. $userInfo['pinyin'] = Tudu_Pinyin::parse($params['truename'], true);
  375. }
  376. if (!empty($params['nick'])) {
  377. $userInfo['nick'] = $params['nick'];
  378. }
  379. if (!empty($params['idnumber'])) {
  380. $userInfo['idnumber'] = $params['idnumber'];
  381. }
  382. if ($edit['password'] && !empty($params['password'])) {
  383. if ($daoUser->isAdmin($orgId, $userId)) {
  384. require_once 'Model/User/Exception.php';
  385. throw new Model_User_Exception('Can not modify the administrator password', self::CODE_NOT_MODIFY_PWD);
  386. }
  387. $userParam['initpassword'] = 1;
  388. $userInfo['password'] = $params['password'];
  389. }
  390. // 用户头像
  391. if (!empty($params['avatars'])) {
  392. $userInfo['avatartype'] = $params['avatartype'];
  393. $userInfo['avatars'] = $params['avatars'];
  394. /* @var $daoImContact Dao_Im_Contact_Contact */
  395. //$daoImContact = Tudu_Dao_Manager::getDao('Dao_Im_Contact_Contact', Tudu_Dao_Manager::DB_IM);
  396. // 需要更新im自定义联系人表的updatetime
  397. // im通过更新时间判断是否需要获取用户头像
  398. //$daoImContact->updateUser($userId . '@' . $orgId, array('updatetime' => time()));
  399. }
  400. // 更新用户数据
  401. if (!empty($userParam)) {
  402. if (!$daoUser->updateUser($orgId, $user->userId, $userParam)) {
  403. require_once 'Model/User/Exception.php';
  404. throw new Model_User_Exception('Update user failed', self::CODE_SAVE_FAILED);
  405. }
  406. }
  407. if (!empty($userInfo)) {
  408. if (!$daoUser->updateUserInfo($orgId, $user->userId, $userInfo)) {
  409. require_once 'Model/User/Exception.php';
  410. throw new Model_User_Exception('Update user info failed', self::CODE_SAVE_FAILED);
  411. }
  412. }
  413. // 群组
  414. /* @var $daoGroup Dao_Md_User_Group */
  415. $daoGroup = Tudu_Dao_Manager::getDao('Dao_Md_User_Group', Tudu_Dao_Manager::DB_MD);
  416. if ($edit['group']) {
  417. $groups = !empty($params['groupid']) ? $params['groupid'] : array();
  418. $daoUser->removeGroups($user->orgId, $user->userId);
  419. foreach ($groups as $groupId) {
  420. $daoGroup->addUser($orgId, $groupId, $userId);
  421. }
  422. }
  423. // 权限组
  424. /* @var $daoRole Dao_Md_User_Role */
  425. $daoRole = Tudu_Dao_Manager::getDao('Dao_Md_User_Role', Tudu_Dao_Manager::DB_MD);
  426. if ($edit['role']) {
  427. $roles = !empty($params['roleid']) ? $params['roleid'] : array();
  428. $daoUser->removeRoles($user->orgId, $user->userId);
  429. foreach ($roles as $roleId) {
  430. $daoRole->addUsers($orgId, $roleId, $userId);
  431. }
  432. }
  433. // 组织架构
  434. /* @var $daoCast Dao_Md_User_Cast */
  435. $daoCast = Tudu_Dao_Manager::getDao('Dao_Md_User_Cast', Tudu_Dao_Manager::DB_MD);
  436. if ($edit['cast']) {
  437. $castDepts = !empty($params['castdept']) ? $params['castdept'] : array();
  438. $castUsers = !empty($params['castuser']) ? $params['castuser'] : array();
  439. // 清除组织架构
  440. $daoCast->clear($orgId, $userId);
  441. // 隐藏部门
  442. foreach ($castDepts as $dept) {
  443. if (!trim($dept) || $dept == '^root' || $dept == $userParam['deptid']) {
  444. continue ;
  445. }
  446. $daoCast->hideDepartment($orgId, $userId, $dept);
  447. }
  448. // 隐藏用户
  449. foreach ($castUsers as $uId) {
  450. if (!$uId || $uId == $userId) {
  451. continue ;
  452. }
  453. $daoCast->hideUser($orgId, $userId, $uId);
  454. }
  455. // 更换部门
  456. if ($user->deptId != $userParam['deptid']) {
  457. $daoCast->updateDepartment($orgId, $userId, $userParam['deptid']);
  458. }
  459. }
  460. // 修改企业默认密码
  461. if ($edit['password'] && !empty($params['password']) && $org->defaultPassword != $params['password']) {
  462. $daoOrg->updateOrg($orgId, array('defaultpassword' => $params['password']));
  463. }
  464. // 发送通知,插入消息队列
  465. if (Tudu_Model::hasResource(Tudu_Model::RESOURCE_CONFIG)) {
  466. $config = Tudu_Model::getResource(Tudu_Model::RESOURCE_CONFIG);
  467. if ($config['httpsqs']) {
  468. $options = $config['httpsqs'];
  469. $httpsqs = new Oray_Httpsqs($options['host'], $options['port'], $options['charset'], $options['name']);
  470. $data = implode(' ', array(
  471. Dao_Md_Log_Oplog::MODULE_DEPT,
  472. Dao_Md_Log_Oplog::OPERATION_UPDATE,
  473. null,
  474. implode(':', array($orgId, $user->userName, $user->uniqueId, ''))
  475. ));
  476. $httpsqs->put($data);
  477. }
  478. }
  479. // 添加后台操作日志
  480. if (!empty($params['operator']) && !empty($params['clientip'])) {
  481. $params['local'] = empty($params['local']) ? null : $params['local'];
  482. $trueName = $edit['truename'] ? $params['truename'] : $userIf->trueName;
  483. $this->_createLog(
  484. Dao_Md_Log_Oplog::MODULE_USER,
  485. Dao_Md_Log_Oplog::OPERATION_UPDATE,
  486. null,
  487. array('orgid' => $orgId, 'operator' => $params['operator'], 'clientip' => $params['clientip'], 'local' => $params['local']),
  488. implode(':', array($orgId, $user->userName, $user->uniqueId)),
  489. array('truename' => $trueName, 'account' => $user->userName)
  490. );
  491. }
  492. }
  493. /**
  494. * 删除用户
  495. */
  496. public function delete(array $params)
  497. {
  498. // 组织ID必须有
  499. if (empty($params['orgid'])) {
  500. require_once 'Model/User/Exception.php';
  501. throw new Model_User_Exception('Missing or invalid value of parameter "orgid"', self::CODE_INVALID_ORGID);
  502. }
  503. $orgId = $params['orgid'];
  504. /* @var $daoUser Dao_Md_User_User */
  505. $daoUser = Tudu_Dao_Manager::getDao('Dao_Md_User_User', Tudu_Dao_Manager::DB_MD);
  506. // 用户名
  507. if (empty($params['userid'])) {
  508. require_once 'Model/User/Exception.php';
  509. throw new Model_User_Exception('Missing the value of parameter "userid"', self::CODE_MISSING_UID);
  510. }
  511. $userIds = is_array($params['userid']) ? $params['userid'] : (array) $params['userid'];
  512. $ret = true;
  513. $uniqueIds = array();
  514. foreach ($userIds as $userId) {
  515. $cuser = $daoUser->getUser(array('orgid' => $orgId, 'userid' => $userId));
  516. $infouser = $daoUser->getUserInfo(array('orgid' => $orgId, 'userid' => $userId));
  517. // 用户已不存在
  518. if (null == $cuser) {
  519. continue;
  520. }
  521. // 是否超级管理员
  522. if ($daoUser->isAdmin($orgId, $userId)) {
  523. require_once 'Model/User/Exception.php';
  524. throw new Model_User_Exception('Can not delete super administrator "'.$userId.'@'.$orgId.'"', self::CODE_DELETE_SUPER_ADMIN);
  525. }
  526. if (!$daoUser->deleteUser($orgId, $userId)) {
  527. $ret = false;
  528. continue;
  529. }
  530. $uniqueIds[] = $cuser->uniqueId;
  531. // 添加操作日志
  532. if (!empty($params['operator']) && !empty($params['clientip'])) {
  533. $params['local'] = empty($params['local']) ? null : $params['local'];
  534. $this->_createLog(
  535. Dao_Md_Log_Oplog::MODULE_USER,
  536. Dao_Md_Log_Oplog::OPERATION_DELETE,
  537. null,
  538. array('orgid' => $orgId, 'operator' => $params['operator'], 'clientip' => $params['clientip'], 'local' => $params['local']),
  539. implode(':', array($cuser->orgId, $cuser->userName, $cuser->uniqueId)),
  540. array('truename' => $infouser->trueName, 'account' => $cuser->userName)
  541. );
  542. }
  543. }
  544. if (!$ret) {
  545. require_once 'Model/User/Exception.php';
  546. throw new Model_User_Exception('Delete user failed', self::CODE_SAVE_FAILED);
  547. }
  548. // 发送通知,插入消息队列
  549. if (Tudu_Model::hasResource(Tudu_Model::RESOURCE_CONFIG)) {
  550. $config = Tudu_Model::getResource(Tudu_Model::RESOURCE_CONFIG);
  551. if ($config['httpsqs']) {
  552. $options = $config['httpsqs'];
  553. $httpsqs = new Oray_Httpsqs($options['host'], $options['port'], $options['charset'], $options['name']);
  554. $data = implode(' ', array(
  555. Dao_Md_Log_Oplog::MODULE_DEPT,
  556. Dao_Md_Log_Oplog::OPERATION_DELETE,
  557. null,
  558. implode(':', array($orgId, implode(',', $uniqueIds)))
  559. ));
  560. $httpsqs->put($data);
  561. }
  562. }
  563. }
  564. /**
  565. * 创建管理日志
  566. *
  567. * @param string $module
  568. * @param string $action
  569. * @param string $subAction
  570. * @param string $description
  571. * @return int
  572. */
  573. protected function _createLog($module, $action, $subAction = null, $params = null, $target = null, array $detail = null)
  574. {
  575. if (null !== $detail) {
  576. $detail = serialize($detail);
  577. }
  578. /* @var $daoLog Dao_Md_Log_Oplog */
  579. $daoLog = Tudu_Dao_Manager::getDao('Dao_Md_Log_Oplog', Tudu_Dao_Manager::DB_MD);
  580. $ret = $daoLog->createAdminLog(array(
  581. 'orgid' => $params['orgid'],
  582. 'userid' => $params['operator'],
  583. 'ip' => $params['clientip'],
  584. 'module' => $module,
  585. 'action' => $action,
  586. 'subaction' => $subAction,
  587. 'target' => $target,
  588. 'local' => $params['local'],
  589. 'detail' => $detail
  590. ));
  591. }
  592. }