AdminClass.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. <?php
  2. namespace bizGhs\admin\classes;
  3. use bizHd\user\classes\UserClass;
  4. use bizGhs\shop\classes\ShopAdminClass;
  5. use bizTy\shop\classes\ShopClass;
  6. use common\components\util;
  7. use common\services\ImageService;
  8. use Yii;
  9. use bizGhs\base\classes\BaseClass;
  10. class AdminClass extends BaseClass
  11. {
  12. public static $baseFile = '\bizGhs\admin\models\Admin';
  13. //未知身份
  14. CONST IDENTITY_UNKNOWN = 0;
  15. //客户,花店
  16. const IDENTITY_CUSTOM = 1;
  17. //供货商员工
  18. const IDENTITY_STAFF = 2;
  19. public static function getRecentShop($admin)
  20. {
  21. $recent = $admin['recentShop'];
  22. $arr = [];
  23. if (!empty($recent)) {
  24. $ids = json_decode($recent, true);
  25. $list = ShopClass::getShopByIds($ids);
  26. if (!empty($list)) {
  27. foreach ($list as $key => $val) {
  28. $arr[] = [
  29. 'shopId' => $val['id'],
  30. 'shopName' => $val['shopName'],
  31. 'shopImg' => $val['avatar'],
  32. ];
  33. }
  34. }
  35. }
  36. return $arr;
  37. }
  38. //最近访问的门店 shish 2021.3.1
  39. public static function addRecentShop($lookShopId, $admin)
  40. {
  41. if (empty($lookShopId)) {
  42. return false;
  43. }
  44. $hasRecentShop = $admin['recentShop'];
  45. $adminId = $admin['id'];
  46. $newShopIds = [];
  47. if (!empty($hasRecentShop)) {
  48. $newShopIds = json_decode($hasRecentShop, true);
  49. }
  50. $newShopIds = array_merge($newShopIds, [$lookShopId]);
  51. $newShopIds = array_unique(array_filter($newShopIds));
  52. self::updateById($adminId, ['recentShop' => json_encode($newShopIds)]);
  53. }
  54. //开店时初始化员工和角色
  55. public static function initAdmin($applyData, $sjId, $shopId)
  56. {
  57. $mobile = $applyData['mobile'] ?? 0;
  58. $adminId = $applyData['adminId'] ?? 0;
  59. //创建管理员角色
  60. $roleId = 0;
  61. $hasRole = AdminRoleClass::getByCondition(['merchantId' => $sjId]);
  62. if (empty($hasRole)) {
  63. $roleReturn = AdminRoleClass::addAdminRole(['roleName' => '老板', 'merchantId' => $sjId, 'auth' => '*']);
  64. $roleId = $roleReturn['id'];
  65. }
  66. //创建管理员
  67. if (!empty($adminId)) {
  68. $shopAdmin = ShopAdminClass::getByCondition(['shopId' => $shopId, 'adminId' => $adminId]);
  69. if (empty($shopAdmin)) {
  70. $adminData = [
  71. 'password' => password_hash($mobile, PASSWORD_BCRYPT),
  72. 'confirmPassword' => password_hash($mobile, PASSWORD_BCRYPT),
  73. 'mobile' => $mobile
  74. ];
  75. self::updateById($adminId, $adminData);
  76. $shopData = [
  77. 'adminId' => $adminId,
  78. 'shopId' => $shopId,
  79. 'merchantId' => $sjId,
  80. 'remind' => 1,
  81. 'roleId' => $roleId,
  82. 'default' => 1,
  83. ];
  84. ShopAdminClass::add($shopData);
  85. }
  86. }
  87. }
  88. //组合员工基本信息 shish 2019.12.9
  89. public static function groupAdminBaseInfo($list, $sensitive = true)
  90. {
  91. $prefix = Yii::$app->params['imgHost'];
  92. $defaultAvatar = $prefix . '/retail/default-avatar.png';
  93. foreach ($list as $key => $val) {
  94. $roleId = 0;
  95. $list[$key]['roleName'] = '';
  96. $avatar = isset($val['avatar']) && !empty($val['avatar']) ? $prefix . $val['avatar'] : $defaultAvatar;
  97. $avatar = $avatar;
  98. $list[$key]['avatar'] = $avatar;
  99. $list[$key]['addDate'] = date("Y-m-d H:i", $val['addTime']);
  100. $list[$key]['lastLoginTime'] = date("Y-m-d H:i", $val['loginTime']);
  101. //敏感信息
  102. if ($sensitive) {
  103. //这里需要输出值secret,否则修改密码那边会有问题
  104. $list[$key]['openId'] = isset($val['openId']) && !empty($val['openId']) ? 'secret' : '';
  105. $list[$key]['password'] = isset($val['password']) && !empty($val['password']) ? 'secret' : '';
  106. $list[$key]['confirmPassword'] = isset($val['confirmPassword']) && !empty($val['confirmPassword']) ? 'secret' : '';
  107. }
  108. }
  109. return $list;
  110. }
  111. //取单个员工详情 shish 2019.12.9
  112. public static function getAdminById($id)
  113. {
  114. $detail = AdminClass::getById($id);
  115. if (empty($detail)) {
  116. util::fail('没有找到员工信息!');
  117. }
  118. $list = self::groupAdminBaseInfo([$detail]);
  119. return current($list);
  120. }
  121. //取多个员工信息 shish 2021.1.19
  122. public static function getAdminByIds($ids)
  123. {
  124. $adminList = self::getByIds($ids, null, 'id');
  125. if (empty($adminList)) {
  126. return [];
  127. }
  128. $adminList = self::groupAdminBaseInfo($adminList);
  129. return $adminList;
  130. }
  131. //添加员工 shish 2019.12.9
  132. public static function addAdmin($data)
  133. {
  134. $merchantId = $data['merchantId'];
  135. //验证角色
  136. $roleId = $data['roleId'];
  137. $role = AdminRoleClass::getById($roleId);
  138. AdminRoleClass::valid($role, $merchantId);
  139. //验证关联的微信
  140. $adminId = $data['admin'];
  141. $admin = self::getById($adminId);
  142. if (empty($admin)) {
  143. util::fail('没有找到管理员信息');
  144. }
  145. $data['password'] = password_hash($data['password'], PASSWORD_BCRYPT);
  146. $respond = self::add($data);
  147. return $respond;
  148. }
  149. //获取商家的所有员工 shish 2019.12.9
  150. public static function getAdminList($merchantId)
  151. {
  152. return self::getAllByCondition(['merchantId' => $merchantId, 'delStatus' => 0, 'status' => 1], null, '*');
  153. }
  154. //获取商家所有员工的名字 shish 2019.12.9
  155. public static function getAdminNameList($merchantId)
  156. {
  157. $list = self::getAdminList($merchantId);
  158. return !empty($list) ? array_column($list, 'adminName') : [];
  159. }
  160. //获取商家所有员工已经关联微信的userId
  161. public static function getShopAdminUserId($merchantId)
  162. {
  163. $list = self::getAdminList($merchantId);
  164. return !empty($list) ? array_column($list, 'userId') : [];
  165. }
  166. //验证权限
  167. public static function valid($admin, $merchantId)
  168. {
  169. if (empty($admin)) {
  170. util::fail('员工信息无效');
  171. }
  172. $adminId = $admin['id'] ?? 0;
  173. $staff = ShopAdminClass::getByCondition(['merchantId' => $merchantId, 'adminId' => $adminId]);
  174. if (empty($staff)) {
  175. util::fail('您没有权限操作');
  176. }
  177. }
  178. //删除员工,需要考虑权限 shish 2019.12.9
  179. public static function deleteAdmin($admin, $adminId)
  180. {
  181. $id = $admin['id'];
  182. if ($admin['super'] == 1) {
  183. util::fail('超级管理员不能删除');
  184. }
  185. if ($id == $adminId) {
  186. util::fail('不能删除自己');
  187. }
  188. self::updateById($id, ['delStatus' => 1]);
  189. }
  190. public static function getByMiniOpenId($miniOpenId)
  191. {
  192. return self::getByCondition(['miniOpenId' => $miniOpenId]);
  193. }
  194. public static function getByUnionId($unionId)
  195. {
  196. return self::getByCondition(['unionId' => $unionId]);
  197. }
  198. //创建以及更新用户 shish 2020.2.7
  199. public static function replaceAdmin($adminInfo, $source)
  200. {
  201. $adminInfo = self::switchAdminInfo($adminInfo, $source);
  202. $adminSource = UserClass::$userSourceId;
  203. $unionId = isset($adminInfo['unionId']) && !empty($adminInfo['unionId']) ? $adminInfo['unionId'] : '';
  204. $unionAdmin = [];
  205. if (!empty($unionId)) {
  206. $unionAdmin = self::getByUnionId($unionId);
  207. }
  208. switch ($source) {
  209. case $adminSource['mini']['name']:
  210. $sourceId = $adminSource['mini']['id'];
  211. $miniOpenId = $adminInfo['miniOpenId'];
  212. $admin = self::getByMiniOpenId($miniOpenId);
  213. break;
  214. case $adminSource['official']['name']:
  215. $sourceId = $adminSource['official']['id'];
  216. $openId = isset($adminInfo['openId']) ? $adminInfo['openId'] : '';
  217. $admin = [];
  218. if (!empty($openId)) {
  219. $admin = self::getByOpenId($openId);
  220. }
  221. break;
  222. default:
  223. throw new \Exception('未知来源的用户');
  224. }
  225. if (empty($admin)) {
  226. if (!empty($unionAdmin)) {
  227. //1、在小程序端已经授权用户信息和unionId之后,关注公众号时走这里
  228. //2、关注了公众号或者H5已经授权时,并首次访问小程序
  229. $admin = self::updateAdmin($unionAdmin, $adminInfo);
  230. } else {
  231. $adminInfo['sourceType'] = $sourceId;
  232. $admin = self::generateAdmin($adminInfo);
  233. }
  234. } else {
  235. if (!empty($unionAdmin)) {
  236. if (isset($unionAdmin['id']) && isset($admin['id']) && $admin['id'] != $unionAdmin['id']) {
  237. //合并相同管理员,小程序管理保留,其它删除
  238. $admin = self::mergeAdmin($unionAdmin, $admin);
  239. }
  240. }
  241. $admin = self::updateAdmin($admin, $adminInfo);
  242. }
  243. return $admin;
  244. }
  245. //更新员工信息 shish 2020.5.30
  246. public static function updateAdmin($originalAdmin, $getAdminInfo)
  247. {
  248. $data = [];
  249. $adminId = $originalAdmin['id'];
  250. //替换掉微信不支持的图片
  251. $nickName = isset($getAdminInfo['nickName']) ? preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $getAdminInfo['nickName']) : '';
  252. if (!empty($nickName)) {
  253. $data['nickName'] = $nickName;
  254. }
  255. if (isset($originalAdmin['adminName']) && empty($originalAdmin['adminName'])) {
  256. $data['adminName'] = $nickName;
  257. }
  258. if (isset($getAdminInfo['openId']) && !empty($getAdminInfo['openId'])) {
  259. $openId = $getAdminInfo['openId'];
  260. $data['openId'] = $openId;
  261. }
  262. if (isset($getAdminInfo['miniOpenId']) && !empty($getAdminInfo['miniOpenId'])) {
  263. $data['miniOpenId'] = $getAdminInfo['miniOpenId'];
  264. }
  265. if (isset($getAdminInfo['unionId']) && !empty($getAdminInfo['unionId'])) {
  266. $data['unionId'] = $getAdminInfo['unionId'];
  267. }
  268. if (isset($getAdminInfo['sex'])) {
  269. $data['sex'] = $getAdminInfo['sex'];
  270. }
  271. if (isset($getAdminInfo['subscribe'])) {
  272. $data['subscribe'] = $getAdminInfo['subscribe'];
  273. }
  274. if (isset($getAdminInfo['subscribeTime'])) {
  275. $data['subscribeTime'] = $getAdminInfo['subscribeTime'];
  276. }
  277. if (isset($getAdminInfo['isFull'])) {
  278. $data['isFull'] = $getAdminInfo['isFull'];
  279. }
  280. if (isset($getAdminInfo['headImgUrl']) && !empty($getAdminInfo['headImgUrl'])) {
  281. $data['isFull'] = 1;
  282. }
  283. //更新头像
  284. $merchantId = 0;
  285. if (isset($originalAdmin['avatar']) == false || empty($originalAdmin['avatar'])) {
  286. if (isset($getAdminInfo['headImgUrl']) && !empty($getAdminInfo['headImgUrl'])) {
  287. $imgUrl = $getAdminInfo['headImgUrl'];
  288. $name = ImageService::generateAvatar($merchantId, $imgUrl);
  289. if (!empty($name)) {
  290. $data['avatar'] = $name;
  291. }
  292. }
  293. }
  294. self::updateById($adminId, $data);
  295. $admin = self::getById($adminId);
  296. return $admin;
  297. }
  298. public static function generateAdmin($getAdminInfo)
  299. {
  300. $time = time();
  301. //替换掉微信名称不支持的图片
  302. $nickName = isset($getAdminInfo['nickName']) ? preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $getAdminInfo['nickName']) : '';
  303. $getAdminInfo['nickName'] = $nickName;
  304. $getAdminInfo['adminName'] = $nickName;
  305. $subscribe = isset($getAdminInfo['subscribe']) ? $getAdminInfo['subscribe'] : 0;
  306. $getAdminInfo['subscribe'] = $subscribe;
  307. $getAdminInfo['avatar'] = '';
  308. $getAdminInfo['password'] = '';
  309. $getAdminInfo['payPassword'] = '';
  310. $getAdminInfo['mobile'] = isset($getAdminInfo['mobile']) ? $getAdminInfo['mobile'] : '';
  311. $getAdminInfo['addTime'] = $time;
  312. $getAdminInfo['source'] = isset($getAdminInfo['source']) ? $getAdminInfo['source'] : 0;
  313. $getAdminInfo['hasSubscribe'] = 0;
  314. if (isset($getAdminInfo['headImgUrl']) && !empty($getAdminInfo['headImgUrl'])) {
  315. $imgUrl = $getAdminInfo['headImgUrl'];
  316. $name = ImageService::generateAvatar(0, $imgUrl);
  317. if (!empty($name)) {
  318. $getAdminInfo['avatar'] = $name;
  319. }
  320. }
  321. $admin = self::add($getAdminInfo);
  322. $adminId = $admin['id'];
  323. if (empty($nickName)) {
  324. self::updateById($adminId, ['adminName' => $adminId, 'nickName' => $adminId]);
  325. }
  326. return $admin;
  327. }
  328. //合并管理员
  329. public static function mergeAdmin($delAdmin, $retainAdmin)
  330. {
  331. $connection = Yii::$app->db;//事务处理
  332. $transaction = $connection->beginTransaction();
  333. try {
  334. $delAdminId = $delAdmin['id'];
  335. $clearData = ['openId' => '', 'miniOpenId' => '', 'unionId' => ''];
  336. self::updateById($delAdminId, $clearData);
  337. $transaction->commit();
  338. } catch (Exception $e) {
  339. $transaction->rollBack();
  340. return [];
  341. }
  342. }
  343. //找出相同unionId的用户
  344. public static function getSameUnionId($unionId)
  345. {
  346. return self::getAllByCondition(['unionId' => $unionId], 'addTime desc', '*');
  347. }
  348. public static function getByOpenId($openId)
  349. {
  350. return self::getByCondition(['openId' => $openId]);
  351. }
  352. //将微信和小程序获取的用户信息转成可以保存的用户信息
  353. public static function switchAdminInfo($info, $source)
  354. {
  355. $openId = '';
  356. if (isset($info['openid']) && !empty($info['openid'])) {
  357. $openId = $info['openid'];
  358. unset($info['openId']);
  359. }
  360. if (isset($info['openId']) && !empty($info['openId'])) {
  361. $openId = $info['openId'];
  362. unset($info['openId']);
  363. }
  364. if (!empty($openId)) {
  365. $adminSource = UserClass::$userSourceId;
  366. switch ($source) {
  367. case $adminSource['mini']['name']:
  368. $info['miniOpenId'] = $openId;
  369. break;
  370. case $adminSource['official']['name']:
  371. $info['openId'] = $openId;
  372. break;
  373. default:
  374. }
  375. }
  376. if (isset($info['nickName'])) {
  377. $info['nickName'] = $info['nickName'];
  378. }
  379. if (isset($info['unionid'])) {
  380. $info['unionId'] = $info['unionid'];
  381. }
  382. if (isset($info['unionId'])) {
  383. $info['unionId'] = $info['unionId'];
  384. }
  385. if (isset($info['headimgurl'])) {
  386. $info['headImgUrl'] = $info['headimgurl'];
  387. }
  388. if (isset($info['avatarUrl'])) {
  389. $info['headImgUrl'] = $info['avatarUrl'];
  390. }
  391. if (isset($info['subscribe_time'])) {
  392. $info['subscribeTime'] = $info['subscribe_time'];
  393. }
  394. if (isset($info['subscribe'])) {
  395. $info['subscribe'] = $info['subscribe'];
  396. }
  397. return $info;
  398. }
  399. //取消关注 shish 2020.4.19
  400. public static function unFocus($adminId)
  401. {
  402. self::updateById($adminId, ['subscribe' => 0, 'hasSubscribe' => 1]);
  403. }
  404. //切换门店 linqh 2021.1.31
  405. public static function toggleShop($admin, $toggleShopId, $sjId, $originShopAdmin)
  406. {
  407. if ($admin['super'] != 1) {
  408. util::fail("您没有权限");
  409. }
  410. $adminId = $admin['id'];
  411. $currentShopId = $admin['currentShopId'] ?? 0;
  412. $sjShopList = ShopClass::getSjShopList($sjId);
  413. $sjShopIds = array_column($sjShopList, 'id');
  414. if (in_array($toggleShopId, $sjShopIds) == false) {
  415. util::fail('不是您的门店');
  416. }
  417. $shopAdmin = \bizTy\shop\classes\ShopAdminClass::toggleShopAddRelate($originShopAdmin, $toggleShopId);
  418. self::updateById($adminId, ['currentShopId' => $toggleShopId]);
  419. return $shopAdmin;
  420. }
  421. }